4X4矩阵式键盘输入程序

合集下载

4x4键盘程序

4x4键盘程序
数码管采用共阴数码管,接p1口,接口顺序如下:
a--p1.0
b--p1.1
c--p1.2
d--p1.3
e--p1.4
f--p1.5
g--p1.6
cp--p1.7
#include<reg51.h>
#defineucharunsigned char
#defineuintunsignedint
//sbitkey1=P3^4;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb: num=9;break;
case 0xdb: num=10;break;
case 0xbb: num=11;break;
case 0x7b: num=12;break;
default: break;
while(temp!=0xf0)
{
delay(5);//消抖
temp=P3;//再次读P3口的数据
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7: num=13;break;
case 0xd7: num=14;break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P1=table[num-1];
P3=0xf7;//将第四行电平拉低
temp=P3;//扫面P3口的数据,送给temp

4×4矩阵式键盘按键

4×4矩阵式键盘按键

一、实验目的1.掌握4×4矩阵式键盘程序识别原理2.掌握4×4矩阵式键盘按键的设计方法二、设计原理(1)如图14.2所示,用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号(2)键盘中对应按键的序号排列如图14.1所示三、参考电路740)this.width=740" border=undefined>图14.2 4×4矩阵式键盘识别电路原理图740)this.width=740" border=undefined>图14.1 4×4键盘0-F显示740)this.width=740" border=undefined>图14.3 4×4矩阵式键盘识别程序流程图四、电路硬件说明(1)在“单片机系统”区域中,把单片机的P3.0-P3.7端口通过8联拨动拨码开关JP3连接到“4×4行列式键盘”区域中的M1-M4,N1-N4端口上(2)在“单片机系统”区域中,把单片机的P0.0-P0.7端口连接到“静态数码显示模块”区域中的任何一个a-h端口上;要求:P0.0对应着a,P0.1对应着b,……,P0.7对应着h五、程序设计内容(1)4×4矩阵键盘识别处理(2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码矩阵的行线和列线分别通过两并行接口和CPU通信键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能六、程序流程图(如图14.3所示)七、汇编源程序;;;;;;;;;;定义单元;;;;;;;;;;COUNT EQU 30H;;;;;;;;;;入口地址;;;;;;;;;;ORG 0000HLJMP STARTORG 0003HRETIORG 000BHRETIORG 0013HRETIORG 001BHRETIORG 0023HRETIORG 002BHRETI;;;;;;;;;;主程序入口;;;;;;;;;;ORG 0100HSTART: LCALL CHUSHIHUA LCALL PANDUANLCALL XIANSHILJMP START ;;;;;;;;;;初始化程序;;;;;;;;;; CHUSHIHUA: MOV COUNT#00H RET;;;;;;;;;;判断哪个按键按下程序;;;;;;;;;; PANDUAN: MOV P3#0FFHCLR P3.4MOV A P3ANL A#0FHXRL A#0FHJZ SW1LCALL DELAY10MSJZ SW1MOV A P3ANL A#0FHCJNE A#0EH K1MOV COUNT#0LJMP DKK1: CJNE A#0DH K2MOV COUNT#4LJMP DKK2: CJNE A#0BH K3 MOV COUNT#8 LJMP DKK3: CJNE A#07H K4 MOV COUNT#12K4: NOPLJMP DKSW1: MOV P3#0FFH CLR P3.5MOV A P3ANL A#0FHXRL A#0FHJZ SW2LCALL DELAY10MS JZ SW2MOV A P3ANL A#0FHCJNE A#0EH K5 MOV COUNT#1 LJMP DKK5: CJNE A#0DH K6 MOV COUNT#5 LJMP DKK6: CJNE A#0BH K7 MOV COUNT#9 LJMP DKK7: CJNE A#07H K8 MOV COUNT#13K8: NOPLJMP DKSW2: MOV P3#0FFH CLR P3.6MOV A P3ANL A#0FHXRL A#0FHJZ SW3LCALL DELAY10MS JZ SW3MOV A P3ANL A#0FHCJNE A#0EH K9 MOV COUNT#2 LJMP DKK9: CJNE A#0DH KA MOV COUNT#6 LJMP DKKA: CJNE A#0BH KB MOV COUNT#10 LJMP DKKB: CJNE A#07H KC MOV COUNT#14 KC: NOPLJMP DKSW3: MOV P3#0FFH CLR P3.7MOV A P3ANL A#0FHXRL A#0FHJZ SW4LCALL DELAY10MSJZ SW4MOV A P3ANL A#0FHCJNE A#0EH KDMOV COUNT#3LJMP DKKD: CJNE A#0DH KE MOV COUNT#7LJMP DKKE: CJNE A#0BH KF MOV COUNT#11LJMP DKKF: CJNE A#07H KG MOV COUNT#15KG: NOPLJMP DKSW4: LJMP PANDUAN DK: RET ;;;;;;;;;;显示程序;;;;;;;;;; XIANSHI: MOV A COUNT MOV DPTR#TABLE MOVC A@A+DPTRMOV P0 ALCALL DELAYSK: MOV A P3ANL A#0FHXRL A#0FHJNZ SKRET ;;;;;;;;;;10ms延时程序;;;;;;;;;;DELAY10MS: MOV R6#20D1: MOV R7#248DJNZ R7$DJNZ R6D1RET;;;;;;;;;;200ms延时程序;;;;;;;;;;DELAY: MOV R5#20LOOP: LCALL DELAY10MSDJNZ R5LOOPRET;;;;;;;;;;共阴码表;;;;;;;;;;TABLE: DB 3FH06H5BH4FH66H6DH7DH07H DB 7FH6FH77H7CH39H5EH79H71H ;;;;;;;;;;结束标志;;;;;;;;;;END八、C语言源程序#include<AT89X51.H>unsigned char code table[]={0x3f0x660x7f0x390x060x6d0x6f0x5e0x5b0x7d0x770x790x4f0x070x7c0x71};void main(void){ unsigned char i j k key;while(1){ P3=0xff; //给P3口置1//P3_4=0; //给P3.4这条线送入0//i=P3;i=i&0x0f; //屏蔽低四位//if(i!=0x0f) //看是否有按键按下//{ for(j=50;j>0;j--) //延时//for(k=200;k>0;k--);if(i!=0x0f) //再次判断按键是否按下//{ switch(i) //看是和P3.4相连的四个按键中的哪个// { case 0x0e:key=0;break;case 0x0d:key=1;break;case 0x0b:key=2;break;case 0x07:key=3;break;}P0=table[key]; //送数到P0口显示//}}P3=0xff;P3_5=0; //读P3.5这条线//i=P3;i=i&0x0f; //屏蔽P3口的低四位//if(i!=0x0f) //读P3.5这条线上看是否有按键按下// { for(j=50;j>0;j--) //延时//for(k=200;k>0;k--);i=P3; //再看是否有按键真的按下//i=i&0x0f;if(i!=0x0f){ switch(i) //如果有显示相应的按键//{ case 0x0e:key=4;break;case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=7;break;}P0=table[key]; //送入P0口显示//}}P3=0xff;P3_6=0; //读P3.6这条线上是否有按键按下// i=P3;i=i&0x0f;if(i!=0x0f){ for(j=50;j>0;j--)for(k=200;k>0;k--);i=P3;i=i&0x0f;if(i!=0x0f){ switch(i){ case 0x0e:key=8;break;key=9;break;case 0x0b:key=10;break;case 0x07:key=11;break;}P0=table[key];}}P3=0xff;P3_7=0; //读P3.7这条线上是否有按键按下// i=P3;i=i&0x0f;if(i!=0x0f){ for(j=50;j>0;j--)for(k=200;k>0;k--);i=P3;i=i&0x0f;if(i!=0x0f){ switch(i){ case 0x0e:key=12;break;case 0x0d:key=13;break;key=14;break;case 0x07:key=15;break;}P0=table[key];}}}}九、注意事项在硬件电路中,要把8联拨动拨码开关JP2拨下,把8联拨动拨码开关JP3拨上去。

