按键输入和LED数码管扫描显示实验
按键输入和LED数码管扫描显示实验
设计内容:
给8个按键键盘的每个键定义一个功能,从左到右按键一次按下时,分别显示数字1-8,当有两个及以上的按键按下时,显示数字9。LCD初始显示个人学号,当有按键按下时,最后一位显示对应的数字。
实验程序:
#include
sbit key=P0^6; //键盘公共线,见原理图
sbit ls1=P0^2; //千位公共极
sbit ls2=P0^3; //百位公共极
sbit ls3=P0^4; //十位公共极
sbit ls4=P0^5; //个位公共极
unsigned char keyval; //读取的键值
#define Dat P1 //数据输出端
char a;
char b[4]={0,3,3,0}; //初始值为学号后四位
unsigned char tab[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//延时----------------------------
Delay(unsigned int t)
{ while(t--); }
//显示----------------------------
void Display(unsigned char mun)
{ unsigned char j;
for(j=0;j<50;j++)
{ Dat=a;
Dat=tab[b[0]]; //把得到7段显示码数据送P1端口
ls1=0; //点亮千位
Delay(100); //显示一会
ls1=1; //关闭,显示下一位
Dat=tab[b[1]];
ls2=0; //点亮百位
Delay(100);
ls2=1;
Dat=tab[b[2]];
ls3=0; //点亮十位
Delay(100);
ls3=1; //个位
Dat=tab[b[3]];
ls4=0;
Delay(100);
ls4=1;
}
}
Dat=0xff; //P1恢复为0xff
}
//--键盘扫描程序-------------------------------------- Scankey()
{ unsigned char i;
key=0; //拉低键盘公共线
if(Dat!=0xff) //有键按下
{ Delay(1000); //消抖动
if(Dat!=0xff) //有键按下
{ i=~Dat;
a=Dat; //读取键盘状态,
switch(i)
{ case 0x01: keyval=0x01;break; //K1
case 0x02: keyval=0x02;break; //K2
case 0x04: keyval=0x03;break; //K3
case 0x08: keyval=0x04;break; //K4
case 0x10: keyval=0x05;break; //K5
case 0x20: keyval=0x06;break; //K6
case 0x40: keyval=0x07;break; //K7
case 0x80: keyval=0x08;break; //K8
default: keyval=0x09;break; } //其它双键按下不处理,均为9 b[3]=b[2];
b[2]=b[1];
b[1]=b[0];
b[0]=keyval;
while(Dat!=0xff)
{key=1; //暂时关闭键盘,不干扰显示
Display(keyval); //等待按键抬起
key=0; //开启键盘检测
}
}
}
key=1; //释放键盘公共线
}
//--主程序--------------------------------------------------------- main()
{
while(1)
{ Display(keyval); //显示
Scankey(); //键盘扫描
}
}