1、 硬件连接
单片机 P0 口控制数码管的段码
单片机 P2 口低四位控制数码管位码
单片机 P1 口控制矩阵按键
2、 实训例程
#include <reg52.h>
#define row 0x0f //行扫描码
#define column 0xf0 //列扫描码
#define seg_drive P0 //数码管段驱动
#define bit_drive P2 //数码管位驱动
#define key_scan P1 //低四位接行,高四位接列,无按键按下时,值为 0xff
unsigned char key_value_r;//行扫后的键值
unsigned char key_value_c; //列扫后的键值
unsigned char seg_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//段码表
unsigned char bit_code=0xfe;//位码
//延时 10ms,去抖动
void delay10ms(void)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
//行扫描函数
unsigned char row_scan(void)
{
key_scan = key_scan & row;//行扫描
if(key_scan!=0x0f) //判断是否行上有按键按下
{
delay10ms(); //延时去抖动
key_value_r = key_scan; //读行扫后的键值
key_scan = 0xff; //扫描变量回复无按键按下状态
}
else
_nop_(); //逻辑完备
return key_value_r; //返回行扫后的键值
}
//列扫描函数
unsigned char column_scan(void)
{
key_scan = key_scan & column;//列扫描
if(key_scan!=0xf0) //判断是否列上有按键按下
{