📄 key.asm
字号:
;实验目的:熟悉按键的判断
; 数码管无按键按下时显示“FF”,有按键按下时显示按键的编号
;硬件要求:拨码开关S1全部置ON
; 拨码开关S6全部置ON,S5第5-6位置ON,其他位置OFF
; 其他拨码开关置OFF
#include<p16f877A.inc> ;包含头文件
__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC
;*******************用户寄存器定义*********************
DISPLAYVAL1 EQU 20H ;显示高位寄存器
DISPLAYVAL2 EQU 21H ;显示低位寄存器
;******************程序入口地址************************
ORG 00H
NOP ;ICD所需要的空指令
GOTO MAIN ;转主程序
;*****************查表程序*****************************
TABLE
ADDWF PCL,1 ;加上偏移地址
RETLW 0C0H ;0的编码
RETLW 0F9H ;1的编码
RETLW 0A4H ;2的编码
RETLW 0B0H ;3的编码
RETLW 83H ;b的编码
RETLW 88H ;A的编码
RETLW 8EH ;F的编码
;****************主程序*******************************
MAIN
MOVLW 0FFH
MOVWF PORTD ;关闭所有显示
BANKSEL TRISA ;选择I/O口方向寄存器所在的体
MOVLW 0FH
MOVWF TRISA ;A口高2位输出,低4位输入
MOVWF TRISB ;B口高4位输出,低4位输入
CLRF TRISD ;D口输出
BANKSEL ADCON1
MOVLW 06H
MOVWF ADCON1 ;A口为普通I/O口
CLRF STATUS ;回体0
LOOP
MOVLW 6
MOVWF DISPLAYVAL1
MOVWF DISPLAYVAL2 ;F的偏移地址
BTFSC PORTB,0 ;BO是否按下?
GOTO PB_1 ;否,转判B1
CALL DELAY ;延时,清除干扰信号
BTFSC PORTB,0 ;再次判断BO口是否按下?
GOTO PB_1 ;否
MOVLW 4 ;是,b的偏移地址
MOVWF DISPLAYVAL1
MOVLW 0 ;0的偏移地址
MOVWF DISPLAYVAL2
GOTO LOOP_END ;转显示部分
PB_1
BTFSC PORTB,1 ;B1是否按下?
GOTO PB_2 ;否,转判B2
CALL DELAY ;延时,清除干扰信号
BTFSC PORTB,1 ;再次判断B1是否按下?
GOTO PB_2 ;否
MOVLW 4
MOVWF DISPLAYVAL1 ;是,b的偏移地址
MOVLW 1
MOVWF DISPLAYVAL2 ;1的偏移地址
GOTO LOOP_END ;转显示部分
PB_2
BTFSC PORTB,2 ;B2是否按下?
GOTO PB_3 ;否,转判B3
CALL DELAY ;延时,清除干扰信号
BTFSC PORTB,2 ;再次判断B2是否按下?
GOTO PB_3 ;否
MOVLW 4
MOVWF DISPLAYVAL1 ;是,b的偏移地址
MOVLW 2
MOVWF DISPLAYVAL2 ;2的偏移地址
GOTO LOOP_END ;转显示部分
PB_3
BTFSC PORTB,3 ;B3是否按下
GOTO PA_0 ;否,转判A0
CALL DELAY ;延时,清除干扰信号
BTFSC PORTB,3 ;再次判断B3是否按下?
GOTO PA_0 ;否
MOVLW 4
MOVWF DISPLAYVAL1 ;是,b的偏移地址
MOVLW 3
MOVWF DISPLAYVAL2 ;3的偏移地址
GOTO LOOP_END ;转显示部分
PA_0
BTFSC PORTA,0 ;A0是否按下
GOTO PA_1 ;否,转判A1
CALL DELAY ;延时,清除干扰信号
BTFSC PORTA,0 ;再次判断A0是否按下?
GOTO PA_1 ;否
MOVLW 5 ;是,A的偏移地址
MOVWF DISPLAYVAL1
MOVLW 0
MOVWF DISPLAYVAL2 ;0的偏移地址
GOTO LOOP_END ;转显示部分
PA_1
BTFSC PORTA,1 ;A1是否按下
GOTO PA_2 ;否,转判A2
CALL DELAY ;延时,清除干扰信号
BTFSC PORTA,1 ;再次判断A1是否按下?
GOTO PA_2 ;否
MOVLW 5
MOVWF DISPLAYVAL1 ;是,A的偏移地址
MOVLW 1
MOVWF DISPLAYVAL2 ;1的偏移地址
GOTO LOOP_END ;转显示部分
PA_2
BTFSC PORTA,2 ;A2是否按下
GOTO PA_3 ;否,转判A3
CALL DELAY ;延时,清除干扰信号
BTFSC PORTA,2 ;再次判断A2是否按下?
GOTO PA_3 ;否
MOVLW 5
MOVWF DISPLAYVAL1 ;是,A的偏移地址
MOVLW 2
MOVWF DISPLAYVAL2 ;1的偏移地址
GOTO LOOP_END ;转显示部分
PA_3
BTFSC PORTA,3 ;A3是否按下
GOTO LOOP_END ;否,转显示部分
CALL DELAY ;延时,清除干扰信号
BTFSC PORTA,3 ;再次判断A3是否按下?
GOTO LOOP_END ;否,转显示部分
MOVLW 5
MOVWF DISPLAYVAL1 ;是,A的偏移地址
MOVLW 3
MOVWF DISPLAYVAL2 ;3的偏移地址
GOTO LOOP_END
LOOP_END
MOVF DISPLAYVAL1,0 ;显示低位
CALL TABLE ;查表获取相应的编码
MOVWF PORTD ;送数码管显示
BCF PORTA,4 ;使能相应数码管显示
CALL DELAY ;延时一段时间,以保证足够的亮度
BSF PORTA,4 ;关闭显示
MOVF DISPLAYVAL2,0 ;显示高位
CALL TABLE ;查表获取相应的编码
MOVWF PORTD ;送数码管显示
BCF PORTA,5 ;使能相应数码管显示
CALL DELAY ;延时一段时间
BSF PORTA,5 ;关闭显示
GOTO LOOP ;循环判断是否有按键按下,并显示
;*******************延时程序*************************
DELAY
MOVLW 0FFH
MOVWF 30H
DECFSZ 30H,1
GOTO $-1
RETURN
;******************程序结束**************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -