一、 实验内容
并行口实现数字0~9、A~F、L、U、P、n总共19个键盘,将按键的结果用4位数码管(例如:7SEG-MPX-CA-BLUE)显示(可选——按键控制移位)出来。
二、 实验目的
掌握动态显示、动态扫描键盘的工作原理及硬、软件的设计、调试方法
掌握80C51接口硬件电路设计方法及软件编程方法
了解80C51外部中断的使用和编程方法
三、 实验设备
DELL台式机 + proteus版本6 + keilC51版本7
四、 实验电路图(可打印)
五、 程序流程图
六、程序源码(可打印)
#include <reg51.h>
void dlms( );
void Keys_Scan();
char PreKey=20,Key=20;
void dlms(char t)
{ char i;
while(t--)
{for( i=200;i>0;i--){}
}
}//delay
void Keys_Scan()
{
char Tmp;
P2=0x00;
P1 = 0x0f;
Tmp = P1 ^ 0x0f; // 列:P1.0-P1.3输出1
switch(Tmp)//读出列数
{
case 1: Key = 0; break;
case 2: Key = 1; break;
case 4: Key = 2; break;
case 8: Key = 3; break;
default: Key= 20;
}
P1=0x00;
P2 = 0x1f;
Tmp = P2^0x1f; //>> 4 ^ 0x0f;//右移
switch(Tmp)
{
case 1: Key += 0; break;
case 2: Key += 4; break;
case 4: Key += 8; break;
case 8: Key += 12;break;
case 16:Key += 16;break;
default: Key=16;
}
dlms(5);
}
void main()
{
char code tab[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,
0xc7,0xc1,0x8c,0x2b};
P3=0x00;
while(1)
{ P1=0x00;
P2=0x1f;
if(P2!= 0x1f)
Keys_Scan();
if(PreKey!= Key)
{
P3 = ~tab[Key];
PreKey = Key;
}
dlms(1000);
}
}