标题:
单片机4x4矩阵键数值读取和显示程序Proteus仿真
[打印本页]
作者:
18896597781
时间:
2021-5-30 10:14
标题:
单片机4x4矩阵键数值读取和显示程序Proteus仿真
4x4矩阵键数值的读取和显示;
按键被按下后只有被松开才会有效果;
多个按键被按下只有按键都被松开最先被按下的按键起效果;
采用共阳极数码管显示;
附件包含完整仿真设计和C程序。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
无标题.png
(58.53 KB, 下载次数: 81)
下载附件
仿真效果
2021-5-30 10:07 上传
单片机源程序如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
/**************物理连线
P1对应数码管;
P2前四位对应矩阵行
P2后四位对应矩阵列
*****************/
#define saomiao P2
#define DB P1
void display(uchar dat); //显示键盘值函数
uchar key_scan( ); //键盘扫描函数
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e }; //0~15数码管代码,共阳极
uchar key; //键盘值
/********************************************************************
延时函数
*********************************************************************/
void delay10ms(void) //延时程序
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
//*****************键盘扫描函数*****************
uchar key_scan()
{
uchar temp;
saomiao=0xfe; //扫描第1行键
temp=saomiao;
temp=temp&0xf0;
if(temp!=0xf0)
delay10ms(); //延时10ms
temp=saomiao;
temp=temp&0xf0; //确认按键被按下
if(temp!=0xf0)
{
temp=saomiao;
switch(temp)
{
case 0xee: //第1行第1列被按下
key=0;
break;
case 0xde: // 第1行第2列被按下
key=1;
break;
case 0xbe: // 第1行第3列被按下
key=2;
break;
case 0x7e: // 第1行第4列被按下
key=3;
break;
default:
break;
}
K1:
temp=saomiao;
temp=temp&0xf0;
while(temp!=0xf0) //等待按键被松开才可以有效果
goto K1;
}
saomiao=0xfd; //扫描第2行键
temp=saomiao;
temp=temp&0xf0;
if(temp!=0xf0)
delay10ms();
temp=saomiao;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=saomiao;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
default:
break;
}
K2: temp=saomiao;
temp=temp&0xf0;
while(temp!=0xf0) //等待按键被松开
goto K2;
}
saomiao=0xfb; //扫描第3行键
temp=saomiao;
temp=temp&0xf0;
if(temp!=0xf0)
delay10ms();
temp=saomiao;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=saomiao;
switch(temp)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
default :
break;
}
K3:
temp=saomiao;
temp=temp&0xf0;
while(temp!=0xf0) //等待按键被松开
goto K3;
}
saomiao=0xf7; //扫描第4行键
temp=saomiao;
temp=temp&0xf0;
if(temp!=0xf0)
delay10ms();
temp=saomiao;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=saomiao;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
default:
break;
}
K4: temp=saomiao;
temp=temp&0xf0;
while(temp!=0xf0) //等待按键被松开
goto K4;
}
return key;
}
void display(uchar dat)
{
DB=table[dat];
}
main()
{
key=0;
while(1)
{
key=key_scan(); //读取按键值
display(key); //显示按键值
}
}
复制代码
所有资料51hei提供下载:
4x4矩阵键.zip
(54.63 KB, 下载次数: 13)
2021-5-30 10:07 上传
点击文件名下载附件
仿真设计和C程序
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1