📄 7289.asm
字号:
;********************************************************
; ZLG7289 测试演示程序 *
;********************************************************
;
KEY_CS BIT P2.0 ;低电平有效
KEY_DAT BIT P2.2
KEY_CLK BIT P2.1 ;上升沿有效
KEY BIT P2.3 ;低电平有效
KEY_VALUE DATA 55H
PT DATA 56H
BLINK DATA 57H ;存放闪烁的位
DSBUF DATA 58H ;显示缓冲区 58-5F
LAST_SEG DATA 60H ;熄灭的段地址
SEG_NUM DATA 61H ;点亮的段地址
TIME_RST BIT P1.4
TIME_IO BIT P1.3
TIME_SCLK BIT P1.2
TIME_REG EQU 2EH ;读写DS1302时存放地址
TIME_DT EQU 2FH ;读写DS1302时存放数据
BUFF DATA 50H ;1% 秒缓冲区
SSBUF DATA 51H ;秒缓冲区
MBUF DATA 52H ;分缓冲区
HBUF DATA 53H ;时缓冲区
ORG 0000H
RESET: AJMP START
;
;********************************************************
; /*主程序*/ *
;********************************************************
;
ORG 0030H
;
START: MOV SP,#07H
MOV P1,#11111111B
MOV P2,#11111111B
MOV P3,#11111111B
PRPT: MOV A,#10100100B ;发送复位指令 0A4H(纯指令)
CALL KEY_SEND
SETB KEY_CS
MOV DSBUF+0,#1EH ;第1位显示 'P'
MOV DSBUF+1,#1FH ;第2位显示 ' '
MOV DSBUF+2,#1FH ;第3位显示 ' '
MOV DSBUF+3,#1FH ;第4位显示 ' '
MOV DSBUF+4,#1FH ;第5位显示 ' '
MOV DSBUF+5,#1FH ;第6位显示 ' '
MOV DSBUF+6,#1FH ;第7位显示 ' '
MOV DSBUF+7,#1FH ;第8位显示 ' '
MOV BLINK,#01111111B ;第1位闪烁
MOV PT,#DSBUF ;显示缓冲区指针
PRPT1: CALL DSUP
JB KEY,$ ;是否有键按下
PRPT2: CALL KBS ;读键
JC PRPT3
AJMP MCMD ;功能键处理
PRPT3: CALL CHAG ;数据键处理
DB 11111111B ;第8位显示 DSBUF+7
DB 01111111B ;第1位显示 DSBUF
SJMP PRPT1
;
;********************************************************
; 数据键处理子程序 *
;********************************************************
;
CHAG: POP DPH
POP DPL
MOV A,BLINK
SETB C
RRC A
MOV BLINK,A
MOV R0,PT
MOV @R0,KEY_VALUE
INC PT
CLR A
MOVC A,@A+DPTR
CJNE A,BLINK,CHAG2 ;判断是否是最后一位
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV BLINK,A ;是最后一位,BLINK赋初值
MOV PT,#DSBUF
CHAG1: JNB KEY,$ ;按键是否释放
INC DPTR
PUSH DPL
PUSH DPH
RET
CHAG2: INC DPTR
SJMP CHAG1
;
;********************************************************
; /*功能键处理子程序*/ *
;********************************************************
;
MCMD: SUBB A,#11H
RL A
MOV DPTR,#JPTB1
JMP @A+DPTR
JPTB1: AJMP PRPT ;11
AJMP PRPT ;12
AJMP PRPT ;13
AJMP PRPT ;14
AJMP PRPT ;15
AJMP PRPT ;16
AJMP PRPT ;17
AJMP HIDE ;18
AJMP CYCLED ;19
AJMP TEST ;1A
AJMP SEG_DEMO ;1B
AJMP DSTIME ;1C
;********************************************************
; /*测试指令演示*/ *
;********************************************************
TEST: MOV A,#10111111B ;发送测试指令 BFH
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_3S ;延时
JMP PRPT
;
;********************************************************
; 段寻址指令测试 *
; 点亮的显示段在8只数码管间做往复8字运动 *
;********************************************************
;
SEG_DEMO: MOV R3,#02
MOV A,#10100100B ;发送复位指令 0A4H(纯指令)
CALL KEY_SEND
SETB KEY_CS
MOV LAST_SEG,#0FFH
SEG_DEMO1: MOV R4,#28 ;循环一次共用28个显示段
SEG_LOOP: MOV A,R4
MOV DPTR,#SEGTB-1 ;查表得显示段地址
MOVC A,@A+DPTR
MOV SEG_NUM,A
MOV A,#11100000B ;发段点亮指令点亮当前段
CALL KEY_SEND
MOV A,SEG_NUM ;发段地址
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_50MS
CALL DELAY_50MS
MOV A,#11000000B ;发段熄灭指令关闭上一显示段
CALL KEY_SEND
MOV A,LAST_SEG ;上一显示段的段地址
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_50MS
MOV LAST_SEG,SEG_NUM ;保存当前段地址
DJNZ R4,SEG_LOOP ;显示下一显示段
DJNZ R3,SEG_DEMO1
AJMP PRPT
;
;*******************************************************
; 循环左/右移测试 *
; 显示缓冲区内容向右运动3次,再向左运动3次 *
;*******************************************************
;
CYCLED: MOV R4,#23 ;循环右移24次
CR_R: MOV A,#10100010B ;循环右移指令
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_50MS
CALL DELAY_50MS
CALL DELAY_50MS
DJNZ R4,CR_R
CALL DELAY_50MS
CALL DELAY_50MS
CALL DELAY_50MS
MOV R4,#23 ;循环左移24次
CR_L: MOV A,#10100011B ;循环左移指令
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_50MS
CALL DELAY_50MS
CALL DELAY_50MS
DJNZ R4,CR_L
CALL DELAY_50MS
CALL DELAY_50MS
CALL DELAY_50MS
AJMP PRPT
;
;*******************************************************
; 消隐指令测试;1为显示,0为消隐 *
;*******************************************************
;
HIDE: MOV DSBUF+0,#00H ;第1位显示 '0'
MOV DSBUF+1,#01H ;第2位显示 '1'
MOV DSBUF+2,#02H ;第3位显示 '2'
MOV DSBUF+3,#03H ;第4位显示 '3'
MOV DSBUF+4,#04H ;第5位显示 '4'
MOV DSBUF+5,#05H ;第6位显示 '5'
MOV DSBUF+6,#06H ;第7位显示 '6'
MOV DSBUF+7,#07H ;第8位显示 '7'
MOV BLINK,#01111111B ;第1位闪烁
MOV PT,#DSBUF ;显示缓冲区指针
CALL DSUP
MOV A,#88H
CALL KEY_SEND
MOV A,#0FFH
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_1S
HIDE1: MOV A,#10011000B ;消隐控制指令98H
CALL KEY_SEND
MOV A,#11110111B ;将第4位设为消隐
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_1S
MOV A,#10011000B ;消隐控制指令
CALL KEY_SEND
MOV A,#11100111B ;增加第5位为消隐
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_1S
MOV A,#10011000B ;消隐控制指令
CALL KEY_SEND
MOV A,#11100011B ;增加第3位为消隐
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_1S
MOV A,#10011000B ;消隐控制指令
CALL KEY_SEND
MOV A,#11000011B ;增加第6位为消隐
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_1S
MOV A,#10011000B ;消隐控制指令
CALL KEY_SEND
MOV A,#11000001B ;增加第2位为消隐
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_1S
MOV A,#10011000B ;消隐控制指令98H
CALL KEY_SEND
MOV A,#10000001B ;增加第7位为消隐
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_1S
MOV A,#10011000B ;消隐控制指令98H
CALL KEY_SEND
MOV A,#10000000B ;增加第1位为消隐
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_1S
MOV A,#10011000B ;消隐控制指令
CALL KEY_SEND
MOV A,#10000001B ;将第1位恢复显示
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_1S
MOV A,#10011000B ;消隐控制指令
CALL KEY_SEND
MOV A,#10011001B ;将中间2位恢复显示
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_1S
MOV A,#10011000B ;消隐控制指令
CALL KEY_SEND
MOV A,#10111101B ;将中间4位恢复显示
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_1S
MOV A,#10011000B ;消隐控制指令
CALL KEY_SEND
MOV A,#11111111B ;全部恢复显示
CALL KEY_SEND
SETB KEY_CS
CALL DELAY_1S
AJMP PRPT
;
;********************************************************
; 7289 数据发送子程序 *
;********************************************************
;
KEY_SEND: PUSH 00H
CLR KEY_CS
MOV R0,#08H
CALL DELAY
KEY_SEND1: RLC A
MOV KEY_DAT,C
SETB KEY_CLK
CALL DELAY
CLR KEY_CLK
CALL DELAY
DJNZ R0,KEY_SEND1
POP 00H
RET
;
;********************************************************
; 显示子程序 *
;********************************************************
;
DSUP: CLR KEY_CS
MOV R0,#10000111B ;最高位开始放
MOV R1,#DSBUF
MOV R7,#08H ;8个数码管
DSUP1: CJNE @R1,#10H,DSUP2 ;判断显示缓冲区的内容是否大于10H
DSUP2: JNC DSUP3
MOV A,R0 ;小于10H是0~F中的数字
ORL A,#01001000B ;下载数据且按方式1译码
CALL KEY_SEND
MOV A,@R1
CALL KEY_SEND
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -