中断定时器与流水灯

此程序为设置Led流水灯与数码管第0一位的0-16数字循环亮。不能将数码管程序放进主函数里,因为延迟函数delay,可能会在add自加到40时刚好在dalay里面,这时不会有数码管的闪烁。

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit wela=P2^7;          //位选
sbit dula=P2^6;          //段选
int num,add,temp=0xfe;
uchar code table[]={
  0x3f,0x06,0x5b,0x4f,
                    0x66
在汇编语言中,利用中断定时器改变流水灯的工作原理通常涉及到硬件中断和程序控制流程的交互。首先,你需要了解你的目标平台支持哪种中断机制,比如8051单片机中的定时器/计数器(Timer)中断。 1. **设置定时器**:通常,选择一个定时器作为触发器,配置它为定期发生中断。例如,在8051中,TMOD寄存器用于设定T0或T1的模式,TH0/TLO寄存器预设中断时间周期。 2. **初始化中断处理程序**:编写一个响应定时器中断的服务子程序(ISR),在这个程序里,你会更新流水灯的状态。当定时器计满后,会自动引发中断请求,CPU暂停当前任务并转去执行这个服务程序。 ```assembly ; 假设是8051的中断服务子程序 TIMER_ISR PROC ; 清除中断标志位 CLI ; 更新流水灯状态 MOV R0, COUNT ; 计数器值(灯的数量) MOV SI, LEDS ; 流水灯地址偏移 next_light: MOVC A, @A+SI ; 读取LED状态 XOR A ; 如果计数器减至0,则点亮LED,否则保持不变 MOV @A+SI, A ; 写回新状态到内存 DJNZ R0, next_light ; 当计数器不为0,继续下一个灯 ; 设置中断标志位,返回主程序 RETI TIMER_ISR ENDP ``` 3. **主程序中启用中断**:在主程序中,需要开启定时器中断,设置中断向量表,并允许外部中断。 4. **循环等待中断**:主程序回到正常执行,通过检查中断标志位判断是否需要再次唤醒定时器中断。当流水灯变化完成后,可以重新调整定时器的计数值,然后继续进入等待中断的状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值