?? timer.asm
字號:
示例代碼(asm)
/*****************************************************************************
*文件名: Timer.ASM
*功能: LPC900單片機單鍵可控定時器演示程序
*日期: 11:27 04-6-9
*****************************************************************************/
$NOMOD51
$INCLUDE(REG932.INC)
;---------------------------
DAT BIT P2.2 ;74HC595數據位
CS BIT P0.6 ;74HC595鎖存位
CLK BIT P2.5 ;74HC595時鐘位
W2 BIT P1.0 ;數碼管位選2
W1 BIT P1.1 ;數碼管位選1
KEY BIT P1.5
CONTROL BIT P2.3
Time_M EQU 30H ;系統時間值(分)
Time_S EQU 31H ;系統時間值(秒)
Load_M EQU 32H ;
Load_S EQU 33H
Count EQU 34H ;按鍵時長計數值
Flag1 EQU 35H ;按鍵計數標志位
Bit0 EQU 36H ;十位
Bit1 EQU 37H ;個位
Flag2 BIT 10H ;選擇模式進入標志位
;IAP_Lite相關寄存器定義
FMADRH DATA 0E7H
FMADRL DATA 0E6H
FMCON DATA 0E4H
FMDATA DATA 0E5H
;---------------------------
ORG 0000H
AJMP MAIN
ORG 0053H
AJMP RTC_ISR
ORG 0080H
;---------------------------
MAIN:
LCALL RTC_Init ;RTC初始化
MAIN_LOOP:
CLR EA ;EA=0
MAIN1:
JB KEY,MAIN1_1 ;等待KEY為0
MOV A,#20 12廣州周立功單片機發展
ACALL Delayms ;延時20ms
INC Count ;延時時間計數
AJMP MAIN1
MAIN1_1:
SETB C
MOV A,Count
SUBB A,#100
JC MAIN2 ;有進位,小于100,則跳至MAIN2
;----------------
JB Flag2,MAIN1_2 ;若Flag2為1,則跳至MAIN1_2
MOV RTCCON,#0 ;關閉RTC定時器
SETB Flag2 ;置位Flag2
MOV A,#77
CALL HexToBCD ;顯示77
AJMP MAIN2_4
MAIN1_2:
CLR Flag2 ;若Flag2為1,則清除Flag2
CALL Save_Time ;調用Save_Time,將定時時間存入芯片的Flash區
MOV A,#99
CALL HexToBCD ;顯示99
MOV RTCCON,#0x03 ;開啟RTC定時器
JMP MAIN2_4
;----------------
MAIN2:
MOV A,Count
JZ MAIN2_4 ;若Count為0,則跳至MAIN2_4
SUBB A,#40
JNC MAIN2_4 ;無進位,表示大于40,則跳至MAIN2_4
INC Flag1
MOV A,Flag1
XRL A,#1
JNZ MAIN2_1 ;不等于1,跳至MAIN2_1
MOV Load_M,#10
MOV A,#10
CALL HexToBCD
AJMP MAIN2_4
MAIN2_1:
MOV A,Flag1
XRL A,#2
JNZ MAIN2_2 ;不等于2,跳至MAIN2_2
MOV Load_M,#20 13廣州周立功單
MOV A,#20
CALL HexToBCD
AJMP MAIN2_4
MAIN2_2:
MOV A,Flag1
XRL A,#3
JNZ MAIN2_3 ;不等于3,跳至MAIN2_3
MOV Load_M,#30
MOV A,#30
CALL HexToBCD
AJMP MAIN2_4
MAIN2_3:
MOV Flag1,#0
;-------------------
MAIN2_4:
MOV Count,#0 ;Count清0
SETB EA ;EA置位
AJMP MAIN_LOOP
RET
;---------------------------
;功能:RTC中斷服務程序
;---------------------------
RTC_ISR:
CLR EA
MOV A,RTCCON
ANL A,#0x63
MOV RTCCON,A ;清除RTCCON標志位
LCALL INC_Time ;時間遞增
MOV DPTR,#0x03F0
LCALL Load_Time ;讀取Load_M
MOV A,Load_M
XRL A,Time_M
JNZ INT_LOOP1 ;如Load_M不等于Time_M,則跳至INT_LOOP1
MOV A,Time_M
LCALL HexToBCD
MOV Time_M,#0 ;將Time_M設置為0
CPL CONTROL ;取反CONTROL引腳
AJMP INT_LOOP1
INT_LOOP1: 14廣州周立
MOV A,Time_M
LCALL HexToBCD
SETB EA
RETI
;---------------------------
;功能:數碼管顯示數據
;入口參數:A,行參:Bit0,Bit1
;---------------------------
HexToBCD:
MOV Bit0,#0
MOV Bit1,A ;先將A保存于Bit1
CLR C
LOOP1: ;將A的個位與十位分離
SUBB A,#10
JC LOOP2 ;有進位跳到LOOP2,
INC Bit0
MOV Bit1,A
AJMP LOOP1
;----------------------
LOOP2:
MOV R6,#50
MOV DPTR,#numtable
LOOP3:
CLR W1
MOV A,Bit0
MOVC A,@A+DPTR ;查表獲得十位的顯示值
ACALL SendData
MOV A,#4
ACALL Delayms
SETB W1
CLR W2
MOV A,Bit1
MOVC A,@A+DPTR ;查表獲得個位的顯示值
ACALL SendData
MOV A,#4
ACALL Delayms
SETB W2
DJNZ R6,LOOP3
MOV R6,#50
LOOP4: 15廣州周立功單片機發展
MOV DPTR,#numtable
CLR W1
MOV A,Bit0
MOVC A,@A+DPTR ;查表獲得十位的顯示值
ACALL SendData
MOV A,#4
ACALL Delayms
SETB W1
MOV DPTR,#numtableDP ;設定表地址為numtableDP,以實現DP閃爍的效果
CLR W2
MOV A,Bit1
MOVC A,@A+DPTR ;查表獲得個位的顯示值
ACALL SendData
MOV A,#4
ACALL Delayms
SETB W2
DJNZ R6,LOOP4
RET
;---------------------------
;功能:發送數據至595
;入口參數:A
;---------------------------
SendData:
CLR CS ;選擇595
MOV R7,#8 ;循環次數為8
LOOP_SendData:
CLR CLK ;CLK拉低
RLC A ;將第8位送入C
MOV DAT,C ;將C中的數據發送
SETB CLK ;CLK拉高
DJNZ R7,LOOP_SendData
SETB CS ;結束選擇595
RET
;--------------------------
;功能:將Load_M及Load_S的值存入FLash
;--------------------------
Save_Time:
MOV FMCON,#0x00 ;裝載數據指令
MOV FMADRH,#0x03
MOV FMADRL,#0xF0 ;設定地址
MOV FMDATA,Load_M ;設定第1個數據,地址自動增1
MOV FMDATA,Load_S ;設定第2個數據,地址自動增1
MOV FMCON,#0x68 ;擦除編程
MOV A,FMCON
ANL A,#0x0F
JNZ Save_Time ;判斷寫操作是否完成
RET
;--------------------------------
; 功能:讀字節數據
; 入口參數:DPTR 要寫入的地址
; 出口參數:讀出數據在ACC
; 占用資源:ACC、DPTR、C位
;--------------------------------
Load_Time:
CLR A
MOVC A,@A+DPTR
RET
;--------------------------------
;功能:時間遞增(每進一次中斷,秒數遞加1)
;--------------------------------
INC_Time:
INC Time_S
MOV A,Time_S
CLR C
SUBB A,#59
;---------------
JC LOOP_INCTime ;有進位,小于59則跳至LOOP_INCTime
MOV Time_S,#0
INC Time_M
MOV A,Time_M
CLR C
SUBB A,#59
JC LOOP_INCTime ;有進位,小于59則跳至LOOP_INCTime
MOV Time_M,#0
LOOP_INCTime:
RET
;-------------------------
;功能:RTC初始化
;-------------------------
RTC_Init:
MOV P0M1,#0x00
MOV P0M2,#0x00
MOV P1M1,#0x00
MOV P1M2,#0x00
MOV P2M1,#0x00 17廣州周立功單片機發展
MOV P2M2,#0x00 ;端口均配置為準雙向
MOV Time_S,#0
MOV Time_M,#0
MOV IEN0,#0xC0 ;使能中斷
MOV WDCON,#0xE0 ;關閉看門狗
MOV RTCH,#0xE0
MOV RTCL,#0xFF ;7.373Mhz下,RTC定時1S的設定值
MOV RTCCON,#0x03 ;使能RTC及RTC中斷
RET
;--------------------------------
;功能:延時100us(7.373MHz時)
;--------------------------------
DELAY100US:
MOV R4,#182
LOOPUS:
DJNZ R4,LOOPUS
RET
;--------------------------------
;功能:ms級延時
;入口參數:A
;--------------------------------
DELAYMS:
MOV R3,A
LOOP_N:
MOV R2,#10
LOOP10:
ACALL DELAY100US
DJNZ R2,LOOP10
DJNZ R3,LOOP_N
RET
;--------------------------------
Numtable: DB 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
NumtableDP: DB 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10
;--------------------------------
END
;--------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -