矩阵键盘按键LED显示键值
2010-02-07 20:44
543 查看
这两天事情很忙,有时间的时候才来调试一下程序。想调出一个LED显示矩阵键盘按键程序,调试了很久。先调其中的一行按键键值很OK。接着就调试4行按键程序,这其中出现了问题。
写的程序语法没有错误,逻辑上有错误很难找。最后参考了别人的程序,调出了满意的结果。
写矩阵一行的程序时,主程序:
main()
{
init();
while(1)
{
keyscan();//键盘扫描程序,返回一个值全局变量keynum
display(keynum);
}
}
单独调试第三行的时候没有出现问题,能得出正确的键值。
这样应该是不会出现错误。但是&与,&&按位与前者为总线操作,后者位操作。
&是位与运算;&&是逻辑与运算。
举例:a=0xfe;b=0x31;
则:a&b=0x30; 返回的是数据。
a=0xfe;b=0x31;c=0x11;d=0x00;
则:(a>b)&&(b>c)=1(真)
(a>b)&&(c>a)=0(假,c小于a)
a&&b (真,对于不为0的数全为真,即 真“与”真,结果:真)
a&&d (假,a真d假,即 真“与”假,结果:假)
返回的是布尔值。(只有1(真)和0(假))
等待松手程序和确认按键程序中都写成了,temp=P3;temp=temp&&0xf0;
所以出现了错误。
正确的程序为temp=P3;temp=temp&0xf0;
松手检测在确认按键后。
经过下列程序调试,实验成功。
/********************************************/
/**********矩阵键盘按键显示******************/
/***************************2010年2月7日21时*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar keynum;
sbit duan=P2^6;
sbit wei=P2^7;
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39 ,0x5e,0x79,0x71};
void display(uchar num);
/******延时XMS************
**************************/
void delay(uchar xms)
{
uchar i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/******初始化*******************
********************************/
void init()
{
duan=1;
P0=0x00;//初始时关段显示
duan=0;
wei=1;
P0=0x00;//位选全部选中
wei=0;
}
keyscan()
{
uchar temp;
P3=0xfe;//第三行 1111 1110
temp=P3;
temp=temp&0xf0;//屏蔽低四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0x7e:
keynum=15;
break; //0111 1110
case 0xbe:
keynum=14;
break;
case 0xde:
keynum=13;
break;
case 0xee:
keynum=12;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(keynum);
}
}
P3=0xfd; //第二行1111 1101
temp=P3;
temp=temp&0xf0;//屏蔽低四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0x7d:
keynum=11;
break;
case 0xbd:
keynum=10;
break;
case 0xdd:
keynum=9;
break;
case 0xed:
keynum=8;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(keynum);
}
}
P3=0xfb;//第一行1111 1011
temp=P3;
temp=temp&0xf0;//屏蔽低四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0x7b:
keynum=7;
break;
case 0xbb:
keynum=6;
break;
case 0xdb:
keynum=5;
break;
case 0xeb:
keynum=4;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(keynum);
}
}
P3=0xf7; //第零行 1111 0111
temp=P3;
temp=temp&0xf0;//屏蔽低四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0x77:
keynum=3;
break; //1110 1110
case 0xb7:
keynum=2;
break; //1101 1110
case 0xd7:
keynum=1;
break; //1011 1110
case 0xe7:
keynum=0;
break; //0111 1110
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(keynum);
}
}
}
void display(uchar num)
{
duan=1;
P0=table[num];
duan=0;
// delay(500);//时间足够短让人分辨不出来闪烁的效果
}
void main()
{
init();
while(1)
{
keyscan();
//display();
}
}
写的程序语法没有错误,逻辑上有错误很难找。最后参考了别人的程序,调出了满意的结果。
写矩阵一行的程序时,主程序:
main()
{
init();
while(1)
{
keyscan();//键盘扫描程序,返回一个值全局变量keynum
display(keynum);
}
}
单独调试第三行的时候没有出现问题,能得出正确的键值。
这样应该是不会出现错误。但是&与,&&按位与前者为总线操作,后者位操作。
&是位与运算;&&是逻辑与运算。
举例:a=0xfe;b=0x31;
则:a&b=0x30; 返回的是数据。
a=0xfe;b=0x31;c=0x11;d=0x00;
则:(a>b)&&(b>c)=1(真)
(a>b)&&(c>a)=0(假,c小于a)
a&&b (真,对于不为0的数全为真,即 真“与”真,结果:真)
a&&d (假,a真d假,即 真“与”假,结果:假)
返回的是布尔值。(只有1(真)和0(假))
等待松手程序和确认按键程序中都写成了,temp=P3;temp=temp&&0xf0;
所以出现了错误。
正确的程序为temp=P3;temp=temp&0xf0;
松手检测在确认按键后。
经过下列程序调试,实验成功。
/********************************************/
/**********矩阵键盘按键显示******************/
/***************************2010年2月7日21时*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar keynum;
sbit duan=P2^6;
sbit wei=P2^7;
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39 ,0x5e,0x79,0x71};
void display(uchar num);
/******延时XMS************
**************************/
void delay(uchar xms)
{
uchar i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/******初始化*******************
********************************/
void init()
{
duan=1;
P0=0x00;//初始时关段显示
duan=0;
wei=1;
P0=0x00;//位选全部选中
wei=0;
}
keyscan()
{
uchar temp;
P3=0xfe;//第三行 1111 1110
temp=P3;
temp=temp&0xf0;//屏蔽低四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0x7e:
keynum=15;
break; //0111 1110
case 0xbe:
keynum=14;
break;
case 0xde:
keynum=13;
break;
case 0xee:
keynum=12;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(keynum);
}
}
P3=0xfd; //第二行1111 1101
temp=P3;
temp=temp&0xf0;//屏蔽低四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0x7d:
keynum=11;
break;
case 0xbd:
keynum=10;
break;
case 0xdd:
keynum=9;
break;
case 0xed:
keynum=8;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(keynum);
}
}
P3=0xfb;//第一行1111 1011
temp=P3;
temp=temp&0xf0;//屏蔽低四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0x7b:
keynum=7;
break;
case 0xbb:
keynum=6;
break;
case 0xdb:
keynum=5;
break;
case 0xeb:
keynum=4;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(keynum);
}
}
P3=0xf7; //第零行 1111 0111
temp=P3;
temp=temp&0xf0;//屏蔽低四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0x77:
keynum=3;
break; //1110 1110
case 0xb7:
keynum=2;
break; //1101 1110
case 0xd7:
keynum=1;
break; //1011 1110
case 0xe7:
keynum=0;
break; //0111 1110
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(keynum);
}
}
}
void display(uchar num)
{
duan=1;
P0=table[num];
duan=0;
// delay(500);//时间足够短让人分辨不出来闪烁的效果
}
void main()
{
init();
while(1)
{
keyscan();
//display();
}
}
相关文章推荐
- [置顶] ARM开发(4)基于STM32的矩阵键盘按键控制TM1629A LED显示
- 基于Proteus+8051汇编应用实例系列之四--4×4键盘矩阵控制条形LED显示
- 用扫描法读出4×4矩阵键盘,在数码管显示按键值
- 4.6.第十一个实验--使用数码管显示矩阵按键的键值
- 定制的小键盘输入数字显示的LED计分显示屏
- 4乘4矩阵键盘扫描物理键值
- 第十六节:矩阵键盘的组合按键触发
- 用树莓派控制8*8led矩阵显示红心
- USB键盘数据格式以及按键键值
- 数码管显示矩阵键盘扫描程序
- 用遥控器控制led灯亮以及LCD上显示相应的按键数
- 并行口实现数字0~9、A~F、L、U、P、n总共19个键盘,将按键的结果用7段数码管(例如:7SEG-MPX-CA-BLUE)显示(可选——按键控制移位)出来
- bind命令_Linux bind 命令用法详解:显示或设置键盘按键与其相关的功能
- linux中键盘按键键值修改
- 独立按键数码管显示键值
- 键盘按键键值
- os如何处理键盘的所有按键,显示or不显示,显示是如何显示
- 51单片机STC89C52 矩阵键盘数码管显示
- JS实现获取键盘按下的按键并显示在页面上的方法
- os如何处理键盘的所有按键,显示or不显示,显示是如何显示