结合4X4矩阵键盘与LCD液晶屏显示器,将矩阵按键号显示在液晶屏上。在液晶屏的第一行显示实验者的姓名英文拼写,第二行显示:“KEY VALUE:矩阵按键号”
单片机源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define key P1
- sbit rw=P2^5;
- sbit rs=P2^6;
- sbit ep=P2^7;
- uchar pose;
-
- void delay(uint z)
- {
- uint x,y;
- for(x=0;x<z;x++)
- for(y=0;y<100;y++);
- }
- bit lcd_bz()
- {
- bit result;
- rw=1;
- rs=0;
- ep=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- result=(bit)(P0&0x80);
- ep=0;
- return result;
- }
- void lcd_wdat(uchar dat)
- {
- while(lcd_bz());
- rs=1; //rs为1表示数据
- rw=0;
- ep=0;
- _nop_();
- _nop_();
- P0=dat;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- ep=1;
- delay(1);
- ep=0;
- }
-
- void lcd_w(uchar cmd)
- {
- while(lcd_bz());
- rs=0;//rs为0表示指令
- rw=0;
- ep=0;
- _nop_();
- _nop_();
- P0=cmd;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- ep=1;
- delay(1);
- ep=0;
- }
- void lcd_pos(uchar lie,uchar hang)
- {
- if(hang==1)
- lcd_w(lie+0x80);
- else
- lcd_w(0x40+lie+0x80);
- }
- //液晶屏设置初始化
- void lcd_init()
- {
- lcd_w(0x01);//清除显示内容
- delay(1);
- lcd_w(0x38);//功能设置:双行显示 //数据位为8,字形大小为5X7
- delay(1);
- lcd_w(0x38);
- delay(1);
- lcd_w(0x0c);//显示开关控制
- delay(1);
- lcd_w(0x06);//输入方式设置
- delay(1);
- }
- uchar scankey()
- {
- uchar hang,lie;
- key=0xf0;
- if(key!=0xf0)
- {
- switch(key)
- {
- case 0x70: hang=3;break;
- case 0xb0: hang=2;break;
- case 0xd0: hang=1;break;
- case 0xe0: hang=0;break;
- default:break;
- }
- delay(5);
- key=0x0f;
- if(key!=0x0f)
- {
- switch(key)
- {
- case 0x07: lie=3;break;
- case 0x0b: lie=2;break;
- case 0x0d: lie=1;break;
- case 0x0e: lie=0;break;
- default:break;
- }
- pose=hang*4+lie;
- return 1;
- }
- else
- return 0;
- }
- else
- return 0;
- }
- void main()
- {
-
- char i;
- uchar code str1[]="xiaoming";
- uchar code str2[]="KEY VALUE: ";
- uchar c[ ]={48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70};
- lcd_init(); //液晶初始化
- delay(10);
- lcd_pos(0,1);
- i=0;
- while(str1[i]!='\0')
- {
- lcd_wdat(str1[i]);
- i++;
- }
- //换行显示
- lcd_pos(0,2);
- i=0;
- while(str2[i]!='\0')
- {
- lcd_wdat(str2[i]);
- i++;
- }
- while(1)
- {
- if(scankey())
- {
- lcd_pos(12,2);
- lcd_wdat(c[pose]);
- }
- }
-
- }
复制代码
所有资料51hei提供下载:
lcd.rar
(1.02 KB, 下载次数: 39)
|