⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 44键盘多模块演示程序.txt

📁 44键盘多模块演示程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
    DW    KEYPROC6
    DW    KEYPROC7
    DW    KEYPROC8
    DW    KEYPROC9
    DW    KEYPROCA
    DW    KEYPROCB
    DW    KEYPROCC
    DW    KEYPROCD
    DW    KEYPROCE
    DW    KEYPROCF
;-------放键事件处理地址表--------------------
    DW    KEYPROC0X
    DW    KEYPROC1X
    DW    KEYPROC2X
    DW    KEYPROC3X
    DW    KEYPROC4X
    DW    KEYPROC5X
    DW    KEYPROC6X
    DW    KEYPROC7X
    DW    KEYPROC8X
    DW    KEYPROC9X
    DW    KEYPROCAX
    DW    KEYPROCBX
    DW    KEYPROCCX
    DW    KEYPROCDX
    DW    KEYPROCEX
    DW    KEYPROCFX
;-------长压键事件处理地址表--------------------
    DW    KEYPROC0W
    DW    KEYPROC1W
    DW    KEYPROC2W
    DW    KEYPROC3W
    DW    KEYPROC4W
    DW    KEYPROC5W
    DW    KEYPROC6W
    DW    KEYPROC7W
    DW    KEYPROC8W
    DW    KEYPROC9W
    DW    KEYPROCAW
    DW    KEYPROCBW
    DW    KEYPROCCW
    DW    KEYPROCDW
    DW    KEYPROCEW
    DW    KEYPROCFW
;------------------------------------------
GETTIMETAB:
    MOV   A,TIMEWRBIT;取时间写入位
    RR    A;/2
    ANL   A,#07H;
    ADD   A,#LOW(GETTIMETABTAB-GETTIMETABOFF)
    MOVC  A,@A+PC
GETTIMETABOFF:
    RET
;-------取时间显示次序表地址-------------
GETTIMETABTAB:
    DB    timewriteram30;千年
        DB    timewriteyear;年
        DB    timewritemonth;月
        DB    timewritedate;日
        DB    timewritehr;时
        DB    timewritemin;分
        DB    timewriteseg;秒
        DB    timewriteday;星期
;------------------------------
MAINSTART:
;-------P0口初始化------------------
    MOV   P0,#11111111B
;-------P1口初始化------------------
    MOV   P1,#11111111B
;-------P2口初始化------------------
    MOV   P2,#11101011B;P2.2,P2.4=0
;-------P3口初始化------------------
    MOV   P3,#11111111B
;--------------------------------
    MOV   IE,#00000000B;EA=0,ES=ET2=ET1=EX1=ET0=EX0=0
    MOV   SP,#SP_MIN;
          MOV   PSW,#00000000B;RS1RS0=00,R0~R7=00H~07H
    MOV   DPTR,#MAINNEXT
    PUSH  DPL
    PUSH  DPH
    RETI
MAINNEXT:
    MOV   DPTR,#MAINPROC
    PUSH  DPL
    PUSH  DPH
    RETI
MAINPROC:
    LCALL MAININIT;系统初始化
;-------主循环-------------------------------------------
;所有正常中断都必须返回到此处,否则,软狗造成系统复位
MAINLOOP:
        MOV   IE,#10101011B;开中断,害怕关定时器中断
    ORL   PCON,#00001101B;待机,喂软狗(pcon<2,3>=1)
    SJMP  MAINLOOP;死循环,所有程序只能通过中断完成!
;-------主程序初始化-------------------------------------
MAININIT:
;-------接口初始化--------------------------
    LCALL SYSTEMIOINIT;系统接口初始化
    MOV   PCON,#00001100B;喂软狗
     CLR   WDT;发送外看门狗喂狗信号
    MOV   WDTRST,#01EH;AT89S52喂内狗
    MOV   WDTRST,#0E1H;AT89S52喂内狗
     SETB  WDT;发送外看门狗喂狗信号
;-------内存初始化-------------------------
    MOV   A,RAM_55H
    XRL   A,RAM_AAH
    CPL   A
    JZ    MAININITNEXT;内存未破坏
    MOV   RAM_55H,#055H
    MOV   RAM_AAH,#0AAH
    LCALL SYSTEMINIT;系统初始化
MAININITNEXT:
;-------运行初始化---------------
    LCALL SYSTEMSETUP;系统设置
    RET
SYSTEMINIT:
;-------开机铃声----------------------------------
        MOV   A,#DEFBEEPMODE3;开机正常铃声
    LCALL SETBEEPMODE;设置响铃方式
;-----------------------------------
    RET
;-------系统接口初始化------------------------------
SYSTEMIOINIT:
;-------键盘初始化------------------------------
    RET
;-------系统设置--------------------------------------
SYSTEMSETUP:
;-------系统主频11.0592MHz---------------------------------
    MOV   AUXR,#01H;关闭EMI
;---------------------------------------------------
    MOV   PCON,#00001100B;喂软狗
        CLR   WDT;发送外看门狗喂狗信号
    MOV   WDTRST,#01EH;AT89S52喂内狗
    MOV   WDTRST,#0E1H;AT89S52喂内狗
     SETB  WDT;发送外看门狗喂狗信号
    MOV   IP,#00100001B;中断优先级EX0>ET2>ET0>EX1>ES
     MOV   TMOD,#00010001B;定时器0,1为方式1(十六位定时器)
    MOV   TCON,#01010101B;启动定时器TR1EQUTR0EQU1,IT1EQUIT0EQU1
;------------------------------------------------------
    MOV   TL0,#LOW(TIME8MS);设置定时器0时间常数
    MOV   TH0,#HIGH(TIME8MS)
;------------------------------------------------------
    MOV   TL1,#LOW(TIME8MS);设置定时器1时间常数
    MOV   TH1,#HIGH(TIME8MS)
;-------设置最小时间片1.25mS---------------------------
        MOV   RCAP2L,#LOW(TIME1_25MS)
        MOV   RCAP2H,#HIGH(TIME1_25MS)
        MOV   TL2,RCAP2L;设置定时器2时间常数
        MOV   TH2,RCAP2H
    SETB  TR2;启动定时器2
    mov   SYSTEMTIME1_25MS,#00h
    mov   SYSTEMTIME500MS,#00h
    LCALL timeDS1302open
        MOV   DPTR,#01FEH
        MOV   A,#055H
        LCALL X5045WRITEBYTE
        INC   DPTR
        MOV   A,#0AAH
        LCALL X5045WRITEBYTE
;-------系统延时参数设置------------------------
    LCALL LEDINIT
    LCALL KEYINIT
    RET
KEYINIT:
    MOV   KEYCOUNT,#00H
    MOV   B,#10H
    MOV   R0,#R20
KEYINITLOOP:
    MOV   @R0,#00H
    INC   R0
    DJNZ  B,KEYINITLOOP
    RET
;-------定时器T0中断服务程序------------
T0INTPROC:
    PUSH  PSW
;;;;;;;;喂软狗信号处理程序;;;;;;;;;;;;;;;;;;;;;;;;;;;
    MOV   A,PCON
    ANL   A,#00001100B
    JZ    T01INTPROCERR;T0T1都无喂狗信号,程序飞
    ANL   PCON,#11111011B;清除喂软狗信号0(自毁)
;--------------------------------------------------
;       XXXX  XXXX
;--------------------------------------------------
    POP   PSW
    RETI
;-------定时器T1中断服务程序------------
T1INTPROC:
    PUSH  PSW
;;;;;;;;喂软狗信号处理程序;;;;;;;;;;;;;;;;;;;;;;;;;;;
    MOV   A,PCON
    ANL   A,#00001100B
    JZ    T01INTPROCERR;T0T1都无喂狗信号,程序飞
    ANL   PCON,#11110111B;清除喂软狗信号1(自毁)
;--------------------------------------------------
;       XXXX  XXXX
;--------------------------------------------------
    POP   PSW
    RETI
;-------T0T1都无喂狗信号,程序飞--------------------
;中断后未回到主循环MAINLOOP处喂软狗,程序必飞
T01INTPROCERR:
        MOV   IE,#00H;关中断
    MOV   SP,#SP_MIN;复位系统SP
    MOV   DPTR,#ERRORPROC
    PUSH  DPL
    PUSH  DPH
    RETI
;-------系统软启动----------------------
ERRORPROC:
        CLR   A
        PUSH  ACC
        PUSH  ACC
        RETI
;-------定时器T2中断服务程序------------
;1.250mS中断
T2INTPROC:
        CLR   TF2
    MOV   AUXR,#01H;关闭EMI
    PUSH  PSW
    PUSH  ACC
T2INTPROC_START:
;---------------------------------------------------
        CLR   WDT;发送外看门狗喂狗信号
    MOV   WDTRST,#01EH;AT89S52喂内狗
    MOV   WDTRST,#0E1H;AT89S52喂内狗
     SETB  WDT;发送外看门狗喂狗信号
;--------------------------------------------------
        INC   SYSTEMTIME1_25MS;1.25MS计数
        MOV   A,SYSTEMTIME1_25MS
        CJNE  A,#80,T2INTPROC_NEXTKEY;80*1.25MS=100mS
        MOV   SYSTEMTIME1_25MS,#00H
;-------100mS到-----------------------------
    INC   SYSTEMTIME125MS;
    LCALL SYSTEMT125MSPROC
    INC   SYSTEMTIME500MS;
        MOV   A,SYSTEMTIME500MS
        CJNE  A,#5,T2INTPROC_NEXTKEY;4*125MS=500mS
        MOV   SYSTEMTIME500MS,#00H
    CPL   LEDCPLBIT
;-------500mS到-------------------------------
        LCALL GETSYSTEMTIME;
    LCALL DISPLAY
T2INTPROC_NEXTKEY:
    LCALL TESTKEY;键扫描(扫描当前键号=T2中断进入号)
    INC   KEYCOUNT;准备下一键号
    ANL   KEYCOUNT,#00001111B
        POP   ACC
    POP   PSW
    RETI
;-------双向双次键扫描-------------------
INKEY:
;入口:
;       无
;出口:
;       ACC若为0,表示无键压下
;       ACC若非0,表示有键压下
    PUSH  B
    MOV   P1,#0F0H;发送低4位(行)
    NOP
    MOV   B,P1;接收高4位(列)
    MOV   P1,#00FH;发送高4位(列)
    NOP
    MOV   A,P1;接收低4位(行)
    MOV   P1,#0FFH
    ORL   A,B;得到负逻辑键值
    CPL   A;变为正逻辑键值
    POP   B
    RET
;-------双向双次键变换-------------------
;本程序与查表GETKEYNUM同功能,但太慢
GETKEYVAL:
    PUSH  B
       MOV   B,A;存键值
       ANL   B,#00001111B;行
       ANL   A,#11110000B;列
       JNB   B.2,GETKEYVAL1
       XRL   B,#00000111B;00000100B->00000011B
GETKEYVAL1:
        JNB   B.3,GETKEYVAL2
       XRL   B,#00001100B;00001000B->00000100B
GETKEYVAL2:
    DEC   B;0~3
    SWAP  A
       JNB   ACC.2,GETKEYVAL3
       XRL   A,#00000111B;01000000B->00110000B
GETKEYVAL3:
    JNB   ACC.3,GETKEYVAL4
       XRL   A,#00001100B;10000000B->01000000B
GETKEYVAL4:
    DEC   A
    XRL   A,#00000011B
    XCH   A,B
       RL    A
       RL    A
       ORL   A,B;合并得到键号。
    POP   B
    RET
;-------MCU多任务键盘事件处理-----------------------
TESTKEY:
;-------16键(4*4)测试----------------------------------------------
;键测试程序每1.25mS执行1次,16键被依次执行,共需16*1.25mS=20mS
;即每键的键扫描频率为20mS,这样就节约了消抖时间
;键测试程序进入的次序号即为键号,这样就可用查表节约查询时间
;用压键次数替代键盘缓冲区,实现压键,放键,长压键3个功能
;键盘缓冲区及双击键事件处理主要适用于文字处理
;长压键事件处理在工控中应用较广(避免多键操作,例手机的锁键盘处理)
;-------------------------------------------------------------------
    PUSH  B;保护现场
;-------键扫描---------------------------------
;本例采用4*4键盘,使用双向双次键扫描技术
        LCALL INKEY;双向双次键扫描
    JZ    TESTKEYERR;无键压下,进行放键事件处理
    MOV   B,A;保存正逻辑键值(采用GETKEYVAL变换,B应存进入次序号)
;-------取键号------------------------------------------------------
;关键:淘汰循环查表的陋习
;不该扫描的键不去管它,上天入地都随它!!!
    LCALL GETKEYNUM;查表取键号(也可用GETKEYVAL变换,但不如查表快和灵活)
;采用GETKEYNUM查表,比较编码
;采用GETKEYVAL变换,比较次序
        CJNE  A,B,TESTKEYERR;非法键(或多键)注意:每次只查本次!!!
;-------有键压下---------------------------------
        MOV   A,KEYCOUNT;取键号;0~15
        ADD   A,#R20;压键次数首址(10H)
    MOV   R0,A;得到压键次数首址(10H+键号)
           MOV   A,@R0;取当前被扫描键的压键次数
;----------------------------------------------
;可改动20*NmS,本例为N=2(键不太好)
;可以根据需要(键盘的好坏),设置N(1~255)
           CJNE  A,#2,$+3;1,20*2=40mS抖动
        JC    TESTKEYINC;键在抖动期,只计压键次数,不执行事件处理
;-------键压下---------------------------------------------
    JB    ACC.7,TESTKEYINC;单击键已执行,阻止单次重入
;-------压键必须解决重入问题-------------------------------
    SETB  ACC.7;设置禁止单次重入标志(压键次数的最高位)
    MOV   @R0,A;保存禁止单次重入标志
        MOV   A,KEYCOUNT;取键号;事件处理地址区域0~15
        LCALL KEYPROC;执行单击事件(散转回收技术)
        MOV   A,#DEFBEEPMODE1;压键铃声(响1声)
    LCALL SETBEEPMODE;设置响铃方式(只设置,发声自动处理)
TESTKEYINC:
    MOV   A,@R0;取压键次数地址
    INC   A;压键计次
    MOV   @R0,A;保存压键次数
    CLR   ACC.7;去掉单次重入标志,允许多次重入
;-------长压键判断-------------------------------------------
;0.5S长压键 500/20mS=25
;1.0S长压键1000/20mS=50
;1.5S长压键1500/20mS=75
;2.0S长压键2000/20mS=100
;若再长必须在对应长压键事件处理中再设计数器,以达到超长时间处理
    CJNE  A,#100,TESTKEYINCEXIT;100*20mS=2S长压
        MOV   @R0,#80H;设置禁止单次重入标志,允许多次重入
        MOV   A,KEYCOUNT;取键号(程序运行次数);0~15
    SETB  ACC.5;2S设置长压键事件处理地址区域;32~47
        LCALL KEYPROC;执行长压键事件(散转回收技术)
        MOV   A,#DEFBEEPMODE1;压键铃声(响1声)
    LCALL SETBEEPMODE;设置响铃方式(只设置,发声自动处理)
TESTKEYINCEXIT:
    POP   B;恢复现场
    RET
TESTKEYERR:
;-------无键压下--------------------------------
        MOV   A,KEYCOUNT;取键号(程序运行次数);0~15
        ADD   A,#R20;压键次数首址(10H)
    MOV   R0,A;得到压键次数首址(10H+键号)
    MOV   A,@R0;取当前被扫描键的压键次数
    JNB   ACC.7,TESTKEYCLR;未压过键,不处理放键事件
;-------键释放----------------------------------
        MOV   A,KEYCOUNT;取键号(程序运行次数);0~15
    SETB  ACC.4;设置放键事件处理地址区域,16~31
        LCALL KEYPROC;执行放键事件(散转回收技术)
TESTKEYCLR:
    MOV   @R0,#00H;清除本键压键次数
    POP   B
    RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -