#include <reg52.h>
#define key_port P0
#define s1_1 1
#define s1_2 2
#define s1_3 3
#define s1_4 4
#define s2_1 5
#define s2_2 6
#define s2_3 7
#define s2_4 8
#define s3_1 9
#define s3_2 10
#define s3_3 0
#define s3_4 11
#define nokey 255
char key_time=0;
bit key_continue;
sbit beep=P1^5;
/*------------------------------------------------------
fuction:scan key
--------------------------------------------------------*/
key_scan(void)
{
static unsigned char key_state,key_val,key_return;
switch (key_state)
{
case 0: //状态0:判断有无按键
key_return=255;
key_port=0x0f;
key_val=key_port;
if(key_val!=0x0f) key_state++; //有按键按下,转入状态1,以消抖并确认键值。
break;
case 1: //状态1:取键值状态
if(key_val!=0x0f) //仍有按键,判断键值
{
key_port=0xf0;
key_val=key_val||key_port;
switch (key_val)
{
case 0xed:
key_return=s1_1;
break;
case 0xdd:
key_return=s1_2;
break;
case 0xbd:
key_return=s1_3;
break;
case 0x7d:
key_return=s1_4;
break;
case 0xeb:
key_return=s2_1;
break;
case 0xdb:
key_return=s2_2;
break;
case 0xbb:
key_return=s2_3;
break;
case 0x7b:
key_return=s2_4;
break;
case 0xe7:
key_return=s3_1;
break;
case 0xd7:
key_return=s3_2;
break;
case 0xb7:
key_return=s3_3;
break;
case 0x77:
key_return=s3_1;
break;
}
key_state++; //取值结束,转入状态2
}
else key_state--; //无按键,转入状态0
break;
case 2:
if(key_port==0xf0)
{
key_state=0;
key_continue=0;
}
else if(++key_time>=100)
{
key_continue=1;
key_time=0;
}
break;
}
return key_return;
}
51单片机矩阵键盘反转法扫描,按键后在lcd上显示的问题
主程序写的不对,这样写,开机后只读一次键盘,可是还没有按键就过去了,然后进入死循环了 while(1);这是死循环。改成这样 void main(){ unsigned char num;lcd_init();while(1) \/\/这行不能打分号;{ num=key_num();lcd_onedis(0,1,num);} } ...
关于51单片机矩阵键盘的问题。
(1)P3口是准双向IO口(注意与双向IO口的区别),它 的硬件结构决定着,读取之前先写1,再读取,读取的结果才可能是正确的,你可以区域查查书。(2)4X4 矩阵键盘的8根线直接连在IO上,而独立按键有一根线固定是接地的,这就意味着必须采取扫面或者线反转的方法。比如其中一根行线赋0,相当于...
51单片机 键盘扫描程序
P2的按键扫描跟实时钟模块共用IO了,虽然几率很小但是还是会有几率误触发导致数据读取错误。
一个关于单片机键盘行列反转扫描法的问题
uchar keyscan()\/\/键盘扫描,使用行列反转扫描法{ uchar high,low,key = 0; \/\/这地方最好初始化0 P1=0x0f; low=P1&0x0f; if(low!=0x0f)\/\/检测有无按键按下 { delayms(5);\/\/去抖 low = P1&0x0f; \/\/再读取一次P1,不然下面的if就没意义了 if(low!=0x...
键盘矩阵行反转法的讲解 有程序有注释 但是就是不明白它怎么实现的...
1、行反转法的基本概念是:行列线的交叉位置布置按键。所有行和列加上拉电阻。所有行作输出先送低电平,然后读入列值。 如果有任意键按下,那么一定对应列值有0出现,也就知道了按下的键所在列。反过来驱动这一列为0,其他列为1。把行作输入。就可以判断按下的键所在行。2、掌握8255的接口。如何...
单片机矩阵键盘反转扫描问题
A)=A&B)|(A&B)|notA & B =B 2、由于单片机的计算速度是微妙级的,所以在执行 while((KeyPort&0xf0)!=0xf0);之前可以认为按键都是被按下的,这样的话,由于被按下,即使人为的给KeyPort复值,他的有效周期大约只有一条语句的时间,之后便会被硬件还原 如果对的话,就采纳吧,都夜里一点多...
...程序中的这个(键盘扫描函数,使用行列反转扫描法)
你用的是4x4的矩阵键盘的行列反转扫描吧,这种方法确定一个键码要分成3步:第一步:将行IO置低电平,列IO置高电平,读数据。按下任意键时,将有一个列IO被拉低,于是读到类似00001011的数据 第二步:将行IO置高电平,列IO置低电平,重复第一步,读到类似11010000的数据cord_l=P3&0xf0;本句取...
...帮我看看这个反转发循环扫描矩阵键盘程序,帮我详细的解释哈。_百...
以S10被按下为例说明:uchar keyscan(void) \/\/键盘扫描函数,使用行列反转扫描法 { uchar cord_h,cord_l;\/\/行列值中间变量 P3=0x0f; \/\/行线输出全为0 cord_h=P3&0x0f; \/\/读入列线值 if(cord_h!=0x0f) \/\/先检测有无按键按下,如果cord_h=0x0f说明无键按下 { delay(...
外设键盘的工作原理
一般在扫描法中分两步处理按键,首先是判断有无键按下,如行线有一个为低,则有键按下。当判断有键按下时,使列线依次变低,读行线,进而判断出具体哪个键被按下。 (2)线反转法。 扫描法是逐行或逐列扫描查询,当被按下的键处于最后一列时,要经过多次扫描才能最后获得此按键所处的行列值。而线反转法则显的...
数控车床怎么编程?
详情请查看视频回答