- /*8位總線驅動LCD1602*/
- #include<reg52.h>
- #defineuchar unsigned char
- #defineuint unsigned int
- #include<intrins.h>//延時時鐘周期時用到
- sbitweixuan=P2^7; //將兩個鎖存器關閉,防止數碼管顯示亂碼
- sbitduanxuan=P2^6;
- //sbitLCD_RW=P2^7; //檢查忙位
- sbitLCD_RS=P3^5;
- sbitLCD_EN=P3^4;
- ucharcode table[]="123456789ABCDEFG";
- ucharcode table1[]="123456789ABCDEFG";
- voiddelayxms(uint xms) //延時X毫秒
- {
- uinti,j;
- for(i=0;i<xms;i++)
- for(j=0;j<114;j++);
- }
- /* voidread_LCD_busy() //檢查忙函數
- {
- LCD_RS=0;
- LCD_RW=1;
- IO7=1; //I/O口寫1
- LCD_EN=1;
- while(IO7); //等待液晶寫完
- LCD_EN=0;
- } */
- voiddelayxus(uint xus) //延時X微秒
- {
- uchari;
- for(i=0;i<xus;i++)
- {
- _nop_();
- }
- }
- voidwrite_LCD_CD(uchar cd,uchar CD) //cd=0寫指令,cd=1寫數據
- {
- //read_LCD_busy();//檢查忙函數
- delayxus(20);//最低延時(一定要在開頭有個延時)
- LCD_RS=cd;
- P0=CD;
- LCD_EN=1;
- LCD_EN=0;
- }
- voidLCD_init() //initialization,液晶初始化
- {
- write_LCD_CD(0,0x38); //顯示模式設置(16*2顯示,5*7點陣,4位數據接口)
- write_LCD_CD(0,0x06); // 寫一個字符后地址指針加1
- write_LCD_CD(0,0x0c); //設置開顯示,不顯示光標
- write_LCD_CD(0,0x01); //顯示清屏,數據指針清0(清屏需要一定時間)
- delayxus(80);//清屏時間
- }
- voidmain()
- {
- uchari;
- duanxuan=0;
- weixuan=0;
- LCD_EN=0;
- LCD_init();
- write_LCD_CD(0,0x80);//數據地址指針,第一行
- do
- {
- write_LCD_CD(1,table[ i]); //寫數據,data是編譯器關鍵詞
- i++;
- }
- while(table[ i]!='\0');
- i=0;
- write_LCD_CD(0,0x80+0x40);//數據地址指針,第二行
- do
- {
- write_LCD_CD(1,table1[ i]); //寫數據,data是編譯器關鍵詞
- i++;
- }
- while(table1[ i]!='\0'); //因為table是字符串
- delayxms(2000);
- //write_LCD_CD(0,0x01); //顯示清屏,數據指針清0
- //delayxus(80);
- write_LCD_CD(0,0x0f);
- write_LCD_CD(0,0x01);
- write_LCD_CD(0,0x80);
- while(1);
- }
復制代碼
|