|
原理圖
- #include<reg52.h>
- #include<stdio.h>
- #include<intrins.h>
- sbit RS = P2^0; //Pin4
- sbit RW = P2^1; //Pin5
- sbit E= P2^2; //Pin6
- #define Data P0//數(shù)據(jù)端口
- char TimeNum[16];
- char Test1[16];
- void DelayUs(unsigned char us)//微秒級延時(shí)函數(shù)
- {
- unsigned char uscnt;
- uscnt=us>>1;
- while(--uscnt);
- }
- void DelayMs(unsigned char ms) //毫秒級延時(shí)函數(shù)
- {
- while(--ms)
- {
- DelayUs(250);
- DelayUs(250);
- DelayUs(250);
- DelayUs(250);
- }
- }
- void WriteCommand(unsigned char c)//寫命令函數(shù)
- {
- DelayMs(5);//操作前短暫延時(shí),保證信號穩(wěn)定
- E=0;
- RS=0;
- RW=0;
- _nop_();
- E=1;
- Data=c;
- E=0;
- }
- void WriteData(unsigned char c) //寫數(shù)據(jù)函數(shù)
- {
- DelayMs(5);//操作前短暫延時(shí),保證信號穩(wěn)定
- E=0;
- RS=1;
- RW=0;
- _nop_();
- E=1;
- Data=c;
- E=0;
- RS=0;
- }
- void ShowChar(unsigned char pos,unsigned char c)//寫字符函數(shù)
- {
- unsigned char p;
- if (pos>=0x10)
- p=pos+0xb0; //是第二行則命令代碼高4位為0xc
- else
- p=pos+0x80; //是第二行則命令代碼高4位為0x8
- WriteCommand (p);//寫命令
- WriteData (c);//寫數(shù)據(jù)
- }
- void lcd_sfm(unsigned char add,unsigned char date)//顯示位置和數(shù)據(jù)
- {
- unsigned char shi,ge;
- shi=date/10;
- ge=date%10;
- WriteCommand(0x80+0x40+add);
- WriteData(0x30+shi);
- WriteData(0x30+ge);
- }
- void ShowString (unsigned char line,char *ptr)//寫字符串函數(shù)
- {
- unsigned char l,i;
- l=line<<4;//若line=0,則地址的高四位為0;若line=1.則地址的高四位為1
- for (i=0;i<16;i++)
- ShowChar (l++,*(ptr+i));//循環(huán)顯示16個(gè)字符
- }
- void InitLcd()//初始化函數(shù)
- {
- DelayMs(15);
- WriteCommand(0x38); //display mode
- WriteCommand(0x38); //display mode
- WriteCommand(0x38); //display mode
- WriteCommand(0x06); //顯示光標(biāo)移動(dòng)位置
- WriteCommand(0x0c); //顯示開及光標(biāo)設(shè)置
- WriteCommand(0x01); //顯示清屏
- }
- void delay(unsigned int t)
- {while(t--);
- }
- unsigned char keyscan(void) //矩陣鍵盤掃描函數(shù)
- {
- unsigned char h,l; //定義行、列值中間變量
- P1=0x0f; //列線輸出全為0,行為1
- h=P1&0x0f; //讀入行線
- if(h!=0x0f) //檢測有無按鍵按下,行不全為1
- { delay(100); //延時(shí)去抖
- if(h!=0x0f) //如果確實(shí)按下
- {
- h=P1&0x0f; //再次讀入行線
- P1=0xf0; //輸出當(dāng)前列線值,行線反轉(zhuǎn)
- l=P1&0xf0; //讀入列線值
- return (h+l); //鍵盤最后組合編碼值,也就是鍵值
- }
- }
- return 0xff; //其余情況返回該值
- }
- unsigned char getkey( )
- {
- unsigned char key,key_num;
- key=keyscan(); //用key讀取keyscan()的值
- switch(key)
- { case 0xee: key_num=0; break;
- case 0xed: key_num=1; break;
- case 0xeb: key_num=2; break;
- case 0xe7: key_num=3; break;
- case 0xde: key_num=4; break;
- case 0xdd: key_num=5; break;
- case 0xbd: key_num=6; break;
- case 0x7d: key_num=7; break;
- case 0xbe: key_num=8; break;
- case 0xdb: key_num=9; break;
- case 0xbb: key_num=10; break;
- case 0x7b: key_num=11; break;
- case 0x7e: key_num=12; break;
- case 0xd7: key_num=13; break;
- case 0xb7: key_num=14; break;
- case 0x77: key_num=15; break;
- default:key_num=0xff; break;
- }
- return key_num;
- }
- void main(void)//主函數(shù)
- { unsigned char kk;
- float x=99.0;
- InitLcd();//初始化LCD
- DelayMs(15);//延時(shí)保證信號穩(wěn)定
- lcd_sfm(5,43);
- ShowString(0,"LCD");
- while(1)
- { kk=getkey();
- if(kk!=0xff)
- { lcd_sfm(5,kk);
- }
- }
- }
復(fù)制代碼
|
評分
-
查看全部評分
|