文档库 最新最全的文档下载
当前位置:文档库 › 矩阵键盘扫描汇编程序

矩阵键盘扫描汇编程序

矩阵键盘扫描汇编程序
矩阵键盘扫描汇编程序

4*4矩阵键盘扫描汇编程序(基于51单片机)

// 程序名称:4-4keyscan.asm

;// 程序用途:4*4矩阵键盘扫描检测

;// 功能描述:扫描键盘,确定按键值。程序不支持双键同时按下,

;// 如果发生双键同时按下时,程序将只识别其中先扫描的按键;// 程序入口:void

;// 程序出口:KEYNAME,包含按键信息、按键有效信息、当前按键状态;//================================================================== ====

PROC KEYCHK

KEYNAME DATA 40H ;按键名称存储单元

;(b7-b5纪录按键状态,b4位为有效位,

;b3-b0纪录按键)

KEYRTIME DATA 43H ;重复按键时间间隔

SIGNAL DATA 50H ;提示信号时间存储单元

KEY EQU P3 ;键盘接口(必须完整I/O口) KEYPL EQU P0.6 ;指示灯接口

RTIME EQU 30 ;重复按键输入等待时间

KEYCHK:

;//=============按键检测程序========================================= ====

MOV KEY,#0FH ;送扫描信号

MOV A,KEY ;读按键状态

CJNE A,#0FH,NEXT1 ;ACC<=0FH

; CLR C ;Acc等于0FH,则CY为0,无须置0

NEXT1:

; SETB C ;Acc不等于0FH,则ACC必小于0 FH,

;CY为1,无须置1

MOV A,KEYNAME

ANL KEYNAME,#1FH ;按键名称屏蔽高三位

RRC A ;ACC带CY右移一位,纪录当前按键状态

ANL A,#0E0H ;屏蔽低五位

ORL KEYNAME,A ;保留按键状态

;//=============判别按键状态,决定是否执行按键扫描=================== =====

CJNE A,#0C0H,NEXT2 ;110按键稳定闭合,调用按键检测子程序

SJMP KEYSCAN

NEXT2:

CJNE A,#0E0H,NEXT3 ;111按键长闭合,重复输入允许判断

SJMP WAIT

NEXT3:

CJNE A,#0A0H,EXIT ;101干扰,当111长闭合处理

ORL KEYNAME,#0E0H

WAIT:

MOV A,KEYRTIME

JNZ EXIT ;时间没到,退出

;//=============键盘扫描程序========================================= =====

KEYSCAN:

MOV R1,#0 ;初始化列地址

MOV R3,#11110111B ;初始化扫描码

LOOP:

MOV A,R3

RL A

MOV R3,A ;保留扫描码

MOV KEY,A ;送扫描码

MOV A,KEY ;读键盘

ORL A,#0F0H ;屏蔽高四位

CJNE A,#0FFH,NEXT31 ;A不等于FFH,说明该列有按键动作

INC R1 ;列地址加1,准备扫描下一列

CJNE R1,#4,LOOP ;列地址不等于4,扫描下一列

SJMP EXIT ;没有按键,退出

;//=============按键判断对应位等于零,说明该行有按键按下============= =====

NEXT31:

JB ACC.0,NEXT32

MOV R2,#0 ;第0行有按键

SJMP NEXT5

NEXT32:

JB ACC.1,NEXT33

MOV R2,#1 ;第1行有按键

SJMP NEXT5

NEXT33:

JB ACC.2,NEXT34

MOV R2,#2 ;第2行有按键

SJMP NEXT5

NEXT34:

MOV R2,#3 ;第3行有按键

NEXT5: ;计算按键地址

MOV A,R1

RL A

RL A ;列地址乘4(每列对应4行)

ADD A,R2 ;加行地址

MOV DPTR,#KEYTAB

MOVC A,@A+DPTR

ANL KEYNAME,#0E0H

ORL KEYNAME,A ;送按键(送值的时候已经置按键有效)

MOV KEYRTIME,#RTIME ;送重复按键等待时间

CLR KEYPL ;打开指示灯

MOV SIGNAL,#10 ;送信号提示时间(每次按键闪10 0ms)

EXIT:

MOV KEY,#0FFH ;置键盘接口高电平

RET ;退出

;//=============按键名称表=========================================== =====

KEYTAB:

DB 1AH ;扫描码0,对应A ************************************ ******

DB 1BH ;扫描码1,对应B *

* **

DB 1CH ;扫描码2,对应C ** I/O口 PX.4 PX.5 PX.6 PX.

7 **

DB 1DH ;扫描码3,对应D *

* **

DB 11H ;扫描码4,对应1 ** PX.0 A(0) 1(4) 2(8) 3 (C) **

DB 14H ;扫描码5,对应4 *

* **

DB 17H ;扫描码6,对应7 ** PX.1 B(1) 4(5) 5(9) 6 (D) **

DB 1EH ;扫描码7,对应E *

* **

DB 12H ;扫描码8,对应2 ** PX.2 C(2) 7(6) 8(A) 9 (E) **

DB 15H ;扫描码9,对应5 *

* **

DB 18H ;扫描码A,对应8 ** PX.3 D(3) E(7) 0(B) F(F) **

DB 10H ;扫描码B,对应0 *

* **

DB 13H ;扫描码C,对应3 ************************************ ******

DB 16H ;扫描码D,对应6

DB 19H ;扫描码E,对应9

DB 1FH ;扫描码F,对应F

END

第二种解法

ORG 0000H

START: MOV R0,#00H ;初始化程序,开始的延时是为了使硬件能够准备好

DJNZ R0,$

LOOP: MOV SP,#60H

CALL KEY

DISPLAY:

MOV A,R4

MOV DPTR,#TABLE ;定义字形表的起始地址

MOVC A,@A+DPTR ;TABLE为表的起始地址

MOV P2,A

SJMP LOOP

;子程序内容,P1口的低四位为行线,高四位为列线

KEY: PUSH PSW

PUSH ACC

MOV P1,#0F0H ;令所有的行为低电平,全扫描字-P1.0-P1.3,列为输入方式

;这一段只是验证有键按下,并不能判断是哪一行

MOV R7,#0FFH ;设置计数常数,作为延时

KEY1: DJNZ R7, KEY1

MOV A,P1 ;读取P1口的列值

ANL A,#0F0H ;判别有键值按下吗(当有键按下时,P1口的高四位就不全为1了,底四位还是都为

0的)

;这个地方进行相或的原因,是因为要把底四位的0000变成1111,以便下一步进行求反ORL A,#0FH //这个地方原版上没有,这是又加了,如果不加的的话,是不对的********

CPL A ;求反后,有高电平就有键按下

JZ EKEY;累加器为0则转移(意为求反后本来全为0的,如果有键按下时,求反后高四位就有1了),

退出

LCALL DEL20ms ;有键按下,进行处理

;下面进行行行扫描,1行1行扫

SKEY: MOV A,#00H

MOV R0,A ;R0作为行计数器,开始初值为0

MOV R1,A ;R1作为列计数器,开始初值为0

MOV R2,#0FEH ;R2作为扫描暂存字,开始初值为1111 1110,(第四位作为行扫描字)

SKEY2: MOV A,R2

MOV P1,A ;输出行扫描字,1111 1110

NOP

NOP

NOP ;3个NOP操作使P1口输出稳定

MOV A,P1 ;读列值(和开始一样)

MOV R1,A ;暂存列值(第一次为**** 1110,既高四位有一位"可能"会为0)

ANL A,#0F0H ;取高四位,

ORL A,#0FH ;使第四位全部置1

CPL A

BIAOZHI:JNZ SKEY3 ;累加器为非0则转移指令(意思是判断到按键在这一行),转去处理

INC R0 ;如果按键没在这一行,行计数器加1

SETB C ;进位标志位加1,为了在左移的时候开始的低位0不在出现在低(循环一圈后)

MOV A,R2

RLC A ;带进位左移1位(形成下一行扫描字,再次扫描)

MOV R2,A

MOV A,R0

;把加1后的行计数器R0和总共扫描次数(4次比较)

CJNE A,#04H,SKEY2 ;(扫描完了么)书本上这个地方也有错误,书本上写的是:SKEY1

AJMP EKEY ;如果没有的话,退出

;有键按下后行扫描过后,此为确列行

SKEY3: MOV A,R1 ;

JNB ACC.4,SKEY5 ;直接寻址位为0咋转移指令

JNB ACC.5,SKEY6

JNB ACC.6,SKEY7

JNB ACC.7,SKEY8

AJMP EKEY //我自己感觉到这命令没有用处

SKEY5: MOV A,#00H ;存0列号

MOV R3,A

AJMP DKEY

SKEY6: MOV A,#01H ;存1列号

MOV R3,A

AJMP DKEY

SKEY7: MOV A,#02H ;存2列号

MOV R3,A

AJMP DKEY

SKEY8: MOV A,#03H ;存3列号

MOV R3,A

AJMP DKEY

;取出具体的行号,再加上列号,最终确认按键的号码

DKEY: //MOV R4,#00H

MOV A,R0

MOV B,#04H

MUL AB ;让行号*4,第四位放在A中(总共就4行,相乘后一定<16,也就是只有第四位有值)ADD A,R3 ;让行号和列号相加,最终确认任按键的具体号

MOV R4,A

EKEY: POP ACC

POP PSW

RET ;按键扫描处理函数

DEL20ms:

MOV R7,#2

DL2: MOV R6,#18

DL1: MOV R5,#255

DJNZ R5,$

DJNZ R6,DL1

DJNZ R7,DL2

RET

;此为共阴极数码管的数字表

TABLE: DB 3FH ;0

DB 06H ;1

DB 5BH ;2

DB 4FH ;3

DB 66H ;4

DB 6DH ;5

DB 7DH ;6

DB 27H ;7

DB 7FH ;8

DB 6FH ;9

DB 77H

DB 7CH

DB 39H

DB 5EH

DB 79H

DB 71H

END

第三种

PIC单片机键盘扫描汇编程序

;本程序用于PIC外接键盘的识别,通过汇编程序,使按下K1键时第一个数码管显示1,按下K2键时第一

;个数码管上显示2,按下K3键时第一个数码管上显示3,按下K4键时第一个

数码管上显示4,

;汇编程序对键盘的扫描采用查询方式

LIST P=18F458

INCLUDE "P18F458.INC"

;所用的寄存器

JIANR EQU 0X20

FLAG EQU JIANR+1 ;标志寄存器

DEYH EQU JIANR+2

DEYL EQU JIANR+3

F0 EQU 0 ;FLAG的第0位定义为F0

ORG 0X00

GOTO MAIN

ORG 0X30

;*************以下为键盘码值转换表****************** CONVERT ADDWF PCL,1

RETLW 0XC0 ;0,显示段码与具体的硬件连接有关

RETLW 0XF9 ;1

RETLW 0XA4 ;2

RETLW 0XB0 ;3

RETLW 0X99 ;4

RETLW 0X92 ;5

RETLW 0X82 ;6

RETLW 0XD8 ;7

RETLW 0X80 ;8

RETLW 0X90 ;9

RETLW 0X88 ;A

RETLW 0X83 ;B

RETLW 0XC6 ;C

RETLW 0XA1 ;D

RETLW 0X86 ;E

RETLW 0X8E ;F

RETLW 0X7F ;"."

RETLW 0XBF ;"-"

RETLW 0X89 ;H

RETLW 0XFF ;DARK

RETURN

;***************PIC键盘扫描汇编程序初始化子程序***************** INITIAL

BCF TRISA,5 ;置RA5为输出方式,以输出锁存信号

BCF TRISB,1

BCF TRISA,3

BCF TRISE,0

BCF TRISE,1

BSF TRISB,4 ;设置与键盘有关的各口的输入输出方式

BCF TRISC,5

BCF TRISC,3 ;设置SCK与SDO为输出方式

BCF INTCON,GIE ;关闭所有中断

LW 0XC0

WF SSPSTAT ;设置SSPSTAT寄存器

LW 0X30

WF SSPCON1 ;设置SPI的控制方式,允许SSP方式,并且时钟下降

;沿发送数据,与"74HC595当其SCLK从低到高电平

;跳变时,串行输入数据(DI)移入寄存器"的特点相对应

LW 0X01

WF JIANR ;显示值寄存器(复用为键值寄存器)赋初值

CLRF FLAG ;清除标志寄存器

RETURN ;返回

;**************显示子程序*****************

DISPLAY

CLRF PORTA

WF SSPBUF

AGAIN

BTFSS PIR1,SSPIF

GOTO AGAIN

NOP

BCF PIR1,SSPIF

BSF PORTA,5 ;详细的程序语句请参考https://www.wendangku.net/doc/4215587214.html, pic教程语句部分,可在首页搜索。

RETURN

;**************查键子程序*****************

KEYSCAN

BCF PORTB,1

BCF PORTA,3

BCF PORTE,0

BCF PORTE,1 ;K1,K2,K3,K4四条列线置0

NOP

NOP ;延时,使引脚的电平稳定

BTFSC PORTB,4

BCF FLAG,F0 ;RB4为1,表示没键按下,清除标志F0

NOP

BTFSS PORTB,4

BSF FLAG,F0 ;RB4为0,表示有键按下,建立标志F0 RETURN

;**********键盘去抖子程序(约8ms的延时)** *************** KEYDELAY

LW 0X0A

WF DEYH

AGAIN2 LW 0XFF

WF DEYL

AGAIN1 DECFSZ DEYL,1

GOTO AGAIN1

DECFSZ DEYH,1

GOTO AGAIN2

RETURN

;***************键服务子程序****************

;确定键值的子程序

KEYSERVE

JIANZHI BCF PORTB,1

BCF PORTA,3

LW 0X03

WF PORTE ;K1,K2置低电平,K3,K4置高电平

NOP

NOP ;使引脚电平稳定

BTFSS PORTB,4

GOTO K1K2 ;RB4为0,表示按键为K1,K2中的一个

GOTO K3K4 ;RB4为1,表示按键为K3,K4中的一个

K1K2 BCF PORTB,1

BSF PORTA,3 ;K1置低电平,K2置高电平

NOP

NOP ;使引脚电平稳定

BTFSS PORTB,4

GOTO K1 ;RB4为0,表示按键为K1

GOTO K2 ;RB4为1,表示按键为K2

K3K4 BCF PORTE,0

BSF PORTE,1 ;K3置低电平,K4置高电平

NOP

NOP ;使引脚电平稳定

BTFSS PORTB,4

GOTO K3 ;RB4为0,表示按键为K3

GOTO K4 ;RB4为1,表示按键为K4

K1 LW 0X03

WF JIANR

GOTO JIANW

K2 LW 0X05

WF JIANR

BCF PORTA,3

GOTO JIANW

K3 LW 0X07

WF JIANR

GOTO JIANW

K4 LW 0X09

WF JIANR ;以上根据按下的键把相应的值送给JIANR

BCF PORTE,1

JIANW BTFSS PORTB,4

GOTO JIANW ;为了防止一次按键多次识别,等键松开才返回RETURN

;****************************************

MAIN NOP

CALL INITIAL ;调用初始化子程序

LOOP

CALL KEYSCAN ;查键

BTFSC FLAG,F0

CALL KEYDELAY ;若检测到有键按下,则调用软件延时子程序去抖动

BTFSC FLAG,F0

CALL KEYSCAN ;若第一次扫描到有键按下,则经过前面的延时去抖后;再次进行键扫描

BTFSC FLAG,F0

CALL KEYSERVE ;若确认有键按下,则需要调用键服务程序

BTFSS FLAG,F0

GOTO LOOP ;如果无键按下,则反复进行键扫描

F JIANR,W

CALL CONVERT ;把按键对应的数字转换成待显示的段码

CALL DISPLAY ;调用显示子程序

GOTO LOOP

END

;* 按矩阵键盘上的键对应的LED显示相应键值 * ;* 矩阵键盘定义: *

;* P1.1-P1.3为行线,P1.4-P 1.7为列线 *

; P0口接led显示

ORG 0000H

JMP MAIN

MAIN:

MOV P0,#0FFH ;初始化端口口

MOV P1,#0FFH

KEYDOWN: ;;;;判断是否有键按下部分

MOV P1,#0F0H

LCALL DELAY

MOV A,P1

CJNE A,#0F0H,KEYSCAN

JMP KEYDOWN

KEYSCAN: ;;扫描键值部分222

MOV A,#00H

MOV P1,#0F0H

MOV A,P1

CJNE A,#70H,N1

MOV R4,#03H

JMP NEXT

N1: CJNE A,#0B0H,N2

MOV R4,#02H

JMP NEXT

N2: CJNE A,#0D0H,N3

MOV R4,#01H

JMP NEXT

N3: CJNE A,#0E0H,NEXT

MOV R4,#00H

JMP NEXT

NEXT:

MOV P1,#00FH

MOV A,P1

CJNE A,#07H,N4

MOV R3,#08H

JMP NEXT1

N4: CJNE A,#0BH,N5

MOV R3,#04H

JMP NEXT1

N5: CJNE A,#0DH,DISPLAY

MOV R3,#00H

JMP DISPLAY

DISPLAY: ;显示部分

MOV A,R4

ADD A,R3

MOV DPTR,#LEDTAB

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

LCALL DELAY

MOV P0,#0FFH

LJMP KEYDOWN

DELAY: ;消抖延时部分

MOV R6,#25

D2: MOV R7,#100

DJNZ R7,$

DJNZ R6,D2

RET

LEDTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H END

4×4矩阵键盘51汇编程序(线反转法)

ISIS 仿真图 C1 22pF C2 22pF P33 P32 P31 P30 矩阵键盘线反转法 U1 X1 19 XTAL1P0.0/AD0 39 38 P0.1/AD1 CRYSTAL P0.2/AD2 37 1836 XTAL2P0.3/AD3 35 P0.4/AD4 34 P0.5/AD5 R133 P0.6/AD6 932 RST P0.7/AD7 10k 21 C3P2.0/A822 P2.1/A9 23 P2.2/A10 2924 PSEN P2.3/A11 10u3025 ALE P2.4/A12 3126 EA P2.5/A13 27 P2.6/A14 28 P2.7/A15 1 P1.0P3.0/RXD 10P30 211P31 P1.1P3.1/TXD 312P32 P1.2P3.2/INT0 413P33 P1.3P3.3/INT1 514P34 P1.4P3.4/T0 615P35 P1.5P3.5/T1 716P36 P1.6P3.6/WR 817P37 P1.7P3.7/RD AT89C51 7654 3333 P P P P 汇编源程序代码 ORG0000H LJMP MAIN ORG0100H

MAIN:ACALL KEYSCAN; 调用子函数 MOV A,30H ; 从 30H单元取相应的数值 MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P2,A ACALL DELAY SJMP MAIN KEYSCAN: MOV P3,#0FH; 线反转法 MOV A,P3 ANL A,#0FH MOV B,A MOV P3,#0F0H MOV A,P3 ANL A,#0F0H ORL A,B CJNE A,#0FFH,KEYPRO RET KEYPRO: MOV B,A; 键值处理程序MOV DPTR,#KEYVALUE MOV R3,#0FFH KEY1:INC R3 MOV A,R3

扫描矩阵键盘简介以及其FPGA设计思路

扫描键盘的设计思想和代码技巧非常值得学习。 首先扫描键盘可以节省FPGA 的引脚资源,例如一个4x4的扫描键盘有16个按键,如果不用扫描方式而是直接把16跟控制线接入FPGA ,就要16个引脚,而用扫描方式只需要4+4=8个引脚。尤其是随着键盘的增大,比如8x9=72的键盘,用扫描方式只需要17个引脚。 要想了解扫描键盘的原理,首先要知道矩阵键盘的电路结构。 如上图所示,矩阵键盘的某一个按钮按下会使对应的一条行线和列线导通,为了便于分析扫描过程做如下简化: 3.3v Row0 Row1 Row2 Row3 Col 0 Col 1 Col 2 Col 3 Row0 Row1 Row2 Row3 Col 0 Col 1 Col 2 Col 3 3 5 A E D C 2 B 9 8 F 4 6 0 1 7 接高电平 由FPGA 输出给键盘高低电平的组合,即是扫描码 键盘行线 高低电平的变化输入给FPGA

扫描键盘的工作状态分为两种: 第一种状态是判断是否有键按下,该状态下四根列线对应的电平状态是{col 0,col 1,col 2,col 3}=0000 。四根行线左端都接高电平,没有键被按下时,四根行线右端的状态是{row0,row1,row2,row3}=1111 。假如上图中按键3被按下了,也就是说row0和col 0接通了。那么四根行线右端的状态将会是{row0,row1,row2,row3}=0111 。也就是说,在第一种状态下,只要键盘行线输入FPGA的状态不是1111,就说明有键被按下了。马上进入第二状态。 第二种状态是判断具体哪个键被按下了。该状态下四根行线左端接高电平不变,四根列线对应的电平状态不断变化,由FPGA的输出的扫描码控制四根列线的电平状态。由第一状态的行线输入已经可以确定按键所处的行了。接下来只要再确定按键所处的列就可以确定到底哪个键被按下了。 如何根据行线的输入确定按键所处的列,奥妙就在于扫描码了。让列线以1000、0100、0010、0001的电平状态不断循环。假设上一状态确定按键处于row0行,那么随着扫描的进行,行线输入的变化规律如下表: 1000 0100 0010 0001 1000 0100 0010 0001 1000 0100 0010 0001 扫描 码 Row0 1 0 0 0 1 0 0 0 1 0 0 0 Row1 1 1 1 1 1 1 1 1 1 1 1 1 Row2 1 1 1 1 1 1 1 1 1 1 1 1 Row3 1 1 1 1 1 1 1 1 1 1 1 1 观察上表可以发现,在row0是1的时候与之对应的扫描码可以体现出按键所在列。 一个随之而来的设计思路是在第一状态确定按键所在行,然后在第二状态捕捉特定行是高电平的时候所对应的扫描码。 但是这里有一个不可避免的实际问题,那就是机械键盘的抖动!这种抖动主要体现在两个方面:第一,我们手指按某个键的时候可能由于接触面积大无意中碰到周围的键。第二,在按着一个键的时候由于力度不均或者接触不良,行线和列线并不能时刻保持接通的状态。下图来自网络上,描述的是单片机的机械键盘,借用一下。

汇编矩阵键盘程序

方法一、 ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV P1,#0F0H //P1口设初值F0,矩阵按键高四位置1,低四位置0, JNB P1.4,Y0 //用JNB检测按键端口,P1.4口低电平跳转 Y0 JNB P1.5,Y1 JNB P1.6,Y2 JNB P1.7,Y3 SJMP MAIN Y0: MOV 30H,#00H MOV P1,#0EFH JNB P1.4,X0 MOV P1,#0DFH JNB P1.4,X1 MOV P1,#0BFH JNB P1.4,X2 MOV P1,#07FH JNB P1.4,X3 Y1: MOV 30H,#01H MOV P1,#0EFH JNB P1.0,X0 MOV P1,#0DFH JNB P1.1,X1 MOV P1,#0BFH JNB P1.2,X2 MOV P1,#7FH JNB P1.3,X3 Y2: MOV 30H,#02H MOV P1,#0EFH JNB P1.0,X0 MOV P1,#0DFH JNB P1.1,X1 MOV P1,#0BFH JNB P1.2,X2 MOV P1,#7FH JNB P1.3,X3 Y3: MOV 30H,#03H MOV P1,#0EFH

MOV P1,#0DFH JNB P1.1,X1 MOV P1,#0BFH JNB P1.2,X2 MOV P1,#7FH JNB P1.3,X3 X0: MOV 31H,#00H ACALL DELAY MOV P1,#0F0H LJMP JISUAN X1: MOV 31H,#01H ACALL DELAY MOV P1,#0F0H LJMP JISUAN X2: MOV 31H,#02H ACALL DELAY MOV P1,#0F0H LJMP JISUAN X3: MOV 31H,#03H ACALL DELAY MOV P1,#0F0H LJMP JISUAN JISUAN: MOV A,31H MOV B,#04H MUL AB ADD A,30H MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,A CC: MOV A,P1 ANL A,#0F0H XRL A,#0F0H JNZ CC LCALL MAIN DELAY: MOV R4,#0C5H D1: MOV R5,#43H D0: MOV R6,#10H

4X4扫描式矩阵键盘课程设计

4X4扫描式矩阵键盘课程设计 课程设计名称: 4_4扫描式矩阵键盘设计 姓名:DUKE 班级:电子1008班 学号:10086 成绩: 日期:2014年1月6日

摘要 随着21世纪的到来,电子信息行业将是人类社会的高科技行业之一,式设施现代化的基础,也是人类通往科技巅峰的直通路。电子行业的发展从长远来看很重要,但最主要的还是科技问题。 矩阵式键盘提高效率进行按键操作管理有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身素质的要求。是它能准时、实时、高效地显示按键信息,以提高工作效率和资源利用率。 矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,显示在LED数码管上。单片机控制依据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。 4*4矩阵式键盘采用AT89C51单片机为核心,主要由矩阵式键盘电路、译码电路、显示电路等组成,软件选用C语言编程。单片机将检测到的按键信号转换成数字量,显示于LED显示器上。该系统灵活性强,易于操作,可靠性高,将会有更广阔的开发前景。

目录 第一章:系统功能要求-------------------------------------------------------- 1.1 4*4 矩阵式键盘系统概述------------------------------------------------ 1.2 本设计任务和主要内容--------------------------------------------------- 第二章:方案论证--------------------------------------------------------------- 第三章:系统硬件电路的设计------------------------------------------------ 3.1 单片机控制系统原理----------------------------------------------------- 3.2 原理图绘制说明---------------------------------------------------------- 3.3 画出流程图---------------------------------------------------------------- 3.4 原理图绘制--------------------------------------------------------------- 第四章:系统程序的设计------------------------------------------------------ 4.1 程序的编写步骤----------------------------------------------------------- 4.2 编写的源程序-------------------------------------------------------------- 第五章:调试及性能分析------------------------------------------------------ 第六章:心得体会--------------------------------------------------------------- 参考文献----------------------------------------------------------------------------

单片机矩阵键盘扫描程序

#include #include #define uint unsigned int #define uchar unsigned char sbit E=P2^7; //1602使能引脚 sbit RW=P2^6; //1602读写引脚 sbit RS=P2^5; //1602数据/命令选择引脚 uint keyflag ; //键盘正在读取标志位,如果Keyflag为1 ,表示正在读取键盘,停止其他功能; char x,y,m,n,c; //Keyflag为0,读取键盘结束,恢复其他功能 char flag1=0; //频率范围10~1000Hz uchar Hrate = 0; //一个周期内高点平占据时间 uchar Lrate = 0; //一个周期内低电平占据时间 uint FREQ0; //定时器T0的计数变量// uint FREQ1; //定时器T1的计数变量// sbit P2_1=P2^0; //设置P2.1,作为信号输出口// uint disbuf[3]; uint figure=0; int sum2=0; int sum1=0; int flag=0; uint count=0; uint max=0; uint disbuf_temp=0; /******************************************************************** * 名称: 1602显示延时函数delay() * 功能: 延时,延时时间大概为5US。

* 输出: 无 ***********************************************************************/ void delay() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } /******************************************************************** * 名称: bit Busy(void) * 功能: 这个是一个读状态函数,读出函数是否处在忙状态 * 输入: 输入的命令值 * 输出: 无 ***********************************************************************/ bit Busy(void) { bit busy_flag = 0; RS = 0; RW = 1; E = 1; delay(); busy_flag = (bit)(P0 & 0x80); E = 0; return busy_flag; } /******************************************************************** * 名称: wcmd(uchar del) * 功能: 1602命令函数 * 输入: 输入的命令值 * 输出: 无 ***********************************************************************/ void wcmd(uchar del) { while(Busy()); RS = 0; RW = 0; E = 0; delay(); P0 = del; delay(); E = 1;

矩阵键盘的工作原理和扫描确认方式

9.3.1 矩阵键盘的工作原理和扫描确认方式 来源:《AVR单片机嵌入式系统原理与应用实践》M16华东师范大学电子系马潮 当键盘中按键数量较多时,为了减少对I/O 口的占用,通常将按键排列成矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图9-7 所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU 通过检测行或列线上的电平变化可以确定哪个按键被按下。 图9-7 为一个 4 x 3 的行列结构,可以构成12 个键的键盘。如果使用 4 x 4 的行列结构,就能组成一个16 键的键盘。很明显,在按键数量多的场合,矩阵键盘与独立式按键键盘相比可以节省很多的I/O 口线。 矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式按键复杂。在矩阵键盘的软件接口程序中,常使用的按键识别方法有行扫描法和线反转法。这两种方法的基本思路是采用循环查循的方法,反复查询按键的状态,因此会大量占用MCU 的时间,所以较好的方式也是采用状态机的方法来设计,尽量减少键盘查询过程对MCU 的占用时间。 下面以图9-7 为例,介绍采用行扫描法对矩阵键盘进行判别的思路。图9-7 中,PD0、PD1、PD2 为3 根列线,作为键盘的输入口(工作于输入方式)。PD3、PD4、PD5、PD6 为4根行线,工作于输出方式,由MCU(扫描)控制其输出的电平值。行扫描法也称为逐行扫描查询法,其按键识别的过程如下。 √将全部行线PD3-PD6 置低电平输出,然后读PD0-PD2 三根输入列线中有无低电平出现。只要有低电平出现,则说明有键按下(实际编程时,还要考虑按键的消抖)。如读到的都是高电平,则表示无键按下。 √在确认有键按下后,需要进入确定具体哪一个键闭合的过程。其思路是:依

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

长沙学院 《单片机原理及应用》 课程设计说明书 题目液晶显示4*4矩阵键盘按键号 程序设计 系(部) 电子与通信工程系 专业(班级) 电气1班 姓名龙程 学号2011024109 指导教师刘辉、谢明华、王新辉、马凌 云 起止日期2014.5.19—2014.5.30

长沙学院课程设计鉴定表

《单片机技术及应用》课程设计任务书系(部):电子与电气工程系专业:11级电子一班指导教师:谢明华、刘辉

目录 前言 (5) 一、课程设计目的 (6) 二、设计内容及原理 (6) 2.1 单片机控制系统原理 (6) 2.2阵键盘识别显示系统概述 (6) 2.3键盘电路 (7) 2.4 12864显示器 (8) 2.5整体电路图 (9) 2.6仿真结果 (9) 三、实验心得与体会 (10) 四、实验程序 (10) 参考文献 (18)

前言 单片机,全称单片微型计算机(英语:Single-Chip Microcomputer),又称微控制器 应(不用外接硬件)和节约成本。它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出接口简单,功能较低。由于其发展非常迅速,旧的单片机的定义已不能满足,所以在很多应用场合被称为范围更广的微控制器;从上世纪80年代,由当时的4位、8位单片机,发展到现在的32位300M的高速单片机。现代人类生活中所用的几乎每件有电子器件的产品中都会集成有单片机。手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电子产品中都含有单片机。汽车上一般配备40多片单片机,复杂的工业控制系统上甚至可能有数百片单片机在同时工作!单片机的数量不仅远超过PC机和其他计算机的总和,甚至比人类的数量还要多。 是以电流刺激液晶分子产生点、线、面配合背部灯管构成画面。由一定数量的彩色或黑白像素组成,放置于光源或者反射面前方。液晶显示器功耗低,因此倍受工程师青睐,适用于使用电池的电子设备。英国科学家在上世纪制造了第一块液晶显示器即LCD。而第一台可操作的LCD基于动态散射模式(Dynamic Scattering Mode,DSM),是RCA公司乔治·海尔曼带领的小组开发的。 LED点阵屏通过LED(发光二极管)组成,以灯珠亮灭来显示文字、图片、动画、视频等,是各部分组件都模块化的显示器件,通常由显示模块、控制系统及电源系统组成。LED点阵显示屏制作简单,安装方便,被广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。 交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键, 键盘是合理的。

扫描式矩阵键盘课程设计

扫描式矩阵键盘课程设 计 Company number【1089WT-1898YT-1W8CB-9UUT-92108】

4X4扫描式矩阵键盘课程设计课程设计名称: 4_4扫描式矩阵键盘设计 姓名: DUKE 班级:电子1008班 学号: 10086 成绩: 日期: 2014年1月6日 摘要 随着21世纪的到来,电子信息行业将是人类社会的高科技行业之一,式设施现代化的基础,也是人类通往科技巅峰的直通路。电子行业的发展从长远来看很重要,但最主要的还是科技问题。 矩阵式键盘提高效率进行按键操作管理有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身素质的要求。是它能准时、实时、高效地显示按键信息,以提高工作效率和资源利用率。 矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,显示在LED数码管上。单片机控制依据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。 4*4矩阵式键盘采用AT89C51单片机为核心,主要由矩阵式键盘电路、译码电路、显示电路等组成,软件选用C语言编程。单片机将检测到的按键信号

转换成数字量,显示于LED显示器上。该系统灵活性强,易于操作,可靠性高,将会有更广阔的开发前景。 目录 第一章:系统功能要求-------------------------------------------------------- 1.1 4*4 矩阵式键盘系统概述------------------------------------------------ 1.2 本设计任务和主要内容--------------------------------------------------- 第二章:方案论证--------------------------------------------------------------- 第三章:系统硬件电路的设计------------------------------------------------ 3.1 单片机控制系统原理----------------------------------------------------- 3.2 原理图绘制说明---------------------------------------------------------- 3.3 画出流程图---------------------------------------------------------------- 3.4 原理图绘制---------------------------------------------------------------

51单片机矩阵键盘扫描程序

/*----------------------------------------------- 名称:矩阵键盘依次输入控制使用行列逐级扫描 论坛:https://www.wendangku.net/doc/4215587214.html, 编写:shifang 日期:2009.5 修改:无 内容:如计算器输入数据形式相同从右至左使用行列扫描方法 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换 #define KeyPort P1 sbit LATCH1=P2^2;//定义锁存使能端口段锁存 sbit LATCH2=P2^3;// 位锁存 unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 unsigned char TempData[8]; //存储显示值的全局变量 void DelayUs2x(unsigned char t);//us级延时函数声明 void DelayMs(unsigned char t); //ms级延时 void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数 unsigned char KeyScan(void);//键盘扫描 unsigned char KeyPro(void); void Init_Timer0(void);//定时器初始化 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { unsigned char num,i,j; unsigned char temp[8]; Init_Timer0(); while (1) //主循环 { num=KeyPro();

矩阵键盘程序(汇编+lcd显示)

; P0接LCD ; P2接矩阵键盘 RS EQU P1.5 ;确定具体硬件的连接方式 RW EQU P1.6 ;确定具体硬件的连接方式 E EQU P1.7 ;LCD1602引脚 ORG 0H MAIN: ACALL START MOV P0,#8FH ;写入显示起始地址(第一行第一个位置)ACALL ENABLE ;调用写入命令子程序 MOV R0,#2FH MOV 2FH,#30H MOV R6,#1 ACALL WRITE1 D: MOV 56H,#0 MOV R1,#50H MOV 54H,#2FH TEST: ;键盘扫描 MOV P2,#0F0H MOV A,P2 CJNE A,#0F0H,HAVE SJMP TEST HAVE: MOV A,#0FEH NEXT: MOV B,A MOV P2,A READ: MOV A,P2 ANL A,#0F0H CJNE A,#0F0H,SCOND MOV A,B RL A CJNE A,#0EFH,NEXT SCOND:ACALL DAY MOV A,P2 ANL A,#0F0H CJNE A,#0F0H,JS SJMP TEST JS: MOV R2,A MOV A,B ANL A,#0FH ORL A,R2

SON: CJNE A,#0E7H,S1 AJMP MAIN S1: CJNE A,#0D7H,S4 MOV B,#31H ;1的ACSII值为31H AJMP YZ S4: CJNE A,#0B7H,S7 MOV B,#34H AJMP YZ S7: CJNE A,#77H,S0 MOV B,#37H AJMP YZ S0: CJNE A,#0EBH,S2 MOV B,#30H AJMP YZ S2: CJNE A,#0DBH,S5 MOV B,#32H AJMP YZ S5: CJNE A,#0BBH,S8 MOV B,#35H AJMP YZ S8: CJNE A,#7BH,S3 MOV B,#38H AJMP YZ S3: CJNE A,#0DDH,S6 MOV B,#33H AJMP YZ S6: CJNE A,#0BDH,S9 MOV B,#36H AJMP YZ S9: CJNE A,#7DH,TEST MOV B,#39H AJMP YZ YZ:MOV A,56H CJNE A,#0,YZ1 SJMP YZ2 YZ1: CJNE @R1,#10,YZ2 AJMP TEST YZ2: CJNE R1,#50H,YZ3 MOV 55H,#0 MOV 58H,#0 MOV A,56H

4X4矩阵式键盘输入程序

4*4键盘程序readkeyboard: begin: acall key_on jnz delay ajmp readkeyboard delay:acall delay10ms acall key_on jnz key_num ajmp begin key_num:acall key_p anl a,#0FFh jz begin acall key_ccode push a key_off:acall key_on jnz key_off pop a ret key_on: mov a,#00h orl a,#0fh mov p1,a mov a,p1 orl a,#0f0h cpl a ret key_p: mov r7,#0efh l_loop:mov a,r7 mov p1,a mov a,p1 orl a,#0f0h mov r6,a cpl a jz next ajmp key_c next: mov a,r7 jnb acc.7,error rl a mov r7,a ajmp l_loop error:mov a,#00h ret key_c:mov r2,#00h mov r3,#00h mov a,r6

mov r5,#04h again1:jnb acc.0,out1 rr a inc r2 djnz r5, again1 out1: inc r2 mov a,r7 mov r5,#04h again2:jnb acc.4,out2 rr a inc r3 djnz r5,again2 out2: inc r3 mov a, r2 swap a add a,r3 ret key_ccode:push a swap a anl a,#0fh dec a rl a ;行号乘4 rl a mov r7,a pop a anl a,#0fh dec a add a,r7 ret delay10ms: anl tmod,#0f0h orl tmod,#01h mov th0,#0d8h mov tl0,#0f0h setb tr0 wait:jbc tf0,over ajmp wait clr tr0 over:ret 单片机键盘设计 (二)从电路或软件的角度应解决的问题 软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。通常采用软件延时的方法:在第一次检测到有键按下时,执行一段延时10ms的子程序后,再确认电平是否仍保持闭合状态电平,如果保持闭合状态电平,则确认真正有键按下,进行相应处理工作,消除了抖动的影响。(这种消除抖动影响的软件措施是切实可行的。)

单片机4X4键盘扫描和显示课程设计

二、设计内容 1、本设计利用各种器件设计,并利用原理图将8255单元与键盘及数码管显示单元连接,扫描键盘输入,最后将扫描结果送入数码管显示。键盘采用4*4键盘,每个数码管可以显示0-F共16个数。将键盘编号,记作0-F,当没按下其中一个键时,将该按键对应的编号在一个数码管上显示出来,当在按下一个 键时,便将这个按键的编号在下一个数码管上显示,数码管上 可以显示最近6次按下的按键编号。 设计并实现一4×4键盘的接口,并在两个数码管上显示键盘所在的行与列。 三、问题分析及方案的提出 4×4键盘的每个按键均和单片机的P1口的两条相连。若没有按键按下时,单片机P1口读得的引脚电平为“1”;若某一按键被按下,则该键所对应的端口线变为地电平。单片机定时对P1口进行程序查询,即可发现键盘上是否有按键按下以及哪个按键被按下。 实现4×4键盘的接口需要用到单片机并编写相应的程序来识别键盘的十六个按键中哪个按键被按下。因为此题目还要求将被按下的按键显示出来,因此可以用两个数码管来分别显示被按下的按键的行与列

表示任意一个十六进制数)分别表示键盘的第二行、第三行、第四行;0xXE、0xXD、0xXB、0xX7(X表示任意一个十六进制数)则分别表示键盘的第一列、第二列、第三列和第四列。例如0xD7是键盘的第二行第四列的按键 对于数码管的连接,采用了共阳极的接法,其下拉电阻应保证芯片不会因为电流过大而烧坏。 五、电路设计及功能说明 4×4键盘的十六个按键分成四行四列分别于P1端口的八条I/O 数据线相连;两个七段数码管分别与单片机的P0口和P2口的低七 位I/O数据线相连。数码管采用共阳极的接法,所以需要下拉电阻 来分流。结合软件程序,即可实现4×4键盘的接口及显示的设计。 当按下键盘其中的一个按键时,数码管上会显示出该按键在4×4键 盘上的行值和列值。所以实现了数码管显示按键位置的功能 四、设计思路及原因 对于4×4键盘,共有十六个按键。如果每个按键与单片机的一个引脚相连,就会占用16个引脚,这样会使的单片机的接口不够用(即使够用,也是对单片机端口的极大浪费)。因此我们应该行列式的接法。行列式非编码键盘是一种把所有按键排列成行列矩阵的键盘。在这种键若没有按键按下时,单片机从P1口读得的引脚电平为“1”;若某一按键被按下,则该键所对应的端口线变为地电平。因此0xEX(X表示任意4×4键盘的第一行中的某个按键被按下,相应的0xDX、0xBX、0x7X(X 二、实验内容

4X4扫描式矩阵键盘课程设计讲解

4x4矩阵键盘识别设计班级:1221201 专业:测控技术与仪器 姓名:涂勇 学号:2012 2012 0110 指导老师:钟念兵 东华理工大学 2016年1月1日

摘要 随着21世纪的到来,电子信息行业将是人类社会的高科技行业之一,电子式设施现代化的基础,也是人类通往科技巅峰的直通路。电子行业的发展从长远来看很重要,但最主要的还是科技问题。 矩阵式键盘提高效率进行按键操作管理有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身素质的要求。是它能准时、实时、高效地显示按键信息,以提高工作效率和资源利用率。 矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N 个按键,显示在LED数码管上。单片机控制依据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。 4*4矩阵式键盘采用STM32嵌入式微处理器为核心,主要由矩阵式键盘电路、硬件电路、显示电路等组成,软件选用C语言编程。STM32将检测到的按键信号转换成数字量,显示于LED显示器上。该系统灵活性强,易于操作,可靠性高,将会有更广阔的开发前景。

目录 第一章:系统功能要求--------------------------------------------------------4*4 矩阵式键盘系统概述------------------------------------------------ 本设计任务和主要内容--------------------------------------------------- 第二章:系统硬件电路的设计------------------------------------------------硬件系统主要思路和电路原理图- -------------------------------------- 硬件上键盘规划- --------------------------------------------------------- 第三章:系统程序的设计------------------------------------------------------程序的编写步骤----------------------------------------------------------- 编写的源程序-------------------------------------------------------------- 第四章:心得体会---------------------------------------------------------------

矩阵键盘程序c程序,51单片机.

/*编译环境:Keil 7.50A c51 */ /*******************************************************/ /*********************************包含头文件********************************/ #include /*********************************数码管表格********************************/ unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x 8E}; /**************************************************************************** 函数功能:延时子程序 入口参数: 出口参数: ****************************************************************************/ void delay(void) { unsigned char i,j; for(i=0;i<20;i++) for(j=0;j<250;j++); } /**************************************************************************** 函数功能:LED显示子程序 入口参数:i 出口参数: ****************************************************************************/ void display(unsigned char i) { P2=0xfe; P0=table[i]; } /**************************************************************************** 函数功能:键盘扫描子程序 入口参数: 出口参数: ****************************************************************************/ void keyscan(void) { unsigned char n; //扫描第一行 P1=0xfe;

单片机矩阵键盘检测程序并用数码管显示c语言程序

#include #define uint16 unsigned int #define uint8 unsigned char //控制数码管段选锁存口 sbit P3_7=P3^7; //共阴数码管显示 uint8 code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0}; uint8 temp; uint16 num; //延时子函数 void delay(uint16 z) { uint16 x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } //子函数声明 uint8 keyscan(); void display(uint8);

void main() { num=17; while(1) { display(keyscan()); } } void display(uint8 num1) { P2=0xf8; P3_7=1; P0=table[num1-1]; P3_7=0; } uint8 keyscan() { P1=0xfe; temp = P1;

temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xee:num=1;break; case 0xde:num=2;break; case 0xbe:num=3;break; case 0x7e:num=4;break; default:break; } while(temp!=0xf0)//检测按键是否放开 { temp=P1; temp=temp&0xf0; }

4X4键盘扫描实验

44 键盘扫描实验 实验目的 1、学习HDL程序的基本设计技巧; 2、掌握矩阵键盘的扫描原理和使用方法。 Verilog程序: module hex_keypad(Col,Code,show,show1,count,scan,clock,Row); output[3:0] Code,Col,count; //定义列信号Col、行列信号共同决定的 输出代码Code、以及计数变量count output[7:0] show,show1; //定义七段显示变量show、show1 input[3:0] Row; //定义输入行信号Row input scan; //定义数码管选择信号scan input clock; //定义时钟信号clock reg[3:0] Col,Code,count; //将输出信号定义为reg型 reg[7:0] show,show1; reg[1:0] cn; //定义reg型变量cn,用于计数 reg reset,count_up,count_down; //定义变量reset用于计数清零,count_up 开始加计数,count_down开始减计数reg[15:0] times1,times2; //定义变量times1、times2用于决定开 始计数的时间 assign scan=1'b1; //将数码管选择信号赋值为1

always@(posedge clock) //产生列信号 if(cn==4)cn<=0; else cn<=cn+1; always@(cn) case(cn) 2'b00:Col=4'b1110; 2'b01:Col=4'b1101; 2'b10:Col=4'b1011; 2'b11:Col=4'b0111; endcase always@(posedge clock) //行列信号共同决定输出代码Code case({Row,Col}) 8'b1110_1110:Code=4'h0; 8'b1110_1101:Code=4'h1; 8'b1110_1011:Code=4'h2; 8'b1110_0111:Code=4'h3; 8'b1101_1110:Code=4'h4; 8'b1101_1101:Code=4'h5;

4x4矩阵键盘电路连接图和快速扫描完整程序

4*4矩阵键盘电路连接图和快速扫描完整程序 #include #include #define uint unsigned int #define uchar unsigned char uchar code wei[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xb9,0xbf,0x89,0xad,0x7f,0xff}; uchar temp=0xfe; //键盘扫描前赋给P1口的试探值 uchar beis=0x00; //键盘扫描的识别倍率 sbit LE1=P2^0; sbit LE2=P2^1; uchar key,sm;//key是扫描得到的键值; //////////////////////////////////////////////////////////////////// //显示函数,静态显示 void xianshi(uchar x) { uint b=200; LE2=1; P0=0X0F; LE2=0;

P0=wei[x]; while(b--); LE1=0; } //////////////////////////////////////////////////////////////////// //4*4矩阵扫描,键值保存在key中 void key_4x4() { P1=temp; //初值uchar temp=0xfe; sm=P1; sm=sm&0xf0; //取P1口高四位的值,如果为0就表示无键按下if(sm!=0xf0) { switch(sm) { case 0x70:{key=0+4*beis;break;} case 0xb0:{key=1+4*beis;break;} case 0xd0:{key=2+4*beis;break;} case 0xe0:{key=3+4*beis;break;} default :{key=10+4*beis;break;} } } else { if(temp==0xf7) { temp=0xfe; } else { temp=_crol_(temp,1); } beis++; if(beis==4)beis=0; } } ////////////////////////////////////////////////////////////////////

相关文档