51单片机4×4矩阵键盘且在数码管最后一位显示汇编语言

51单片机4×4矩阵键盘且在数码管最后一位显示汇编语言

51下面是51单片机使用4×4矩阵键盘的汇编程序,并在数码管的最后一位显示一个字符:```ORG 0 ;程序从地址0开始MOV P1,#0FFH ;P1口设置为输入口MOV P0,#0FH ;P0口设置为输出口LOOP:MOV A,P1 ;读取P1口的值CJNE A,#0FFH,KEY_PRESSED ;判断是否有按键按下SJMP LOOP ;如果没有按键按下,继续循环KEY_PRESSED:MOV R0,A ;保存按键的值CLR P0.0 ;选定行0MOV A,P1ANL A,#0F0H ;按位与运算,保留列位的值CJNE A,#0F0H,COL0 ;判断是否有按键按下在第0列MOV A,#'0' ;如果在第0列按下按键,则A的值为0JMP DISP ;跳转到显示程序COL0:CLR P0.1 ;选定行1MOV A,P1ANL A,#0F0HCJNE A,#0E0H,COL1 ;判断是否有按键按下在第1列MOV A,#'1' ;如果在第1列按下按键,则A的值为1JMP DISP ;跳转到显示程序COL1:CLR P0.2 ;选定行2MOV A,P1ANL A,#0F0HCJNE A,#0D0H,COL2 ;判断是否有按键按下在第2列MOV A,#'2' ;如果在第2列按下按键,则A的值为2JMP DISP ;跳转到显示程序COL2:CLR P0.3 ;选定行3MOV A,P1ANL A,#0F0HCJNE A,#0B0H,COL3 ;判断是否有按键按下在第3列MOV A,#'3' ;如果在第3列按下按键,则A的值为3JMP DISP ;跳转到显示程序COL3:CLR P0.4 ;选定行4MOV A,P1ANL A,#0F0H4MOV A,#'4' ;如果在第4列按下按键,则A的值为4 JMP DISP ;跳转到显示程序COL4:CLR P0.5 ;选定行5MOV A,P1ANL A,#0F0HCJNE A,#0B0H,COL5 ;判断是否有按键按下在第5列 MOV A,#'5' ;如果在第5列按下按键,则A的值为5 JMP DISP ;跳转到显示程序COL5:CLR P0.6 ;选定行6MOV A,P1ANL A,#0F0HCJNE A,#0D0H,COL6 ;判断是否有按键按下在第6列 MOV A,#'6' ;如果在第6列按下按键,则A的值为6 JMP DISP ;跳转到显示程序COL6:CLR P0.7 ;选定行7MOV A,P1ANL A,#0F0HCJNE A,#0E0H,COL7 ;判断是否有按键按下在第7列 MOV A,#'7' ;如果在第7列按下按键,则A的值为7 JMP DISP ;跳转到显示程序COL7:MOV A,#00HJMP EXIT ;如果没有按下任何键,退出程序DISP: ;数码管显示程序MOV R1,#100B ;延时计数器初始化MOV P2,A ;把按键值存入P2口MOV A,#07HANL A,P0 ;从P0口读取选定的行值MOV P0,A ;根据选定的行值输出相应的值ACALL DELAY ;调用延时程序MOV P0,#0FH ;关闭所有行DJNZ R1,$ ;当延时计数器不为0时,继续延时MOV A,#0FHMOV P0,A ;清除所有显示JMP LOOP ;跳转回主程序EXIT:MOV P2.7,1 ;在数码管的最后一位显示字符1SJMP EXIT ;无限循环DELAY: ;延时程序MOV R2,#75DMOV R3,#200D DELAY3:DJNZ R3,$DJNZ R2,DELAY2 RET```。

4X4矩阵式键盘输入程序

4X4矩阵式键盘输入程序

4*4 键盘程序readkeyboard: orl a,#0f0h mov a, r2begin: acall key_on mov r6,a swap a jnz delay cpl a add a,r3ajmp readkeyboard jz next retdelay:acall delay10ms ajmp key_c key_ccode:push a acall key_on next: mov a,r7 swap ajnz key_num jnb acc.7,error anl a,#0fhajmp begin rl a dec akey_num:acall key_p mov r7,a rl a ; 行号乘anl a,#0FFh ajmp l_loop 4jz begin error:mov a,#00h rl aacall key_ccode ret mov r7,apush a key_c:mov r2,#00h pop akey_off:acall key_on mov r3,#00h anl a,#0fh jnz key_off mov a,r6 dec apop a mov r5,#04h add a,r7ret again1:jnb acc.0,out1retkey_on: mov a,#00h rr a delay10ms: orl a,#0fh inc r2 anl tmod,#0f0h mov p1,a djnz r5, again1 orl tmod,#01h mov a,p1 out1: inc r2 mov th0,#0d8h orl a,#0f0h mov a,r7 mov tl0,#0f0h cpl a mov r5,#04h setb tr0ret again2:jnb acc.4,out2wait:jbc tf0,overkey_p: mov r7,#0efh rr a ajmp waitl_loop:mov a,r7 inc r3 clr tr0 mov p1,amov a,p1 djnz r5,again2out2: inc r3 单片机键盘设计over:ret二)从电路或软件的角度应解决的问题软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。

单片机实现4X4矩阵键盘控制项目PPT课件

单片机实现4X4矩阵键盘控制项目PPT课件

-
5
• 在矩阵按键处理过程中,一旦检测到有按 键闭合与确认按键已经稳定闭合期间,通 过调用10-20ms延时子程序避开按键抖动问 题。由于按键是机械器件,按下或者松开 时有固定的机械抖动,抖动图如图所示。
-
6
• 按键去抖分为硬件去抖和软件去抖,硬件去抖最简单的是 按键两端并联电容,容量根据实验而定。软件去抖使用方 便不增加硬件成本,容易调试,所以现在处理按键抖动问 题大部分选择软件去抖。软件去抖操作步骤如下:
-
10
13.4 项目软件程序设计
• 矩阵键盘行线P20~P23为输出线,列线 P24~P27为输入线。单片机将行线(P20~P23) 全部输出低电平,此时读入列线数据,若列线 全为高电平则没有键按下,当列线有出现低电 平时调用延时程序以此来去除按键抖动。延时 完成后再判断是否有低电平,如果此时读入列 线数据还是有低电平,则说明确实有键按下, 再来进一步确定键值。
51单片机
VC C P0. 0 P0. 1 P0. 2 P0. 3 P0. 4 P0. 5 P0. 6 P0. 7 EA/VPP PROG/ ALE PSEN A15/P2. 7 A14/P2. 6 A13/P2. 5 A12/P2. 4 A11/P2. 3 A10/P2. 2 A9/P2. 1 A8/P2. 0

case 0xdd:P0=table[5];break; //显示按键码“5”

case 0xbd:P0=table[6];break; //显示按键码“6”

case 0x7d:P0=table[7];break; //显示按键码“7”

case 0xeb:P0=table[8];break; //显示按键码“8”

4乘4矩阵键盘输入数码管显示四位数要点

4乘4矩阵键盘输入数码管显示四位数要点
平滑 , 减小振动 , 可在步进电机控 制脉冲的上升沿和下降沿采用细分的梯形 波 , 可以减小步进电机的步进角 , 提高电机运行的平稳性。 在步进电机停转时 , 为了防止因惯性而使电机轴产生顺滑 , 则需采用合适的锁定波形 , 产生锁定磁 力矩 , 锁定步进电机的转轴 , 使步进电机的转轴不能自由转动。 (5) 步进电机的速度控制
Proteus 软件功能的理解,学会用这个软件设计三相步进电机控制系统,将理论
知识与实践相联系,为以后在学习和工作的发展打下一个良好的基础
。然后,
通过该课程设计, 初步理解了利用计算机控制技术进行三相步进电机控制系统的
设计。
最后,我明白:知识不是孤立的,相互之间有联系的,我们要学会理解知识
点以及学科之间的融合渗透。 本次课程设计涉及到了计算机技术, 自动控制技术,
微机技术, 数字电子技术等众多知识, 因而我们需要把把各个学科之间的知识融
合起来,形成一个整体。认识到 Proteus这个软件的强大功能,为以后的学习和
工作打下基础 。
我相信未来是属于我们的, 随着科学技术的发展, 控制技术的应用将将越来
越广泛,发挥越来越重要的作用。
参考文献
[1] 阎石主编 . 数字电子技术 . [M] 北京:高等教育出版社, 2006 年 [2] 陈振官等编著 . 新颖高效声光报警器 . [M] 北京:国防工业出版社, 2005 年 [3] 王东峰等主编 .单片机 C 语言应用 100 例 . [M] 北京:电子工业出版社, 2009 年 [4] 胡耀辉等主编 .单片机系统开发实例经典 . [M] 北京:冶金工业出版社, 2006 年 [5] 李鸿主编 .单片机原理及应用 . [M] 湖南:湖南大学出版社, 2005 年 [6] 谭浩强主编 .C 语言程序设计 . [M] 北京:清华大学出版社, 2005 年

4×4_矩阵键盘计算器设计

4×4_矩阵键盘计算器设计

西华大学课程设计说明书题目4×4 矩阵键盘计算器设计系(部) 电气信息学院专业(班级) 自动化3班姓名学号指导教师胡红平起止日期2012.6.10-2012.6.30计算机接口及应用课程设计任务书系(部):电气信息学院专业:09自动化指导教师:日期:2012-6-20西华大学课程设计鉴定表摘要近几年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。

在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面的知识是不够的,还应根据具体硬件结合,加以完善。

本任务是个简易得三位数的减法运算,用4×4 矩阵键盘及计算器设计,利用数码管实现255内的减法运算。

程序都是根据教材内和网络中的程序参考编写而成,在功能上还并不完善,限制也较多。

本任务重在设计构思与团队合作,使得我们用专业知识,专业技能分析和解决问题全面系统的锻炼。

关键词:单片机,AT89C51,矩阵键盘,数码管ABSTRACTIn recent years, along with the rapid development of science and technology, the application of SCM is unceasingly thorough, it causes the traditional control test technology increasingly updates. In real-time detection and automatic control of single-chip microcomputer application system, often as a core component to use, only microcontroller aspects of knowledge is not enough, should according to specific hardware combined, and perfects.This task is a simple three digits, subtract with 4 * 4 matrix keyboard and a calculator design, use digital tube realization within the 255 subtract. Program is according to the teaching material and within the network reference and compiled program, on the function is not perfect, restrictions also more. This task focuses on design conception and team cooperation, make us with professional knowledge, professional skills to analyze and solve problems of full system exercise.Keywords:Single-chip,AT89C51,Matrix keyboard,digital tube目录摘要 (I)ABSTRACT (II)第1章课题概述 (1)1.1 课题概述 (1)1.2 课题要求 (2)第2章系统设计 (3)2.1 设计思路 (3)2.2 框图设计 (3)2.3 知识点 (3)2.4 硬件设计 (4)2.4.1 电路原理图 (4)2.4.2 元件选择 (5)2.4.3 PCB制版及效果 (9)2.5 软件设计 (10)2.5.1 程序流程图 (10)2.6 系统仿真及调试 (11)2.6.1 硬件调试 (11)2.6.2 软件调试 (11)2.6.3 软硬件调试 (11)结论 (11)参考文献 (14)附录 (15)第1章课题概述1.1 课题概述随着当今时代的电子领域的发展,尤其是自动化的控制领域,传统的分立元件或数字逻辑电路构成的控制系统正被智能化的单片机所取代。

4x4矩阵键盘工作原理

4x4矩阵键盘工作原理

4x4矩阵键盘工作原理
4x4矩阵键盘是一种常见的输入设备,它由16个按键组成,通
常用于嵌入式系统中。

其工作原理是利用矩阵的方式将16个按键映
射到单一的输入口上,从而减少了引脚的数量。

在4x4矩阵键盘中,按键排列成4行4列的矩阵形式。

