📄 程序2.txt
字号:
;*************************************************************
; 教学打铃系统*04级********编写
;*************************************************************
;***********************数据处理*****************************
;变量定义
scl bit p3.3
sda bit p3.2
time0 equ 30H;秒Y
time1 equ 31H;时Y
time2 equ 32H;分Y
time3 equ 33H;十毫秒次数控制Y
disp_t00 equ 35H;秒个位Y(右)
disp_t01 equ 36H;秒十位
disp_t10 equ 37H;分个位
disp_t11 equ 38H;分十位
disp_t20 equ 39H;时个位
disp_t21 equ 3aH;时十位Y(左)
;-----------------------------------------------------------
t_01 equ 3bH;临时显存秒Y
t_02 equ 3cH;临时显存分Y
t_03 equ 3dH;临时显存时Y
nishi equ 3eH;当前修改的是哪一临时位Y
nion equ 3fH;当前打铃点序号
key_x1 equ 41H;按键检测数据是否与上一次相同,如果相同不累加,否则算为一次按键Y
key_ok equ 42H;按键功能寄存/第二功能寄存Y
next_01 equ 43H;当前打铃序号
next_02 equ 44H;--------------分
next_03 equ 45H;--------------时
rall equ 46H;打铃点总数
writ equ 47H;0ffh为写状态,00H为不用写状态
ring equ 48H;0ffh为打铃中,00H为打铃结束
setd equ 49H;0ffh为20ms中断时间到!
nicui equ 4AH;
rbign equ 60H;打铃点在中的存储位置24co2
;**********************数据处理结束***************************
;*************************************************************
; 主程序(main)
;*************************************************************
;-------------------------入口程序----------------------------
org 0000H
ajmp start
org 001BH
ajmp int_t1
org 0040H
;------------------------主程序开始---------------------------
start: mov sp,#50H
;------------------------数据初始化---------------------------
mov time0,#00H
mov time1,#00H
mov time2,#00H
mov time3,#00H
mov t_01,#00H
mov t_02,#00H
mov t_03,#00H
mov disp_t00,#3fH
mov disp_t01,#3fH
mov disp_t10,#3fH
mov disp_t11,#3fH
mov disp_t20,#3fH
mov disp_t21,#3fH
mov nion,#00H
mov key_ok,#00H
mov nicui,#00H
clr p3.1
clr p3.4
mov writ,#00H
;判断是否读芯片,是则读入、否则不读
mov r4,#rbign ;读打铃点总数
mov r3,#1
mov r0,#rall
acall rd_eerom
mov a,rall
jz n0_1
clr c
subb a,#40
jc n0_2 ;如打铃点数字超过40则将总打铃点设为0,
mov rall,#00H ;否则读出数据到80H为首地址的内存区
mov r4,#rbign
mov r0,#rall
mov r3,#1
acall wr_eeprom ;写数据
jmp n0_1
n0_2: mov a,rall ;读数据到内存
rl a ;打铃乘2得总的字节数
mov r3,a
mov r0,#80H
mov r4,#00H
acall rd_eerom
;------------------------开中断--------------------------------
n0_1: acall next5 ;查找和当前时间最接近的下一打铃点
mov TMOD,#10H
mov TL1,#0e0H ;10 mS 的时间常数
mov TH1,#0b1H
SETB ET1
SETB TR1
SETB Ea
;允许中断
;--------------------------------------------------------------
ne_1: mov a,setd
jz ne_2
acall next2
acall next4 ;调用键盘检测(子程序四)
mov setd,#00h
ne_2: mov a,time0 ;比较下一打铃点
jnz n0_4
acall next6 ;打铃点检测
n0_4: cjne a,#20,n0_5
clr p3.4
n0_5: mov a,nion
cjne a,#0ffH,n0_3
acall next5
mov nion,#00H
;jmp n0_3
mov a,writ
cjne a,#0ffH,n0_3 ;判断是否需要写数据
mov r3,#1
mov r0,#rall
mov r4,#60H
acall wr_eeprom
mov a,rall
rl a
mov r3,a
mov r0,#80H
mov r4,#00H
acall wr_eeprom
mov writ,#00H
n0_3: jmp ne_1
;***********************主程序结束*****************************
;------------------------中断子程序----------------------------
int_t1: clr tr1
mov tl1,#0e0H ;20mS 定时常数
mov th1,#0b1H
setb tr1
acall next1 ;调用调时(子程序一)
mov setd,#0ffH
reti
;***********************子程序结束*****************************
;==============================================================
;用到数据a,r0,r4
;----------------------调时间(子程序一)-----------------------
next1: mov a,r3
push a
mov a,r0
push a
mov a,r4
push a
mov a,time3
inc a
mov time3,a
cjne a,#25,ne1_1 ;计时50毫秒
mov r4,key_ok
cjne r4,#00H,ne1_6
cpl p3.1
jmp ne1_1
ne1_6: mov b,key_ok
jnb b.6,ne1_1
mov r1,nishi
mov @r1,#0ffH
mov r0,#t_01
acall next3
ne1_1: cjne a,#50,ne1_2 ;计时100毫秒
mov time3,#0
mov r0,#time0
cjne @r0,#3bH,second
mov @r0,#00h ;秒加1
inc r0
cjne @r0,#3bH,minute ;分加1
mov @r0,#00H
inc r0
cjne @r0,#17H,hour ;时加1
mov @r0,#00H
jmp ne1_3
hour: inc @r0
jmp ne1_3
minute: inc @r0
jmp ne1_3
second: inc @r0
cpl p3.1
ne1_3: mov r4,key_ok
cjne r4,#00H,ne1_4 ;有键按下不调用此次拆字
mov r0,#time0
jmp ne1_5
ne1_4: mov r0,#t_01
ne1_5: acall next3 ;调用拆字(子程序三)
ne1_2: pop a
mov r4,a
pop a
mov r0,a
pop a
mov r3,a
RET
;***********************子程序结束*****************************
;==============================================================
;影响r0,r5,r6,r7
;----------------------显示(子程序二)------------------------
next2: mov a,r0
push a
mov r0,#disp_t00
mov r5,#6
mov a,#0dfH
ne2_1: mov p2,a
mov p0,@r0
inc r0
rr a
mov r6,#23H
wait0: mov r7,#15H
djnz r7,$
djnz r6,wait0
mov p2,#0
mov p0,#0
djnz r5,ne2_1
pop a
mov r0,a
ret
;***********************子程序结束*****************************
;入口数据r0送须拆字的首地址,r1存储首地址。
;影响数据为,r0,a,b,r1,r3
;--------------------拆字程序(子程序三)----------------------
next3: mov r3,#3
mov r1,#disp_t00
ne3_1: mov a,@r0
mov b,#100
div ab
jz ne3_2
mov @r1,#00H
inc r1
mov @r1,#00H
jmp ne3_3
ne3_2: mov a,@r0
mov b,#10
div ab
mov r6,a
mov a,b
mov dptr,#leds
movc a,@a+dptr
mov @r1,a
inc r1
mov a,r6
movc a,@a+dptr
mov @r1,a
ne3_3: inc r1
inc r0
djnz r3,ne3_1
ret
;***********************子程序结束*****************************
;---------------------next5按下(子程序十二)------------------
next5: mov a,rall ;将与现在时间最接近的打铃点装入:next_01
cjne a,#0,n5_8
jmp n5_1
n5_8: mov r0,#80H ;next_02,next_03
mov r1,#00H
n5_2: mov a,@r0
cjne a,time2,n5_4
inc r0
mov a,@r0
cjne a,time1,n5_3
jmp n5_6
n5_3: jc n5_6
inc r1
mov next_01,r1
mov next_02,@r0
dec r0
mov next_03,@r0
jmp n5_7
n5_4: jc n5_5
inc r1
mov next_01,r1
mov next_03,@r0
inc r0
mov next_02,@r0
jmp n5_7
n5_5: inc r0
n5_6: inc r0
inc r1
mov a,r1
cjne a,rall,n5_2
mov r0,#80H
mov next_01,#01H
mov next_03,@r0
inc r0
mov next_02,@r0
jmp n5_7
n5_1: mov next_01,#00H
mov next_02,#00H
mov next_03,#00H
n5_7: ret
;***********************子程序结束*****************************
;-------------------对时检查(子程序十三)---------------------
;==============================================================
next6: mov a,rall
jz n6_1
mov a,next_03 ;如果时间正确打铃一分钟
cjne a,time2,n6_1
mov a,next_02
cjne a,time1,n6_1
setb p3.4
acall next5 ;调到下一打铃点
n6_1: ret
;***********************子程序结束*****************************
;--------------------按键检查(子程序四)----------------------
;r1临时数据地址参数,B为按键功能检测数据 a,b,r1
;--------------------------------------------------------------
next4:
mov a,p1
mov r1,nishi
mov @r1,nicui
mov b,key_ok
cjne a,key_x1,k_1
jmp ne4_1
k_1: mov key_x1,a
mov r4,key_ok
jb p1.0,kx_1 ;key_1按下
acall key_1
jmp ne4_1
kx_1: jnb b.0,ne4_1
jb p1.1,kx_2 ;key_2按下
acall key_2
jmp ne4_1
kx_2: jb p1.2,kx_3 ;key_3按下
acall key_3
jmp ne4_1
kx_3: jb p1.3,kx_4 ;key_4按下
acall key_4
jmp ne4_1
kx_4: jb p1.4,kx_5 ;key_5按下
acall key_5
jmp ne4_1
kx_5: jb p1.5,kx_6 ;key_6按下
acall key_6
jmp ne4_1
kx_6: jb p1.6,kx_7 ;key_7按下
acall key_7
jmp ne4_1
kx_7: jb p1.7,ne4_1
acall key_8 ;key_8按下
ne4_1: mov nishi,r1
mov nicui,@r1
mov key_ok,b
ret
;***********************子程序结束*****************************
;----------------------key_1按下(子程序五)-------------------
key_1: jb b.6,nk1_1
mov t_03,#0aH ;菜单
mov t_02,#00H
mov t_01,#00H
setb b.0
nk1_1: ret
;***********************子程序结束*****************************
;----------------------key_2按下(子程序六)-------------------
key_2: jb b.6,nk2_1 ;修改时间
setb b.1
mov t_03,#0bH
mov t_02,#00H
mov t_01,#00H
nk2_1: ret
;***********************子程序结束*****************************
;----------------------key_3按下(子程序七)-------------------
key_3: jb b.6,nk3_1 ;向左/增加打铃点
setb b.2 ;菜单选择
mov t_03,#0aH
mov t_02,#0aH
mov t_01,#00H
jmp nk3_2
nk3_1: jb b.4,nk3_2 ;删除
jb b.2,nk3_4 ;增加
;jb b.3,nk3_4 ;修改
cjne r1,#t_03,nk3_3 ;时间修改移位
mov r1,#t_01
jmp nk3_2
nk3_3: inc r1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -