- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- /**************1602部分******************/
- sbit lcden=P1^2;
- sbit lcdrs=P1^0;
- sbit lcdrw=P1^1;
- sbit psdat=P3^4;
- sbit psclk=P3^3;
- /*char code Tab[]={'0','1','2','3','4','5','6','7','8',
- '9','A','B','C','D','E','F'};*/
- char code Tab[]="0123456789abcdef";
- uchar key[3];
- uchar numbit,keyv,keynum,m,n,o,p,q,r;
- void delay(uint z) //延时子程序
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_com(uchar com)//定义一个带参数的写命令子程序
- {
- lcdrs=0; //1602的rs为0时,接收命令,为1时接收数据
- P0=com;//把void write_com(uchar com)中的COM中的数据给P0口
- delay(2);
- lcden=1;
- delay(2);
- lcden=0;
- delay(2);
- }
-
- void init_1602()//定义一个初始化子程序
- {
- lcden=0;
- lcdrw=0;
- write_com(0x38);//调用 write_com子程序并把0x38赋给P0口,显示模式打开
- write_com(0x0f);//调用 write_com子程序并把“开显示,显示光标,光标闪烁”指令码赋给P0口
- write_com(0x06);//调用 write_com子程序并把“地址指针加1,整屏不移动”指令码赋给P0口
- write_com(0x80);//数据指针初始化,让指针指向最左端,显示从第一行开始
- write_com(0x01);//调用 write_com子程序并把"清零指"令码赋给P0口
- }
-
- void write_dat(uchar dat)//定义一个带参数的写数据子程序
- {
- lcdrs=1; //1602的rs为0时,接收命令,为1时接收数据
- P0=dat;//把void write_shu(uchar shu)中的COM中的数据给P0口
- delay(2);
- lcden=1;
- delay(2);
- lcden=0;
- delay(2);
- }
-
- /******************/
-
- void main()
- {
- init_1602();
- IT1=1;//接P3^3,所以用外部中断1,用下降沿IT1=0是用低电平
- EX1=1;// 打开外部中断1。
- EA=1;//打开总中断
- while(1)
- {
- if(keynum==3)
- {
- keynum=0;
- m=key[0]/16;
- n=key[0]%16;
- o=key[1]/16;
- p=key[1]%16;
- q=key[2]/16;
- r=key[2]%16;
- write_com(0x80);
- write_dat(Tab[m]);
- write_dat(Tab[n]);
- write_dat(Tab[o]);
- write_dat(Tab[p]);
- write_dat(Tab[q]);
- write_dat(Tab[r]);
- }
-
- }
- }
- void int1() interrupt 2
- {
- if((numbit>0)&&(numbit<9))
- {
- keyv=keyv>>1;
- if(psdat)
- keyv=keyv|0x80;
- }
- numbit++;
- if(numbit>10)
-
- {
- numbit=0;
- key[keynum]=keyv;
- keynum++;
- }
- }
|