矩阵键盘程序解析,扫描和判断程序如下。求注释!!真心看不懂啊!4*4矩阵
因为不知道你的单片机板子的电路图,我用我自己的板子写的代码发给你,你可以参考我的矩阵键盘扫描的方法,仿照着写。(这个不难的,用心看看就能懂的)
/********************************************************************
* 文件名 : 矩阵键盘.c
* 描述 : 该文件实现了 4 * 4 键盘的试验。通过数码管的最后一位来显示
当前的按键值。
* 创建人 : 东流,2012年2月7日
*********************************************************************/
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 名称 : Keyscan()
* 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
* 输入 : 无
* 输出 : 按键值
***********************************************************************/
uchar Keyscan(void)
{
uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};//让矩阵键盘的每行分别为低电平
for(j=0; j<4; j++)
{
P1 = Buffer[j];
temp = 0x10;
for(i=0; i<4; i++)
{
if(!(P1 & temp)) //判断P1口高4位某一行为低电平
{
return (i+j*4);//返回键码
}
temp <<= 1;
}
}
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
uchar Key_Value; //读出的键值
P2 = 7;
while(1)
{
P1 = 0xf0;
if(P1 != 0xf0)//判断有无按键按下
{
Delay_1ms(20);//按键消抖
if(P1 != 0xf0)//第二次判断有无按键按下
{
Delay_1ms(20); //按键消抖
if(P1 != 0xf0)//第三次判断有无按键按下
{
Key_Value = Keyscan();
}
}
}
P0 = table[Key_Value]; //数码管赋值
}
}
呵呵,一楼的回答,是我两年多前,发表的博文。
搜:
做而论道 用扫描法读出4×4矩阵键盘,在数码管显示按键值
百度一下,即可。
PANDUAN: MOV P3,#0FFH //程序开始 p3口全部拉高
CLR P3.4 //P3.4置零 P3=0XEF
MOV A,P3 //将P3端口的值赋给A---0XEF
ANL A,#0FH //将上一步得到的值 和0X0F逻辑与---也就是取P3口低四位0X0F----结果存到A
XRL A,#0FH //A里面的值 与0X0F异或 ---结果为0
JZ SW1 //如果为零 则跳转到SW1,否则往下执行---含义就是如果为零则代表无键按下 否则有
LCALL DELAY10MS //延时10MS--有按键按下, 软件消抖
JZ SW1 //继续判断---确定有键按下 但是不确定是哪个键按下 --接下来判断哪个键按下
MOV A,P3 // 以解释
ANL A,#0FH //以解释
CJNE A,#0EH,K1 //A不等于0x0E 则跳转到k1, 否则往下执行
MOV COUNT,#0 //count置零
LJMP DK //跳转到DK
K1: CJNE A,#0DH,K2
MOV COUNT,#4
LJMP DK
K2: CJNE A,#0BH,K3
MOV COUNT,#8
LJMP DK
K3: CJNE A,#07H,K4
MOV COUNT,#12
K4: NOP
LJMP DK
SW1: MOV P3,#0FFH //以上分析的结果--程序跳转到这执行
CLR P3.5 //与之前的分析很类似--以下不在分析
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ SW2
LCALL DELAY10MS
JZ SW2
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,K5
MOV COUNT,#1
LJMP DK
K5: CJNE A,#0DH,K6
MOV COUNT,#5
LJMP DK
K6: CJNE A,#0BH,K7
MOV COUNT,#9
LJMP DK
K7: CJNE A,#07H,K8
MOV COUNT,#13
K8: NOP
LJMP DK
SW2: MOV P3,#0FFH
CLR P3.6
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ SW3
LCALL DELAY10MS
JZ SW3
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,K9
MOV COUNT,#2
LJMP DK
K9: CJNE A,#0DH,KA
MOV COUNT,#6
LJMP DK
KA: CJNE A,#0BH,KB
MOV COUNT,#10
LJMP DK
KB: CJNE A,#07H,KC
MOV COUNT,#14
KC: NOP
LJMP DK
SW3: MOV P3,#0FFH
CLR P3.7
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ SW4
LCALL DELAY10MS
JZ SW4
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,KD
MOV COUNT,#3
LJMP DK
KD: CJNE A,#0DH,KE
MOV COUNT,#7
LJMP DK
KE: CJNE A,#0BH,KF
MOV COUNT,#11
LJMP DK
KF: CJNE A,#07H,KG
MOV COUNT,#15
KG: NOP
LJMP DK
SW4: LJMP PANDUAN
DK: RET
ZBV
57
您有没有完好的矩阵键盘处理程序啊?非常需要,我想要能够存储任意值的...
其实矩阵键盘的扫面处理特别简单,不需要逐行扫描,给你提个思路,希望对你有帮助,最好是自己写代码,在实践中学习。举一个例子,如图所示,P1口接矩阵按键,低四位接行,高四位接列。矩阵键盘的扫描就是三个步骤:1:判断是否有按键按下,同时要注意去抖动。明白一个道理:矩阵键盘的任何一个按键...
51单片机。4*4矩阵键盘扫描
矩阵键盘扫描是分两次的。比方说,51单片机,默认各口是高电平,首先,比方图中P1.0-P1.3给低电平(注:你的图太小,我就把接矩阵键盘的各口当作P1.0-P1.7),若图中无键被按下,P1.4-P1.7扫描出来的就都是高电平,若有键被按下,则P1.4-P1.7某根线就会是低电平,但是比方说...
C语言矩阵键盘函数疑问
看程序中P1.0-P1.3是行扫描输出,P1.4-P1.7是扫描输入。所以原理是P1.0-P1.3中每次只有一个引脚输出0,其余输出1,然后读取P1.4-P1.7是否有引脚为0;如果有0说明有按键按下,如果全1说明没有按键按下。scancode这个变量就是用于控制P1.0-P1.3(P1 = scancode;由这句输出)中每次...
矩阵式键盘的主要工作方式有
矩阵式键盘的主要工作方式有编程扫描方式和中断扫描方式。根据查询相关公开信息显示,在矩阵键盘的软件接口程序中,常使用的按键识别方法有行扫描法和线反转法。这两种方法的基本思路是采用循环查循的方法,反复查询按键的状态。
单片机简答题 以4×4矩阵键盘为例,写出该键盘按键处理扫描流程_百度...
uchar kbscan(void){ unsigned char sccode,recode;P1=0x0f; \/\/发0扫描,列线输入 if ((P2 & 0x0f) != 0x0f) \/\/有键按下 { delay(20); \/\/延时去抖动 if ((P1&0x0f)!= 0x0f){ sccode = 0xef; \/\/逐行扫描初值 while((sccode&0x01)!=0){ P1=sccode;if((P1&...
键盘扫描的工作原理 要程序的 哪位高人给个答案啊
P2口是4X4矩阵键盘 P0口是8个发光二极管,用来显示按键 \/ include<reg52.h> unsigned char Trg;unsigned char Cont;void KeyRead( void ){ unsigned char ReadData;P2=0x0f;ReadData=P2;P2=0xf0;ReadData=(ReadData | P2)^0xff;Trg = ReadData & (ReadData ^ Cont);Cont = ReadData;}...
初学单片机矩阵键盘逐行扫描,问题困扰好久
P3=0x7f;\/\/高4位作为输出,低4 位为输入,作为输入时要先将其置1 每次扫描时高4位中只有一根线是0,如果没有按键按下,高4位中的0就不会传到低4位上 那麼读P3的低4位,它将仍保持原状态4个1(0x0f)反之,若读到的不是4个1,说明有按键按下了 temp=P3;\/\/将P3口的状态读回来 temp...
arduino 4*4矩阵键盘 怎么用
2 PIN 的排针插到Arduino的8,9脚,5 PIN 的排针插到2~5脚定义Arduino IO口byte rowPins[ROWS] = {9, 8, 7, 6}; \/\/连接到行数字小键盘的管脚byte colPins[COLS] = {5, 4, 3, 2};\/\/连接到列数字小键盘的管脚示例程序 [C++]include <Keypad.h> const byte ROWS = 4; \/\/four ...
这样的4×4矩阵键盘工作原理是什么?单片机该如何去识别是哪个键按下...
扫描的工作方式,就是 P1.7~P1.5 轮流 输出 低电平,然后读入P1.3~P1.0,判断,如果有按下,就是低电平,没按下的都是高电平,当然要延时10ms,去抖动。单片机的c语言应用程序设计(修订版)http:\/\/www.gougou.com\/search?search=%E5%8D%95%E7%89%87%E6%9C%BA%E7%9A%84c%E8%AF%...
设计一个3 行×4列的矩阵键盘,采用行扫描法编写程序,当有按键动作时,能...
uchar keyscan(void); \/\/键盘 void SYS_LED(void); \/\/指示灯 uchar a=0;uchar keynum;void delay_50us(uint t){ uchar j;for(;t>0;t--)for(j=19;j>0;j--);} void SYS_LED(){ SYSLED = 0;delay_50us(100);SYSLED = 1;} void display( uchar keynum) \/\/根据key...
宫芳山地: 假设按下的是S1键进行如下检测(4*4键盘)先在P3口输出 p3 00001111低四位 行会有变化 cord_h =00001111&00001110 =00001110if !=00001111延时0.1uscord_h=00001110&00001111=00001110if !=00001111P3再输出11111110...
东昌府区19758903980: 我想要一份矩阵键盘的操作说明书 - ?
宫芳山地: 其实矩阵键盘的扫面处理特别简单,不需要逐行扫描,给你提个思路,希望对你有帮助,最好是自己写代码,在实践中学习. 举一个例子,如图所示,P1口接矩阵按键,低四位接行,高四位接列. 矩阵键盘的扫描就是三个步骤: 1:判断是否...
东昌府区19758903980: 求一个单片机C51的 4*4矩阵键盘 扫描程序, - ?
宫芳山地: 可以参考:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/ef086222268d4f4eac34de59.html 程序中,读取4*4矩阵键盘的函数,可以得到0~F,和16.当读出为16的时候,即是按键放手了,可以执行对应的功能程序.
东昌府区19758903980: 51单片机矩阵键盘扫描程序分析??
宫芳山地: 我给你一个我自己写的吧 有注释 假设按下的是S1键进行如下检测(4*4键盘) 先在P3口输出 p3 00001111 低四位 行会有变化 cord_h =00001111&00001110 =00001110 if !=00001111 延时0.1us cord_h=00001110&00001111=00001110 if !=...
东昌府区19758903980: 单片机的 矩阵键盘问题 求讲解!!附程序了 - ?
宫芳山地: 这程序,逻辑上,是有错的.------------------ if(key_l!=0xf0) //--不等于则....{ delay_50us(800);//键盘消抖 if(key_l!=0xf0) //--不等于则....…… ------------------ 在延时前、后的两个判断,所用的条件、变量内容,都是完全相同的.在前面如果满足条件,在后面,就也能满足.在前面,不满足条件,在后面,也一定不满足.实际上,后面的这个判断,并无任何用处.对于消抖,这程序仅仅是进行了延时而已.采纳答案中,没有指出这个缺点.http://wenwen.sogou.com/z/q765985689.htm 这才是正确的程序和正确的解释.
东昌府区19758903980: 键盘矩阵中识别有键按下及判别具体键的方法是什么? - ?
宫芳山地: 控制方式,先判断是否有键按下. 如有,再判断哪一键按下,并得到键码值,然后根据键码值转向不同的功能程序. 矩阵式结构键盘比独立式按键要复杂,识别也要复杂一些.最常用的识别方法是键盘扫描法.
东昌府区19758903980: 单片机简答题 以4*4矩阵键盘为例,写出该键盘按键处理扫描流程 - ?
宫芳山地: uchar kbscan(void) {unsigned char sccode,recode;P1=0x0f; //发0扫描,列线输入if ((P2 & 0x0f) != 0x0f) //有键按下{delay(20); //延时去抖动if ((P1&0x0f)!= 0x0f){sccode = 0xef; //逐行扫描初值while((sccode&0x01)!=0){P1=sccode;...
东昌府区19758903980: 矩阵式键盘工作流程主要包括 三个步骤 - ?
宫芳山地: 首先在桌面上单击鼠标右键,在随后出现的快捷菜单上选择"新建--快捷方式",接着系统便会启动创建快捷方式向导,在文本中输入:rundll32.exeuser32.dll,LockWorkStation"单击“下一步”,在弹出的窗口中输入快捷方式的名称(你自己可以选择一个喜欢的名称),单击“完成”.此时屏幕会有一个空白的图标.这样可以双击桌面快捷方式来迅速锁定键盘和显示器,而不需要使用组合键或屏幕保护程序
东昌府区19758903980: 为什么51单片机的矩阵键盘不可以让单片机对整个p3进行扫描,例如判断p3是否为0xee 而要逐行逐 - ?
宫芳山地: 矩阵键盘,也就是行列式键盘.因为列线是共用的,行线也是共用.所以,只能逐行(或逐列)的检测.不能一次性全部读出.
东昌府区19758903980: 用51单片机矩阵如何写程序 - ?
宫芳山地: 矩阵键盘吗?,这是4*4矩阵键盘扫描程序,10毫秒扫描一次,用定时器1控制: void t1isr() interrupt 3 {unsigned char sccode,recode;TH0=(65536-10000)/256;TL0=(65536-10000)%256;P3=0x0f; //发0扫描,列线输入if ((P3 & 0x0f) != 0x0f)...