单片机高手,帮我看看这个反转发循环扫描矩阵键盘程序,帮我详细的解释哈。

菜鸟智商太低,纸上画了N次了 种感觉不对。看不懂!!
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define uchar unsigned char
#define uint unsigned int

unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
/*------------------------------------------------
函数声明
------------------------------------------------*/
uchar keyscan(void);//键盘扫描
void delay(uint i); //演示程序
/*------------------------------------------------
主函数
------------------------------------------------*/
void main()
{
uchar key;
P2=0x00; //1数码管亮 按相应的按键,会显示按键上的字符
while(1)
{
key=keyscan(); //调用键盘扫描,
switch(key)
{
case 0x7e:P0=dofly[0];break;//0 按下相应的键显示相对应的码值
case 0x7d:P0=dofly[1];break;//1
case 0x7b:P0=dofly[2];break;//2
case 0x77:P0=dofly[3];break;//3
case 0xbe:P0=dofly[4];break;//4
case 0xbd:P0=dofly[5];break;//5
case 0xbb:P0=dofly[6];break;//6
case 0xb7:P0=dofly[7];break;//7
case 0xde:P0=dofly[8];break;//8
case 0xdd:P0=dofly[9];break;//9
case 0xdb:P0=dofly[10];break;//a
case 0xd7:P0=dofly[11];break;//b
case 0xee:P0=dofly[12];break;//c
case 0xed:P0=dofly[13];break;//d
case 0xeb:P0=dofly[14];break;//e
case 0xe7:P0=dofly[15];break;//f
}
}
}
/*------------------------------------------------
键盘扫描程序
------------------------------------------------*/
uchar keyscan(void) //键盘扫描函数,使用行列反转扫描法
{
uchar cord_h,cord_l;//行列值中间变量
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}return(0xff); //返回该值
}
/*------------------------------------------------
延时程序
------------------------------------------------*/
void delay(uint i) //延时函数
{
while(i--);
}

以S10被按下为例说明:
uchar keyscan(void) //键盘扫描函数,使用行列反转扫描法
{
uchar cord_h,cord_l;//行列值中间变量
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下,如果cord_h=0x0f说明无键按下
{
delay(100); //去抖
if(cord_h!=0x0f)//确实有键按下
{
cord_h=P3&0x0f; //开始P3=0x0f,S10按下后P3.1=0,所以P3=0x0d,列线值cord_h=P3&0x0f即cord_h=0x0d;
P3=cord_h|0xf0; //cord_h=0x0d,因为S10闭合,所以P3.5和P3.1都为0,P3=0xdd;
cord_l=P3&0xf0; //cord_l=0xdd&0xf0即cord_l=0xd0
return(cord_h+cord_l);//键盘最后组合码值0xdd;对应case 0xdd:P0=dofly[9];break;显示9
}
}return(0xff); //无键按下返回该值,不显示
}追问

P3=cord_h|0xf0; //cord_h=0x0d,因为S10闭合,所以P3.5和P3.1都为0,P3=0xdd;
这补还是有点糊涂, cord-h==0x0d 0x0d|0xf0==0xfd啊 所以这步P3被赋值了0xfd啊??

追答

是的,如果S10没有闭合0x0d|0xf0是等于0xfd,此处相当于P3一开始等于0xfd,但是由于S10闭合了,瞬间由于外电路的作用P3变成了0xdd。此处要结合电路来理解。

温馨提示:内容为网友见解,仅供参考
无其他回答

单片机高手,帮我看看这个反转发循环扫描矩阵键盘程序,帮我详细的解释哈...
以S10被按下为例说明:uchar keyscan(void) \/\/键盘扫描函数,使用行列反转扫描法 { uchar cord_h,cord_l;\/\/行列值中间变量 P3=0x0f; \/\/行线输出全为0 cord_h=P3&0x0f; \/\/读入列线值 if(cord_h!=0x0f) \/\/先检测有无按键按下,如果cord_h=0x0f说明无键按下 { delay(...

51单片机键盘矩阵扫描代码的理解
MOV P2,A 是把扫描码赋给P2口,其实是赋给P2口的低四位,进行扫描;MOV A,P2 是读取P2口的值,后面一句把低四位屏蔽了,最终还是读取了高四位

单片机4×4矩阵键盘扫描编程问题(里面详细,欢迎高手)
扫描第一行,就是将第一行电平置为低电平,其他的都为高,扫描哪一行就让哪一行的电平置零,其他行为高电平。这就是第一个问题。在没有键按下的时候,列线全部是高电平,有第一行的键按下的时候,相应的列线就为低电平了,n=P1;n&=0xf0;if(n!=0xf0)这几句就是判断有没有键按下。在第...

关于51单片机矩阵键盘的问题。
(2)4X4 矩阵键盘的8根线直接连在IO上,而独立按键有一根线固定是接地的,这就意味着必须采取扫面或者线反转的方法。比如其中一根行线赋0,相当于这一行的四个按键变成了四个独立按键,在读取列线的值就知道了究竟哪个按键被按下了。 此时P3口就出现了特定的电平组合,相当于特征码了,然后再...

单片机串口通信和矩阵键盘的程序怎么写,请教高手!
串行通信是有中断的,按道理不会与键盘口冲突,那就是程序的问题了

...哪位高手能帮忙把下面按键扫描程序改成用定时器对按键进行定时扫描啊...
功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。输入 : 无 输出 : 按键值 \/ uchar Keyscan(void){ uchar i,j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};for(j=0; j<4; j++){ P1 = Buffer[j];temp = 0x01;for(i=0; i<4; i++){ if(...

单片机串口通信与矩阵键盘
你的按键是装在P3口,在判断第二行按键时你让P3口输出11111101(0xfd),也就让TX一直为0,所以...串口当然不会输出你按下的东西了...

...写4*4的矩阵按键程序啊,还要加蜂鸣器的那种程序,急用,拜托拜托...
矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,...

单片机矩阵键盘输入的数字怎么存放到数组中,a[10]数组中个元素有键盘...
嗯,你应该是取到键值就把它放到数组中吧,然后把取建的标志置为0对吧,但是单片机扫描速度很快,你按下去到提起手来单片机都扫了很多次了,即使标志被指为0又会很快被置为1的,然后又继续赋值了,你应该做个松键程序,跟按键程序差不多,也要消除抖动,确定按键被提起来后,再给数组赋值 ...

一个4*4键盘控制两块单片机的问题!!!求教高手!!!
可以尝试下面的思路(假设4*4矩阵键盘,4根行线接P1.0~P1.3口,4根列线接P2.0~P2.3口键盘扫描机制:列线分别顺序输出0111、 1011、 1101、 1110,分别在相应时刻读入P1口状态)1、P2口全部输出高电平 2、读入P2口状态,有0则说明另一台单片机在扫描,则退出,等待一段时间再扫描。3、将...

相似回答
大家正在搜