?? 10000clock.asm
字號:
ByteCnt DATA 28H ;I2C總線收發字節計數器
SlvAdr DATA 29H ;從器件地址(控制信息)
SubAdr DATA 2AH ;對于32Kbit(4BK)存儲容量及以上器件來說,待讀寫
;單元地址為兩字節,分別存放SubAdr、SubAdr+1單元中
KEYSTU DATA 2BH ;鍵盤按鍵狀態寄存器,其中b2、b1、b0分別記錄最近
KEYNAME DATA 2DH ;b0,b1位記錄按鍵值
;b7作為按鍵有效標志,b7為0時,鍵值無效。
;b7為1時,按鍵值有效,且未尚未處理,不能
;接受新按鍵。
;外部程序執行了按鍵功能后,將按鍵有效標志清0,允許接收新按鍵
RcvDat DATA 30H ;接收數據緩沖區(長度為8字節)
XmtDat DATA 38H ;發送數據緩沖區(長度為8字節)
FHbit BIT 00H ;發送及接收成功標志存放在00H位單元中。0表示成功;
;1表示失敗
NOACK BIT 01H ;讀操作時主器件非應答標志位,1表示非應答,0表示應答。
T40 BIT 02H ;40ms時間到標志
ENTER BIT 03H ;確認鍵按下標志
ALARM BIT 04H ;鬧鐘開啟標志
C_5S BIT 05H ;5S到標志
C_2S BIT 06H ;2S到標志
S_WATCH BIT 07H ;秒表啟動標志
SCL BIT P1.0 ;模擬I2C總線時鐘信號, 輸出
SDA BIT P1.1 ;模擬I2C總線數據/地址引腳,雙向
RS BIT P2.5 ;決定要傳送的是命令還是數據
RW BIT P2.6 ;決定要讀還是寫,一般寫的時候多
E BIT P2.7 ;時鐘信號
BEE BIT P2.0
LIG BIT P2.1
;***********************定義LCD顯示緩沖區地址******************
YER1 EQU 40H
YER0 EQU 41H
MON1 EQU 42H
MON0 EQU 43H
DAY1 EQU 44H
DAY0 EQU 45H
WEK EQU 46H
HOU1 EQU 47H
HOU0 EQU 48H
MIN1 EQU 49H
MIN0 EQU 4AH
SEC1 EQU 4BH
SEC0 EQU 4CH
;************************定義按鍵位*********************
SW BIT P1.7 ;定義P1.7調整鍵
UP BIT P1.6 ;定義P1.6加一鍵
DOWN BIT P1.5 ;定義P1.5減一鍵
CONF BIT P1.4 ;定義P1.4鍵為確認鍵
COUNT EQU 4DH ;判別選擇鍵按的次數
D_COUNT EQU 4EH ;背光定時10S倒數單元
P_COUNT EQU 4FH ;圖案計數單元
;***********************定義鬧鐘緩沖區地址******************
C_WEK EQU 50H
C_HOU1 EQU 51H
C_HOU0 EQU 52H
C_MIN1 EQU 53H
C_MIN0 EQU 54H
C_COUNT EQU 55H ;鬧鐘定時5S倒數單元
;***********************定義鬧鐘緩沖區地址******************
S_MS1 EQU 56H
S_MS0 EQU 57H
S_SEC1 EQU 58H
S_SEC0 EQU 59H
S_MIN1 EQU 5AH
S_MIN0 EQU 5BH
S_HOU1 EQU 5CH
S_HOU0 EQU 5DH
ORG 0000H ;跳轉主程序
LJMP MAIN
ORG 0003H ;顯示中斷入口
LJMP INT0
ORG 000BH ;鬧鐘計時中斷
LJMP CTC0
ORG 0013H ;鬧鐘中斷入口
LJMP INT1
ORG 001BH ;背光燈計時中斷
LJMP CTC1
ORG 002BH ;鍵盤掃描中斷入口
LJMP CTC2
ORG 0100H
;主程序
MAIN:
NOP
NOP
NOP
MOV SP, #0DFH ;對于具有256字節內部RAM芯片來說,
;將0E0H-0FFH,共計32字節作為堆棧區
MOV R0, #01H
LOOPIC1:
MOV @R0, #0
INC R0
CJNE R0, #0, LOOPIC1
SETB LIG ;關背光燈
SETB BEE ;關蜂鳴器
CLR S_WATCH ;關秒表
;日歷初始化
LCALL LOAD8563
;鬧鐘初始化
CLR ALARM
CLR C_5S
CLR C_2S
LCALL LOADCLOCK
MOV C_COUNT,#64H
MOV D_COUNT,#0C8H
;初始化CLKOUT為1Hz時鐘輸出
MOV R0,#XmtDat
MOV @R0,#83H
MOV ByteCnt,#01H
MOV SlvAdr,#0A2H
MOV SubAdr,#0DH
LCALL SendData
;初始化中斷INT0
SETB IT0 ;下降沿觸發
ORL IPH,#01H ;IPH沒有位尋址功能,所以要用ORL置1
CLR PX0 ;優先級為2級,次高級
SETB EX0
;初始化中斷INT1
CLR IT1 ;低電平觸發
ORL IPH,#06H ;INT1,T0中斷優先級高位置1
SETB PT0 ;T0優先級為3級,最高級
CLR PX1 ;INT1優先級為2級,次高級
SETB EX1
;初始化LCD
LCALL LOADLCD
;初始化鍵盤
MOV KEYSTU,#07H ;按鍵狀態初始化為111
ANL KEYNAME,#01111111B ;將鍵值設為無效
CLR ENTER ;確認鍵初始化為沒有按下
;初始化定時器T2
MOV TH2,#63H ;定時40ms
MOV TL2,#0C0H
MOV RCAP2H,#63H ;重裝63C0
MOV RCAP2L,#0C0H
MOV T2CON,#00000100B ;自動重裝,定時,并啟動T2
ORL IPH,#00100000B ;IPH沒有位尋址功能,所以要用ORL置1
SETB PT2 ;優先級為3級,最高級
SETB ET2
SETB EA ;中斷總開關
;按鍵功能執行程序
REDO:
JNB T40,REDO ;40ms未到
CLR T40
LCALL KEYCHK ;掃描鍵盤有沒有按下
MOV A,KEYNAME ;讀鍵值
JNB ACC.7,REDO ;鍵盤按鍵無效,就循環等待
CLR EA ;停止中斷
ANL KEYNAME,#7FH ;清按鍵有效標志
CLR LIG ;開背光燈
CJNE A,#81H,CON1 ;執行功能鍵功能1
LCALL DIS_TIME ;右下角顯示TIME,表示正在設置時間日期
LJMP IN ;時間日期鬧鐘設置程序
CON1:
CJNE A,#82H,CON2 ;
LCALL DIS_ALARM ;顯示正在設置鬧鐘
LJMP C_IN ;設置鬧鐘
CON2:
CJNE A,#83H,CON3 ;
LCALL DIS_STOPW
MOV P_COUNT,#0
LJMP STOPWATCH ;秒表程序
CON3:
CJNE A,#84H,CON4 ;
LCALL C_STOP ;中途停止鬧鐘,開背光
CON4:
SETB EA
MOV COUNT,#0 ;功能鍵計數器歸零
LCALL LOADLCD
LJMP REDO ;循環操作
;*******************時間日期鬧鐘設置程序****************
KEY:
JBC ENTER,CON4 ;按下確認鍵就退出設置
JB SW,KEY0 ;調整程序
LCALL DELAY150MS
JB SW,KEY0
IN:
INC COUNT
MOV A,COUNT
CJNE A,#8,KEYOVER
MOV COUNT,#00H
MOV D_COUNT,#0C8H
MOV TL1,#0B0H ;設置T1初值,定時50ms
MOV TH1,#3CH
ANL TMOD,#0FH
ORL TMOD,#00010000B ;16位定時器
SETB ET1
SETB TR1
;SETB LIG ;關背光
LJMP CON4 ;一個循環后退出設置程序
KEYOVER:
JB SW,KEY0 ;此句用來設置鍵盤是否重復輸入,引用此句時沒有重復輸入
LJMP KEYOVER
;**********************秒鐘調整程序********
KEY0:
MOV A,COUNT ;秒鐘加1程序
CJNE A,#1,KEY1
JB UP,KEY00
LCALL DELAY150MS
JB UP,KEY00
INC SEC0
MOV A,SEC0
CJNE A,#10,KEY0OVER
MOV SEC0,#00H
INC SEC1
MOV A,SEC1
CJNE A,#6,KEY0OVER
MOV SEC1,#00H
LJMP KEY0OVER
KEY0OVER:
;JB UP,KEY00
;LJMP KEY0OVER
KEY00:
JB DOWN,KEY1 ;秒鐘減1程序
LCALL DELAY150MS
JB DOWN,KEY1
MOV A,SEC0
CJNE A,#0,CCC
MOV SEC0,#9
MOV A,SEC1
CJNE A,#0,CCCC
MOV SEC1,#5
LJMP KEY00OVER
CCCC:
DEC SEC1
LJMP KEY00OVER
CCC:
DEC SEC0
KEY00OVER:
;JB DOWN,KEY1
;LJMP KEY00OVER
;*************分鐘調整程序*********************
KEY1:
MOV A,COUNT ;分鐘加1程序
CJNE A,#2,KEY2
JB UP,KEY11
LCALL DELAY150MS
JB UP,KEY11
INC MIN0
MOV A,MIN0
CJNE A,#10,KEY1OVER
MOV MIN0,#00H
INC MIN1
MOV A,MIN1
CJNE A,#6,KEY1OVER
MOV MIN1,#00H
LJMP KEY1OVER
KEY1OVER:
;JB UP,KEY11
;LJMP KEY1OVER
KEY11:
JB DOWN,KEY2 ;分鐘減1程序
LCALL DELAY150MS
JB DOWN,KEY2
MOV A,MIN0
CJNE A,#0,AAA
MOV MIN0,#9
MOV A,MIN1
CJNE A,#0,AAAA
MOV MIN1,#5
LJMP KEY11OVER
AAAA:
DEC MIN1
LJMP KEY11OVER
AAA:
DEC MIN0
KEY11OVER:
;JB DOWN,KEY2
;LJMP KEY11OVER
;***********時調整程序******************
KEY2:
MOV A,COUNT ;時加1程序
CJNE A,#3,KEY3
JB UP,KEY22
LCALL DELAY150MS
JB UP,KEY22
INC HOU0
MOV A,HOU1
CJNE A,#2,HOURS
MOV A,HOU0
CJNE A,#4,KEY2OVER
MOV HOU0,#00H
MOV HOU1,#00H
LJMP KEY2OVER
HOURS:
MOV A,HOU0
CJNE A,#10,KEY2OVER
MOV HOU0,#00H
INC HOU1
KEY2OVER:
;JB UP,KEY22
;LJMP KEY2OVER
KEY22:
JB DOWN,KEY3 ;時鐘減1程序
LCALL DELAY150MS
JB DOWN,KEY3
MOV A,HOU0
CJNE A,#0,H4
MOV A,HOU1
CJNE A,#0,H5
MOV HOU0,#3
MOV HOU1,#2
LJMP KEY22OVER
H5:
MOV HOU0,#9
DEC HOU1
LJMP KEY22OVER
H4:
DEC HOU0
KEY22OVER:
;JB DOWN,KEY3
;LJMP KEY22OVER
;************星期調整程序****************
KEY3:
MOV A,COUNT ;星期加1程序
CJNE A,#4,KEY4
JB UP,KEY33
LCALL DELAY150MS
JB UP,KEY33
INC WEK
MOV A,WEK
CJNE A,#7,KEY3OVER
MOV WEK,#00H
KEY3OVER:
;JB UP,KEY33
;LJMP KEY3OVER
KEY33:
JB DOWN,KEY4 ;星期減1程序
LCALL DELAY150MS
JB DOWN,KEY4
MOV A,WEK
CJNE A,#0,A2
MOV WEK,#6
LJMP KEY33OVER
A2:
DEC WEK
KEY33OVER:
;JB DOWN,KEY4
;LJMP KEY33OVER
;*******************日調整*****************
KEY4:
MOV A,COUNT ;日加1程序
CJNE A,#5,KEY5
JB UP,KEY44
LCALL DELAY150MS
JB UP,KEY44
INC DAY0
MOV A,DAY1
CJNE A,#3,DAYY
MOV A,DAY0
CJNE A,#2,KEY4OVER
MOV DAY0,#1
MOV DAY1,#00H
LJMP KEY4OVER
DAYY:
MOV A,DAY0
CJNE A,#10,KEY4OVER
MOV DAY0,#00H
INC DAY1
KEY4OVER:
;JB UP,KEY44
;LJMP KEY4OVER
KEY44:
JB DOWN,KEY5 ;日減1程序
LCALL DELAY150MS
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -