LCD12864示例子程序
生活随笔
收集整理的這篇文章主要介紹了
LCD12864示例子程序
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
總結(jié)一下一些模塊常用的子程序
相信很多同學(xué)和我一樣,剛開始的時(shí)候可能不太喜歡拿著數(shù)據(jù)手冊(cè)去看,然后去寫一些子程序。比如說lcd12864或者lcd1602的一些寫命令、寫數(shù)據(jù)、忙檢查子程序等等。
這里給大家總結(jié)一些模塊的子程序,大家直接可以復(fù)制粘貼拿來用。
LCD12864模塊
下面是實(shí)際使用lcd12864模塊的子程序,當(dāng)然如果大家買的模塊帶中文字庫(kù),可以直接查找字庫(kù)表顯示中文漢字。或者直接將中文字符串進(jìn)行輸出顯示。
/******************************************************************* 函數(shù)名稱:delay(int ms) 函數(shù)功能:延時(shí) 輸入?yún)?shù):ms 要延時(shí)的ms數(shù) 返回值: 無*******************************************************************/ void delay_ms(int ms) {while(ms--){uchar i;for(i=0;i<250;i++){; ; ; ;} //一個(gè)機(jī)器周期為1us,250*4us=1ms} } /******************************************************************* 函數(shù)名稱:lcd_busy() 函數(shù)功能:檢測(cè)LCD忙狀態(tài)。 輸入?yún)?shù):無 返回值: result result為1時(shí),忙等待;result為0時(shí),閑,可寫指令數(shù)據(jù) *******************************************************************/ bit lcd_busy() { bit result; //定義是否忙碌標(biāo)志位LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delay_ms(1);result = (bit)(LCD_data&0x80);LCD_EN = 0;return(result); } /******************************************************************* 函數(shù)名稱:lcd_wcmd() 函數(shù)功能:lcd寫指令數(shù)據(jù)子程序。 輸入?yún)?shù):cmd 輸入命令 返回值: 無 *******************************************************************/ void lcd_wcmd(uchar cmd) { while(lcd_busy());LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;delay_ms(1);LCD_data = cmd; //將指令數(shù)據(jù)送入P0口delay_ms(1);LCD_EN = 1;delay_ms(1);LCD_EN = 0; }/******************************************************************* 函數(shù)名稱:lcd_wdat() 函數(shù)功能:lcd寫顯示數(shù)據(jù)子程序。 輸入?yún)?shù):dat 顯示的數(shù)據(jù) 返回值: 無 *******************************************************************/ void lcd_wdat(uchar dat) { while(lcd_busy());LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;LCD_data = dat; //將顯示數(shù)據(jù)送入P0口delay_ms(1);LCD_EN = 1;delay_ms(1);LCD_EN = 0; }/******************************************************************* 函數(shù)名稱:lcd_init() 函數(shù)功能:lcd初始化子程序。 輸入?yún)?shù):無 返回值: 無 *******************************************************************/ void lcd_init() { lcd_wcmd(0x34); //擴(kuò)充指令操作delay_ms(5);lcd_wcmd(0x30); //基本指令操作delay_ms(5);lcd_wcmd(0x0C); //顯示開,關(guān)光標(biāo)delay_ms(5);lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容delay_ms(5); }/******************************************************************* 函數(shù)名稱:lcd_pos() 函數(shù)功能:lcd設(shè)定顯示位置子程序。 輸入?yún)?shù):X:行數(shù) Y:列數(shù) 返回值: 無 *******************************************************************/ void lcd_pos(uchar X,uchar Y) { uchar pos;if(X==0)X=0x80; //設(shè)置為第1行,注意對(duì)應(yīng)X是0else if(X==1)X=0x90;else if(X==2)X=0x88;else if(X==3)X=0x98;pos = X+Y ; //設(shè)置列,注意第一列對(duì)應(yīng)Y是0lcd_wcmd(pos); //設(shè)定顯示地址 }/******************************************************************* 函數(shù)名稱:lcd_display() 函數(shù)功能:lcd設(shè)定顯示位置并顯示字符串子程序,包括中英文、數(shù)字、特殊字符。 輸入?yún)?shù):X:行數(shù) Y:列數(shù) *dis 字符串地址 返回值: 無 *******************************************************************/ void lcd_display (uchar X,uchar Y,uchar *dis) {uchar i;lcd_pos(X,Y); i = 0;while(dis[i] != '\0') //顯示字符串{ lcd_wdat(dis[i]); i++;} }很多同學(xué)在做仿真的時(shí)候代碼和實(shí)際的不太一樣。比如用proteus仿真時(shí)lcd12864有CS1,CS2兩個(gè)片選信號(hào)引腳,但是實(shí)際的時(shí)候大多數(shù)是沒有這兩個(gè)引腳,而是一個(gè)PSB引腳(當(dāng)然淘寶上也有帶CS1,CS2片選引腳的lcd12864買)。接下來給大家總結(jié)一下仿真時(shí)如果用CS1,CS2片選引腳應(yīng)該怎么寫這些子程序。
void delay_ms(uint xms) //延時(shí)子程序 {uint i,j;for(i=xms;i>0;i--){for(j=110;j>0;j--); } }void lcd_busy() //LCD忙檢查子程序 {uchar result;LCD_RS=0;LCD_RW=1;do {LCD_data=0x00;LCD_EN=1;_nop_();result=LCD_data;LCD_EN=0;result=0x80&result; //檢查忙信號(hào)}while(!(result==0x00)); //當(dāng)忙信號(hào)為0時(shí)才可繼續(xù)操作 }void lcd_wcmd(uchar cmd) //LCD寫命令子程序 { lcd_busy();LCD_RS=0; //寫命令LCD_RW=0;LCD_data=cmd;LCD_EN=1; //利用EN 下降沿完成命令寫操作_nop_();_nop_();LCD_EN=0; }void SetPage(uchar page) //設(shè)置頁碼子程序,頁碼為0~7 {page=0xb8|page;lcd_wcmd(page); }void SetStartLine(uchar startline) //設(shè)置起始行,行號(hào)為0~63 {startline=0xc0|startline;lcd_wcmd(startline); }void SetColumn(uchar column) //設(shè)置列子程序,列號(hào)為0~63 {column=column&0x3f;column=0x40|column;lcd_wcmd(column); }void SetOnOff(uchar onoff) //開關(guān)顯示屏子程序 {onoff=0x3e|onoff;lcd_wcmd(onoff); }void lcd_wdat(uchar dat) //LCD寫數(shù)據(jù)子程序 { lcd_busy();LCD_RS=1;LCD_RW=0;LCD_data=dat;LCD_EN=1;_nop_();_nop_();LCD_EN=0; }void SelectScreen(uchar screen) //選屏子程序,screen=0,1,2 {switch(screen){case 0: CS1=0; //全屏顯示_nop_();_nop_();_nop_();CS2=0;_nop_();_nop_();_nop_();break;case 1: CS1=0; //左屏顯示_nop_();_nop_();_nop_();CS2=1;_nop_();_nop_();_nop_();break;case 2: CS1=1; //右屏顯示_nop_();_nop_();_nop_();CS2=0;_nop_();_nop_();_nop_();break;} }void ClearScreen(uchar screen) //清屏子程序,screen=0,1,2 {uchar i,j;SelectScreen(screen);for(i=0;i<8;i++){SetPage(i);SetColumn(0);for(j=0;j<64;j++){lcd_wdat(0x00);}} }void lcd_init() //lcd12864初始化子程序 {lcd_busy(); //讀忙信號(hào),不忙則向下執(zhí)行SelectScreen(0);SetOnOff(0); //關(guān)屏SelectScreen(0);SetOnOff(1); //開屏SelectScreen(0);ClearScreen(0); //清屏SetStartLine(0); //開始行為0 }void ChineseDisplay(uchar screen,uchar page,uchar column,uchar number) //漢字顯示子程序 {int i;SelectScreen(screen); //screen為顯示的屏號(hào)column=column&0x3f; //column為列號(hào)SetPage(page); //page為頁號(hào),顯示第number個(gè)漢字的上半部分,可理解為要顯示的漢字位于屏幕的第page行SetColumn(column);for(i=0;i<16;i++){lcd_wdat(Chinese[i+32*number]);//number為字號(hào),取第number個(gè)漢字的第i列數(shù)據(jù)編碼值}SetPage(page+1); //顯示第number個(gè)漢字的下半部分SetColumn(column);for(i=0;i<16;i++){lcd_wdat(Chinese[i+32*number+16]);//取第number個(gè)漢字的第i列數(shù)據(jù)編碼值} }下篇:DS1302時(shí)鐘模塊
鏈接: 下篇:DS1302時(shí)鐘模塊
總結(jié)
以上是生活随笔為你收集整理的LCD12864示例子程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: token、cookie是什么
- 下一篇: DS1302示例子程序