📄 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 + -