天天看點

用RaspberryPi 3B 驅動LCD1602(八位總線)液晶顯示屏(使用iwringPi庫,C語言編寫)

作為CSDN專業技術IT社群的一個新手小白,第一篇文章就從LCD1602起步吧。

也是剛剛接觸到樹莓派,裝的是Raspbian官方的桌面版本系統,雖然這似乎并不重要,手頭上的樹莓派隻有空溜溜的開發闆裝上了散熱片,以及16GB的SD卡和讀寫器以及一個USB線的供電插頭,是以用SSH網線連接配接到筆記本電腦,遠端桌面連接配接進行控制。其中的安裝步驟,網上教程也多了去,在此也不加以贅述了。

總的硬體電路子產品

用RaspberryPi 3B 驅動LCD1602(八位總線)液晶顯示屏(使用iwringPi庫,C語言編寫)

 在此申明一點,其實私以為一般對LCD1602的應用,隻是将其作為一個顯示屏而已,

 (雖然本身LCD1602是個低速CPU,雙方可以進行互相傳遞資料)

 那麼就意味着我的硬體電路RW端杜邦線接出來接到VSS(GND)即可,保證RW=0,并且實作起來,我沒有按照手冊上所說每次進行忙檢測,RW=0意味着lcd1602發送不了忙标志位給樹莓派(或者我第一次用單片機),實測問題不大,

 故我的代碼實作不包含忙檢測、RW(自己實踐得到隻要保證2ms 以上的延時,LCD能正常顯示資料)

 是以程式代碼裡隻用樹莓派的各個端口輸出高低電平給LCD即可實作字元啦~

 同時為了避免每次給LCD諸多引腳進行接線,自己DIY做了一個轉接闆電路,有電阻調節液晶顯示屏亮度,并且有個短接帽,短接時lcd發光顯示,拔掉背光。

用RaspberryPi 3B 驅動LCD1602(八位總線)液晶顯示屏(使用iwringPi庫,C語言編寫)

其中V0端的青色杜邦線 本可以避免的,奈何背面走錫把路堵死了,是以隻能用杜邦線橋接了,這裡的短接帽被我拔了

 黃色的杜邦線即将RW接K、VSS(GND端)

有關LCD1602的硬體連接配接,很重要的一點:

LCD的供電VDD保證5v(記住隻需要這個供電端5v即可),

DB0-DB7、EN\RS端的高低電平寫入,用3.3v的通用推挽輸出能驅動,并且不需要在樹莓派(或者單片機)IO輸出端接電阻進入DB0-DB7端或者EN、RW端

以下是我截取LCD1602一個英文手冊裡的:這裡的引腳輸入電壓最小值為0.7*vdd約接近3.3V

用RaspberryPi 3B 驅動LCD1602(八位總線)液晶顯示屏(使用iwringPi庫,C語言編寫)

(至于為什麼可以不加電阻,以後得看看LCD1602這個低速CPU裡的主晶片資料手冊方能知道,大機率是晶片内自有電阻保護,防止電流過大?)之前用stm32F407走了挺大的一個坑,設定成端口開漏,并且5v上拉10k電阻,保證IO口可以進行雙向,可讀可寫,那麼LCD1602進行的忙檢測就能實作了。具體的心得,另起一個部落格寫吧。

話不多說,直接上代碼吧,第一次寫部落格,有很多纰漏之處,詞不達意,以後回來再修改吧。

#include<wiringPi.h>
#include<stdio.h>
#define uchar unsigned char
void port_init(){
    int i ;
    for(i=0;i<8;i++)
         pinMode(i,OUTPUT);
    pinMode(27,OUTPUT); //RS Setpin
    pinMode(28,OUTPUT);	//EN Setpin
}
void write_cmd(uchar cmd){
	digitalWrite(27,LOW); //RS = 0	
	digitalWriteByte(cmd);//GPIO0=cmd
	digitalWrite(28,HIGH);
	delay(5);
	digitalWrite(28,LOW);
}
void write_dat(uchar dat){
	digitalWrite(27,HIGH); //RS=1
	digitalWriteByte(dat);//GPIO0=dat
	digitalWrite(28,HIGH);// EN=1;
	delay(5);			
	digitalWrite(28,LOW);// EN=0;
        
}
void init_LCD1602(void){
	write_cmd(0x38);//八線模式下兩行顯示 
	write_cmd(0x0c);//開啟顯示
	write_cmd(0x06);//位址+1
	write_cmd(0x01);//清屏
}
void showstring(uchar *p,int row_number){
	int i=0;
	row_number==1?write_cmd(0x80):write_cmd(0xc0);
	while(p[i]!='\0'){
		write_dat(p[i]);
		i++;
	}
}
int main(void){
	wiringPiSetup();
	port_init();
	init_LCD1602();
	showstring("2018.11.25",1);
	showstring("Hello,Raspberry",2);
	printf("hello\n");
	return 0;
}
           

這裡補充下函數的聲明:

void pinMode(int pin, int mode);

pinMode(pinNumber,OUTPUT); // set mode to output

pinMode(pinNumber, INPUT); // set mode to input

void digitalWriteByte(int value)

