system.lst
来自「结合"61板"的三个按键完成带有语音播报功能的电子钟:、KEY1--按一下播放年」· LST 代码 · 共 459 行 · 第 1/2 页
LST
459 行
< //========================================================================================
< // End of hardware.inc
< //========================================================================================
.EXTERNAL _SecondAddOne
.PUBLIC Year;
.PUBLIC MonDayHr;
.PUBLIC MinSec;
.PUBLIC Per500msSet;
//*********************RAM空间占用*************************//
0000032E .RAM
0000032E 00 00 .VAR Year //年 b15--if leap year
0000032F 00 00 .VAR MonDayHr //月日时 b13--b10(month) b9--b5(day) b4--b0(hour)
00000330 00 00 .VAR MinSec //分秒 b12--b7(minute) b6--b1(second) b0--500ms
00000331 00 00 .VAR Per500msSet //500ms 标志
0000926C .CODE
//*********************************************************//
//函数:System_Initial()
//描述:键盘扫描初始化
//参数:无
//返回:无
//*********************************************************//
.PUBLIC _System_Initial;
_System_Initial: .PROC
//******************系统时钟、中断*************************//
0000926C 40 92 r1=0
0000926D 19 D3 13 70 [P_SystemClock]=r1
0000926F 40 92 r1=0
00009270 19 D3 F8 02 [R_InterruptStatus] = r1
00009272 19 D3 10 70 [P_INT_Ctrl]=r1
00009274 48 F1 IRQ OFF
00009275 4C F1 FIQ OFF
//*********************I/O口*******************************//
00009276 09 93 00 FF r1=0xff00
00009278 19 D3 03 70 [P_IOA_Attrib] = r1 //A7--A0 输入
0000927A 19 D3 02 70 [P_IOA_Dir] = r1 //A15--A8 输出
0000927C 40 92 r1 = 0x0000
0000927D 19 D3 00 70 [P_IOA_Data] = r1
//*********************万年历******************************//
0000927F 09 93 D1 07 r1=2001
00009281 19 D3 2E 03 [Year]=r1 //2001年 b15--not leap year
00009283 09 93 20 04 r1=0x0420
00009285 19 D3 2F 03 [MonDayHr]=r1 //1月1日1时
// b13--b10(month) b9--b5(day) b4--b0(hour)
00009287 40 92 r1=0x0000
00009288 19 D3 30 03 [MinSec]=r1 //0分0秒
//b12--b7(minute) b6--b1(second) b0--500ms
0000928A 19 D3 31 03 [Per500msSet]=r1
//*******************中断**********************************//
0000928C 09 93 84 00 r1 = C_IRQ5_2Hz+ C_IRQ3_KEY //2Hz+KeyUp
0000928E 11 A3 F8 02 r1|=[R_InterruptStatus]
00009290 19 D3 F8 02 [R_InterruptStatus] = r1
00009292 19 D3 10 70 [P_INT_Ctrl]=r1
00009294 49 F1 IRQ ON
00009295 90 9A retf;
.ENDP;
//*********************************************************//
//函数:Clear_WatchDog()
//描述:看门狗清0
//参数:无
//返回:无
//*********************************************************//
.PUBLIC _Clear_WatchDog;
_Clear_WatchDog: .PROC
00009296 41 92 r1=0x0001; // Clear watch dog
00009297 19 D3 12 70 [P_Watchdog_Clear]=r1; //
00009299 90 9A retf;
.ENDP
//*********************************************************//
//函数:LightOn()
//描述:点亮放光二极管
//参数:无
//返回:无
//*********************************************************//
.PUBLIC _LightOn;
_LightOn: .PROC //点亮IOA15 LED
0000929A 09 93 00 80 r1= 0x8000;
0000929C 11 A3 01 70 r1 |= [P_IOA_Buffer];
0000929E 19 D3 01 70 [P_IOA_Buffer] = r1;
000092A0 90 9A retf;
.ENDP
.PUBLIC _LightOff; //熄灭 IOA15 LED
_LightOff: .PROC
000092A1 09 93 FF 7F r1= 0x7FFF;
000092A3 11 B3 01 70 r1&= [P_IOA_Buffer];
000092A5 19 D3 01 70 [P_IOA_Buffer] = r1;
000092A7 90 9A retf;
.ENDP
//*********************************************************//
//函数:Calendar_Counter()
//描述:万年历调整
//参数:500ms标志 [Per500msSet]----0xFFFF,500ms到
//返回:无
//*********************************************************//
.PUBLIC _Calendar_Counter
_Calendar_Counter: .PROC
000092A8 11 93 31 03 r1 = [Per500msSet]; //500ms标志
000092AA 01 4E JNZ Update_Time;
000092AB 90 9A RETF;
Update_Time:
000092AC 40 92 r1 = 0;
000092AD 19 D3 31 03 [Per500msSet] = r1;
//**************minute & second
000092AF 11 93 30 03 r1 = [MinSec];
000092B1 41 02 r1 += 1; //秒+1
000092B2 09 B5 7E 00 r2 = r1 AND 0x007E; //是否到60秒?
000092B4 0A 45 78 00 CMP r2,60*2;
000092B6 37 0E JB _2HzRtc_90;
000092B7 09 B3 80 1F r1 &= 0x1F80;
000092B9 09 03 80 00 r1 += 0x0080;
000092BB 0C 99 FF FF r4=0xFFFF //分+1,置调整标志
000092BD 1C D9 41 03 [_SecondAddOne]=r4
000092BF 09 43 00 1E CMP r1,60*128; //是否到60分
000092C1 2C 0E JB _2HzRtc_90;
000092C2 43 02 r1+=0x0003; //手工校正
//**************month, day, hour
000092C3 12 95 2F 03 r2 = [MonDayHr];
000092C5 41 04 r2 += 1; //时+1
000092C6 0A B7 1F 00 r3 = r2 AND 0x001F;
000092C8 58 46 CMP r3,24; //是否到24小时
000092C9 21 0E JB _2HzRtc_80;
000092CA 0A B5 E0 3F r2& = 0x3FE0; //小时清0
000092CC 7A 97 r3 = r2 LSR 4;
000092CD 63 97 r3 = r3 LSR 1;
000092CE 5F B6 r3 &= 0x001F;
000092CF 40 F0 FE 92 CALL F_GetDaysOfTheMonth; //读本月天数
000092D1 01 47 CMP r3,r1;
000092D2 17 0E JB _2HzRtc_75;
000092D3 0A B5 00 3C r2 &= 0x3C00;
000092D5 0A 05 00 04 r2 += 0x0400; //月+1
000092D7 0A 45 00 34 CMP r2,13*1024; //月超过12?
000092D9 10 0E JB _2HzRtc_75;
000092DA 0A 95 00 04 r2 = 0x0400; //月置1
//**************year
000092DC 13 97 2E 03 r3 = [Year];
000092DE 41 06 r3 += 1; //年+1
000092DF 0B B7 FF 7F r3&=0x7FFF
000092E1 0B 47 1B 0C CMP r3,3099; //3099年
000092E3 02 8E JBE _2HzRtc_70;
000092E4 0B 97 D1 07 r3 = 2001; //2001年
_2HzRtc_70:
000092E6 40 F0 12 93 CALL F_CalcLeapYear_or_NonLeapYear //计算平闰年,r3---返回值
//闰年(b15=1) 平年(b15=0)
000092E8 1B D7 2E 03 [Year] = r3;
_2HzRtc_75:
000092EA 60 04 r2 += 0x0020; //天+1
_2HzRtc_80:
000092EB 1A D5 2F 03 [MonDayHr] = r2;
_2HzRtc_85:
000092ED 40 92 r1 = 0x0000; //r1 = 0x0000;
_2HzRtc_90:
000092EE 19 D3 30 03 [MinSec] = r1;
000092F0 90 9A RETF;
//**************Table
TB_DaysOfMonth: //高字节---闰年天数, 低字节---- 平年天数
000092F1 1F 1F .DW 31*256+31;
000092F2 1F 1F .DW 31*256+31; //1 month
000092F3 1C 1D .DW 29*256+28; //2 month
000092F4 1F 1F .DW 31*256+31; //3 month
000092F5 1E 1E .DW 30*256+30; //4 month
000092F6 1F 1F .DW 31*256+31; //5 month
000092F7 1E 1E .DW 30*256+30; //6 month
000092F8 1F 1F .DW 31*256+31; //7 month
000092F9 1F 1F .DW 31*256+31; //8 month
000092FA 1E 1E .DW 30*256+30; //9 month
000092FB 1F 1F .DW 31*256+31; //10 month
000092FC 1E 1E .DW 30*256+30; //11 month
000092FD 1F 1F .DW 31*256+31; //12 month
//*********************************************************//
//函数:F_GetDaysOfTheMonth
//描述:计算本月天数
//参数:无
//返回:r1--天数
//*********************************************************//
F_GetDaysOfTheMonth:
000092FE 11 93 2F 03 r1 = [MonDayHr];
00009300 79 93 r1 = r1 LSR 4;
00009301 79 93 r1 = r1 LSR 4;
00009302 69 93 r1 = r1 LSR 2;
00009303 4F B2 r1 &= 0x000F;
00009304 09 0B F1 92 bp = r1 + TB_DaysOfMonth;
00009306 C5 92 r1 = [bp];
00009307 0C 99 00 80 r4 = 0x8000
00009309 14 C9 2E 03 TEST r4,[Year]; //平闰年?
0000930B 03 4E JNZ GetDaysOfTheMonth_LeapYear;
GetDaysOfTheMonth_NonLeapYear: //平年
0000930C 09 B3 FF 00 r1 &= 0x00FF;
0000930E 90 9A RETF;
GetDaysOfTheMonth_LeapYear: //闰年
0000930F 79 93 r1 = r1 LSR 4;
00009310 79 93 r1 = r1 LSR 4;
00009311 90 9A RETF;
//**************平闰年计算*********************************//
//描述:闰年条件:
// 1、能被400整除
// 2、能被4整除,但不能被100整除
//*********************************************************//
F_CalcLeapYear_or_NonLeapYear:
00009312 03 99 r4=r3;
00009313 40 48 CMP r4,0;
00009314 06 5E JZ GetDaysOfTheMonth_20;
GetDaysOfTheMonth_10:
00009315 0C 49 90 01 CMP r4,400; //判断是否能被400整除
00009317 06 0E JB GetDaysOfTheMonth_30; //不能被400整除
00009318 0C 29 90 01 r4 -= 400;
0000931A 46 4E JNZ GetDaysOfTheMonth_10;
GetDaysOfTheMonth_20: //闰年--能被400整除 或 能被4整除但不能被100整除
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?