?? 程序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 + -