?? clock1.asm
字號:
;==========TIME LED===========
;OSC=12MHZ
;2006/03/19
;========程序向量入口處========
ORG 0000H
AJMP Main
ORG 0003H
RETI
ORG 000bH
AJMP Scan
ORG 0013H
AJMP Music
ORG 001bH
RETI
ORG 0023H
RETI
ORG 002bH
RETI
;========定義寄存器===========
TagBuf0 data 20H
SecTag Bit 00H
Timetag Bit 01H
DateTag Bit 02H
WeekTag Bit 03H
YearTag Bit 04H
ModeTag Bit 05H
AdjTag1 Bit 06H
AdjTag2 Bit 07H
;-----------------------
TagBuf1 data 21H
AdjTag3 Bit 08H
AdjTag4 Bit 09H
OnTag1 Bit 0aH
OffTag1 Bit 0bH
OnTag2 Bit 0cH
OffTag2 Bit 0dH
OnTag3 Bit 0eH
OffTag3 Bit 0fH
;-----------------------
TagBuf2 data 22H
DotTag1 Bit 10H
DotTag2 Bit 11H
OnTag Bit 12H
OffTag Bit 13H
LedTag Bit 14H
RingTag Bit 15H
;=======================
Days data 23H ; 判斷每個月的天數
Second data 24H ; 時間寄存器
Minute data 25H
Hour data 26H
Day data 27H
Month data 28H
Week data 29H
Year data 2aH
Cent data 2bH
;=======================
RingBuf data 2cH
;-----------------------
OnHour1 data 2dH
OnMin1 data 2eH
OffHour1 data 2fH
OffMin1 data 30H
;-----------------------
OnHour2 data 31H
OnMin2 data 32H
OffHour2 data 33H
OffMin2 data 34H
;-----------------------
OnHour3 data 35H
OnMin3 data 36H
OffHour3 data 37H
OffMin3 data 38H
;-----------------------
OnHour3 data 39H
OnMin3 data 3AH
OffHour3 data 3BH
OffMin3 data 3CH
;=======================
Ledbuf1 data 3DH
Ledbuf2 data 3EH
Ledbuf3 data 3FH
Ledbuf4 data 40H
WorkBuf1 data 41H
WorkBuf2 data 42H
;=======================
MuiBuf1 data 43H
MuiBuf2 data 44H
MuiBuf3 data 45H
MuiBuf4 data 46H
;=======================
LedCount data 47H
KeyCount data 48H
ModeBuf data 49H
ShowBuf1 data 4AH
ShowBuf2 data 4BH
ShowBuf3 data 4cH
;=======================
Port1 data 90H
Led_A Bit 90H
Led_B Bit 91H
Led_C Bit 92H
Led_D Bit 93H
Led_E Bit 94H
Led_F Bit 95H
Led_G Bit 96H
SCLK Bit 96H
Led_DP Bit 97H
SDATA Bit 97H
;----------------------
Port3 data 0B0H
ModeKey Bit 0B0H
LedCom1 Bit 0B0H
HourKey Bit 0B1H
LedCom2 Bit 0B1H
MinKey Bit 0B2H
LedCom3 Bit 0B2H
YesKey Bit 0B3H
LedCom4 Bit 0B3H
KeyPort Bit 0B4H
RstPort Bit 0B5H
MuiPort Bit 0B6H
;--------工作寄存器--------
Bank00 data 00H
Bank01 data 08H
Bank10 data 10H
Bank11 data 18H
;---------堆棧設置---------
Stacks data 50H
LedNub data 04H
KeyNub data 04H
;==============主程序開始===============
Main: MOV Port1,#00H
MOV Port3,#00H ; 端口初始化
MOV PSW,#00H
MOV SP,#Stacks
MOV R1,#20H
CLR A
Power: MOV @R1,A
INC R1
CJNE R1,#80H,Power
MOV LedCount,#LedBuf1; 從第一數碼管掃描
MOV IP,#00H
MOV IE,#82H ; 設置中斷
MOV TMOD,#02H ; 00000010B,Gate=0,C/T=0,M1M0=10,
MOV TH0,#0fah
MOV TL0,#0fah ; 定義中斷掃描時間
SETB TR0
Main0: JNB RingTag,$
ACALL MuiStart
SJMP Main0
;============調聲音子程序==============
MuiStart: MOV MuiBuf4,#00H
MuiNext: MOV A,MuiBuf4
MOV DPTR,#MuiTab
MOVC A,@A+DPTR
MOV R2,A ; 暫存R2
JZ MuiExit ; ?A=0,是 跳結束
ANL A,#0FH
MOV R5,A ; 存入節拍碼
MOV A,R2
SWAP A
ANL A,#0FH ; 得出音符碼
JNZ MuiSing ; ?A=0,否 跳發音
CLR TR1 ; 禁止啟動定時器
AJMP MuiDelay
MuiSing: DEC A
MOV MuiBuf3,A ; 音符暫存MuiBuf3
RL A ; 因為是16字節必須乘以2倍
MOV DPTR,#MuiTab1
MOVC A,@A+DPTR
MOV TH1,A
MOV MuiBuf2,A ; 取到高字節存入TH0與MuiBuf2
MOV A,MuiBuf3 ; 還原音符碼
RL A
INC A ; 查低字節
MOV DPTR,#MuiTab1
MOVC A,@A+DPTR
MOV TL1,A
MOV MuiBuf1,A ; 取到低字節存入TL0與MuiBuf1
SETB TR1 ; 啟動定時器
MuiDelay: CALL Delay10
INC MuiBuf4
AJMP MuiNext
MuiExit: CLR TR1 ; 禁止啟動定時器
RET
;----------------------------
MuiTab: DB 042H,082H,082H,082H,084H,002H,072H
DB 062H,072H,062H,052H,048H
DB 0B2H,0B2H,0B2H,0B2H,0B4H,002H,0A2H ;//1
DB 012H,0A2H,0D2H,092H,088H
DB 082H,0B2H,0B2H,0A2H,084H,002H,072H
DB 062H,072H,062H,052H,044H,002H,012H ;//2
DB 012H,062H,062H,052H,044H,002H,082H
DB 072H,062H,052H,032H,048H,000H ;//3
;----------------------------
MuiTab1: DW 64021,64103,64260,64400,64524,64580,64684,64777
DW 64820,64898,64968,65030,64934
;=============================
Music: PUSH DPL
PUSH DPH
PUSH A ; 現場保護
PUSH B
PUSH PSW
MOV PSW,#Bank11
MOV TL1,MuiBuf1
MOV TH1,MuiBuf2 ; 重新裝入新值
CPL MuiPort ; 取反,發出聲音
POP PSW ; 恢復現場
POP A
POP B
POP DPH
POP DPL ; 注意先進后出
RETI ; 中斷返回
;===========================
NumTab: DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H ; 顯示代碼
;// 0 1 2 3 4 5 6 7 8 9 暗 ; 顯示數字
;===========================
Scan: CLR EA
PUSH DPL
PUSH DPH
PUSH A
PUSH B
PUSH PSW
MOV PSW,#Bank01
CPL LedTag ; 消隱
JB LedTag,Scan0
MOV Port1,#00H
ANL Port3,#0Fh
ACALL GetTime ; 不顯示,并刷新時間
ACALL GetShow ; 調準備顯示模式
ScanRet: CLR TF0
POP PSW
POP B
POP A
POP DPH
POP DPL
SETB EA
RETI
;-----------------------------------
Scan0: PUSH DPL
PUSH DPH ; 數據保護
MOV R0,LedCount
MOV DPTR,#NumTab ;指定查表啟始地址
DispLed1: MOV A,@R0
MOVC A,@A+DPTR
CJNE R0,#LedBuf1,DispLed2
SETB LedCom1;//P3.0
JNB DotTag1,DispLed2
SETB ACC.7
DispLed2: CJNE R0,#LedBuf2,DispLed3
SETB LedCom2;//P3.1
JNB DotTag2,DispLed3
SETB ACC.7
DispLed3: CJNE R0,#LedBuf3,DispLed4
SETB LedCom3;//P3.2
JNB OnTag,DisLed4
SETB ACC.7
DispLed4: CJNE R0,#LedBuf4,DispLed
SETB LedCom4;//P3.3
JNB OffTag,DispLed
SETB ACC.7
DispLed: MOV Port1,A
POP DPH
POP DPL
INC KeyCount
INC LedCount
JNB KeyPort,KeyDown
;--------------------------------
Scan1: MOV R0,LedCount
CJNE R0,#LedBuf4,ScanRet
MOV LedCount,#LedBuf1
MOV KeyCount,#00H
AJMP ScanRet
;--------------------------------
KeyDown: ACALL Sound
MOV ShowBuf1,#50H
MOV ShowBuf2,#0a0H
MOV ShowBuf3,#0a0H
MOV A,KeyCount
KeyDown1: CJNE A,#01H,KeyDown2
INC ModeBuf
MOV A,ModeBuf
AJMP ModeSet
KeyDown2: CJNE A,#02H,KeyDown3
MOV R1,WorkBuf1
INC @R1
MOV A,@R1
DA A
MOV @R1,A
AJMP Scan1
KeyDown3: CJNE A,#03H,KeyDown4
MOV R1,WorkBuf2
INC @R1
MOV A,@R1
DA A
MOV @R1,A
AJMP Scan1
KeyDown4: CJNE A,#04H,Scan1
AJMP Scan1
;-------------------------------
ModeSet: SUBB A,#0CH ; 總共11種模式
JNC ModeRet
JB ModeTag,ModeSet1
CLR C
MOV A,TagBuf0
JNZ ModeSet1
MOV TagBuf1,#00H
SETB C
ModeSet1: RLC A
MOV TagBuf0,A
AJMP ModeSet4
ModeSet2: CLR C
MOV A,TagBuf1
JNZ ModeSet2
MOV TagBuf0,#00H
SETB C
ModeSet3: RLC A
MOV TagBuf1,A
AJMP Scan1
ModeSet4: INC WorkBuf1
INC WorkBuf2
ModeRet: MOV ModeBuf,#00H
MOV TagBuf0,#00H
MOV TagBuf1,#00H
MOV ShowBuf1,#00H
MOV ShowBuf2,#00H
MOV ShowBuf3,#00H
SJMP Scan1
;===================================
GetTime:
;===================================
GetShow: MOV A,ShowBuf
JZ ShowTime
DJNZ ShowBuf,ShowTime
ANL TagBuf2,#0fH
ShowTime: JNB TimeTag,ShowDate
MOV R0,#Minute
ORL TagBuf,#0f0H ; 四點全部點亮
SJMP ShowLed
ShowDate: JNB DateTag,ShowWeek
MOV R0,#Day
SJMP ShowLed
ShowWeek: JNB WeekTag,ShowYear
MOV R0,#Week
SJMP ShowLed2
ShowYear: JNB WeekTag,ShowOn1
MOV R0,#Year
SJMP ShowLed2
ShowSec: JNB SecTag,ShowYear
MOV R0,#Day
ShowLed2: MOV LedBuf3,#0AH
MOV LedBuf4,#0AH
MOV R2,#01H
SJMP ShowLed1
;------------------------------
ShowOn1: JNB OnTag1,ShowOff1
MOV R0,#OnMin1
SETB OnTag
SJMP ShowLed
ShowOff1: JNB OffTag1,ShwOn2
MOV R0,#OffMin1
SETB OffTag
SJMP ShowLed
ShowOn2: JNB OnTag1,ShowOff3
MOV R0,#OnMin2
SETB OnTag
SJMP ShowLed
ShowOff2: JNB OffTag2,ShwOn2
MOV R0,#OffMin2
SETB OffTag
SJMP ShowLed
ShowOn3: JNB OnTag1,ShowOff1
MOV R0,#OnMin3
SETB OnTag
SJMP ShowLed
ShowOff3: JNB OffTag1,ShowLed0
MOV R0,#OffMin3
SETB OffTag
SJMP ShowLed
ShowLed: SETB DotTag1
SETB DotTag2
ShowLed0: MOV R1,#LedBuf1
MOV R2,#02H
ShowLed1: MOV A,@R0
ANL A,#0FH
MOV @R1,A
INC R1
MOV A,@R0
SWAP A
ANL A,#0FH
MOV @R1,A
INC R0
INC R1
DJNZ R2,ShowLed1
RET
;------------寫HT1380子程序----------
Write: CLR SCLK
NOP
MOV R7,#08H
Write1: RRC A
MOV SDATA,C
NOP
SETB SCLK
NOP
CLR SCLK
DJNZ R7,Write1
RET
;------------讀HT1380子程序----------
Read: CLR A
CLR C
MOV R7,#08H
Read1: NOP
MOV C,SDATA
RRC A
SETB SCLK
NOP
CLR SCLK
DJNZ R7,Read1
RET
Init1380: CLR RstPort
NOP
CLR SCLK
NOP
SETB RstPort
MOV A,#81H
LCALL Write
LCALL Read
JNB ACC.7,InitA
MOV A,#8EH
LCALL Write
MOV A,#00H
LCALL Write
MOV A,#80H
LCALL Write
MOV A,#00H
LCALL Write
MOV A,#8EH
LCALL Write
MOV A,#80H
LCALL Write
InitA: NOP
CLR RstPort
RET
;==========聲音子程序===========
Sound: MOV R5,#25 ; R6*R5決定響時間長短
Sound1: MOV R6,#25
Sound2: CPL MuiPort ; 反相產生正弦波(產生聲)
MOV R7,#100
Sound3: DJNZ R7,Sound3 ; R7延時決定響聲頻率高低
DJNZ R6,sound2
DJNZ R5,sounD1
CLR MuiPort ; 清零端電壓后返回
RET
;==========延時子程序===========
Delay: MOV R5,#05H
Delay10: MOV R6,#125;//#0faH ; 延時125ms子程序
Delay11: MOV R7,#250;//#0faH
Delay12: JNB KeyPort,Quit
DJNZ R7,Delay12
DJNZ R6,Delay11
DJNZ R5,Delay10
RET
Quit: CLR RingTag
CLR TR1
RET
END ;//
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -