📄 timer and ring.asm
字号:
;教学打铃控制器 湖南师范大学工学院04级应用电子班王原亮
;
;-------------------------------按键定义,对应于P1口
SETUP EQU 0FEH ; "设置" "11111110"
NEW EQU 0FDH ; "新增 "11111101"
DEL EQU 0FBH ; "删除" "11111011"
UP EQU 0F7H ; "向上" "11110111"
DOWN EQU 0EFH ; "向下" "11101111"
RIGHT EQU 0DFH ; "向右" "11011111"
ENTER EQU 07FH ; "确认" "10111111"
CANCEL EQU 0BFH ; "取消" "01111111"
SDA EQU P3.2
SCL EQU P3.3
BELLR EQU P3.4
;--------------------------------存储单元定义
SECLOC EQU 30H
MINLOC EQU 31H
HOURLOC EQU 32H ;时.分.秒存储单元
T0COUNT EQU 33H ;50MS计数存储单元
SECLED EQU P3.1 ;秒闪信息
;34H到39H定义为显示缓冲区
DPLYLOC EQU 3AH ;显示子程序的起入口指针存放单元,在调用时钟显示时为#34H
KEYBUF EQU 3BH
KEYCODE EQU 3CH ;存放按键值单元,没有按键时为0FFH
KEYFLAG EQU 3DH ;按键标志位, 有按键时置0FFH,默认为00
CONSOS EQU 3EH ;3_6转换程序源单元块的首地址存放单元
CONDES EQU 3FH ;3_6转换程序目的单元块的尾地址存放单元
SECBUF EQU 40H
MINBUF EQU 41H
HOURBUF EQU 42H ;时,分,秒设置缓冲区
T1COUNT EQU 43H ;T1中断计数
;44H-49H定义为设置时的显示缓冲区
BELLM EQU 50H ;存放打铃时间分位,初始为--
BELLH EQU 51H ;打铃时间时位,初始为--
BELNUM EQU 52H ;打铃序号,初始为0,BCD格式
;54H-59H为打铃点浏览和设置时的显示缓冲区
NEWFLAG EQU 5AH ;新增打铃点的标志位
BELFLAG EQU 5BH ;打铃点个数有效标志
BNBIN EQU 5CH ;BELNUM的二进制表示
BCBIN EQU 5DH ;BELCOT的二进制表示
KEYFLAG2 EQU 5FH
TCDOWN EQU 4AH ;时间设置倒计时
BCDOWN EQU 4BH ;打铃倒计时
BRFLAG EQU 4CH ;打铃标志
;--------------------------------80H-0CFH为打铃信息缓冲区
;--------------------------------位单元定义
;00单元用于存放闪烁位信息
T0L EQU 0BAH ;TL0初值,方便调试
;--------------------------------主程序开始
ORG 0000H
AJMP START ;主程序入口
ORG 000BH
LJMP T0INT ;定时器T0中断入口
START: CLR BELLR
MOV SP,#60H
MOV T0COUNT,#20 ;秒计数标志
MOV T1COUNT,#00H
MOV SECLOC,#00H
MOV MINLOC,#30H
MOV HOURLOC,#12H ;初始化时、分、秒存储单元
MOV CONSOS,#30H
MOV CONDES,#39H ;初始化3-6转换程序参数
MOV DPLYLOC,#34H ;初始显示时钟
MOV KEYCODE,#0FFH ;初始化P1口按键扫描值
MOV KEYFLAG,#00H ;初始化按键标志
MOV KEYFLAG2,#00H
MOV BCDOWN,#00H
MOV BRFLAG,#00H
MOV TCDOWN,#20
SETB C
MOV 01H,C
MOV R0,#07FH
MOV R1,#80H
MOV A,#0FFH ;初始化80H-0FF单元为0FF
INTLP1: MOV @R1,A
INC R1
DJNZ R0,INTLP1
MOV BELLM,#0EEH ;初始化打铃点分单元为"-"
MOV BELLH,#0EEH ;初始化打铃点时单元为"-"
MOV BELNUM,#00H
MOV BELFLAG,#0FFH
MOV NEWFLAG,#00H
INTGO: MOV TMOD,#11H
MOV TH0,#03CH
MOV TL0,#T0L
SETB EA
SETB ET0
SETB TR0
MAINRD: LCALL START24
MOV A,#0A0H
LCALL WBYTE
MOV A,#00H
LCALL WBYTE
LCALL START24
MOV A,#0A1H
LCALL WBYTE
LCALL RBYTE
MOV B,A
LCALL STOP24
MOV A,B
CLR C
SUBB A,#41 ;读入的是用二进制表示的BELCOT
JC INTEF
MOV BCBIN,#00H
MOV BNBIN,#00H
AJMP INTSTOP
INTEF: MOV BCBIN,B ;---------------- ;初始化打铃点个数
INTSTOP:MOV A,BCBIN
JZ MAIN
MOV BNBIN,#01H ;有打铃点,则显示为第一个打铃点信息,
MOV R0,#80H ;RAM指针
MOV A,BCBIN
MOV B,#2
MUL AB
MOV R3,A ;数据字节数
MOV R4,#01H ;24C02存储地址
LCALL RD24 ;读24C02
;-----------------------------------
MAIN: LCALL LEDDIS
LCALL DISPLAY
LCALL GETKEY
MOV A,KEYFLAG
JZ LOOP
MOV A,KEYCODE
MOV KEYFLAG,#00H
CJNE A,#RIGHT,NOTRIGHT
LJMP BELLBRO ;按下RIGHT键,转入打铃点浏览状态,BELL BROWSE
NOTRIGHT:MOV A,KEYCODE
CJNE A,#SETUP,LOOP
LJMP TIMESET ;按下SETUP键,转入时间设置状态,TIME SET
LOOP: LJMP MAIN
;------------------------------------ ;T0中断子程序,
T0INT: MOV TL0,#T0L ;重新置定时常数
MOV TH0,#03CH
PUSH DPL
PUSH DPH
PUSH ACC
PUSH PSW
PUSH CONSOS
PUSH CONDES
MOV A,T1COUNT
ADD A,#1
MOV T1COUNT,A
CJNE A,#10,NEXT1
MOV T1COUNT,#00H
MOV C,01H
CPL C
MOV 01H,C
NEXT1: MOV A,T0COUNT
CJNE A,#15,NEXT0
SETB SECLED
NEXT0: DJNZ T0COUNT,EXIT ;判断是否为1S
MOV T0COUNT,#20
MOV A,SECLOC ;秒钟值
CJNE A,#59H,SECEXIT ;不到59时调整
MOV SECLOC,#99H
MOV A,MINLOC ;分钟值
CJNE A,#59H,MINEXIT
MOV MINLOC,#99H
MOV A,HOURLOC ;时钟值
CJNE A,#23H,HOUREXIT
MOV HOURLOC,#99H
HOUREXIT:MOV A,HOURLOC
ADD A,#01
DA A ;时加1
MOV HOURLOC,A
MINEXIT:MOV A,MINLOC
ADD A,#01
DA A ;分加1
MOV MINLOC,A
LCALL SCAN
SECEXIT:MOV A,SECLOC
ADD A,#01
DA A ;秒加1
MOV SECLOC,A
CLR SECLED
DEC TCDOWN
MOV A,TCDOWN
SUBB A,#21
JC TCGO
MOV TCDOWN,#20
TCGO: MOV A,BRFLAG
JZ EXIT
INC BCDOWN
MOV A,BCDOWN
CJNE A,#11,EXIT
CLR BELLR
MOV BRFLAG,#00H
EXIT: POP CONDES
POP CONSOS
POP PSW
POP ACC
POP DPH
POP DPL
RETI ;中断返回
;---------------------------------------打铃点扫描程序
SCAN: PUSH 02H
PUSH 01H
PUSH 00H
PUSH ACC
MOV A,BCBIN
JZ SEXIT
MOV R2,A ;R2放置扫描次数
MOV R0,#80H ;R0为地址指针
SCANHLP:MOV A,@R0
CJNE A,32H,SCANNEXT
MOV R1,00H
INC R1 ;R1为分指针
MOV A,@R1
CJNE A,31H,SCANNEXT
MOV BCDOWN,#00H
SETB BELLR
MOV BRFLAG,#0FFH
AJMP SEXIT
SCANNEXT:INC R0
INC R0
DJNZ R2,SCANHLP
SEXIT: POP ACC
POP 00H
POP 01H
POP 02H
RET
;-----------------------------------------读键子程序
GETKEY: PUSH ACC
PUSH B
PUSH 01H
MOV KEYFLAG,#00H
MOV KEYBUF,#00H
MOV A,P1
CJNE A,#0FFH,KEYDOWN
MOV KEYFLAG2,#00H
AJMP GKEXIT
KEYDOWN:MOV KEYBUF,A
ACALL DY10MS
MOV A,P1
MOV B,KEYBUF
CJNE A,B,GKEXIT
MOV A,KEYFLAG2
JNZ GKLPOUT1
MOV R1,#200
GKLP: ACALL DY10MS
LCALL LEDDIS
LCALL DISPLAY
MOV A,P1
CJNE A,#0FFH,GKNEXT
AJMP GKLPOUT
GKNEXT: DJNZ R1,GKLP
MOV KEYFLAG2,#0FFH
AJMP GKLPOUT
GKLPOUT1:MOV R1,#20
GKLP1LP:ACALL DY10MS
LCALL LEDDIS
LCALL DISPLAY
DJNZ R1,GKLP1LP
GKLPOUT:MOV KEYCODE,KEYBUF
MOV KEYFLAG,#0FFH
GKEXIT: POP 01H
POP B
POP ACC
RET
;------------------------------
DY10MS: PUSH 00H
MOV R0,#20
DL10LP: LCALL DISPLAY
DJNZ R0,DL10LP
POP 00H
RET
;-------------------------------------- 此程序将@CONSOS起始的三个单元拆解
; 为6个BCD码送往@CONDES为尾的六个单元
LEDDIS:PUSH 00H
PUSH 01H
PUSH 02H
MOV R2,#3H
MOV R0,CONSOS
MOV R1,CONDES
LDLOOP: MOV A,@R0
PUSH ACC
MOV B,#0FH
ANL A,B
MOV @R1,A
DEC R1
POP ACC
SWAP A
ANL A,B
MOV @R1,A
DEC R1
INC R0
DJNZ R2,LDLOOP
POP 02H
POP 01H
POP 00H
RET
;------------------------------------ 显示子程序,入口条件:在40H中存放了显示段低地址指针,对应的显示为高位,
DISPLAY:PUSH ACC
PUSH PSW
PUSH 00H
PUSH 01H
MOV R0,DPLYLOC
MOV R1,#0FEH
DISLP: MOV DPTR,#TABLE
MOV A,@R0
MOVC A,@A+DPTR
MOV P2,#0FFH
MOV P0,A
MOV A,R1
MOV P2,A
LCALL DLYMS
RL A
MOV R1,A
INC R0
JB ACC.6,DISLP
MOV P2,#0FFH
POP 01H
POP 00H
POP PSW
POP ACC
RET
;------------------ ;用于显示暂留的延迟
DLYMS: PUSH 00H
MOV R0,#20H
DJNZ R0,$
POP 00H
RET
;************************************* 时钟设置子程序
TIMESET:PUSH ACC
PUSH PSW
PUSH DPLYLOC
PUSH CONSOS
PUSH CONDES ;现场保护
MOV TCDOWN,#20
MOV DPLYLOC,#44H ;显示程序入口指针指向44H
MOV 40H,30H
MOV 41H,31H
MOV 42H,32H
MOV CONSOS,#40H
MOV CONDES,#49H ;初始化转换程序
LCALL LEDDIS ;将40H-42H单元的内容拆解为六个BCD字节送往显示单元
LCALL DISPLAY ;初始化完毕
HOURSET:MOV A,TCDOWN
JNZ HOURGO
LJMP SETCAN
HOURGO: MOV C,01H
JNC HIDE
LCALL LEDDIS
LCALL DISPLAY
AJMP HOURSP
HIDE: PUSH 42H
MOV 42H,#0FFH
LCALL LEDDIS
LCALL DISPLAY
POP 42H
HOURSP: LCALL GETKEY
MOV A,KEYFLAG
JZ HOURSET
MOV A,KEYCODE
MOV TCDOWN,#20
MOV KEYFLAG,#00H
MOV B,A
CJNE A,#CANCEL,NOTCN
LJMP SETCAN ;CANCEL,则转向取消设置程序
NOTCN: CJNE A,#ENTER,NOTENT
LJMP SETENT ;ENTER,则转向确定设置程序
NOTENT: CJNE A,#RIGHT,NOTRIT
LJMP MINSET ;按下RIGHT键,转入分钟设置
NOTRIT: MOV A,KEYCODE
CJNE A,#UP,NOTUP
MOV A,42H
CJNE A,#23H,ADDH
MOV 42H,#00H
AJMP SETOK
ADDH: LCALL DAASP
MOV 42H,A
LJMP SETOK
NOTUP: MOV A,B
CJNE A,#DOWN,NOTDOWN
MOV A,42H
CJNE A,#00H,SUBH
MOV 42H,#23H
AJMP SETOK
SUBH: SUBB A,#1
JNB AC,STOH
SUBB A,#6
STOH: MOV 42H,A
SETOK: LCALL LEDDIS
NOTDOWN:LJMP HOURSET
;-------------------------- 分钟设置
MINSET: MOV A,TCDOWN
JNZ MINGO
LJMP SETCAN
MINGO: MOV C,01H
JNC HIDE1
LCALL LEDDIS
LCALL DISPLAY
AJMP MINSP
HIDE1: PUSH 41H
MOV 41H,#0FFH
LCALL LEDDIS
LCALL DISPLAY
POP 41H
MINSP: LCALL GETKEY
MOV A,KEYFLAG
JZ MINSET
MOV A,KEYCODE
MOV TCDOWN,#20
MOV KEYFLAG,#00H
MOV B,A
CJNE A,#CANCEL,NOTCN1
LJMP SETCAN ;CANCEL,则转向取消设置程序
NOTCN1: CJNE A,#ENTER,NOTENT1
LJMP SETENT ;ENTER,则转向确定设置程序
NOTENT1: CJNE A,#RIGHT,NOTRIT1
LJMP SECSET ;按下RIGHT键,转入秒钟设置
NOTRIT1:MOV A,KEYCODE
CJNE A,#UP,NOTUP1
MOV A,41H
CJNE A,#59H,ADDM
MOV 41H,#00H
AJMP SETOK1
ADDM: LCALL DAASP
MOV 41H,A
AJMP SETOK1
NOTUP1: MOV A,B
CJNE A,#DOWN,NOTDOWN1
MOV A,41H
CJNE A,#00H,SUBM
MOV 41H,#59H
AJMP SETOK1
SUBM: SUBB A,#1
JNB AC,STOM
SUBB A,#6
STOM: MOV 41H,A
SETOK1: LCALL LEDDIS
NOTDOWN1:LJMP MINSET
;------------------------------ 秒设置
SECSET: MOV A,TCDOWN
JNZ SECGO
LJMP SETCAN
SECGO: MOV C,01H
JNC HIDE2
LCALL LEDDIS
LCALL DISPLAY
AJMP SECSP
HIDE2: PUSH 40H
MOV 40H,#0FFH
LCALL LEDDIS
LCALL DISPLAY
POP 40H
SECSP: LCALL GETKEY
MOV A,KEYFLAG
JZ SECSET
MOV A,KEYCODE
MOV TCDOWN,#20
MOV KEYFLAG,#00H
MOV B,A
CJNE A,#CANCEL,NOTCN2
LJMP SETCAN ;CANCEL,则转向取消设置程序
NOTCN2: CJNE A,#ENTER,NOTENT2
LJMP SETENT ;ENTER,则转向确定设置程序
NOTENT2: CJNE A,#RIGHT,NOTRIT2
LJMP HOURSET ;按下RIGHT键,转入时钟设置
NOTRIT2:MOV A,KEYCODE
CJNE A,#UP,NOTUP2
MOV A,40H
CJNE A,#59H,ADDS
MOV 40H,#00H
AJMP SETOK2
ADDS: LCALL DAASP
MOV 40H,A
LJMP SETOK2
NOTUP2: MOV A,B
CJNE A,#DOWN,NOTDOWN2
MOV A,40H
CJNE A,#00H,SUBS
MOV 40H,#59H
AJMP SETOK2
SUBS: SUBB A,#1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -