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

📄 sy3.asm

📁 利用键盘中断编写程序完成以下功能: (1)在LCD上排显示"TJU EIE05 xxxxxx"
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        JSR  KB_def               ;把定义后的字符asc放入a              
        JSR  LCDCommand           ;让下排右边显示按键值      
        RTS

*----键盘中断初始化子程序(KB_Init)-------------------------*
*功能:对被定义为键盘中断的引脚进行初始化,但未开放键盘中断*
*占用CPU内寄存器:A                                        *
*----------------------------------------------------------*
KB_Init:
        LDA  #%00                               ;定义A口之前复位PTA
        STA  PTA
        LDA  #%11111000                         ;定义A口2-0为输入,5-3为输出
        STA  DDRA 
        LDA  #%00000111                        ;定义A口2-0有上拉电阻
        STA  PTAPUE
        ;BSET 0,INTKBSCR                         ;按要求2,则不执行本语句;按要求3,则执行本语句
        BSET 1,INTKBSCR                         ;屏蔽键盘中断(IMASK=1)
        LDA  #%00000111                         ;允许KBIE2-0pin中断进入
        STA  INTKBIER 
        BSET 2,INTKBSCR                         ;清除键盘中断请求(ACKK=1)
        BCLR 1,INTKBSCR 
        RTS

*----扫描读取键值(KB_A)---------------------------------------*
*功能:扫描一次接在PTA口的4*4键盘(PTA7-4 接4根键盘行线,PTA3-0 *
*      接4根键盘列线)上的按键,读取键值->A,若无按键,A中WZ为  *
*      $FF                                                    *
*入口:无                                                     *
*占用内存:TmpVar1(缓冲使用)                                  *
*出口:A=键值                                                 *
*-------------------------------------------------------------*
KB_A:
        MOV  #%11110111,TmpVar1                  ;使第一根列线为0(低电平)
        LDX  #$03                                ;将扫描3根行线
KB_A1:
        LDA  PTA                                 ;取PTA->A
        ORA  #%11111000                          ;PTA2-0保留原态,PTA5-3令为1
        AND  TmpVar1                             ;令PTAn=0,n=3\4\5
        STA  PTA
        NOP
        NOP
        LDA  PTA                                 ;看第n列是否有键按下
        AND  #%00000111                          ;PTA7-4保留原态,令低4为=0
        CBEQA #$07,KB_A2                         ;A等于$F0,说明本列线上没有键家按下,在转KB_A2
                                                ;A不等于$F0,找到了被按下得键
                                                ;取键值-〉A
        LDA  PTA
        BRA  KB_A3
KB_A2: 
        SEC                                      ;令C=1
        ROL  TmpVar1                             ;使下一个列线为0
        DBNZX KB_A1                              ;对列线循环
        LDA  #$FF                                ;没有键被按下为$FF
KB_A3:
        RTS

*----键值转为定义值子程序(KB_def)-----------------------------*
*功能:键值转为键盘表面定义的字符或符号代表值                 *
*入口:内存第0页中KB_value中为键值,使用键值编号表            *
*占用CPU寄存器:X                                             *
*出口:A=键定义值                                             *
*-------------------------------------------------------------* 
KB_Def:
        LDHX #$0000
KB_Def1:
        LDA  KB_Table,X            
        BEQ  KB_Def3              ;=0,表示表中未定义此键值
        CMP  KB_value             ;与入口键值相比较
        BNE  KB_Def2              ;不等,未找到转KB_key2
        INCX                      ;找到
        LDA  KB_Table,X           ;取键定义值-〉A
        BRA  KB_DefR               
KB_Def2:
        INCX                      ;(HX)+1->(HX),跳过键定义
        INCX                      ;(HX)+1->(HX),跳过对应键上的数字定义
        BRA  KB_Def1              ;转去判断是不是下一个键
KB_Def3:
        LDA  #$FF                 ;未定义键用FF标志
KB_DefR:
      RTS
KB_Table FCB %11110110,"1",%11101110,"2",%11011110,"3"
         FCB %11110101,"4",%11101101,"5",%11011101,"6"
         FCB %11110011,"7",%11101011,"8",%11011011,"9"
         FCB $00

*----键盘中断子程序(KB_Int)-----------------------------------*
*功能:键盘中断程序,键值放入内存KB_value中                   *
*调用子程序:扫描法读取键值子程序(KB_A)                       *
*出口:第0页内存单元KB_value中为键值                          *
*-------------------------------------------------------------*
KB_Int:
        PSHH                                     ;保护H(其他CPU寄存器已自动保护)
        SEI
        BSET 1,INTKBSCR                          ;禁止键盘中断
        ;--以下为键盘中断程序任务-------------------
        JSR  KB_A                                ;调子程序KB_A取得键值-〉A
        STA  KB_value                            ;放内存KB_value中
        JSR  KB_def                              ;转为键定义值
        STA  Key_Buffer                          ;根据键定义值进行相应的处理,1、2执行加减,其余显示键号
        CMP  #$31
        BNE  KB_Int1
        LDA  value
        INCA
        CMP  #$39
        BHS  KB_Int2
        STA  value
        BRA  KB_Int4      
KB_Int1:
        LDA  Key_Buffer          
        CMP  #$32
        BNE  KB_Int4
        LDA  value
        DECA
        CMP  #$2F
        BLS  KB_Int3
        STA  value
        BRA  KB_Int4  
KB_Int2:
        LDA  #$30
        STA  value
        BRA  KB_Int4
KB_Int3:
        LDA  #$38
        STA  value
        BRA KB_Int4
KB_Int4:      
        JSR  Init-LCD            ;LCD初始化   
        JSR  Show-LCD-Buffer     ;把LCD-BUFFER中的16个字符送LCD显示
        LDA  #$8
        JSR DelaySub
       ;-----以上为键盘中断程序任务-------------------
       PULH                                     ;H出栈(其他CPU寄存器已自动保存)
       ;----------------------------------------------
       JSR  KB_Init                             ;执行键盘初始化程序
       BCLR 1,INTKBSCR                          ;开放键盘中断(IMASKK=0)
       CLI
       RTI

*----程序延时子程序(DelaySub)---------------------------------*
*功能:程序方法延时,延时长短由入口A中的数值决定              *
*入口:A=延时长度                                             *
*注:最小延时0.1秒,最大延时A=$FF ,255*0.1=25.5秒             *
*占用CPU内寄存器:HX,A                                        *
*-------------------------------------------------------------* 
DelaySub:                         ;延时0.1秒 
         PSHH                     ;保据寄存器HX
         PSHX       
DelaySub1:
         LDHX  #$FFFF             
DelaySub2: 
         PSHA                     ;保护寄存器A
         LDA #$FF
DelaySub3:    
         DBNZA DelaySub3 
         PULA
         DBNZX DelaySub2
         DBNZA DelaySub1 
         PULX
         PULH
         RTS

***********************************************************************
*--------------以下为中断矢量----------------------------------------- 
        ORG  $FFE0                             ;键盘中断矢量
        FDB  KB_Int 
        ORG  $FFFE                             ;复位矢量
        FDB  MainInit













;BSET 0,INTKBSCR                         ;按要求2,则不执行本语句;按要求3,则执行本语句


⌨️ 快捷键说明

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