每一行的按键都共用一根引脚,每一列的按键也共用一根引脚。

当按下某一个按键时,会在对应的行和列上形成短暂的电路通路,此时矩阵键盘会将这个按键的行和列位置保存下来,通过扫描算法得出该按键的编号,然后将其传输到处理器中进行处理。

具体来说,矩阵键盘的扫描算法通常采用轮询的方式进行。

处理器按照一定的时间间隔扫描矩阵键盘的每一行和每一列,从而得出哪个按键被按下了。

同时,为了防止按键的抖动影响输入的精度,还需要进行消抖处理。

总的来说,4x4矩阵键盘工作原理相对简单,但需要合理设计矩阵排布和扫描算法,以确保输入的准确性和稳定性。

- 1 -。

单片机-4x4个矩阵按键控制数码管显示数字程序

单片机-4x4个矩阵按键控制数码管显示数字程序

单⽚机-4x4个矩阵按键控制数码管显⽰数字程序1 #include "8051.h"2 typedef unsigned char u8;3 typedef unsigned int u16;4 u8 smgduan[]= {5/*0 1 2 3 4 5 6 7 */60x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,7/*8 9 A B C D E F */80x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};910// P0⼝为数码管的位选的8位输⼊引脚11// P0 = 0x00;121314void Delayms(u16 ms);15void shumaguan(u8 n);16void DigDisplay();17void KeyTest();18void smg(u8 n, u8 m);19void key_4x4();2021void main()22 {23while(1)24 {25 key_4x4();26 }27 }2829// 不精确的延时函数30void Delayms(u16 ms)31 {32 unsigned int i, j;33for(i = ms; i > 0; i--)34for(j = 110; j > 0; j--);35return;36 }3738// 数码管根据74HC138译码器选择对应的段(选择哪个数码管显⽰)39void shumaguan(u8 n)40 {41switch(n)42 {43case0:44 LSA = 0;LSB = 0;LSC = 0;break;45case1:46 LSA = 1;LSB = 0;LSC = 0;break;47case2:48 LSA = 0;LSB = 1;LSC = 0;break;49case3:50 LSA = 1;LSB = 1;LSC = 0;break;51case4:52 LSA = 0;LSB = 0;LSC = 1;break;53case5:54 LSA = 1;LSB = 0;LSC = 1;break;55case6:56 LSA = 0;LSB = 1;LSC = 1;break;57case7:58 LSA = 1;LSB = 1;LSC = 1;break;59 }60 }6162// 数码管显⽰数字,并以⼗进制递增63void DigDisplay()64 {65 u8 i1 = 0;66 u8 i2 = 0;67 u8 i3 = 0;68 u8 i4 = 0;69 u8 i5 = 0;70 u8 i6 = 0;71 u8 i7 = 0;72 u8 i8 = 0;7374757677for (i8 = 0; i8 < 10; i8++)78for (i7 = 0; i7 < 10; i7++)79for (i6 = 0; i6 < 10; i7++)80for (i5 = 0; i5 < 10; i5++)81for (i4 = 0; i4 < 10; i4++)82for (i3 = 0; i3 < 10; i3++)83for (i2 = 0; i2 < 10; i2++)84for (i1 = 0; i1 < 10; i1++)85 {86 u16 cnt = 10;87while (cnt--)88 {89 shumaguan(0); //选中第⼀个数码管90 P0 = smgduan[i1]; //给他送⼀个数字91 Delayms(1); //稍微延时⼀下下92 shumaguan(1); //然后切换到第⼆个数码管。

4x4键盘

4x4键盘

4x4键盘输入实验一、实验目的1.掌握4×4矩阵式键盘程序识别原理。

2.掌握4×4矩阵式键盘按键的设计方法。

二、实验原理:主要原理为扫描键盘矩阵时,每次只有一行电平拉低。

在逐次扫描拉低的这些行的同时,去读那些列的电平。

;被拉低的行上,按下的键对应的列的电平为0 ,其它为1. 用左移位的指令,在进位位CY里就可以检测出是0还是1.为1表示无按下,;为0表示该键按下。

在扫描按键时,如无按下,则取码指针R1加1后,继续扫描。

如有键按下,转按键处理子程序,按键按下标志位;F0清0(表示按下)。

此时,取码指针的值,就是按键的键名。

随后继续进入按键检测子程序重新扫描。

每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。

矩阵的行线和列线分别通过两并行接口和CPU通信。

每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。

键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。

两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。

键盘连接成4×4的矩阵形式,占用单片机P1口的8根线,行信号是P1.0-1.3,列信号是P1.4-1.7。

三、实验内容及过程:1、流程图2、实验中碰到的问题编写程序时需要用到的共阳字形码,不能与共阴字形码混淆。

在仿真过程中,数码管下拉电阻起到分流作用,应该接地,但是却始终不能出结果,将下拉电阻与电源相连就可以显示正确了。

四、实验现象:按下一个键,在数码管上就会显示对应的数字或者字母。

五、程序:ORG 0000HAJMP MAINORG 0030H MAIN: MOV DPTR,#TABLCALL KEYMOVC A,@A+DPTRMOV P1,ALJMP MAIN KEY: LCALL KSJNZ K1LCALL DELAYAJMP KEYK1: LCALL DELAYLCALL KSJNZ K2AJMP KEYK2: MOV R2,#0EFHMOV R4,#0000HK3: MOV P1,R2L6: JB P2.0,L1MOV A,#0000HAJMP LKL1: JB P2.1,L2MOV A,#04HAJMP LKL2: JB P2.2,L3MOV A,#08HAJMP LKL3: JB P2.3,NEXTMOV A,#0CH LK: ADD A,R4PUSH ACCK4: LCALL DELAYLCALL K4POP ACCRETNEXT: INC R4MOV A,R2JNB ACC.7,KEYRL AMOV R2,AAJMP K3KS: MOV P2,#0FHMOV A,P2XRL A,#0FHRETDELAY:MOV R6,#0FEHLOOP1:MOV R7,#0FEHLOOP2:DJNZ R7,LOOP2DJNZ R6,LOOP1RETTAB: DB 0C0HDB 0F9HDB 0A4HDB 0B0HDB 99HDB 92HDB 82HDB 0F8HDB 80HDB 90HDB 088HDB 083HDB 0C6HDB 0A1HDB 086HDB 08EHEND六、实验心得通过本实验,懂得如何安装kell软件以及实验仿真板,懂得KEIL C51单片机仿真软件的调试,掌握了单片机矩阵键盘的基本知识。

4×4矩阵键盘的工作原理 )

4×4矩阵键盘的工作原理 )

====================================================
键值显示子程序
====================================================
KEY_PLAER:
MOV A,30H ;键值数据送入A
矩阵键盘键值查找程序
键值存入30H单元
=====================================================
KEY_SCAN: ;识别键盘有无键按下子程序
MOV P1,#0F0H ;置列线为0,行线为1
这样,对于一组数码管动态扫描显示需要由两组信号来控制:一组是字段输出口输出的字形代码,用来控制显示的字形,称为段码;另一组是位输出口输出的控制信号,用来选择第几位数码管工作,称为位码。
由于各位数码管的段线并联,段码的输出对各位数码管来说都是相同的。因此,同一时刻如果各位数码管的位选线都处于选通状态的话,8位数码管将显示相同的字符。若要各位数码管能够显示出与本位相应的字符,就必须采用扫描显示方式。即在某一时刻,只让某一位的位选线处于导通状态,而其它各位的位选线处于关闭状态。同时,段线上输出相应位要显示字符的字型码。这样同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭的,如此循环下去,就可以使各位数码管显示出将要显示的字符。
图1 矩阵键盘电路
图2 按键排列
2、数码管动态扫描显示电路
在ME300B开发系统中,采用了8位数码管动态扫描显示。它将所有数码管的8个段线相应地并接在一起,并接到 AT89S51的P0口,由P0口控制字段输出。而各位数码管的共阳极由AT89S51的P2口控制Q20-Q27来实现8位数码管的位输出控制。

单片机课程设计4X4矩阵键盘显示

单片机课程设计4X4矩阵键盘显示

长沙学院?《单片机原理及应用》课程设计说明书题目】液晶显示4*4矩阵键盘按键号程序设计系(部)电子与通信工程系专业(班级)电气1班姓名龙程学号【09指导教师刘辉、谢明华、王新辉、马凌云起止日期—长沙学院课程设计鉴定表《单片机技术及应用》课程设计任务书系(部):电子与电气工程系专业:11级电子一班指导教师:谢明华、刘辉—目录'前言 (5)一、课程设计目的 (6)二、设计内容及原理 (6)单片机控制系统原理 (6)阵键盘识别显示系统概述 (6)键盘电路 (7)12864显示器 (8)整体电路图 (9)!仿真结果 (9)三、实验心得与体会 (10)四、实验程序 (10)参考文献 (18)…。

,】前言单片机,全称单片微型计算机(英语:Single-Chip Microcomputer),又称微控制器(Microcontroller),是把中央处理器、存储器、定时/计数器(Timer/Counter)、各种输入输出接口等都集成在一块集成电路芯片上的微型计算机。

与应用在个人电脑中的通用型微处理器相比,它更强调自供应(不用外接硬件)和节约成本。

它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出接口简单,功能较低。

由于其发展非常迅速,旧的单片机的定义已不能满足,所以在很多应用场合被称为范围更广的微控制器;从上世纪80年代,由当时的4位、8位单片机,发展到现在的32位300M的高速单片机。

现代人类生活中所用的几乎每件有电子器件的产品中都会集成有单片机。

手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电子产品中都含有单片机。

汽车上一般配备40多片单片机,复杂的工业控制系统上甚至可能有数百片单片机在同时工作!单片机的数量不仅远超过PC机和其他计算机的总和,甚至比人类的数量还要多。

液晶显示器(英语:Liquid Crystal Display,缩写:LCD)为平面薄型的显示设备。

它的主要原理是以电流刺激液晶分子产生点、线、面配合背部灯管构成画面。

单片机驱动4X4矩阵式键盘输入程序

单片机驱动4X4矩阵式键盘输入程序

单片机驱动4X4矩阵式键盘输入程序用AT89S51单片机的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。

实现键盘输入的识别。

我将给大家提供c和汇编两个版本的4X4矩阵式键盘输入程序。

如果网页上不清楚点此处下载本键盘输入程序源代码汇编语言源程序:KEYBUF EQU 30HORG 00HSTART: MOV KEYBUF,#2WAIT:MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1MOV A,P3ANL A,#0FHCJNE A,#0EH,NK1MOV KEYBUF,#0LJMP DK1NK1: CJNE A,#0DH,NK2 MOV KEYBUF,#1 LJMP DK1NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#2 LJMP DK1NK3: CJNE A,#07H,NK4 MOV KEYBUF,#3 LJMP DK1NK4: NOPDK1:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,ADK1A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK1ANOKEY1:MOV P3,#0FFHCLR P3.5MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2LCALL DELY10MS MOV A,P3ANL A,#0FHJZ NOKEY2MOV A,P3ANL A,#0FHCJNE A,#0EH,NK5 MOV KEYBUF,#4 LJMP DK2NK5: CJNE A,#0DH,NK6 MOV KEYBUF,#5 LJMP DK2NK6: CJNE A,#0BH,NK7 MOV KEYBUF,#6 LJMP DK2NK7: CJNE A,#07H,NK8 MOV KEYBUF,#7 LJMP DK2NK8: NOPDK2:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,ADK2A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK2ANOKEY2:MOV P3,#0FFHCLR P3.6ANL A,#0FHXRL A,#0FHJZ NOKEY3LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3MOV A,P3ANL A,#0FHCJNE A,#0EH,NK9MOV KEYBUF,#8LJMP DK3NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#9LJMP DK3NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10LJMP DK3NK11: CJNE A,#07H,NK12 MOV KEYBUF,#11LJMP DK3NK12: NOPDK3:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTRMOV P0,ADK3A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK3ANOKEY3:MOV P3,#0FFHCLR P3.7MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4MOV A,P3ANL A,#0FHCJNE A,#0EH,NK13MOV KEYBUF,#12LJMP DK4NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#13LJMP DK4NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#14LJMP DK4NK15: CJNE A,#07H,NK16 MOV KEYBUF,#15LJMP DK4NK16: NOPDK4:MOV A,KEYBUFMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,ADK4A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK4ANOKEY4:LJMP WAITDELY10MS:MOV R6,#10D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71HENDC语言源程序:#includeunsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsigned char temp;unsigned char key;unsigned char i,j;//我的程序没有注释,不过很简单。

独立4X4矩阵两用键盘制作方法

独立4X4矩阵两用键盘制作方法

线有点乱、、、、、 基本竣工啦、、、、 具体电路图如下:
拨码开关下方的杜邦针是用来独立键盘插接,当拨码开关处于断开状 态时,将电路板右上角的杜邦针的 1、2、3 端子分别用杜邦线接与开发板负 极,此时拨码开关下的杜邦针均为连接单片机 IO 口的端子,此时为 3X4 的 独立键盘。 拨码开关处于接通状态时,电路板右上角的杜邦针直接按序插接于单 片机 IO 口,此时为 4X4 矩阵键盘;
独立 4X4 矩阵两用键盘制作方法
看到买的开发板上面用的键盘有两种,一种是独立键盘,一种是矩阵 键盘,我在制作最小系统时发现最两个键盘很麻烦,而且都不常用,虽然可 以制作 4 个独立键,但有时不够用,更何况矩阵键盘编程也麻烦,何不多做 几个独立键呢,但要飞那幺多按键而且还占地,我就想做一个键盘,代替了 两个键盘,于是乎今天就做了一个两用的、、、可以当 4X4 矩阵键盘用,也可 以当 3X4 独立键盘用、、、、、、、、 来工、、、、、
找来 16 个按键、、、、 点焊各个按键、、、、 按键焊接 OK、、、、、、 布线、、、
继续焊接、、、 焊接八位拨码开关、、、、
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4*4键盘程序readkeyboard:begin: acall key_onjnz delayajmp readkeyboarddelay:acall delay10msacall key_onjnz key_numajmp beginkey_num:acall key_panl a,#0FFhjz beginacall key_ccodepush akey_off:acall key_onjnz key_offpop aretkey_on: mov a,#00horl a,#0fhmov p1,amov a,p1orl a,#0f0hcpl aretkey_p: mov r7,#0efhl_loop:mov a,r7mov p1,amov a,p1orl a,#0f0hmov r6,acpl ajz nextajmp key_cnext: mov a,r7jnb acc.7,errorrl amov r7,aajmp l_looperror:mov a,#00hretkey_c:mov r2,#00hmov r3,#00hmov a,r6mov r5,#04hagain1:jnb acc.0,out1rr ainc r2djnz r5, again1out1: inc r2mov a,r7mov r5,#04hagain2:jnb acc.4,out2rr ainc r3djnz r5,again2out2: inc r3mov a, r2swap aadd a,r3retkey_ccode:push aswap aanl a,#0fhdec arl a ;行号乘4rl amov r7,apop aanl a,#0fhdec aadd a,r7retdelay10ms:anl tmod,#0f0horl tmod,#01hmov th0,#0d8hmov tl0,#0f0hsetb tr0wait:jbc tf0,overajmp waitclr tr0over:ret单片机键盘设计(二)从电路或软件的角度应解决的问题软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。

通常采用软件延时的方法:在第一次检测到有键按下时,执行一段延时10ms的子程序后,再确认电平是否仍保持闭合状态电平,如果保持闭合状态电平,则确认真正有键按下,进行相应处理工作,消除了抖动的影响。

(这种消除抖动影响的软件措施是切实可行的。

)2.采取串键保护措施。

串键:是指同时有一个以上的键按下,串键会引起CPU错误响应。

通常采取的策略:单键按下有效,多键同时按下无效。

3.处理连击。

连击:是一次按键产生多次击键的效果。

要有对按键释放的处理,为了消除连击,使得一次按键只产生一次键功能的执行(不管一次按键持续的时间多长,仅采样一个数据)。

否则的话,键功能程序的执行次数将是不可预知,由按键时间决定。

连击是可以利用的。

连击对于用计数法设计的多功能键特别有效。

三、键盘工作方式单片及应用系统中,键盘扫描只是CPU的工作内容之一。

CPU忙于各项任务时,如何兼顾键盘的输入,取决于键盘的工作方式。

考虑仪表系统中CPU任务的份量,来确定键盘的工作方式。

键盘的工作方式选取的原则是:既要保证能及时响应按键的操作,又不过多的占用CPU的工作时间。

键盘的工作方式有:查询方式(编程扫描,定时扫描方式)、中断扫描方式。

四、键盘电路结构(一)独立式按键接口设计优点:电路配置灵活,软件结构简单。

此键盘是用于按键较少或操作速度较高的场合。

也可以用扩展I/O口搭接独立式按键接口电路,可采用8255扩展I/O口,用三态缓冲器扩展。

这两种配接方式,都是把按键当作外部RAM某一工作单元的位来对待,通过读片外RAM 的方法,识别按键的工作状态。

上电路中独立式按键电路,各按键开关均采用了上拉电阻,是为了保证在按键断开时,各I/O有确定的高电平。

如输入口线内部已有上拉电阻,则外电路的上拉电阻可省去。

(二)矩阵式键盘接口设计矩阵式键盘适用于按键数量较多的场合,由行线和列线组成,按键位于行列的交叉点上。

节省I/O口。

矩阵键盘工作原理:行线通过上拉电阻接到+5V上。

无按键,行线处于高电平状态,有键按下,行线电平状态将由与此行线相连的列线电平决定。

列线电平为低,则行线电平为低;列线电平为高,则行线电平为高。

五、双功能及多功能键设计在单片机应用系统中,为简化硬件线路,缩小整个系统的规模,总希望设置最少的按键,获得最多的控制功能。

矩阵键盘与独立式按键键盘相比,硬件电路大大节省。

可通过软件的方法让一键具有多功能。

方法:选择一个RAM工作单元,对某一个按键进行按键计数,根据不同计数值,转到子程序。

这种计数多功能键最好与显示器结合用,以便知道当前计数值,同时配合一个启动键。

复合键是使用软件实现一键多功能的另一个途径。

所谓复合键,就是两个或两个以上的键的联合,当这些键同时按下时,才能执行相应的功能程序。

实际情况做不到“同时按下”,他们的时间差别可以长到50ms,解决策略是:定义一个或两个引导键,这些引导键按下时没什么意义,执行空操作。

引导键的例子:微机键盘上的CTRL、SHIFT、ALT。

缺点:一是操作变得复杂,二是操作时间变长。

多功能键的利用,应具体情况具体分析。

要求速度的场合最好做一键一功能。

如果系统功能很多,一键一功能不现实,可采取一键多功能。

六、功能开关及拨码盘接口设计设计原因:键盘输入灵活性大,操纵方便。

但某些重要功能或数据由键盘输入,误操作将产生一些不良后果。

因此常设定静态开关的方法来执行这些功能或输入数据。

静态开关一经设定,将不再改变,一直维持设定的开关状态。

通常这些开关状态是在单片机系统加电时由CPU读入内存RAM的,以后CPU将不再关注这些开关的状态,因此,即使加电后,这些开关的状态发生变化,也不会影响CPU的正常工作,只有在下一次加电时,这些新状态才能生效。

第一,功能开关:主要是根据开关的状态执行一些重要的功能。

第二,拨码盘:单片机应用系统中,有时要输入一些控制参数,这些参数一经设定,将维持不变,除非给系统断电后重新设定。

这时使用数字拨码盘既简单直观,又方便可靠。

七、按键介绍常用的按键有三种:机械触点式按键、导电橡胶式和柔性按键(又称触摸式键盘)。

机械触点式按键是利用弹性使键复位,手感明显,连线清晰,工艺简单,适合单件制造。

但是触点处易侵入灰尘而导致接触不良,体积相对较大。

导电橡胶按键是利用橡胶的弹性来复位,通过压制的方法把面板上所有的按键制成一块,体积小,装配方便,适合批量生产。

但是时间长了,橡胶老化而使弹力下降,同时易侵入灰尘。

柔性按键是近年来迅速发展的一种新型按键,可以分为凸球型和平面型两种。

凸球型动作幅度触感明显,富有立体感,但制造工艺相对复杂;平面型幅度微小,触感较弱,但工艺简单,寿命长。

柔性按键最大特点是防尘、防潮、耐蚀,外形美观,装嵌方便。

而且外形和面板的布局、色彩、键距可按照整机的要求来设计。

八、单片机系统键盘设计实例键盘工作方式采用定时扫描方式。

采用定时器T0定时,CPU每隔200ms扫描键盘一次,即通过读取573的输出数据,识别按键的工作状态。

对于重键(串键:指同时有一个以上的键按下),采用软件提供保护,当判断为一个以上的键按下,则不处理,返回重新进行监测。

只有监测到一个键按下时,才判断键值,执行相应键处理工作。

键盘对液晶显示的控制是通过显示画面的页码作为接口参数来完成的。

在每一页中,键盘对数据的修改是通过对按键次数的计算作为接口参数来实现的。

具体例程如下:void keyscan() /*键盘扫描*/{ucher data newz ,temp,pat;if(time_out){ACC=MJP; /*读取573数据*/temp=ACC&0x0f, /*取低四位*/if(temp!=0x0f) /*有键按下*/{msec(10); /*延时10MS*/ACC=MJP; /*读取573数据*/temp=ACC&0x0fif(temp=0x0f){newz=temp; /*读取新键值*/pat=newz^old; /*键值有无变化*/if(pat)>0) /*有变化*/{old=newz; /*原键值等于新键值*/keymana(); /*调键散转程序*/}else;}else;}elsr;old=temp; /*原键值不变*/time_out=0 /*标志位置零*/}esel;}4*4键盘程序; 0 1 2 3 --P30; 4 5 6 7 --P31; 8 9 A B --P32 ; C D E F --P33 ; P34 P35 P36 P37 ORG 0000hLJMP MAINORG 0030hMAIN:MOV DPTR,#TABLCALL KEYMOVC A,@A+DPTR MOV P0,A CLR P1.3LJMP MAINKEY: LCALL KSJNZ K1LCALL DELAY2 AJMP KEYK1: LCALL DELAY2LCALL KSJNZ K2AJMP KEYK2: MOV R2,#0EFHMOV R4,#00HK3: MOV P3,R2L6: JB P3.0,L1MOV A,#00H AJMP LKL1: JB P3.1,L2MOV A,#04HAJMP LKL2: JB P3.2,L3MOV A,#08HAJMP LKL3: JB P3.3,NEXT MOV A,#0cH LK: ADD A,R4PUSH ACC K4: LCALL DELAY2 LCALL KSJNZ K4POP ACCRETNEXT:INC R4MOV A,R2JNB ACC.7,KEYRL AMOV R2,AAJMP K3KS: MOV P3,#0FHMOV A,P3XRL A,#0FHRETDELAY2: MOV R5,#08HL7: MOV R6,#0FAHL8: DJNZ R6,L8DJNZ R5,L7RETTAB:DB 0C0H;0DB 0F9H;1DB 0A4H;2DB 0B0H;3DB 099H;4DB 092H;5DB 082H;6DB 0F8H;7DB 080H;8DB 090H;9DB 088H;ADB 083H;bDB 0C6H;CDB 0A1H;dDB 086H;EDB 08EH;FEND4X4矩阵键盘扫描汇编程序PROC KEYCHKKEYNAME DATA 40H;(b7-b5纪录按键状态,b4位为有效位, ;b3-b0纪录按键)KEYRTIME DATA 43HSIGNAL DATA 50HKEY EQU P3KEYPL EQU P0.6RTIME EQU 30KEYCHK: MOV KEY,#0FHMOV A,KEYCJNE A,#0FH,NEXT1; CLR CNEXT1:; SETB CMOV A,KEYNAMEANL KEYNAME,#1FHRRC AANL A,#0E0HORL KEYNAME,ACJNE A,#0C0H,NEXT2SJMP KEYSCANNEXT2: CJNE A,#0E0H,NEXT3SJMP WAITNEXT3:CJNE A,#0A0H,EXITORL KEYNAME,#0E0H WAIT: MOV A,KEYRTIMEJNZ EXITKEYSCAN: MOV R1,#0MOV R3,#11110111B LOOP: MOV A,R3RL AMOV R3,AMOV KEY,AMOV A,KEYORL A,#0F0HCJNE A,#0FFH,NEXT31INC R1CJNE R1,#4,LOOPSJMP EXITNEXT31: JB ACC.0,NEXT32MOV R2,#0SJMP NEXT5NEXT32:JB ACC.1,NEXT33MOV R2,#1SJMP NEXT5NEXT33:JB ACC.2,NEXT34MOV R2,#2SJMP NEXT5NEXT34:MOV R2,#3NEXT5: MOV A,R1RL ARL AADD A,R2MOV DPTR,#KEYTABMOVC A,@A+DPTRANL KEYNAME,#0E0HORL KEYNAME,AMOV KEYRTIME,#RTIMECLR KEYPLMOV SIGNAL,#10EXIT: MOV KEY,#0FFHRETKEYTAB: ;//=按键名称表=DB 1AH ;扫描码0,对应ADB 1BH ;扫描码1,对应BDB 1CH ;扫描码2,对应CDB 1DH ;扫描码3,对应DDB 11H ;扫描码4,对应1DB 14H ;扫描码5,对应4DB 17H ;扫描码6,对应7DB 1EH ;扫描码7,对应EDB 12H ;扫描码8,对应2DB 15H ;扫描码9,对应5DB 18H ;扫描码A,对应8DB 10H ;扫描码B,对应0DB 13H ;扫描码C,对应3DB 16H ;扫描码D,对应6DB 19H ;扫描码E,对应9DB 1FH ;扫描码F,对应FEND4×4矩阵式键盘org 0000hljmp startorg 0030hstart:mov dptr,#tablemov r3,#4mov p2,#00hlcall keyscanresponse:movc a,@a+dptrmov p0,asetb p2.1keyscan:lcall keypress;jnz k1jmp keyscank1: lcall delaylcall keypressjnz k2jmp keyscank2: mov r0,#00h mov r1,#00h mov p1,#0efh mov a,p1anl a,#0fh; mov r2,axrl a,#0fhjnz k3mov p1,#0dfh mov r0,#01h mov a,p1anl a,#0fhmov r2,axrl a,#0fhjnz k3mov p1,#0bfh; mov r0,#02hmov a,p1anl a,#0fh; mov r2,axrl a,#0fhjnz k3mov p1,#07fh; mov r0,#03h; mov a,p1anl a,#0fh; mov r2,axrl a,#0fhjnz k3jmp keyscank3: mov a,r2rrc a ;jnc k4 ;rrc ajnc k5 ;rrc ajnc k6 ;jnb p1.3,$mov r1,#03hmov a,r0mov b,r3mul abadd a,r1jmp responsek4: jnb p1.0,$ ; mov r1,#00hmov a,r0mov b,#4mul abadd a,r1jmp responsek5: jnb p1.1,$mov r1,#01hmov a,r0mov b,#4mul abadd a,r1jmp responsek6: jnb p1.2,$mov r1,#02hmov a,r0mov b,#4mul abadd a,r1jmp response keypress:mov p1,#0fh mov a,p1xrl a,#0fhretdelay: mov r7,#50d1: mov r6,#248djnz r6,$djnz r7,d1rettable: db 3fh,06h,5bh,4fh;0 1 2 366h,6dh,7dh,07h;4 5 6 77fh,6fh,77h,7ch;8 9 a b39h,5eh,79h,71h;c d e fend *********4×4矩阵式键盘KEYNAME DATA 40HORG 0000HLJMP MAINORG 0030HMAIN:MOV SP, #80HCLR F0LOOP:LCALL KEYCHKLCALL KEYSCANSJMP LOOPKEYCHK:MOV P1, #0F0HMOV A, P1CJNE A, #0F0H, $+3LCALL DELAY_10MSMOV A, P1CJNE A, #0F0H, NEXT11CLR F0SJMP EXIT1NEXT11:SETB F0EXIT1:RETKEYSCAN:JNB F0, EXIT2MOV R7, #4MOV R5, #0MOV R6, #01111111BLOOP1:MOV A, R6RL AMOV R6, AMOV P1, AMOV A, P1ANL A, #0F0HXRL A, #0F0HJNZ NEXT21INC R5DJNZ R7, LOOP1SJMP EXIT2NEXT21:JNB Acc.4, NEXT22MOV R4, #0SJMP NEXT25NEXT22:JNB Acc.5, NEXT23MOV R4, #1SJMP NEXT25NEXT23:JNB Acc.6, NEXT24MOV R4, #2SJMP NEXT25NEXT24:MOV R4, #3NEXT25:MOV A, R5RL ARL AADD A, R4MOV DPTR, #KEYTABMOVC A, @A+DPTRMOV KEYNAME, AEXIT2:RETDELAY_10MS:SETB RS1SETB RS0MOV R2,#20DELAY0:MOV R3,#250DJNZ R3,$DJNZ R2,DELAY0RETKEYTAB:DB 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15END4X4键盘输入数码管移位显示1 #include <REG51.H>#include<intrins.h>#include<bin.h>uchar num,num1,temp;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};uchar keyscan();void delay(uchar z){ //10MS延时uint x;for(z;z!=0;z--)for(x=1250;x!=0;x--);}void main(){wela=1;dula=0;P0=0xc0;num=17;P0=0;wela=0; //所有数码管不亮dula=1;while(1){num1=keyscan();P0=table[num1-1];}}uchar keyscan(){P3=0xf0;temp=P3;while(temp!=0xf0){delay(1);temp=P3;while(temp!=0xf0){P3=0xfe;temp=P3&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xee:num=1,temp=0xf0; break;case 0xde:num=2,temp=0xf0; break;case 0xbe:num=3,temp=0xf0; break;case 0x7e:num=4,temp=0xf0; break;// default:temp=0xf0;}P3=0xfd;temp=P3&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:num=5,temp=0xf0;break;case 0xdd:num=6,temp=0xf0;break;case 0xbd:num=7,temp=0xf0;break;case 0x7d:num=8,temp=0xf0;break;// default:temp=0xf0;}}P3=0xfb;temp=P3&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:num=9,temp=0xf0;break; case 0xdb:num=10,temp=0xf0;break; case 0xbb:num=11,temp=0xf0;break; case 0x7b:num=12,temp=0xf0;break;// default:temp=0xf0;}}P3=0xf7;temp=P3;temp&=0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:num=13,temp=0xf0;break; case 0xd7:num=14,temp=0xf0;break; case 0xb7:num=15,temp=0xf0;break; case 0x77:num=16,temp=0xf0;break;// default:temp=0xf0;}}}return (num);}4X4键盘输入数码管移位显示2 #include <REG51.H>#include<intrins.h>#include<bin.h>uchar num,num1,num2,temp;uchar a,b,c,d,e,f;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};uchar code table1[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe} ;uchar keyscan();void display();void delay(uchar z){uint x;for(z;z!=0;z--)for(x=625;x!=0;x--);}void inti(){num1=0;a=b=c=d=e=f=16;wela=0;dula=0;}void main(){inti();while(1){keyscan();switch(num1){case 1:a=num-1;break;case 2:b=num-1;break;case 3:c=num-1;break;case 4:d=num-1;break;case 5:e=num-1;break;case 6:f=num-1;break;// default:;}display();}}uchar keyscan(){P3=0xf0;temp=P3;while(temp!=0xf0){delay(1);temp=P3;while(temp!=0xf0){P3=0xfe;temp=P3&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xee:num=1,temp=0xf0; break;case 0xde:num=2,temp=0xf0; break;case 0xbe:num=3,temp=0xf0; break;case 0x7e:num=4,temp=0xf0; break;// default:temp=0xf0;}}P3=0xfd; //temp=P3&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:num=5,temp=0xf0;break;case 0xdd:num=6,temp=0xf0;break;case 0xbd:num=7,temp=0xf0;break;case 0x7d:num=8,temp=0xf0;break;// default:temp=0xf0;}}P3=0xfb;temp=P3&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:num=9,temp=0xf0;break;case 0xdb:num=10,temp=0xf0;break;case 0xbb:num=11,temp=0xf0;break;case 0x7b:num=12,temp=0xf0;break;// default:temp=0xf0;}}P3=0xf7;temp=P3;temp&=0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:num=13,temp=0xf0;break;case 0xd7:num=14,temp=0xf0;break;case 0xb7:num=15,temp=0xf0;break;case 0x77:num=16,temp=0xf0;break;// default:temp=0xf0;}}P3=0xf0;while(P3!=0xf0);delay(1);while(P3!=0xf0);}if(num1==6){num1=0;}num1++;}return (num);}void display(){ //最右第1个数码管,下同。

相关文档
最新文档