矩阵键盘扫描-----反转法
#include<reg52.h>#define uint unsigned int
#define uchar unsigned char
uchar low,high,temp;
void delay(uint t);
void main()
{
while(1)
{
P3=0x0f;
if(P3!=0x0f)
{ delay(100);
low=P3&0x0f;
P3=0xff; //What the hell ??????
P3=0xf0; //如果没了上面那行,此处用 P3=low|0xf0 什么的 同样失效。。。。
high=P3&0xf0;
temp=high+low;
switch(temp)
{
case 0xd7:P0=0x3f;break; //0
case 0xeb:P0=0x06;break; //1
case 0xdb:P0=0x5b;break; //2
case 0xbb:P0=0x4f;break; //3
case 0xed:P0=0x66;break; //4
case 0xdd:P0=0x6d;break; //5
case 0xbd:P0=0x7d;break; //6
case 0xee:P0=0x07;break; //7
case 0xde:P0=0x7f;break; //8
case 0xbe:P0=0x6f;break; //9
}
}
}
}
void delay(uint t)
{
while(t--);
}
-----------------------------------------------------------------------------------------------------------------------
首先 这个程序是正确的,虽然有些地方不足,但是是可以正常工作的。。。
主要是红 {MOD}字体那 就是让我纠结了好久的一个问题,实在是想不出来了 所以来论坛里求助 希望大家能帮帮忙 看一下也行 谢谢了 :)
因为实在是太奇怪了,
如果没有他,
如果我将她该为0x0f;那么高四位(P3.4~P3.7)相当于失效。
如果将他改为0xfe;那么P3.0口就失效。。。
总之就是,这个P3端口必须要置1一下 后面才能使用。
但是从C语言上,对于下面一条语句来说,他是多余的呀,难道和硬件有关吗???
如果有关的话 那这句话究竟起着什么作用呢???
我是在
仿真软件上进行测试的 也没有提示有错误
//键盘扫描函数
uchar Matrixkeyscan()
{
uchar num;
uchar key_lie; //按键扫描函数里用来存储列的变量
uchar key_hang; //存储行的变量
uchar key; //具体按下的键值的编码
P2=0xf0; //1111 0000,行为低电平,列为高电平
key_lie=P2; //读取IO的数值
key_lie=key_lie&0xf0; //与,将低四位屏蔽
if(key_lie!=0xf0) //如果不等,说明有按键按下
{
Delay_ms(10); //去抖动
if(key_lie!=0xf0) //说明确实有按键被按下
{
key_lie=P2; //读取最新的P2值
key_lie=key_lie&0xf 0; //得到最新的列的信息(这两行可以不写,写上更严谨)
//假如第一列的某个按键按下,则key_lie为1110 0000
P2=0x0f; //0000 1111,列为低电平,行为高电平
key_hang=P2; //读取P2口
key_hang=key_hang&0x0f; //将高四位屏蔽掉,得到具体的行的信息,假如第一行的某个按键被按下
//则key_hang为0000 1110
key=key_hang|key_lie; //将行和列的信息相或,1110 0000 |0000 1110=1110 1110,
//可知第一行,第一列的按键被按下
}
while(P2!=0x0f); //等待按键被释放
}
switch(key) //根据按键的数值进行判断
{
case 0xee: num=0;break; //0xee=1110 1110 说明第一个按键被按下,则num的值为0;
case 0xde: num=1;break;
case 0xbe: num=2;break;
case 0x7e: num=3;break;
case 0xed: num=4;break;
case 0xdd: num=5;break;
case 0xbd: num=6;break;
case 0x7d: num=7;break;
case 0xeb: num=8;break;
case 0xdb: num=9;break;
case 0xbb: num=10;break;
case 0x7b: num=11;break;
case 0xe7: num=12;break;
case 0xd7: num=13;break;
case 0xb7: num=14;break;
case 0x77: num=15;break;
case 0x00: num=16;break; //如果没有按键按下,则不显示
}
return num;
}
加油加油加油加油加油
一周热门 更多>