使用某C51学习板,编写一个C51程序,实现如下功能:
1)启动时,数码管显示11, 代表第1行第1列
2)按下矩阵键盘中某键时,数码管显示按键对应的行号和列号,例如23代表2行3列
#include <reg51.h>
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义矩阵按钮的端口
#define AnNiu P1
//定义数码管段码口
#define SMG P0
//定义数码管位选信号控制脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
//共阴极数码管显示0~F的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
u16 x=1;//定义一个变量存储按键的值
u16 num=1;//定义一个变量存储按键返回的值
//延时
void delay_10us(u8 ten_us)
{
while(ten_us--);
}
//矩阵按键
u16 key_discern(void)
{
AnNiu=0xf7;//第一列为低电平
if(AnNiu!=0xf7)
{
delay_10us(1000);
switch(AnNiu)
{
case 0x77:x=1;break;
case 0xb7:x=5;break;
case 0xd7:x=9;break;
case 0xe7:x=13;break;
}
}
AnNiu=0xfb;//第二列为低电平
if(AnNiu!=0xfb)
{
delay_10us(1000);
switch(AnNiu)
{
case 0x7b:x=2;break;
case 0xbb:x=6;break;
case 0xdb:x=10;break;
case 0xeb:x=14;break;
}
}
AnNiu=0xfd;//第三列为低电平
if(AnNiu!=0xfd)
{
delay_10us(1000);
switch(AnNiu)
{
case 0x7d:x=3;break;
case 0xbd:x=7;break;
case 0xdd:x=11;break;
case 0xed:x=15;break;
}
}
AnNiu=0xfe;//第四列为低电平
if(AnNiu!=0xfe)
{
delay_10us(1000);
switch(AnNiu)
{
case 0x7e:x=4;break;
case 0xbe:x=8;break;
case 0xde:x=12;break;
case 0xee:x=16;break;
}
}
return x;
}
//显示数码管
void smg_display(void)
{
//行的数码管
LSC=1;LSB=1;LSA=1;//译码器显示第8个数码管
SMG=gsmg_code[(num-1)/4+1];//传送段选数据
delay_10us(100);//延时一段时间,等待显示稳定
SMG=0x00;//消隐
//列的数码管
LSC=1;LSB=1;LSA=0;//译码器显示第7个数码管
SMG=gsmg_code[(num-1)%4+1];//传送段选数据
delay_10us(100);//延时一段时间,等待显示稳定
SMG=0x00;//消隐
}
void main()
{
while(1)
{
num=key_discern();
smg_display();
}
}