- ;*******************程序说明***********************
- /*
- 使用定时器1s切一次P2.0状态
- 100MS,执行一次C函数,通过直接位寻址间接切一次P2.1状态
- 500MS,切一次P2高4位状态
- */
- ;**************************************************
-
- $include (Ai8051U.inc)
-
-
- ;*******************常量定义***********************
- CONSTVALUE1 EQU 1
- CONSTVALUE2 EQU 2
-
- ;*******************变量定义***********************
- ;测试定时器,1s切一次状态
- LED1 BIT P2.0
- ;测试外部C函数调用,100MS
- LED2 BIT P2.1
-
-
- ;20H~7FH 可位寻址
- ;测试位寻址
- FLAG1 BIT 20H.0
- FLAG2 BIT 7FH.0
- FLAG3 BIT 7FH.7
-
-
- ;1ms定时中断标识
- F1MS BIT 20H.1
-
- MSCOUNT DATA 30H
- MS100COUNT DATA 32H
- ;*******************外部变量及函数声明***********************
-
- ;EXTRN CODE(RL_LAMP_APP);
- EXTRN CODE(DELAY500MS);
- EXTRN CODE(MyBank3Fun);
- EXTRN CODE(MyBank2Fun);
- ;C函数调用测试
- EXTRN CODE(toggleBit);
-
- ;************************************************
-
- ?ED?MAIN SEGMENT EDATA ;定义数据段
- RSEG ?ED?MAIN
- EDATAVAR1:
- DS 2
-
-
-
- ;*******************中断定义***********************
-
- CSEG AT 0000H
- LJMP RESET ;复位跳转
- ORG 000BH
- LJMP TIMER0_ISR
- ORG 1000H
-
- ;********************主程序*************************
- ?PR?MAIN SEGMENT CODE ;定义代码段
- RSEG ?PR?MAIN
-
- MAIN:
- NOP
- RESET:
- MOV R0,#7FH
- CLR A
- CLEARRAM:
- MOV @R0,A
- DJNZ R0,CLEARRAM
-
- INIT_SP:
- ;MOV SP,#80H
- MOV DR60,#0100H
-
- INIT_EAXFR:
- MOV WTST,#00H
- MOV CKCON,#00H
- SETB EAXFR
-
- LCALL TIMER0_INIT
- CLR F1MS
- SETB EA
- INIT_APP:
- MOV P2M0,#00H
- MOV P2M1,#00H
- MOV WR0,#0
-
- MOV EDATAVAR1,WR0 ; 初始化MSCOUNT为0
- MOV MSCOUNT,WR0 ; 初始化MSCOUNT为0
- MOV MS100COUNT,A;
- SETB FLAG1
- SETB FLAG2
- SETB FLAG3
- LCALL MyBank3Fun
- LCALL MyBank2Fun
- RUN_APP:
- LOOP:
- JBC F1MS,LOOP_1MS_EVENT
- LCALL CHECK_LESS_500MS
- ;LCALL RL_LAMP_APP
- LJMP LOOP;
- LOOP_1MS_EVENT:
- LCALL FUN_100MS;
- LCALL FUN_1MS;
- LJMP LOOP;
-
-
- TIMER0_INIT: ;1毫秒@40.000MHz
- ORL AUXR,#80H ;定时器时钟1T模式
- ANL TMOD,#0F0H ;设置定时器模式
- MOV TL0,#0C0H ;设置定时初始值
- MOV TH0,#063H ;设置定时初始值
- CLR TF0 ;清除TF0标志
- SETB TR0 ;定时器0开始计时
- SETB ET0 ;定时器0中断开
- RET
-
- TIMER0_ISR:
- SETB F1MS
- RETI
-
- FUN_100MS:
- INC MS100COUNT ; 递增计数器(先低字节)
- MOV A, MS100COUNT
- CJNE A, #100,FUN_100MS_RET
- ;达到100ms
- ;CPL LED2
- LCALL toggleBit
- JC FUN_100MS_C1
- CLR LED2
- SJMP FUN_100MS_CLR
- FUN_100MS_C1:
- SETB LED2
- SJMP FUN_100MS_CLR
- FUN_100MS_CLR:
- CLR A ; 清零
- MOV MS100COUNT,A
- FUN_100MS_RET:
- RET;
-
-
-
-
- CHECK_LESS_500MS:
- ; 检查MSCOUNT是否小于500(0x01F4)
- MOV A, MSCOUNT+1 ; 加载高字节
- CJNE A, #01H, CHECK_LESS_500MS_1
- CHECK_LESS_500MS_1:
- JC LESS_THAN_500;前数小于后数
- LJMP GREATER_EQUAL_500;前数大于等于后数
-
- MOV A, MSCOUNT ; 高字节等于0x01,检查低字节
- CJNE A, #0F4H, CHECK_LESS_500MS_2
- CHECK_LESS_500MS_2:
- JC LESS_THAN_500;前数小于后数
- LJMP GREATER_EQUAL_500;前数大于等于后数
-
- LESS_THAN_500:
- ; 设置P2的高四位为0
- ANL P2, #0x0F ; 将P2的高四位清零,低四位保持不变
- SJMP CHECK_LESS_500MS_END ; 跳转到更新P2的代码
-
- GREATER_EQUAL_500:
- ; 设置P2的高四位为1
- ORL P2, #0xF0 ; 将P2的高四位置1,低四位保持不变
- CHECK_LESS_500MS_END:
- RET
-
-
- FUN_1MS:
- LCALL FUN_100MS;
-
- INC MSCOUNT ; 递增计数器(先低字节)
- MOV A, MSCOUNT
- CJNE A, #00H,FUN_1MS_JUGE
- INC MSCOUNT+1 ; 递增高字节
- FUN_1MS_JUGE:
- ; 检查是否达到1000(0x03E8)
- MOV A, MSCOUNT+1 ; 加载高字节
- CJNE A, #03H, FUN_1MS_RET ; 比较高字节是否为0x03
- MOV A, MSCOUNT ; 高字节匹配,检查低字节
- CJNE A, #0E8H, FUN_1MS_RET
-
- ; 触发条件:切换灯状态并清零
- CPL LED1
- CLR A ; 清零低字节
- MOV MSCOUNT,A
- MOV MSCOUNT+1,A
- FUN_1MS_RET:
- RET;
- END
复制代码
|