51单片机学习笔记,4*4矩阵键盘
扫描二维码
随时随地手机看文章
今天学习了下矩阵键盘,
4*4, 分别代表0~F这16个数字
我们按了哪个键就显示到数码管上
看完郭老师讲解原理后就自己动手写了,郁闷的是
在keil软件中,我在switch-case语句中 少了个冒号,竟然编译通过!
结果当然不正确了,然后我再keil中调试代码,那更郁闷了,P3口在扫描到第2行键盘时就
会复位成0xff,怎么赋值都没用,其实是没写冒号啊!
调了半天都不行,最后不得不将STC89C52RC换上仿真芯片SST89E516,在线调试后才发现的错误,
然后参考书上的代码才调试成功的,表示无语~~~
mark下
C代码
#include
#include"MY51.H"
voidshowKey(uint8num);//静态显示
voidkeyScan();
voidmain()
{
showKey(18);//初始显示的是6个负号
while(1)
{//循环检测
keyScan();
}
}
voidshowKey(uint8num)
{
P0=0xc0;//11000000打开6个数码管
wela=open;
wela=lock;
P0=table[num];
dula=1;
dula=0;
}
voidkeyScan()
{
uint8num=0;//定义显示的数字
uint8temp=0;//P3口回读信息
uint8i=0;//定义矩阵键盘行号索引
for(i=0;i<4;i++)//共4行
{
P3=_crol_(0xfe,i);//扫描的行索引号,从第0行到第3行
temp=P3;//读取P3口
temp=temp&0xf0;//提取高4位
if(temp!=0xf0)//按键了
{
delayms(5);//消抖
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//真的按键了
{
switch(temp)
{
case0xe0://11100000
{
num=0+4*i;
break;
}
case0xd0://11010000
{
num=1+4*i;
break;
}
case0xb0://10110000
{
num=2+4*i;
break;
}
case0x70://01110000
{
num=3+4*i;
break;
}
default:
{
num=18;//18号索引是负号
led7=0;//按了不该按的指示灯
break;
}
}
while(1)//松开按键检测
{
temp=P3;//读取P3口
temp=temp&0xf0;//提取高4位
if(temp==0xf0)//松开按键了
{
delayms(5);
temp=P3;
temp=temp&0xf0