⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.asm

📁 功能: LPC900单片机单键可控定时器演示程序
💻 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 + -