📄 noname1.asm
字号:
;************************************************************************
INCLUDE HT46F47E.INC
DATA.SECTION'DATA'
DISP_RAM1 DB ? ;数码管1显示内容寄存器
DISP_RAM2 DB ? ;数码管2显示内容寄存器
DISP_RAM3 DB ? ;数码管3显示内容寄存器
DISP_RAM4 DB ? ;数码管4显示内容寄存器
DISP_RAM DB ? ;查表得到显示代码
DISP_NUM DB ? ;扫描第几位数码寄存器
DISP_NUM1 DB ? ;每个数码管显示时延时寄存器
DISP_NUM2 DB ? ;一次调用显示时延时寄存器
ACC_BUF DB ? ;ACC备份
STATUS_BUF DB ? ;STATUS备份
T_4MS DB ? ;4毫秒计数
T_125US DB ? ;125US
T_SEC DB ? ;秒钟计数
T_MIN DB ? ;分钟计数
SW DB ? ;十位
GW DB ? ;个位
FLASH DB ? ;":"闪动
T_HOUR DB ? ;HOUR
TEMP DB ?
TEMP1 DB ? ;显示变量
COM1 EQU PA.4 ;DISPLAY1
COM2 EQU PA.5 ;DISPLAY1
COM3 EQU PA.7 ;DISPLAY1
COM4 EQU PA.6 ;DISPLAY1
DATA164 EQU PA.1 ;DATA TO 164
CLK164 EQU PA.0 ;CLOCK TO 164
KM DB ? ;延按键时寄存器
KEYB DB ?
KBUF DB ? ;送到输出的键值
KBUF1 DB ? ;首次键值
KBUF2 DB ? ;延时后的键值
K_ONE EQU KEYB.0 ;首次进入标志
K_DOWN EQU KEYB.1
BZ_M DB ?
BZ_F EQU KEYB.2 ;蜂鸣器响标志
KEYK EQU KEYB.3 ;开关标志
BZ_S DB ? ;蜂鸣器响时间长度寄存器
code.section'code'
;************************************************************************
ORG 000H
JMP STAR
ORG 008H
JMP T0_ISR
ORG 020H
STAR:
MOV A,00H
MOV PAC,A ;设置PA口为输出口
CLR PA
MOV A,41H ;内存清零
MOV MP0,A
RAM_CLR:
CLR IAR0
INC MP0
SZ MP0.6
JMP RAM_CLR
MOV A,125
MOV TMR,A
MOV A,92H ;4分频*125=500/4(指令周期)=125US
MOV TMRC,A
MOV A,05H ;开定时中断和总中断
MOV INTC,A
BEGIN:
SET BZ_F
SET PA.3
MOV A,250
MOV BZ_S,A
;*********************主程序******************************************
MAIN:
CLR WDT
CALL SW_TEST ;按键检测
CALL SW_OUT ;功能输出
SNZ KEYK ;是否开机?
JMP MAIN ;NO
CALL TIME_MAN ;进制转换
CALL DISPLAY ;显示扫描
MAIN1: ;4MS执行一次主程序
SZ T_125US ;4MS到?
JMP MAIN1 ;NO等待
JMP MAIN ;YES循环
;*********************显示扫描******************************************
DISPLAY:
CALL CLR_COM ;清COM
INC DISP_NUM ;加一
MOV A,DISP_NUM ;
AND A,00000011B ;
ADDM A,PCL ;
JMP DISPLAY1 ;扫描第一位
JMP DISPLAY2 ;扫描第二位
JMP DISPLAY3 ;扫描第三位
JMP DISPLAY4 ;扫描第四位
DISPLAY1:
MOV A,DISP_RAM1
MOV TBLP,A ;取显示值,放入查表的偏移量寄存器
TABRDL DISP_RAM ;查表,取显示代码
MOV A,DISP_RAM
CALL OUT_164 ;输出到164
SET COM1 ;打开第一个数码管公共端
RET
DISPLAY2:
MOV A,DISP_RAM2
MOV TBLP,A ;取显示值,放入查表的偏移量寄存器
TABRDL DISP_RAM ;查表,取显示代码
SZ FLASH ;":"闪动
SET DISP_RAM.7
MOV A,DISP_RAM
CALL OUT_164
SET COM2
RET
DISPLAY3:
MOV A,DISP_RAM3
MOV TBLP,A ;取显示值,放入查表的偏移量寄存器
TABRDL DISP_RAM ;查表,取显示代码
MOV A,DISP_RAM
CALL OUT_164
SET COM3
RET
DISPLAY4:
MOV A,DISP_RAM4
MOV TBLP,A ;取显示值,放入查表的偏移量寄存器
TABRDL DISP_RAM ;查表,取显示代码
MOV A,DISP_RAM
CALL OUT_164
SET COM4
RET
CLR_COM:
CLR COM1
CLR COM2
CLR COM3
CLR COM4
RET
;************************164输出******************************************
OUT_164:
MOV TEMP1,A
MOV A,8
MOV TEMP,A
OUT_164_1:
CLR CLK164
CLR DATA164
SZ TEMP1.7
SET DATA164
NOP
SET CLK164
RL TEMP1
SDZ TEMP
JMP OUT_164_1
RET
;***********************按键检测*********************************************
SW_TEST:
; SZ K_ONE
; JMP OUT_164SW1
; SET K_ONE
CALL CLR_COM
MOV A,00H
CALL OUT_164
CALL OUT_164SW
RET
OUT_164SW:
MOV A,01H
MOV TEMP1,A
MOV A,8
;--------------------------------------------------------------------------
OUT_164SW_1:
CLR CLK164 ;CLOCK清零
CLR DATA164 ;DATA清零
SZ TEMP1.0 ;TEMP第0位是否为O
SET DATA164 ;NO,则置DATA为高
NOP
NOP
SET CLK164 ;CLOCK拉高,输出数据
NOP
CLR DATA164 ;DATA清零
SET PAC.1 ;DATA设置为输入
NOP
NOP
NOP
NOP
SZ DATA164 ;是否有按键按下
JMP KEY_PRESSED ;有按键按下则处理
CLR PAC.1 ;PAC.1为输出
RL TEMP1 ;左移
SDZ ACC ;8位是否传完
JMP OUT_164SW_1 ;未完,返回
SET K_DOWN
RET
KEY_PRESSED:
CLR PAC.1 ;PAC.1OUTPUT
CLR K_DOWN
MOV A,TEMP1
MOV KBUF,A
CLR TEMP
CLR TEMP1
RET
;-------------------------------------------------------------
;OUT_164SW1:
; CALL DISPLAY1
; CALL DISPLAY2
; CALL DISPLAY3
; CALL DISPLAY4
; MOV A,01H
; MOV TEMP1,A
; MOV A,8
;OUT_164SW_2:
; CLR CLK164 ;CLOCK清零
; CLR DATA164 ;DATA清零
; SZ TEMP1.0 ;TEMP第0位是否为O
; SET DATA164 ;NO,则置DATA为高
; NOP
; NOP
; SET CLK164 ;CLOCK拉高,输出数据
; NOP
; CLR DATA164 ;DATA清零
; SET PAC.1 ;DATA设置为输入
; NOP
; NOP
; NOP
; NOP
; SZ DATA164 ;是否有按键按下
; JMP KEY_PRESSED1 ;有按键按下则处理
; CLR PAC.1 ;PAC.1为输出
; RL TEMP1 ;左移
; SDZ ACC ;8位是否传完
; JMP OUT_164SW_1 ;未完,返回
; SET K_DOWN ;没有按键按下或已释放按键
; RET
;KEY_PRESSED1:
; CLR PAC.1 ;PAC.1OUTPUT
; CLR K_DOWN ;
; MOV A,TEMP1
; XOR A,KBUF1
; SZ ACC
; JMP KEY_CLR
; MOV A,TEMP1
; MOV KBUF,A
; CLR KBUF1
; CLR KBUF2
; CLR TEMP
; CLR TEMP1
; CLR K_ONE
; RET
;KEY_CLR:
; CLR KBUF1
; CLR KBUF2
; CLR TEMP
; CLR TEMP1
; CLR K_ONE
; RET
;*********************按键输出********************************
;----------------------时钟加1--------------------------------
SW_OUT:
SNZ K_DOWN ;是否释放
RET ;NO
MOV A,KBUF
XOR A,01H
SZ ACC
JMP SW1
SNZ KEYK
RET
SET BZ_F
SET PA.3
MOV A,20
MOV BZ_S,A
INC T_HOUR
CLR KBUF
MOV A,T_HOUR
XOR A,24
SZ ACC
RET
CLR T_HOUR
RET
;*************************分钟加1*******************************
SW1:
MOV A,KBUF
XOR A,02H
SZ ACC
JMP SW2
SNZ KEYK
RET
SET BZ_F
SET PA.3
MOV A,20
MOV BZ_S,A
INC T_MIN
CLR KBUF
MOV A,T_MIN
XOR A,60
SZ ACC
RET
CLR T_MIN
RET
;*********************开关**********************************
SW2:
MOV A,KBUF
XOR A,08H
SZ ACC
JMP SW3
SET BZ_F
SET PA.3
MOV A,20
MOV BZ_S,A
SNZ K_ONE
JMP KEY_ON
JMP KEY_OFF
;-----------------------------------------------------------
KEY_ON:
SET KEYK
SET K_ONE
CLR KBUF
CLR T_HOUR
CLR T_MIN
CLR T_4MS
CLR T_125US
RET
;-------------------------------------------------------------
KEY_OFF:
CLR KEYK
CLR K_ONE
CLR KBUF
RET
;********************清零*******************************
SW3:
MOV A,KBUF
XOR A,04H
SZ ACC
RET
SNZ KEYK
RET
SET BZ_F
SET PA.3
MOV A,250
MOV BZ_S,A
CLR T_SEC
CLR T_MIN
CLR T_HOUR
CLR T_125US
CLR T_4MS
CLR KBUF
RET
;**********************进制转换*********************************
TIME_MAN:
MOV A,T_MIN
CALL H2D
MOV A,GW
MOV DISP_RAM4,A
MOV A,SW
MOV DISP_RAM3,A
MOV A,T_HOUR
CALL H2D
MOV A,GW
MOV DISP_RAM2,A
MOV A,SW
MOV DISP_RAM1,A
RET
;------------------------------------------------------------------------
H2D:
CLR SW
H2D_LOOP:
MOV GW,A
SUB A,10
SNZ C
RET
INC SW
JMP H2D_LOOP
;**************************定时中断************************************
T0_ISR:
MOV ACC_BUF,A
MOV A,STATUS
MOV STATUS_BUF,A
INC T_125US
MOV A,T_125US
XOR A,32
SZ ACC
JMP T0_ISR_EXIT
CLR T_125US
SZ BZ_F
JMP BZ_ON
JMP T0_ISR1
BZ_ON:
DEC BZ_S
SZ BZ_S
JMP T0_ISR1
CLR PA.3
CLR BZ_F
CLR BZ_S
T0_ISR1:
INC T_4MS
INC KM
SET FLASH
MOV A,T_4MS
SUB A,125
SNZ C
JMP T0_ISR_EXIT
CLR FLASH
SUB A,125
SNZ C
JMP T0_ISR_EXIT
CLR T_4MS
INC T_SEC
MOV A,T_SEC
SUB A,60
SNZ C
JMP T0_ISR_EXIT
CLR T_SEC
INC T_MIN
MOV A,T_MIN
SUB A,60
SNZ C
JMP T0_ISR_EXIT
CLR T_MIN
INC T_HOUR
MOV A,T_HOUR
XOR A,24
SZ ACC
JMP T0_ISR_EXIT
CLR T_HOUR
T0_ISR_EXIT:
MOV A,STATUS_BUF
MOV STATUS,A
MOV A,ACC_BUF
RETI
;***************************************************************
; 表格区,0~9对应的显示代码
;***************************************************************
ORG 0700H
TABLE:
DC 5FH,12H,6BH,07AH,36H,07CH,07DH,1AH,07FH,7EH
; 0 1 2 3 4 5 6 7 8 9
;***************************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -