📄 k1-k4-move-shuma.asm
字号:
;********************************************************************
;* *
;* ME500单片机开发系统演示程序 - 计按键次数 *
;* *
;* 8位数码管显示 *
;* *
;* 版本: V1.0 (2006/11/20) *
;* 作者: gguoqing (Email: gguoqing@willar.com) *
;* 网站: www.willar.com(伟纳电子) www.mcusj.com(伟纳单片机世界) *
;* 邮箱: support@willar.com *
;* *
;*【版权】Copyright(C)伟纳电子 www.willar.com All Rights Reserved *
;*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! *
;* *
;********************************************************************
;* *
;* 描述: *
;* 对独立键进行按键次数计数, *
;* K1按下后,进行加1计数,K2按下后,进行减1计数。 *
;* K4按下后,清计数与显存单元,数码管显示'0' 。 *
;* *
;* 数码管显示的位数随按键次数的变化而变化。 *
;* *
;********************************************************************
K1 BIT P1.4
K2 BIT P1.5
K3 BIT P1.6
K4 BIT P1.7
K_OLD EQU 30H
K_NEW EQU 31H
K_COUNT EQU 32H
UP_DOWN BIT 20H.1 ;加减计数标志
DISSTART EQU 40H ;显示单元首地址
LED_DATA EQU P0 ;数码管数据口定义
;**********************************************************
ORG 0000H
JMP MAIN
ORG 0030H
;**********************************************************
MAIN:
MOV SP,#60H
MOV P1,#0FFH
MOV P0,#0FFH
MOV K_OLD,#00H
MOV K_COUNT,#00H
CALL CLR_SCREEN ;显存单元初始化
MAIN1:
CALL CONVT
CALL PLAY
CALL KEY_PROG
JMP MAIN1
KEY_PROG:
CALL K_SCAN ;键扫描
MOV A,K_NEW
CJNE A,K_OLD,KEY_P1
JMP KEY_P_END
KEY_P1:
MOV R4,#7
KEY_P2:
CALL CONVT ;用显示程序来进行键延时
CALL PLAY
DJNZ R4,KEY_P2
CALL K_SCAN ;再判断键是否按下
MOV A,K_NEW
CJNE A,K_OLD,KEY_P3
JMP KEY_P_END
KEY_P3:
JB ACC.0,LOOP1 ;K1按下
JB ACC.1,LOOP2 ;K2按下
JB ACC.3,LOOP3 ;K4按下
JMP KEY_P_END
LOOP1:
SETB UP_DOWN ;加计数
MOV A,K_COUNT
CJNE A,#08H,LOOP1A
JMP KEY_P_END
LOOP1A:
INC K_COUNT ;键计数加1
MOV A,K_COUNT
JMP KEY_P_END
LOOP2:
MOV A,K_COUNT
CJNE A,#00H,LOOP2A
MOV K_COUNT,#00H
CALL CLR_SCREEN ;清显存单元
JMP KEY_P_END
LOOP2A:
CLR UP_DOWN ;减计数
DEC K_COUNT ;键计数减1
MOV A,K_COUNT
CJNE A,#00H,LOOP2B
MOV K_COUNT,#00H
SETB UP_DOWN ;加计数
LOOP2B:
JMP KEY_P_END
LOOP3:
MOV K_COUNT,#00H ;键计数单元清零
SETB UP_DOWN ;加计数
CALL CLR_SCREEN ;清显存单元
KEY_P_END:
RET
;**********************************************************
; 根据健值取数子程序
;**********************************************************
CONVT:
MOV A,K_COUNT
CJNE A,#00H,CONVT1
MOV DISSTART,#00H
JMP CONVT_END
CONVT1:
CJNE A,#01H,CONVT2
JNB UP_DOWN,CONVT1A
MOV DISSTART,#01H
JMP CONVT_END
CONVT1A:
MOV DISSTART+1,#0AH
JMP CONVT_END
CONVT2:
CJNE A,#02H,CONVT3
JNB UP_DOWN,CONVT2A
MOV DISSTART+1,#02H
JMP CONVT_END
CONVT2A:
MOV DISSTART+2,#0AH
JMP CONVT_END
CONVT3:
CJNE A,#03H,CONVT4
JNB UP_DOWN,CONVT3A
MOV DISSTART+2,#03H
JMP CONVT_END
CONVT3A:
MOV DISSTART+3,#0AH
JMP CONVT_END
CONVT4:
CJNE A,#04H,CONVT5
JNB UP_DOWN,CONVT4A
MOV DISSTART+3,#04H
JMP CONVT_END
CONVT4A:
MOV DISSTART+4,#0AH
JMP CONVT_END
CONVT5:
CJNE A,#05H,CONVT6
JNB UP_DOWN,CONVT5A
MOV DISSTART+4,#05H
JMP CONVT_END
CONVT5A:
MOV DISSTART+5,#0AH
JMP CONVT_END
CONVT6:
CJNE A,#06H,CONVT7
JNB UP_DOWN,CONVT6A
MOV DISSTART+5,#06H
JMP CONVT_END
CONVT6A:
MOV DISSTART+6,#0AH
JMP CONVT_END
CONVT7:
CJNE A,#07H,CONVT8
JNB UP_DOWN,CONVT7A
MOV DISSTART+6,#07H
JMP CONVT_END
CONVT7A:
MOV DISSTART+7,#0AH
JMP CONVT_END
CONVT8:
CJNE A,#08H,CONVT_END
MOV DISSTART+7,#08H
CONVT_END:
RET
;**********************************************************
; 清显存单元
;**********************************************************
CLR_SCREEN:
SETB UP_DOWN
MOV DISSTART+0,#00H
MOV DISSTART+1,#0AH
MOV DISSTART+2,#0AH
MOV DISSTART+3,#0AH
MOV DISSTART+4,#0AH
MOV DISSTART+5,#0AH
MOV DISSTART+6,#0AH
MOV DISSTART+7,#0AH
RET
;**********************************************************
; 键扫描子程序
;**********************************************************
K_SCAN:
MOV P1,#0FFH
MOV K_NEW,#00H
MOV A,P1
CPL A
ANL A,#0F0H
SWAP A
MOV K_NEW,A
RET
;**********************************************************
; 数码管显示子程序
;**********************************************************
PLAY:
MOV R0,#DISSTART ;获得显示单元首地址
MOV R1,#07FH ;从第一个数码管开始
MOV R2,#08 ;共显示8位数码管
DISP1:
MOV A,@R0 ;获得当前位地址
MOV DPTR,#TAB_NU ;获得表头
MOVC A,@A+DPTR ;查表获得显示数据
MOV LED_DATA,A ;显示数据
MOV P2,R1 ;开始显示当前位
MOV A,R1 ;准备显示下一位
RR A
MOV R1,A ;下一位
INC R0 ;取下一个单元地址
LCALL DELAY1MS ;延时 1 MS
DJNZ R2,DISP1 ;重复显示下一个
MOV P2,#0FFH ;关闭显示
RET ;显示完成,返回
;**********************************************************
; 1ms延时子程序
;**********************************************************
DELAY1MS:
MOV R6,#10
DEL1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL1
RET
;**********************************************************
TAB_NU:
DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
DB 080H,090H,0FFH,088H,083H,0C6H,0A1H,086H,08EH
;**********************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -