日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LCD12864示例子程序

發布時間:2025/5/22 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LCD12864示例子程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

總結一下一些模塊常用的子程序

相信很多同學和我一樣,剛開始的時候可能不太喜歡拿著數據手冊去看,然后去寫一些子程序。比如說lcd12864或者lcd1602的一些寫命令、寫數據、忙檢查子程序等等。
這里給大家總結一些模塊的子程序,大家直接可以復制粘貼拿來用。

LCD12864模塊

下面是實際使用lcd12864模塊的子程序,當然如果大家買的模塊帶中文字庫,可以直接查找字庫表顯示中文漢字。或者直接將中文字符串進行輸出顯示。

/******************************************************************* 函數名稱:delay(int ms) 函數功能:延時 輸入參數:ms 要延時的ms數 返回值: 無*******************************************************************/ void delay_ms(int ms) {while(ms--){uchar i;for(i=0;i<250;i++){; ; ; ;} //一個機器周期為1us,250*4us=1ms} } /******************************************************************* 函數名稱:lcd_busy() 函數功能:檢測LCD忙狀態。 輸入參數:無 返回值: result result為1時,忙等待;result為0時,閑,可寫指令數據 *******************************************************************/ bit lcd_busy() { bit result; //定義是否忙碌標志位LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delay_ms(1);result = (bit)(LCD_data&0x80);LCD_EN = 0;return(result); } /******************************************************************* 函數名稱:lcd_wcmd() 函數功能:lcd寫指令數據子程序。 輸入參數:cmd 輸入命令 返回值: 無 *******************************************************************/ void lcd_wcmd(uchar cmd) { while(lcd_busy());LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;delay_ms(1);LCD_data = cmd; //將指令數據送入P0口delay_ms(1);LCD_EN = 1;delay_ms(1);LCD_EN = 0; }/******************************************************************* 函數名稱:lcd_wdat() 函數功能:lcd寫顯示數據子程序。 輸入參數:dat 顯示的數據 返回值: 無 *******************************************************************/ void lcd_wdat(uchar dat) { while(lcd_busy());LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;LCD_data = dat; //將顯示數據送入P0口delay_ms(1);LCD_EN = 1;delay_ms(1);LCD_EN = 0; }/******************************************************************* 函數名稱:lcd_init() 函數功能:lcd初始化子程序。 輸入參數:無 返回值: 無 *******************************************************************/ void lcd_init() { lcd_wcmd(0x34); //擴充指令操作delay_ms(5);lcd_wcmd(0x30); //基本指令操作delay_ms(5);lcd_wcmd(0x0C); //顯示開,關光標delay_ms(5);lcd_wcmd(0x01); //清除LCD的顯示內容delay_ms(5); }/******************************************************************* 函數名稱:lcd_pos() 函數功能:lcd設定顯示位置子程序。 輸入參數:X:行數 Y:列數 返回值: 無 *******************************************************************/ void lcd_pos(uchar X,uchar Y) { uchar pos;if(X==0)X=0x80; //設置為第1行,注意對應X是0else if(X==1)X=0x90;else if(X==2)X=0x88;else if(X==3)X=0x98;pos = X+Y ; //設置列,注意第一列對應Y是0lcd_wcmd(pos); //設定顯示地址 }/******************************************************************* 函數名稱:lcd_display() 函數功能:lcd設定顯示位置并顯示字符串子程序,包括中英文、數字、特殊字符。 輸入參數:X:行數 Y:列數 *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++;} }

很多同學在做仿真的時候代碼和實際的不太一樣。比如用proteus仿真時lcd12864有CS1,CS2兩個片選信號引腳,但是實際的時候大多數是沒有這兩個引腳,而是一個PSB引腳(當然淘寶上也有帶CS1,CS2片選引腳的lcd12864買)。接下來給大家總結一下仿真時如果用CS1,CS2片選引腳應該怎么寫這些子程序。

void delay_ms(uint xms) //延時子程序 {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; //檢查忙信號}while(!(result==0x00)); //當忙信號為0時才可繼續操作 }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) //設置頁碼子程序,頁碼為0~7 {page=0xb8|page;lcd_wcmd(page); }void SetStartLine(uchar startline) //設置起始行,行號為0~63 {startline=0xc0|startline;lcd_wcmd(startline); }void SetColumn(uchar column) //設置列子程序,列號為0~63 {column=column&0x3f;column=0x40|column;lcd_wcmd(column); }void SetOnOff(uchar onoff) //開關顯示屏子程序 {onoff=0x3e|onoff;lcd_wcmd(onoff); }void lcd_wdat(uchar dat) //LCD寫數據子程序 { 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(); //讀忙信號,不忙則向下執行SelectScreen(0);SetOnOff(0); //關屏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為顯示的屏號column=column&0x3f; //column為列號SetPage(page); //page為頁號,顯示第number個漢字的上半部分,可理解為要顯示的漢字位于屏幕的第page行SetColumn(column);for(i=0;i<16;i++){lcd_wdat(Chinese[i+32*number]);//number為字號,取第number個漢字的第i列數據編碼值}SetPage(page+1); //顯示第number個漢字的下半部分SetColumn(column);for(i=0;i<16;i++){lcd_wdat(Chinese[i+32*number+16]);//取第number個漢字的第i列數據編碼值} }

下篇:DS1302時鐘模塊
鏈接: 下篇:DS1302時鐘模塊

總結

以上是生活随笔為你收集整理的LCD12864示例子程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。