将一個8位的位元組寫入到前8個GPIO管腳中。這是一次性設定8個管腳的最快的方法,盡管将會花費兩個寫入操作到樹莓派的GPIO硬體上。

定時函數:

void delay (unsigned int howLong)

這個是毫秒級的延時函數

vim編輯儲存為lcd1602.c檔案後,

在終端執行gcc -o lcd_driver lcd1602.c -lwiringPi 編譯生成可執行檔案obj,

再./lcd_driver即可看到LCD的顯示了

用RaspberryPi 3B 驅動LCD1602(八位總線)液晶顯示屏(使用iwringPi庫,C語言編寫)

最後實驗效果:

用RaspberryPi 3B 驅動LCD1602(八位總線)液晶顯示屏(使用iwringPi庫,C語言編寫)

ps:四線模式下需要注意的點,這裡我還沒試過四線模式下樹莓派的驅動。僅僅對51單片機和32試過并成功了。

四線模式,主要目的是為了減少連線,但是51和32的經曆讓我發現四線模式下,我單片機複位按下會出現亂碼,或者一行黑塊,需要在write(0x32);write_cmd(0x28);函數前加入一段複位語句,這裡注意是針對lcd進行複位,是以我覺得還是八線穩定些,省去這些麻煩。加入複位之後,我51單片機複位按鍵按下,lcd顯示成功率剛開始50%,因為用的是學習版,有許多外設子產品,有點幹擾,而且16p母座直接插上去就好了,後來我也像樹莓派一樣杜邦線直接從IO端口引出來接lcd,單片機複位之後lcd正常顯示100%,但是32就不一定了,雖然是最小系統闆,但還是存在一些外設之類的,這待解決吧。。。

複位語句如下:

用RaspberryPi 3B 驅動LCD1602(八位總線)液晶顯示屏(使用iwringPi庫,C語言編寫)

一個中文手冊裡的操作步驟:

用RaspberryPi 3B 驅動LCD1602(八位總線)液晶顯示屏(使用iwringPi庫,C語言編寫)

         介紹完樹莓派驅動程式後,想在此記錄下個人對單片機接觸曆史吧。

   大二的時候導師讓學51單片機,于是買了51QX的開發學習闆進行學習,當時對單片機可謂是一無所知,聽到51這一詞彙更是不知所雲,稀裡糊塗地學着,從看視訊教程出來,慢慢了解了單片機這玩意,但即使把視訊教程看了底朝天,有時候還是處于一無所知的狀态,總得從更底層出發,學彙編指令,了解寄存器等玩意(是以目前剛開始接觸),學單片機第一步私以為先看一遍視訊,手冊這玩意到現在也沒怎麼看過,主要是想看可是看不懂啊,乍一看實在感覺難以下咽。

  可是這種東西就是需要慢慢地,靜下心去看,先大概浏覽一遍,再逐行把語句讀下去,總能讀懂一點東西。

  51學了中斷、矩陣鍵盤這類知識後,也不深入,當初就是那種淺嘗辄止後又接觸到32這東西,32單片機相比較51更為複雜,剛開始看視訊教程也看不明白,尤其是前面介紹概念性的東西,後面慢慢地發現也就多了些配置函數,由此才覺得51好簡單,也不是簡單啦,就是端口似乎是開漏輸出,這一特性使得端口的狀态既能當輸入又能當輸出,在代碼程式設計裡友善很多,從32的學習經曆來看,端口配置有很多門道,什麼開漏輸出啊,通用推挽輸出**,剛開始根本不知道這些東西有什麼用**,

  可是後來實作矩陣鍵盤,先看明白51怎麼實作的,然後轉到32就有很多門道,比如要動态配置成輸入輸出,擷取什麼行、列線值,或者設定成開漏模式,手冊裡都清楚有講,這樣就能實作雙向IO功能。

  是以我第一次真正靜下心去看晶片資料手冊GPIO那邊的内容,看明白了很多,也将例程裡那些别人寫好的gpio庫函數裡看了看,懂得了一些gpio->ODR,GPIO->BSRR這些東西,我記得沒錯的話是叫做寄存器操作。

  昨晚第二次看資料手冊,是針對lcd1602,雖然還是看不太明白,但也是慢慢地來,大概看明白30%,學習這東西是越學越深入的,因為那個lcd,複位出現了問題,我問别人,去百度,才發現有時候會遇到單片機熱啟動、冷啟動方面的知識,雖然我現在還是不太懂,但是至少先有個基礎性的概念,所有學習也都是這樣,沒有一蹴而就的。同時以前學數電,RAM\ROM那一章跳過了,近幾天要翻看這些底層的東西,基礎還是很重要的。

  以前對單片機外設很不了解,以為那個開發闆外面接什麼電機,或者紅外遙控,就叫做外設,其實後來才恍然知道整個開發闆上幾乎都是外設,針對晶片這幾個引腳來着。。。。這些電機、紅外遙控現階段也是跟視訊試了一下,就沒深入,

  學習還是得迂回前進的,以後我還是會重新來過的,目前想做智能小車,寒假試試吧,都已經大三了,是該懂得什麼叫做學習了,而不是隻是為了考個好成績,拿個獎學金,應應試。