📄 13简易秒表的制作.asm
字号:
BANK0_REG EQU 00H ;选择第0组寄存器
BANK1_REG EQU 08H ;选择第1组寄存器
BANK2_REG EQU 10H ;选择第2组寄存器
BANK3_REG EQU 18H ;选择第3组寄存器
LED_MAX_BITS EQU 06H ;LED最大位数
LED_SCL EQU P1.0
LED_SDA EQU P1.1
HD_K1 EQU P1.2
HD_K2 EQU P1.3
HD_K3 EQU P1.4
HD_CBP EQU P1.5
K1_FLAG EQU 00H
K2_FLAG EQU 01H
K3_FLAG EQU 02H
LED_DIS_BUF EQU 30H
ORG 0000H
LJMP START
ORG 000BH
LJMP TIMER0_INT
START:
MOV SP,#0DFH
MOV PSW,#BANK0_REG
MOV TMOD,#01H ;定时器0方式1
MOV TH0,#0D8H ;定时器0置初值
MOV TL0,#0F0H
MOV R0,#30H
MOV R7,#80H-20H
LCALL PUB_CLEAR_RAM1 ;清0RAM单元
LCALL LED_CLR_FULL
LCALL LED_DISP_DATA
START_A:
LCALL KEY_TEST
JNC START_A
RETEST:
LCALL KEY_SCAN
JB K1_FLAG,PRO_K1
JB K2_FLAG,PRO_K2
JB K3_FLAG,PRO_K3
SJMP START_A
PRO_K1: ;启动
SETB TR0
SETB TR1
SETB ET0
SETB EA
LJMP START_A
PRO_K2: ;停止
CLR EA
CLR ET0
CLR TR1
CLR TR0
LJMP START_A
PRO_K3: ;清零
CLR EA
LJMP START
;---------------------------------------
;定时器0中断服务程序
;---------------------------------------
TIMER0_INT:
PUSH PSW
PUSH ACC
MOV PSW,#BANK3_REG
MOV TH0,#0D8H
MOV TL0,#0F0H
MOV A,LED_DIS_BUF+2
ADD A,#1
DA A
MOV LED_DIS_BUF+2,A
MOV A,LED_DIS_BUF+1
ADDC A,#0
DA A
MOV LED_DIS_BUF+1,A
CJNE A,#60H,TIMER0_END
MOV LED_DIS_BUF+1,#00H
MOV A,LED_DIS_BUF
ADD A,#1
DA A
MOV LED_DIS_BUF,A
TIMER0_END:
LCALL LED_DISP_DATA
POP ACC
POP PSW
RETI
;--------------------------------------------------
;测键入子程序
;功能:判断是否有键输入
;入口:按键
;出口:A
;--------------------------------------------------
KEY_TEST:
JNB P1.2,KEY_TEST_OK
JNB P1.3,KEY_TEST_OK
JNB P1.4,KEY_TEST_OK
CLR C
RET
KEY_TEST_OK:
SETB C
RET
;--------------------------------------------------
;键盘扫描程序
;--------------------------------------------------
KEY_SCAN:
CLR K1_FLAG
CLR K2_FLAG
CLR K3_FLAG
JNB P1.2,KEY_SCAN_K0
JNB P1.3,KEY_SCAN_K1
JNB P1.4,KEY_SCAN_K2
SJMP KEY_SCAN_END
KEY_SCAN_K0:
SETB K1_FLAG
JNB P1.2,$
SJMP KEY_SCAN_END
KEY_SCAN_K1:
SETB K2_FLAG
JNB P1.3,$
SJMP KEY_SCAN_END
KEY_SCAN_K2:
SETB K3_FLAG
JNB P1.4,$
SJMP KEY_SCAN_END
KEY_SCAN_END:
RET
;------------------------------------
;清除指定的RAM单元
;入口: R0:源地址 R7:长度
;------------------------------------
PUB_CLEAR_RAM1:
CJNE R7,#0,PUB_CLEAR_RAM1_1
SJMP PUB_CLEAR_RAM1_E
PUB_CLEAR_RAM1_1:
MOV @R0,#0
INC R0
DJNZ R7,PUB_CLEAR_RAM1_1
PUB_CLEAR_RAM1_E:
RET
;--------------------------------
;发送一字节数据
;入口:ACC
;--------------------------------
LED_DISP_BYTE:
PUSH ACC
CLR LED_SCL
MOV R7,#8
LED_DISP_BYTE1:
RLC A
MOV LED_SDA,C
NOP
NOP
SETB LED_SCL
NOP
NOP
CLR LED_SCL
DJNZ R7,LED_DISP_BYTE1
POP ACC
RET
;-----------------------------------
;发送LED_MAX_BIT字节
;入口:LED_DIS_BUF:起始地址
;-----------------------------------
LED_DISP_DATA:
PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
MOV PSW,#BANK2_REG
MOV A,#LED_DIS_BUF
ADD A,#LED_MAX_BITS/2-1
MOV R0,A
MOV R6,#LED_MAX_BITS/2
MOV DPTR,#DIS_TAB
LED_DISP_DATA_A:
MOV A,@R0
ANL A,#0FH
MOVC A,@A+DPTR
LCALL LED_DISP_BYTE
MOV A,@R0
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
LCALL LED_DISP_BYTE
DEC R0
DJNZ R6,LED_DISP_DATA_A
POP DPL
POP DPH
POP ACC
POP PSW
RET
;------------------------------------
;清除LED上的显示内容
;------------------------------------
LED_CLR_FULL:
PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
MOV PSW,#BANK2_REG
MOV R6,#6
LED_CLR_A:
MOV A,#0FFH
LCALL LED_DISP_BYTE
DJNZ R6,LED_CLR_A
POP DPL
POP DPH
POP ACC
POP PSW
RET
;----------------------------------------------------------------------
DIS_TAB: ;字形表
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH ;共阳极LED
NOP9:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -