版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
液晶顯示接口設(shè)計第7章液晶顯示屏以其功耗低、體積小、顯示內(nèi)容豐富、超薄輕巧的諸多優(yōu)點,在袖珍式儀表和低功耗應(yīng)用系統(tǒng)中得到越來越廣泛的應(yīng)用。液晶顯示屏的種類繁多,本章介紹常用的字符型液晶顯示模塊SMC1602、圖形液晶顯示模塊OCM12864。引言目錄SMC1602的基礎(chǔ)應(yīng)用1SMC1602溫度快速顯示和忙狀態(tài)判斷2OCM12864使用基礎(chǔ)4SMC1602漢字顯示與4位數(shù)據(jù)總線3OCM12864溫度顯示5行業(yè)PPT模板/hangye/本章小結(jié)6本章習(xí)題77.1SMC1602的基礎(chǔ)應(yīng)用7.1.1SMC1602概述7.1.1SMC1602概述每個字符都有一個固定的代碼。例如,大寫字母A的代碼是01000001B(41H),顯示時把地址41H中的字模顯示出來,我們就能看到字母A。SMC1602內(nèi)部的CGRAM能存儲8個自定義字符,在SMC1602初始化時,向CGRAM寫入字模,寫入地址為0x00~0x07(共8個地址)。7.1.2SMC1602與單片機的接口7.1.2SMC1602與單片機的接口SMC1602讀操作時序如圖7-7所示。當(dāng)R/W和E引腳均為高電平時,通過從E引腳信號算起的時間tD,即可從SMC1602數(shù)據(jù)口讀出指令或數(shù)據(jù)。7.1.2SMC1602與單片機的接口SMC1602寫操作時序如圖7-8所示。當(dāng)R/W引腳為低電平、E引腳為高電平時,在從E引腳信號算起的時間tPW內(nèi),都可將指令或數(shù)據(jù)向SMC1602的數(shù)據(jù)口寫入。7.1.3SMC1602內(nèi)部寄存器介紹DDRAM地址映射圖如圖7-9所示。SMC1602共有2行,每行有16個字符。例如,地址00表示第1行第1個字符的位置,如果要在這個位置顯示某個字符,則只要送出地址00和這個字符的ASCII碼即可。7.1.3SMC1602內(nèi)部寄存器介紹SMC1602內(nèi)部的控制器共有11條控制指令,如表7-4所示。它的讀/寫操作、屏幕和光標(biāo)的操作都是通過指令編程來實現(xiàn)的。7.1.4SMC1602基礎(chǔ)應(yīng)用仿真利用前面學(xué)到的理論知識設(shè)計一個SMC1602的顯示電路,編寫驅(qū)動程序,顯示一些簡單的字符。7.1.4SMC1602基礎(chǔ)應(yīng)用仿真/**********************************************************************函數(shù)功能:寫指令到LCD指令寄存器**********************************************************************/voidLcd_WriteCmd(void){LCD_RS=0; //選擇LCD指令寄存器LCD_RW=0; //執(zhí)行寫入操作LCD_E=1; //使能LCDDelay_1mS(50);//見"時序參數(shù)表"中"E脈寬tpw"要求≥150nSLCD_E=0;Delay_1mS(50);//而"E周期tc"要求≥400nS}7.1.4SMC1602基礎(chǔ)應(yīng)用仿真/**********************************************************************函數(shù)功能:寫數(shù)據(jù)到LCD數(shù)據(jù)寄存器,指針ch指向數(shù)據(jù)的首地址,n為數(shù)據(jù)個數(shù)**********************************************************************/voidLcd_WriteData(uchar*ch,ucharn){uchari;
for(i=0;i<n;i++){P2=*(ch+i); //送字符數(shù)據(jù)
LCD_RS=1; //選擇LCD數(shù)據(jù)寄存器LCD_RW=0; //使能寫入操作LCD_E=1; //啟動LCDDelay_1mS(50);//見"時序參數(shù)表"中"E脈寬tpw"要求>150nSLCD_E=0;Delay_1mS(50);//而"E周期tc"要求>400nS}}7.1.4SMC1602基礎(chǔ)應(yīng)用仿真/**********************************************************************函數(shù)功能:LCD初始化**********************************************************************/voidLcd_Init(void){P2=0x01;//指令1:清屏指令Lcd_WriteCmd();
P2=0x38;//指令6:功能設(shè)定指令,8位,2行,5*7點矩陣Lcd_WriteCmd();
P2=0x0F;//指令4:開顯示指令,顯示屏ON,光標(biāo)ON,閃爍ONLcd_WriteCmd();
P2=0x06;//指令3:設(shè)置字符&光標(biāo)移動模式,光標(biāo)右移,整屏顯示不移動Lcd_WriteCmd();}7.1.4SMC1602基礎(chǔ)應(yīng)用仿真/**********************************************************************函數(shù)功能:主函數(shù),在指定的位置顯示指定的字符串**********************************************************************/voidmain(void){while(1){Lcd_Init(); //LCD初始化
P2=0x80; //指令8:DDRAM第1行起始地址Lcd_WriteCmd();Lcd_WriteData(Line1,16);//寫入第1行16個字符
P2=0xC0; //指令8:DDRAM第2行起始地址Lcd_WriteCmd();Lcd_WriteData(Line2,16);//寫入第2行16個字符P2=0xCF; //指令8:光標(biāo)停留在第2行最后一個字符的位置Lcd_WriteCmd();
Delay_1mS(3000);//在當(dāng)前顯示處停留3S}}7.1.5SMC1602溫度顯示的仿真在SMC1602基礎(chǔ)應(yīng)用仿真任務(wù)的基礎(chǔ)上修改驅(qū)動程序,不僅要顯示字符,還要顯示數(shù)值,如溫度值。7.1.5SMC1602溫度顯示的仿真/**********************************************************************函數(shù)功能:將數(shù)值轉(zhuǎn)換成字符串**********************************************************************/voidValue2Ascii(ucharval,uchar*valAscii){valAscii[0]=val/10+'0';valAscii[1]=val%10+'0';}這里主要增加了Value2Ascii()函數(shù),將溫度變量temp轉(zhuǎn)換成字符串tempAscii[],并顯示溫度字符串。7.1.5SMC1602溫度顯示的仿真/**********************************************************************函數(shù)功能:主函數(shù),在指定的位置顯示指定的字符串**********************************************************************/Lcd_Init();//LCD初始化P2=0x80;//指令8:DDRAM第1行起始地址Lcd_WriteCmd();Lcd_WriteData(Line1,16);//寫入第1行16個字符P2=0xC0;//指令8:DDRAM第2行起始地址Lcd_WriteCmd();Lcd_WriteData(Line2,13);//寫入第2行13個字符Value2Ascii(temp,tempAscii);//將溫度變量轉(zhuǎn)換成字符串Lcd_WriteData(tempAscii,2);//顯示溫度字符串P2=0xCF;//指令8:光標(biāo)停留在第2行最后一個字符位置Lcd_WriteCmd();Delay_1mS(3000);//在當(dāng)前顯示處停留3s7.2SMC1602溫度快速顯示和忙狀態(tài)判斷7.2.1任務(wù)要求在SMC1602溫度顯示的仿真任務(wù)的基礎(chǔ)上修改驅(qū)動程序,要求每個字符的顯示沒有延時,快速顯示所有字符。7.2.2任務(wù)分析在SMC1602溫度顯示的仿真任務(wù)中,Lcd_WriteCmd()和Lcd_WriteData()函數(shù)都用到了延時函數(shù)Delay_1mS(50)。在第5章曾介紹過,軟件的延時是阻塞式延時,會影響程序的執(zhí)行速度,特別是毫秒級的延時。因此,本任務(wù)通過減少延時時間,采用微秒級延時,或者判斷SMC1602忙狀態(tài)來實現(xiàn)快速顯示所有字符。7.2.3原理圖設(shè)計原理圖設(shè)計的參考圖不變,顯示效果如圖7-11所示。7.2.4SMC1620溫度快速顯示的程序設(shè)計1.增加延時函數(shù)Delay_100uS()增加一個延時100μs的延時函數(shù)Delay_100uS(),并在main()函數(shù)中調(diào)用Delay_100uS(1),修改j的初值,就可以調(diào)整Delay_100uS()函數(shù)的延時時間。voidDelay_100uS(uintt){uinti,j;
for(i=t;i>0;i--){for(j=10;j>0;j--);}}7.2.4SMC1620溫度快速顯示的程序設(shè)計2.調(diào)試Delay_100uS()函數(shù)中的參數(shù)在Keil中可以查看Delay_100uS()函數(shù)的延時時間,如果延時時間不夠準(zhǔn)確,與100μs相差較大,則可以修改j的初值。單擊“Debug”按鈕,進(jìn)入調(diào)試狀態(tài),同時顯示Disassembly匯編代碼窗口,如圖7-12所示。如果修改了程序,則必須先編譯(快捷鍵F7),再單擊“Debug”按鈕。7.2.4SMC1620溫度快速顯示的程序設(shè)計如圖7-13所示,切換回Main.c匯編代碼窗口,箭頭所指位置表示將要執(zhí)行的語句,灰色塊表示對應(yīng)行為可以執(zhí)行語句(若無灰色塊,則表示該行語句不可執(zhí)行)。7.2.4SMC1620溫度快速顯示的程序設(shè)計(1)增加兩個斷點。在Delay_100uS(1)所在行任意處雙擊,增加第一個斷點(圓點),在下一個灰色塊,即Lcd_Init()所在行任意處雙擊,增加第二個斷點,如圖7-14所示。7.2.4SMC1620溫度快速顯示的程序設(shè)計在Keil的菜單欄中選擇“View”→“AnalysisWindows”→“PerformanceAnalyzerWindow”選項,打開執(zhí)行時間分析窗口,其中“totaltime”數(shù)值框中的值表示程序已經(jīng)運行的時間(單位為s),這里為0,表示程序還未運行,如圖7-15所示。7.2.4SMC1620溫度快速顯示的程序設(shè)計(2)程序運行到第一個斷點處。單擊“Run”按鈕,程序運行到第一個斷點處,如圖7-16所示。7.2.4SMC1620溫度快速顯示的程序設(shè)計查看執(zhí)行時間分析窗口,此時程序運行了0.000391s,如圖7-17所示。7.2.4SMC1620溫度快速顯示的程序設(shè)計(3)程序運行到第二個斷點處。單擊“Run”按鈕,程序運行到第一個斷點處,如圖7-18所示。這里也可以使用“StepOver”單步按鈕使程序運行到第二個斷點處。7.2.4SMC1620溫度快速顯示的程序設(shè)計查看執(zhí)行時間分析窗口,此時,程序運行了0.000497s(見圖7-19),計算得0.000497s-0.000391s=106μs,表示執(zhí)行Delay_100uS(1)函數(shù)使用了106μs,符合任務(wù)要求。7.2.4SMC1620溫度快速顯示的程序設(shè)計3.改寫Lcd_WriteCmd()、Lcd_WriteData()函數(shù)將程序中的Delay_1mS(50)改為Delay_100uS(9),盡量減少操作LCD所需的時間,即可達(dá)到快速顯示所有字符的要求。/**********************************************************************函數(shù)功能:寫指令到LCD指令寄存器**********************************************************************/voidLcd_WriteCmd(void){LCD_RS=0; //選擇LCD指令寄存器LCD_RW=0; //執(zhí)行寫入操作LCD_E=1; //使能LCDDelay_100uS(9); //見"時序參數(shù)表"中"E脈寬tpw"要求>150nSLCD_E=0;Delay_100uS(9); //而"E周期tc"要求>400nS}7.2.4SMC1620溫度快速顯示的程序設(shè)計/**********************************************************************函數(shù)功能:寫數(shù)據(jù)到LCD數(shù)據(jù)寄存器,指針ch指向數(shù)據(jù)的首地址,n為數(shù)據(jù)個數(shù)**********************************************************************/voidLcd_WriteData(uchar*ch,ucharn){uchari;
for(i=0;i<n;i++){P2=*(ch+i); //送字符數(shù)據(jù)
LCD_RS=1; //選擇LCD數(shù)據(jù)寄存器LCD_RW=0; //使能寫入操作LCD_E=1; //啟動LCDDelay_100uS(9); //見"時序參數(shù)表"中"E脈寬tpw"要求>150nSLCD_E=0;Delay_100uS(9); //而"E周期tc"要求>400nS}}7.2.5SMC1602忙狀態(tài)判斷1.使用STC-ISP生成Delay_100uS()函數(shù)可以使用STC-ISP直接生成Delay_100uS()函數(shù),在“8051指令集”下拉列表中選擇“STC-Y1”選項即可,如圖7-20所示。7.2.5SMC1602忙狀態(tài)判斷2.忙等待異常將SMC1602溫度快速顯示源碼中的Delay_100uS(9)改為Delay_100uS(8)。此時,SMC1602第2行不能顯示,Proteus日志窗口提示“Controllerreceivedcommand
whilstbusy.”(LCD1接收命令時正忙)(單擊“Message”按鈕可顯示),如圖7-21所示,說明Delay_100uS(8)這個延時時間太短,即單片機在向SMC1602發(fā)送指令或數(shù)據(jù)時,SMC1602正忙。7.2.5SMC1602忙狀態(tài)判斷3.忙狀態(tài)的讀取voidLcd_BusyWait(void){uchari=0;//LCD_BUSY=1; P2=0xFF; //讀取1602的狀態(tài)時,1602會輸出一個字節(jié)LCD_RS=0;LCD_RW=1;LCD_E=1;while(LCD_BUSY==1);//忙否:1602模塊壞了或被拔下,將在此死循環(huán)/*while(i++<255){if(LCD_BUSY==0)break;//忙否:推薦這種寫法}//while*/LCD_E=0;}7.2.5SMC1602忙狀態(tài)判斷上述程序說明:在讀取SMC1602忙狀態(tài)時,SMC1602會輸出一個字節(jié),只要通過最高位P2.7來判斷SMC1602忙否即可。單片機在讀引腳前先將引腳置1,只有這樣,讀取的數(shù)據(jù)才正確。但如果只將P2.7引腳置1,即LCD_BUSY=1,那么Proteus日志窗口會提示A8等引腳邏輯電平?jīng)_突,如圖7-22所示。此時,需要將LCD_BUSY=1改為P2=0xFF,以接收SMC1602一字節(jié)的狀態(tài)字。7.2.5SMC1602忙狀態(tài)判斷4.改寫Lcd_WriteCmd和Lcd_WriteData()函數(shù)在前面調(diào)用忙等待函數(shù)Lcd_BusyWait(),表示在每次寫指令、讀/寫數(shù)據(jù)之前檢測忙狀態(tài)信號,并將Delay_100uS(9)改為最小的Delay_100uS(1)。voidLcd_WriteCmd(ucharcmd){Lcd_BusyWait();//忙等待
P2=cmd;
LCD_RS=0;//選擇LCD指令寄存器LCD_RW=0;//執(zhí)行寫入操作LCD_E=1;//使能LCDDelay_100uS(1);//見"時序參數(shù)表"中"E脈寬tpw"要求>150nSLCD_E=0;Delay_100uS(1);//而"E周期tc"要求>400nS}7.2.5SMC1602忙狀態(tài)判斷5.改寫main()和Lcd_Init()函數(shù)voidmain(void){
while(1){Lcd_WriteCmd(0x80);//指令8:DDRAM第1行起始地址Lcd_WriteData(Line1,16);//寫入第1行16個字符
Lcd_WriteCmd(0xC0);//指令8:DDRAM第2行起始地址Lcd_WriteData(Line2,13);//寫入第2行13個字符Value2Ascii(temp,tempAscii);//將溫度變量轉(zhuǎn)換成字符串Lcd_WriteData(tempAscii,2);//顯示溫度字符串
Lcd_WriteCmd(0xCF);//指令8:光標(biāo)停留在第2行最后一個字符的位置Delay_1mS(3000);//在當(dāng)前顯示處停留3S}}7.2.5SMC1602忙狀態(tài)判斷上述程序在Lcd_Init()函數(shù)中調(diào)用了Lcd_WriteCmd_NoChk()函數(shù),該函數(shù)較Lcd_WriteCmd()函數(shù)只少了忙等待函數(shù)Lcd_BusyWait(),因為上電后,SMC1602默認(rèn)為忙狀態(tài),所以需要向SMC1602中寫入一個指令并等待一小段時間,只有這樣,SMC1602才會變成空閑狀態(tài)。/**********************************************************************函數(shù)功能:LCD初始化**********************************************************************/voidLcd_Init(void){Lcd_WriteCmd_NoChk(0x01);//指令1:清屏指令Delay_1mS(2);Lcd_WriteCmd(0x38);//指令6:功能設(shè)定指令,8位,2行,5*7點矩陣Lcd_WriteCmd(0x0F);//指令4:開顯示指令,顯示屏ON,光標(biāo)ON,閃爍ONLcd_WriteCmd(0x06);//指令3:設(shè)置字符&光標(biāo)移動模式,光標(biāo)右移,整屏顯示不移動}7.2.5SMC1602忙狀態(tài)判斷/**********************************************************************函數(shù)功能:寫指令到LCD指令寄存器**********************************************************************/voidLcd_WriteCmd_NoChk(ucharcmd){P2=cmd;
LCD_RS=0; //選擇LCD指令寄存器LCD_RW=0; //執(zhí)行寫入操作LCD_E=1; //使能LCDDelay_100uS(1);//見"時序參數(shù)表"中"E脈寬tpw"要求>150nSLCD_E=0;Delay_100uS(1);//而"E周期tc"要求>400nS}7.3SMC1602漢字顯示與4位數(shù)據(jù)總線7.3.1SMC1602漢字顯示1.任務(wù)要求在SMC1602忙狀態(tài)判斷任務(wù)的基礎(chǔ)上修改驅(qū)動程序,要求第1行顯示一些簡單常用的漢字,如年月日時分秒;第2行顯示的溫度值后面帶符號“℃”。2.原理圖設(shè)計原理圖設(shè)計的參考圖不變,顯示效果如圖7-23所示。7.3.1SMC1602漢字顯示3.漢字顯示的原理前面已經(jīng)介紹過CGRAM的相關(guān)知識,這里不再贅述。CGRAM中第一個字符的存儲空間如圖7-24所示。需要注意的是,由于CGROM地址中包含了CGRAM地址(高4位為0000的地址),在設(shè)置CGROM地址的指令中,命令字節(jié)D6的值為1。因此,在寫命令到CGRAM中時,寫入值為0x40~0x47,對應(yīng)的CGRAM地址為0x00~0x07。7.3.1SMC1602漢字顯示在取模軟件PCtoLCD中選擇“模式”→“圖形模式”選項,如圖7-25所示。新建點陣大小為8×8,如圖7-26所示。7.3.1SMC1602漢字顯示單擊選出“℃”的形狀,如圖7-27所示。打開“字模選項”對話框,具體設(shè)置如圖7-28所示。設(shè)置好后單擊“生成字模”按鈕,得到“℃”的字模{0x16,0x09,0x08,0x08,0x08,0x09,0x06,0x00},如圖7-29所示。7.3.1SMC1602漢字顯示其余6個漢字“年月日時分秒”的形狀如下圖7-30所示,制作字模的過程與符號℃類似。7.3.1SMC1602漢字顯示4.漢字的寫入將7個自定義字符生成的字模保存到一維數(shù)組g_ucFont[]中,該數(shù)組位于51單片機的ROM空間。/**********************************************************************1602要顯示7個自定義字符,其字模由取模軟件生成有6個漢字和1個℃,分別為年月日,時分秒,℃**********************************************************************/ucharcodeg_ucFont[]={0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02,
0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00,
0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,0x00,
0x02,0x1F,0x1A,0x1E,0x1A,0x12,0x04,0x00,
0x04,0x0A,0x11,0x0E,0x06,0x1A,0x04,0x00,
0x0A,0x12,0x0F,0x1C,0x09,0x1A,0x0C,0x00,
0x16,0x09,0x08,0x08,0x08,0x09,0x06,0x00,
};7.3.1SMC1602漢字顯示在SMC1602初始化Lcd_Init()函數(shù)中,將7個自定義字符的字模寫入CGRAM。/**********************************************************************函數(shù)功能:LCD初始化**********************************************************************/voidLcd_Init(void){Lcd_WriteCmd_NoChk(0x01);//指令1:清屏指令Delay_1mS(2);Lcd_WriteCmd(0x38);//指令6:功能設(shè)定指令,8位,2行,5*7點矩陣Lcd_WriteCmd(0x0F);//指令4:開顯示指令,顯示屏ON,光標(biāo)ON,閃爍ONLcd_WriteCmd(0x06);//指令3:設(shè)置字符&光標(biāo)移動模式,光標(biāo)右移,整屏顯示不移動Lcd_WriteCmd(0x40);//指令7:CGRAM的開始地址Lcd_WriteData(g_ucFont,8*7);//將7個自定義字符的字模寫入CGRAM}7.3.1SMC1602漢字顯示5.漢字的顯示在主函數(shù)main()中,在顯示溫度字符串后緊接著顯示符號“℃”。數(shù)組UserChar[]中保存著這7個自定義字符在DDRAM中的值,分別為0~6。為了顯示漢字,Line2[]數(shù)組的內(nèi)容改為:voidmain(void){uchartemp=28;//溫度變量uchartempAscii[2];ucharUserChar[]={0,1,2,3,4,5,6};//7個自定義字符在數(shù)據(jù)存貯器DDRAM中的值
//Delay_100uS(1); //調(diào)試Delay_100uS()函數(shù)中的參數(shù)
Lcd_Init();//LCD初始化函數(shù)只需執(zhí)行一次,將其放到while(1)循環(huán)外面7.3.1SMC1602漢字顯示
while(1){
Lcd_WriteCmd(0x80);
//指令8:DDRAM第1行起始地址
Lcd_WriteData(Line1,16);
//寫入第1行16個字符
Lcd_WriteCmd(0xC0);
//指令8:DDRAM第2行起始地址
Lcd_WriteData(Line2,13);
//寫入第2行13個字符
Lcd_WriteCmd(0xC0+4);
Lcd_WriteData(&UserChar[0],1);
//年在DDRAM中的值為0
Lcd_WriteCmd(0xC0+7);
Lcd_WriteData(&UserChar[1],1);
//月在DDRAM中的值為1
Lcd_WriteCmd(0xC0+10);
Lcd_WriteData(&UserChar[2],1);
//日在DDRAM中的值為2
Value2Ascii(temp,tempAscii);
//將溫度變量轉(zhuǎn)換成字符串
Lcd_WriteCmd(0xC0+13);
Lcd_WriteData(tempAscii,2);
//顯示溫度字符串
Lcd_WriteData(&UserChar[6],1);
//℃在DDRAM中的值為6
Lcd_WriteCmd(0xCF);
//指令8:光標(biāo)停留在第2行最后一個字符的位置
Delay_1mS(3000);
//在當(dāng)前顯示處停留3s
}}7.3.2SMC16024位數(shù)據(jù)總線5.漢字的顯示1.4位數(shù)據(jù)總線的原理當(dāng)單片機引腳不夠用時,SMC1602采用四線接法,可以多留出4個端口,以備單片機連接其他外圍電路。四線接法把DB3~DB0(仿真軟件中的D3~D0)引腳懸空不接,其他引腳的接法與八線接法一樣,顯示效果如圖7-31所示。7.3.2SMC16024位數(shù)據(jù)總線2.改寫Lcd_WriteCmd_NoChk()、Lcd_WriteCmd()、Lcd_WriteData()函數(shù)四線數(shù)據(jù)傳輸只需通過DB4~DB7引腳,其程序與八線接法大同小異,只需在寫指令或數(shù)據(jù)時,先傳輸相應(yīng)的高4位,再傳輸?shù)?位即可。7.3.2SMC16024位數(shù)據(jù)總線/**********************************************************************函數(shù)功能:寫指令到LCD指令寄存器**********************************************************************/voidLcd_WriteCmd_NoChk(ucharcmd){LCD_RS=0; //選擇LCD指令寄存器LCD_RW=0; //執(zhí)行寫入操作
P2=cmd; //先寫高4位給P2口高4位LCD_E=1; //使能LCDDelay_100uS(1); //見"時序參數(shù)表"中"E脈寬tpw"要求>150nSLCD_E=0;Delay_100uS(1); //而"E周期tc"要求>400nS
P2=cmd<<4;//再寫低4位給P2口高4位LCD_E=1; //使能LCDDelay_100uS(1);//見"時序參數(shù)表"中"E脈寬tpw"要求>150nSLCD_E=0;Delay_100uS(1);//而"E周期tc"要求>400nS}7.3.2SMC16024位數(shù)據(jù)總線/**********************************************************************函數(shù)功能:寫指令到LCD指令寄存器(不使用忙等待)**********************************************************************/voidLcd_WriteCmd(ucharcmd){//Lcd_BusyWait();//使用4位數(shù)據(jù)總線時不能再使用忙等待函數(shù)LCD_RS=0; //選擇LCD指令寄存器LCD_RW=0; //執(zhí)行寫入操作P2=cmd; //先寫高4位給P2口高4位LCD_E=1; //使能LCDDelay_100uS(1); //見"時序參數(shù)表"中"E脈寬tpw"要求>150nSLCD_E=0;Delay_100uS(1);//而"E周期tc"要求>400nS
P2=cmd<<4;//再寫低4位給P2口高4位LCD_E=1; //使能LCDDelay_100uS(1);//見"時序參數(shù)表"中"E脈寬tpw"要求>150nSLCD_E=0;Delay_100uS(1);//而"E周期tc"要求>400nS}7.3.2SMC16024位數(shù)據(jù)總線voidLcd_WriteData(uchar*ch,ucharn){uchari;for(i=0;i<n;i++){//Lcd_BusyWait();//忙等待,在4位數(shù)據(jù)總線不能再使用忙等待函數(shù)LCD_RS=1; //選擇LCD數(shù)據(jù)寄存器LCD_RW=0; //使能寫入操作P2=*(ch+i); //先寫高4位給P2口高4位LCD_E=1; //啟動LCDDelay_100uS(1); //見"時序參數(shù)表"中"E脈寬tpw"要求>150nSLCD_E=0;Delay_100uS(1); //而"E周期tc"要求>400nS
P2=(*(ch+i))<<4;//再寫低4位給P2口高4位LCD_E=1; //啟動LCDDelay_100uS(1); //見"時序參數(shù)表"中"E脈寬tpw"要求>150nSLCD_E=0;Delay_100uS(1); //而"E周期tc"要求>400nS}}7.3.2SMC16024位數(shù)據(jù)總線voidLcd_Init(void){Lcd_WriteCmd_NoChk(0x32);//指令6:經(jīng)試用,0x30~0x3F中只有0x32才能正常顯示,還可使用0x02,0x12Delay_1mS(2); //該延時可去掉,上一語句改為Lcd_WriteCmd(0x32)Lcd_WriteCmd(0x28);//指令6:功能設(shè)定指令,4位,2行,5*7點矩陣Lcd_WriteCmd(0x0F);//指令4:開顯示指令,顯示屏ON,光標(biāo)ON,閃爍ONLcd_WriteCmd(0x06);//指令3:設(shè)置字符&光標(biāo)移動模式,光標(biāo)右移,整屏顯示不移動Lcd_WriteCmd(0x40);//指令7:CGRAM的地址Lcd_WriteData(g_ucFont,8*7);//將7個自定義字符的字模寫入CGRAM}3.改寫Lcd_Init()函數(shù)將Lcd_WriteCmd(0x38)改為Lcd_WriteCmd(0x28),將SMC1602設(shè)為4位數(shù)據(jù)總線,并在這條語句前面增加Lcd_WriteCmd_NoChk(0x32)。需要注意的是,這個說明在SMC1602的數(shù)據(jù)手冊中并沒有提到。7.4OCM12864使用基礎(chǔ)7.4.1OCM12864概述7.4.2OCM12864與單片機的接口OCM12864采用模擬端口線連接方式,如圖7-33所示。7.4.2OCM12864與單片機的接口OCM12864讀操作時序如圖7-34所示。其中,當(dāng)R/W引腳為高電平、E引腳為高電平時,通過從E引腳信號算起的時間tr,即可從OCM12864數(shù)據(jù)口讀出指令或數(shù)據(jù)。7.4.2OCM12864與單片機的接口OCM12864寫操作時序如圖7-35所示。其中,當(dāng)R/W引腳為低電平、E引腳為高電平時,在從E引腳信號算起的時間PWEH內(nèi),都可將指令或數(shù)據(jù)向OCM12864的數(shù)據(jù)口寫入。7.4.3OCM12864的控制指令OCM12864控制指令相對于SMC1602要簡單,其主要指令及引腳數(shù)據(jù)設(shè)置如表7-9所示。7.4.4OCM12864的基礎(chǔ)顯示1.任務(wù)要求利用前面學(xué)到的理論知識設(shè)計一個OCM12864的顯示電路,編寫驅(qū)動程序,顯示一些簡單的字符,包括中文、英文、數(shù)字、符號等。2.原理圖設(shè)計原理圖設(shè)計參考圖7-36。7.4.4OCM12864的基礎(chǔ)顯示3.漢字、英文的字??梢允褂萌∧\浖CtoLCD來取字模,執(zhí)行“模式”→“字符模式”命令,進(jìn)入字符模式,如圖7-37所示。7.4.4OCM12864的基礎(chǔ)顯示3.漢字、英文的字模取模方式為“列行式”、取模走向為“逆向(低位在前)”,勾選“自定義格式”復(fù)選框,具體設(shè)置如圖7-38所示。默認(rèn)選中“陰碼”單選按鈕,即點亮用“1”表示。而顯示屏上的“中文反顯顯示效果”和“EngReverseDisp”是反顯效果,應(yīng)選中“陽碼”單選按鈕。7.4.4OCM12864的基礎(chǔ)顯示OCM12864液晶屏共有128列,分為左區(qū)、右區(qū),每一區(qū)都有64列。7.4.4OCM12864的基礎(chǔ)顯示4.圖片的模如果要取圖片的模,則執(zhí)行“文件”→“打開”命令,如圖7-39所示。先選擇bmp圖片,該圖片應(yīng)為黑白圖片,大小應(yīng)為128×64(單位為像素)。它的字模選項設(shè)置與漢字、英文的字模一樣,最終也是單擊“生成字?!卑粹o。7.4.4OCM12864的基礎(chǔ)顯示5.漢字、英文顯示的流程圖為了便于理解漢字、英文顯示的原理,畫出其流程圖,如圖7-40所示。這里總共要顯示4行漢字、英文。其中,漢字為16×16點陣,英文為16×8點陣,因為一頁的寬度為8位,所以每個漢字或英文都要占用兩頁,分別對應(yīng)漢字、英文的上半部分和下半部分。當(dāng)顯示完漢字上半部分的16字節(jié)后,就要顯示漢字下半部分的16字節(jié),而英文的上半部分、下半部分都為8字節(jié)。當(dāng)顯示完上半部分后,就要定位到OCM12864的下一頁來顯示下半部分,這是在Lcd_DisOneRow()函數(shù)中調(diào)用Lcd_SetPageCol()函數(shù)來實現(xiàn)的,具體見例程源碼。7.4.4OCM12864的基礎(chǔ)顯示7.4.4OCM12864的基礎(chǔ)顯示6.OCM12864的基礎(chǔ)顯示的完整源碼/**********************************************************************函數(shù)功能:寫數(shù)據(jù)或命令到LCD**********************************************************************/voidLcd_WriteByte(bitbDataType,ucharVal){/*Lcd_BusyWait();//在仿真中,"忙等待&忙狀態(tài)讀取"函數(shù)無法通過while(Lcd_BusyRead());*/
LCD_PIN_DI=bDataType;LCD_PIN_RW=0;LCD_PIN_DATA=Val;LCD_PIN_E=1;LCD_PIN_E=0;}7.4.4OCM12864的基礎(chǔ)顯示/**********************************************************************函數(shù)功能:初始化**********************************************************************/voidLcd_Init(void){LCD_PIN_RST=0;//12864復(fù)位Delay_uS(50);LCD_PIN_RST=1;
Lcd_WriteByte(LCD_CMD,LCD_DISP_ON);//顯示開}7.4.4OCM12864的基礎(chǔ)顯示//函數(shù)功能:設(shè)置頁地址和列地址voidLcd_SetPageCol(unsignedcharucPage,unsignedcharucCol){ucharucPageScope,ucColScope;ucPageScope=LCD_PAGES-1;ucColScope=LCD_COLS-1;switch(ucCol&0xC0)//只保留低6位{case0://在左區(qū)LCD_PIN_LEFT_CS=0;LCD_PIN_RIGHT_CS=1;break;case0x40://在右區(qū)(0x40=64)LCD_PIN_LEFT_CS=1;LCD_PIN_RIGHT_CS=0;break;}//switchLcd_WriteByte(LCD_CMD,ucPage|LCD_SETX);//頁地址范圍為0~7Lcd_WriteByte(LCD_CMD,ucCol|LCD_SETY); //列地址范圍為0~63}7.4.4OCM12864的基礎(chǔ)顯示//函數(shù)功能:在指定位置顯示一行voidLcd_DisOneRow(ucharucPage,ucharucCol,ucharcode*pt,ucharucLng){uchari,j,ucTmpPage,ucTmpCol,ucFontWidth,ucNum;ucTmpPage=ucPage;ucTmpCol=ucCol;if(ucLng==0){ucFontWidth=32;//一個漢字16x16點陣,字模有32字節(jié)ucNum=8; //一行有8個漢字}else{ucFontWidth=16;//一個英文16x8點陣,字模有16字節(jié)ucNum=16; //一行有16個英文}for(i=0;i<ucNum;i++){for(j=0;j<ucFontWidth;j++){//顯示一個漢字或英文if(j==ucFontWidth/2){//顯示字模的上半部分后,接著顯示下半部分ucPage++;ucCol=ucTmpCol;}Lcd_SetPageCol(ucPage,ucCol++);Lcd_WriteByte(LCD_DATA,pt[i*ucFontWidth+j]);}ucPage=ucTmpPage; //顯示一個漢字或英文后,頁不變,列變ucTmpCol=ucCol;}}7.4.4OCM12864的基礎(chǔ)顯示/**********************************************************************函數(shù)功能:在指定位置顯示一張圖片**********************************************************************/voidLcd_DisImg(ucharcode*pt){ucharucPage,ucCol;
for(ucPage=0;ucPage<8;ucPage++)//總共8頁{for(ucCol=0;ucCol<128;ucCol++)//顯示一頁{AddrConversion(ucPage,ucCol);Lcd_WriteByte(LCD_DATA,*(pt++));}}}7.4.4OCM12864的基礎(chǔ)顯示/**********************************************************************函數(shù)功能:主函數(shù),在指定的位置顯示中文,英文,數(shù)字,符號,圖片等**********************************************************************/voidmain(){Lcd_Init();
while(1){Lcd_DisOneRow(0,0,ucChn,0);//在第0頁最前面顯示中文效果Lcd_DisOneRow(2,0,ucChnRev,0);//在第2頁最前面顯示中文反顯Lcd_DisOneRow(4,0,ucEng,1);//在第4頁最前面顯示英文Lcd_DisOneRow(6,0,ucEngRev,1);//在第6頁最前面顯示英文反顯Delay_1mS(3000);
Lcd_DisImg(ucImg);//顯示圖片Delay_1mS(3000);}}7.5OCM12864溫度顯示7.5.1任務(wù)要求在OCM12864的基礎(chǔ)顯示任務(wù)的基礎(chǔ)上修改驅(qū)動程序,不僅要顯示漢字、英文,還要顯示數(shù)值,如溫度值。7.5.2任務(wù)分析本任務(wù)要顯示溫度值,可將溫度值中的每個數(shù)值拆開,找到對應(yīng)的字模后送到OCM12864中顯示即可。7.5.3原理圖設(shè)計原理圖設(shè)計的參考圖不變,顯示效果如圖7-41所示。7.5.4OCM12864溫度顯示的程序設(shè)計與前面的操作一樣,使用取模軟件生成“Temperature:”和數(shù)字0~9的字模。參考Lcd_DisOneRow()函數(shù),編寫一個在指定位置顯示溫度值的函數(shù)Lcd_DisTemp(),數(shù)字為16×8點陣,所以跟顯示英文的代碼是一樣的。ucharcodeucTemp[]=//"Temperature:"的字模,宋體,高x寬=16x8{//由于這里篇幅所限,省略字模,具體見例程源碼};ucharcodeucNumber[]=//數(shù)字"0~9"的字模,宋體,高x寬=16x8{//由于這里篇幅所限,省略字模,具體見例程源碼};7.5.4OCM12864溫度顯示的程序設(shè)計//函數(shù)功能:在指定位置顯示溫度值voidLcd_DisTemp(ucharucPage,ucharucCol,ucharucTemp){uchari,j,ucTmpPage,ucTmpCol;uchartmp[3];ucTmpPage=ucPage;ucTmpCol=ucCol;tmp[0]=0; //溫度值
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 體育運動彩鋼板安裝合同模板
- 酒店廚師戒煙承諾書范文
- 醫(yī)療機構(gòu)辦公用品投標(biāo)資料
- 酒店式農(nóng)業(yè)園區(qū)租賃合同范本
- 建立清晰的人事流程計劃
- 積木游戲在幼兒園學(xué)習(xí)中的應(yīng)用計劃
- 業(yè)務(wù)員季度工作總結(jié)范文
- 公司客服工作總結(jié)5篇
- 校園安全管理總結(jié)10篇
- DB31∕903-2015 便攜式纏繞瓶定期檢驗與評定
- 【課件】供應(yīng)商現(xiàn)場與質(zhì)量管理
- 2024年立式碾米機項目可行性研究報告
- 統(tǒng)編版語文九年級上冊(2024)(含答案)
- 中華人民共和國保守國家秘密法實施條例培訓(xùn)課件
- 智慧醫(yī)學(xué)語言基礎(chǔ)2024a學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 成都錦城學(xué)院《算法分析與設(shè)計》2022-2023學(xué)年期末試卷
- 2024年全國統(tǒng)一高考英語試卷(新課標(biāo)Ⅰ卷)含答案
- 花卉學(xué)智慧樹知到期末考試答案章節(jié)答案2024年浙江農(nóng)林大學(xué)暨陽學(xué)院
- 晉江市土地利用總體規(guī)劃
- 泵站質(zhì)量檢查表
- 新版atstudy系統(tǒng)測試計劃
評論
0/150
提交評論