您的位置:首页 > 其它

(单片机原理与应用)并行口设计数字键盘实验

2015-03-07 13:12 204 查看
一、实验内容
并行口实现数字0~9、A~F、L、U、P、n总共19个键盘,将按键的结果用4位数码管(例如:7SEG-MPX-CA-BLUE)显示(可选——按键控制移位)出来。

二、实验目的

掌握动态显示、动态扫描键盘的工作原理及硬、软件的设计、调试方法

掌握80C51接口硬件电路设计方法及软件编程方法

了解80C51外部中断的使用和编程方法

三、实验设备
DELL台式机 、keilC51版本7、proteus版本6
四、实验电路图





五、程序流程图




[b]六、程序源码

[/b]
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//0-9,A~F,L,U,P,n的数码管断码
uchar code DSY_CODE[]=
{ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x38,0x3e,0x73,0x37
};
sbit P2_0=P2^0;
uchar pre_key=20,key=20;
//延时
void DelayMS(uint ms)
{
uchar t;
while(ms--)
for(t=0;t<120;t++);
}
//键盘矩阵扫描
void keys_scan()
{
uchar temp;
P0=0x0f;
P2_0=0;
DelayMS(1);
//按键后P2_0=0,00001111将变成P2_0=0,0000XXXX,X中有1个为0,3个仍为1
//下面的异或操作会把3个1变成0,唯一的0变成1
temp=P0^0x0f;
//判断按键发生于0~3列中的哪一列
switch(temp)
{
case 1:key=0;break;
case 2:key=1;break;
case 4:key=2;break;
case 8:key=3;break;
}
P0=0xf0;
P2_0=1;
DelayMS(1);
//按键后,P2_0=1,11110000将变成P2_1=X,XXXX0000,X中有1个为0,3个仍为1
//下面的表达式会判断P2_1或者会将高4位移到低4位,并将其中唯一的0变为1,其余为0
if(P2_0==0)
key+=16;
else
{
temp=P0>>4^0x0f;
switch(temp)
{
case 1:key+=0;break;
case 2:key+=4;break;
case 4:key+=8;break;
case 8:key+=12;break;
}
}
}
void main()
{
P1=0x00;
P2_0=0;
while(1)
{
P0=0xf0;
P2_0=1;
if(P0!=0xf0||P2_0!=1)
keys_scan();//扫描键盘获取按键序号Key
if(pre_key!=key)
{
P1=DSY_CODE[key];//显示
pre_key=key;
}
DelayMS(100);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: