有关4X4矩阵键盘FPGA的程序的分析,有谁帮我分析一下这个状态机的程序啊

有关4X4矩阵键盘FPGA的程序的分析,有谁帮我分析一下这个状态机的程序啊,第1张

是应该还有col的输出,这才是整个扫描程序的重点。如果扫描的原理懂了的话,程序好像也没这么难理解啊,简单讲一下,在NO_KEY_PRESSED,col输出0000,如果有按键按下,当前行的row连接到col,则按下的那一行电平为0,转到SCAN_COL0。行值由row可知,开始逐列扫描以确定列值;在SCAN_COL0状态,col输出1000,若是第一列的按键,则row应该变为1111,即可确定是第一列,否则转到第二列扫描,col输出0100···类推

大体上看了一下你的程序, 就是一个很简单的键盘扫描~~ 你应该看看矩阵键盘的原理,再看这个的时候就很简单了~~我给你手写也有点累~ 处于责任心,给你写点吧!! 这个程序实现的是44的矩阵键盘,用高4位来进行扫描是否有键按下(高位的4个口轮流置零扫描), 如果有键按下(置零的哪个口连接的线就会和低四位其中的一根线接触)低四位中就会有一个口为低电平 剩下的就是通过高低4位来判断具体按键是哪个~~ 我不写了~~ 自己了解一下原理吧,很简单~~~ 加油!

PANDUAN: MOV P3,#0FFH //程序开始 p3口全部拉高

CLR P34 //P34置零 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 P35 //与之前的分析很类似--以下不在分析

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 P36

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 P37

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

这个我知道有个类似的,

你的意思就是按1下,执行函数1;按第2下,执行函数2

你在检测按键按下的时候。设置个变量sum=0;按1次就sum++

然后就可以区分按下两次的不同了。

void keyscan()

{

if(s==0)

{

delay(5);

if(s==0)

{

while(!s);

snum++;

}

}

if(snum==1)

{

TR0=0;

ET0=0;

}

if(snum==2)

{

TR0=1;

ET0=1;

snum=0;

}

}

比如,我写的一个暂停的函数,按1下,执行一个函数1,暂停;

再按1下,执行另一函数2,开始工作。

不懂的QQ358357912说吧 ,另外你发问题不给分,这个态度是不对滴^-^

我是找到相关资料,希望能帮到你! ;占用单元30H~3CH,40H,A,B,DPTR,R0,R1,R2,R3,R4,R6,R7

KEYBUF EQU 40H ;键号存放单元

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN: MOV KEYBUF,#0 ;初始键号设位0,也可以为任意值

MOV R0,#30H ;显示首地址

MOV R2,#0CH ;计算数据存放单元个数

CLR A

QING: MOV @R0,A ;将数据存放单元清零

INC R0

DJNZ R2,QING

MOV P0,#8FH ;关闭显示

MOV R1,#30H ;将显示首地址存放R1里

;===============================================

;五位无符号显示子程序

DIS1: MOV R0,#30H ;把显示数据第一位放在R0里

MOV R2,#04H ;把显示的位码放在R2里

MOV R3,#05H ;把显示的长度放在R3里

DIS2: MOV A,@R0

ANL A,#0FH ;屏蔽显示数据的高四位

MOV B,A

MOV A,R2

ANL A,#0FH ;屏蔽位码的高四位

SWAP A

ORL A,B

MOV P0,A ;送总显示数据到P0显示

LCALL DELY4ms ;调用延时4ms

INC R0 ;取下一个显示数据

DEC R2

DJNZ R3,DIS2 ;四位显示晚后重新开始显示

;===================================================

;键盘扫描子程序

WAIT: MOV P1,#0FFH ;P1口送高电平

CLR P10 ;第一行清零

MOV A,P1 ;读P1口

ANL A,#0F0H ;低位屏蔽

XRL A,#0F0H ;判断低位是否有低电平 ,即判断是否有按键按下

JZ NOKEY1 ;地位有低电平继续扫描,否者跳到第而行去扫描

LCALL DELY10ms ;延时10ms去抖在进行判断是否有按键按下

MOV A,P1 ;继续读P1口

ANL A,#0F0H ;判断低位是否有低电平

CJNE A,#0E0H,NK1 ;如果扫描数据不为0E0H就转到NK1

MOV KEYBUF,#0 ;否者判断为0号键

AJMP DK ;转DK1查表程序

NK1: CJNE A,#0D0H,NK2 ;如果扫描数据不为0D0H就转到NK2

MOV KEYBUF,#1 ;否者判断为1号键

AJMP DK ;转DK2查表程序

NK2: CJNE A,#0B0H,NK3 ;如果扫描数据不为0B0H就转到NK3

MOV KEYBUF,#2 ;否者判断为2号键

AJMP DK ;转DK3查表程序

NK3: CJNE A,#70H,NK4 ;如果扫描数据不为70H就转到NK4

AJMP SAN_CHU

NK4: NOPNOKEY1: MOV P1,#0FFH ;和上面相同

CLR P11

MOV A,P1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY2

LCALL DELY10MS

MOV A,p1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY2

MOV A,P1

ANL A,#0F0H

CJNE A,#0E0H,NK5

MOV KEYBUF,#3

AJMP DK

NK5: CJNE A,#0D0H,NK6

MOV KEYBUF,#4

AJMP DK

NK6: CJNE A,#0B0H,NK7

MOV KEYBUF,#5

AJMP DK

NK7: CJNE A,#70H,NK8

MOV KEYBUF,#10

AJMP DK

NK8: NOPNOKEY2: MOV P1,#0FFH

CLR P12

MOV A,P1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY3

LCALL DELY10MS

MOV A,P1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY3

MOV A,P1

ANL A,#0F0H

CJNE A,#0E0H,NK9

MOV KEYBUF,#6

AJMP DK

NK9: CJNE A,#0D0H,NK10

MOV KEYBUF,#7

AJMP DK

NK10: CJNE A,#0B0H,NK11

MOV KEYBUF,#8

AJMP DK

NK11: CJNE A,#70H,NK12

AJMP DENG_HAO

NK12: NOPNOKEY3: MOV P1,#0FFH

CLR P13

MOV A,P1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY4

LCALL DELY10MS

MOV A,P1

ANL A,#0F0H

XRL A,#0F0H

JZ NOKEY4

MOV A,P1

ANL A,#0F0H

CJNE A,#0E0H,NK13

AJMP CHU

NK13: CJNE A,#0D0H,NK14

AJMP CHENG

NK14: CJNE A,#0B0H,NK15

AJMP JIAN

NK15: CJNE A,#70H,NK16

AJMP JIA

NK16: NOP;=======================================================

;查表求键值程序

;查表求键值程序

DK: MOV B,#00H

MOV A,KEYBUF ;查表程序 查对应的键号数据

MOV DPTR,#TABLE ;把表头地址放入DPTR

MOVC A,@A+DPTR ;A里面存放的为键号,利用A和表头地址找到对应的键号数据

MOV B,A ;把查到的数据送往显示单元

INC R1 ;取下一个显示单元

MOV A,R1

CJNE A,#36H,DKA1 ;判断显示单元是否已满

MOV R1,#35H ;35H,36H单元用于更好的控制五位显示

AJMP DKADKA1: MOV 34H,33H ;按键代码按左移显示,先按先显示

MOV 33H,32H

MOV 32H,31H

MOV 31H,30H

MOV 30H,B

DKA: MOV A,P1 ;读P1口

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

XRL A,#0F0H ;地位是有低电平

JNZ DKA ;如果有低电平继续读P1口,否者向下执行,查找第二行

NOKEY4: LJMP DIS1

;===================================

;功能按键功能设定

DENG_HAO:MOV DPTR,#JI_SUAN ;等号键功能通过加、减、乘、除设定的偏移量来调用子程序

MOV A,3CH ;3CH存放的为功能程序入口地址偏移量

JMP @A+DPTR ;转移到按键功能程序JI_SUAN: AJMP JIA1 ;加计算子程序

AJMP JIAN1 ;减计算子程序

AJMP CHENG1 ;乘计算子程序

AJMP CHU ;除计算子程序

;=======删除键功能

SAN_CHU: ACALL QING_DIS

AJMP DKA

;=======加键功能

JIA: MOV 3CH,#00H

ACALL CUN_SHU

ACALL QING_DIS

AJMP DKA

;=======减键功能

JIAN: MOV 3CH,#02H

ACALL CUN_SHU

ACALL QING_DIS

AJMP DKA

;=======乘键功能

CHENG: MOV 3CH,#04H

ACALL CUN_SHU

ACALL QING_DIS

AJMP DKA

;=======除键功能

CHU: MOV 3DH,#06H

ACALL CUN_SHU

ACALL QING_DIS

AJMP DKA;=================================

;存被加(减、乘、除)数,存放在37H~3BH里

CUN_SHU: MOV 37H,30H ;36H存放的为最低位

MOV 38H,31H

MOV 39H,32H

MOV 3AH,33H

MOV 3BH,34H ;3AH存放的为最高位

RET

;================================

;清除显示单元

QING_DIS: MOV R1,#30H

QING1: MOV @R1,#00H

INC R1

MOV A,R1

CJNE A,#36H,QING1

MOV R1,#30H

LOP1: RET

;================================

;十进制加法子程序

JIA1: ;

AJMP DKA

;================================

;十进制减法子程序

JIAN1: ;

AJMP DKA

;================================

;十进制乘法子程序

CHENG1: ;

AJMP DKA

;================================

;十进制除法子程序

CHU1: ;

AJMP DKA

;=============================================

;延时程序和查表表格

DELY4ms: MOV R6,#8 ;延时4毫秒

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RETDELY10ms:MOV R6,#20 ;延时10毫秒

D2: MOV R7,#248

DJNZ R7,$

DJNZ R6,D2

RETTABLE: DB 07H, 04H, 01H ; / 本表格是以键盘为参考 7 8 9 /

DB 08H, 05H, 02H ; 4 5 6

DB 09H, 06H, 03H ; - 1 2 3 -

DB 00H, 00H ;= + 清除 0 = +

END

以上就是关于有关4X4矩阵键盘FPGA的程序的分析,有谁帮我分析一下这个状态机的程序啊全部的内容,包括:有关4X4矩阵键盘FPGA的程序的分析,有谁帮我分析一下这个状态机的程序啊、矩阵键盘程序解析,扫描和判断程序如下。求注释!!真心看不懂啊!4*4矩阵、51单片机矩阵键盘程序问题求解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10128339.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存