#include"reg52.h"
#define led P0 //定义led数码管连在P0口
#define key P1 //定义矩阵键盘连在P1口
#define LCD1602_D P0 //lcd I/O口连在P0口
#define uchar unsigned char
#define uint unsigned int
sbit E=P2^7; //定义lcd端口
sbit RW=P2^5;
sbit RS=P2^6;
void LcdWriteCom(uchar com); //函数声明
void WriteDat(uchar dat);
void Lcdxs(uchar x,uchar y,uchar dat);
uchar code lcd[]={0x31,0x32,0x33,0x2b,0x34,0x35,0x36,0x2d,0x37,0x38,0x39,0x2a,0x23,0x30,0x2f,0x3d}; // 123+456-789*#0/=
uchar a;
void delay(uint i) //延时函数
{
while(i--)
{;}
}
void keydownup() //矩阵按键扫描程序
{
char b=0;
key=0x0f;
if(key!=0x0f)
{
delay(1000); //延时消抖
if(key!=0x0f)
{
key=0x0f; //检测列 使高四位为低,低四位为高,判断低四位是否有低电平出现(有则key!=0x0f)
switch(key)
{
case 0x07:a=0;break;
case 0x0b:a=1;break;
case 0x0d:a=2;break;
case 0x0e:a=3;break;
}
key=0xf0; //检测行 使高四位为高,低四位为低,判断高四位是否有低电平出现(有则key!=0xf0)
switch(key)
{
case 0x70:a=a; break;
case 0xb0:a=a+4; break;
case 0xd0:a=a+8; break;
case 0xe0:a=a+12;break;
}
while((b<50)&&key!=0xf0) //判断按键按下后是否松开 超时或者按键松开则跳出循环
{
delay(1000);
b++;
}
}
}
}
void LcdWriteCom(uchar com) //写指令函数
{
E=0; //允许使能
RS=0; //指令
RW=0; //写入
LCD1602_D=com;
delay(1);
E=1; //写入时序
delay(1);
E=0;
}
void WriteDat(uchar dat) //写数据函数
{
E=0; //允许使能
RS=1; //数据
RW=0; //写入
LCD1602_D=dat;
delay(1);
E=1; //写入时序
delay(1);
E=0;
}
void Lcdxs(uchar x,uchar y,uchar dat) //显示一个字符的函数
{
uchar t;
if(y==1)
t=0x80+x;
else
t=0xc0+x;
LcdWriteCom(t);
WriteDat(dat);
}
void main()
{
LcdWriteCom(0x38); //开显示
LcdWriteCom(0x0c); //开显示不开光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
delay(100);
while(1)
{
keydownup(); //矩阵按键扫描程序
Lcdxs(0,1,lcd[a]); //显示按键按下后数组中对应的值
}
}
|