作為CSDN專業技術IT社群的一個新手小白,第一篇文章就從LCD1602起步吧。
也是剛剛接觸到樹莓派,裝的是Raspbian官方的桌面版本系統,雖然這似乎并不重要,手頭上的樹莓派隻有空溜溜的開發闆裝上了散熱片,以及16GB的SD卡和讀寫器以及一個USB線的供電插頭,是以用SSH網線連接配接到筆記本電腦,遠端桌面連接配接進行控制。其中的安裝步驟,網上教程也多了去,在此也不加以贅述了。
總的硬體電路子產品
在此申明一點,其實私以為一般對LCD1602的應用,隻是将其作為一個顯示屏而已,
(雖然本身LCD1602是個低速CPU,雙方可以進行互相傳遞資料)
那麼就意味着我的硬體電路RW端杜邦線接出來接到VSS(GND)即可,保證RW=0,并且實作起來,我沒有按照手冊上所說每次進行忙檢測,RW=0意味着lcd1602發送不了忙标志位給樹莓派(或者我第一次用單片機),實測問題不大,
故我的代碼實作不包含忙檢測、RW(自己實踐得到隻要保證2ms 以上的延時,LCD能正常顯示資料)
是以程式代碼裡隻用樹莓派的各個端口輸出高低電平給LCD即可實作字元啦~
同時為了避免每次給LCD諸多引腳進行接線,自己DIY做了一個轉接闆電路,有電阻調節液晶顯示屏亮度,并且有個短接帽,短接時lcd發光顯示,拔掉背光。
其中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
(至于為什麼可以不加電阻,以後得看看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的顯示了
最後實驗效果:
ps:四線模式下需要注意的點,這裡我還沒試過四線模式下樹莓派的驅動。僅僅對51單片機和32試過并成功了。
四線模式,主要目的是為了減少連線,但是51和32的經曆讓我發現四線模式下,我單片機複位按下會出現亂碼,或者一行黑塊,需要在write(0x32);write_cmd(0x28);函數前加入一段複位語句,這裡注意是針對lcd進行複位,是以我覺得還是八線穩定些,省去這些麻煩。加入複位之後,我51單片機複位按鍵按下,lcd顯示成功率剛開始50%,因為用的是學習版,有許多外設子產品,有點幹擾,而且16p母座直接插上去就好了,後來我也像樹莓派一樣杜邦線直接從IO端口引出來接lcd,單片機複位之後lcd正常顯示100%,但是32就不一定了,雖然是最小系統闆,但還是存在一些外設之類的,這待解決吧。。。
複位語句如下:
一個中文手冊裡的操作步驟:
介紹完樹莓派驅動程式後,想在此記錄下個人對單片機接觸曆史吧。
大二的時候導師讓學51單片機,于是買了51QX的開發學習闆進行學習,當時對單片機可謂是一無所知,聽到51這一詞彙更是不知所雲,稀裡糊塗地學着,從看視訊教程出來,慢慢了解了單片機這玩意,但即使把視訊教程看了底朝天,有時候還是處于一無所知的狀态,總得從更底層出發,學彙編指令,了解寄存器等玩意(是以目前剛開始接觸),學單片機第一步私以為先看一遍視訊,手冊這玩意到現在也沒怎麼看過,主要是想看可是看不懂啊,乍一看實在感覺難以下咽。
可是這種東西就是需要慢慢地,靜下心去看,先大概浏覽一遍,再逐行把語句讀下去,總能讀懂一點東西。
51學了中斷、矩陣鍵盤這類知識後,也不深入,當初就是那種淺嘗辄止後又接觸到32這東西,32單片機相比較51更為複雜,剛開始看視訊教程也看不明白,尤其是前面介紹概念性的東西,後面慢慢地發現也就多了些配置函數,由此才覺得51好簡單,也不是簡單啦,就是端口似乎是開漏輸出,這一特性使得端口的狀态既能當輸入又能當輸出,在代碼程式設計裡友善很多,從32的學習經曆來看,端口配置有很多門道,什麼開漏輸出啊,通用推挽輸出**,剛開始根本不知道這些東西有什麼用**,
可是後來實作矩陣鍵盤,先看明白51怎麼實作的,然後轉到32就有很多門道,比如要動态配置成輸入輸出,擷取什麼行、列線值,或者設定成開漏模式,手冊裡都清楚有講,這樣就能實作雙向IO功能。
是以我第一次真正靜下心去看晶片資料手冊GPIO那邊的内容,看明白了很多,也将例程裡那些别人寫好的gpio庫函數裡看了看,懂得了一些gpio->ODR,GPIO->BSRR這些東西,我記得沒錯的話是叫做寄存器操作。
昨晚第二次看資料手冊,是針對lcd1602,雖然還是看不太明白,但也是慢慢地來,大概看明白30%,學習這東西是越學越深入的,因為那個lcd,複位出現了問題,我問别人,去百度,才發現有時候會遇到單片機熱啟動、冷啟動方面的知識,雖然我現在還是不太懂,但是至少先有個基礎性的概念,所有學習也都是這樣,沒有一蹴而就的。同時以前學數電,RAM\ROM那一章跳過了,近幾天要翻看這些底層的東西,基礎還是很重要的。
以前對單片機外設很不了解,以為那個開發闆外面接什麼電機,或者紅外遙控,就叫做外設,其實後來才恍然知道整個開發闆上幾乎都是外設,針對晶片這幾個引腳來着。。。。這些電機、紅外遙控現階段也是跟視訊試了一下,就沒深入,
學習還是得迂回前進的,以後我還是會重新來過的,目前想做智能小車,寒假試試吧,都已經大三了,是該懂得什麼叫做學習了,而不是隻是為了考個好成績,拿個獎學金,應應試。