单片机汇编程序设计之时间片
;========================================================
; timer0中断服务程序
;入口 无(timer0初始化函数未给出)
;出口 r_sys_slice
;
; 用于系统计时,每50us,r_sys_slice+=1
;========================================================
timer0_isev:
push
bclr interrupt_flag ;清中断标志
mov a,#256-50 ;定时初值初值
mov time,a
inc r_sys_slice
pop
reti
;========================================================
; 系统时间片
;入口 r_sys_slice
;出口 r_led_cyc_cnt、r_sw_cyc_cnt
;
; 确定时间基准10ms=50us*200
;========================================================
sys_time:
if(r_sys_slice>=200){
r_sys_slice=0;
r_led_cyc_cnt++;
r_sw_cyc_cnt++;
}
ret
;========================================================
; 按键检测
;入口 r_sw_cyc_cnt
;出口 无
;
; 每50ms检测一次按键
;========================================================
ck_sw:
if(r_sw_cyc_cnt>=5){
r_sw_cyc_cnt=0;
;check sw
;....
}
ret
;========================================================
; 循环点亮led
;入口 r_led_cyc_cnt
;出口 ...
;
; 每个led亮500ms
;========================================================
flash_led:
if(r_led_cyc_cnt>=50){
r_led_cyc_cnt=0;
;light next led
}
ret
end
;---------------------------------------------------------
这样写完后,除满足点亮led的同时有效检测按键,还便于扩展其它功能。且可以认为每个模块都是实时运行的。
如果,编译环境允许,将每个模块放在一个单独的文件中,大大提高程序的可读性。
评论