中断控制流水灯c语言程序,51单片机按键中断控制流水灯

满意答案

02ae427d08e371d7e90d5b995e828d6d.png

levis501523

2018.01.03

02ae427d08e371d7e90d5b995e828d6d.png

采纳率:58%    等级:12

已帮助:8301人

#include

#include

#define uchar unsigned char

uchar led,time=0;

sbit key=P1^0;

void t0isr() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

led=_crol_(led,1);

P0=led;

time++;

if(time>=200)TR0=0;

}

main()

{

uchar keyval=0;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

ET0=1;

EA=1;

while(1)

{

if(key==0)

{

while(key==0);

keyval++;

keyval%=3;

}

switch(keyval)

{

case 0:led=0xff;P0=led;break;

case 1:TR0=1;led=0xfe;break;

case 2:TR0=0;break;

default:break;

}

}

}追问: 麻烦老哥了,我去试试

10分享举报

在汇编语言中编写流水灯程序通常涉及基本的输入输出操作以及中断处理机制。流水灯,也称为七段数码管显示器,是一种常用的电子显示设备,通过轮流点亮各个段可以显示出数字和字符。 下面是一个简单的示例,展示了如何使用8051单片机的P1口控制一组共阳极数码管,同时通过定时器T1的溢出中断改变流水灯的显示顺序: ```assembly ; 定义变量和寄存器 ORG 00H ; 程序起始地址 MOV TMOD, #01H ; 设置定时器T1工作模式为模式1(计数从0开始) ; 初始化定时器T1 MOV TH1, #0FDH MOV TL1, #0FDH ; 定义数码管显示状态 LEDs: DB 0DH, 0FH, 07H, 0FH, 0FFH, 0FFH, 0FFH, 0FFH MainLoop: MOV P1, #0FFH ; 清零P1口,关闭所有数码管 JB TF1, NextStep ; 检查TF1标志是否触发,如果没到溢出,则等待 NextStep: MOV A, @LEDs ; 取下一个显示状态 ANL A, #0F0H ; 高4位用于选择数码管的段 ORL A, P1 ; 将A的内容设置到P1口对应位置 RET ; 返回主循环 ; 中断服务程序 - T1溢出中断 InterruptHandler: CLR TF1 ; 清除TF1标志,防止连续触发 INC @LEDs ; 将LEDs指针向后移动一位,改变显示顺序 RETI ; 返回并允许中断再次发生 END MainLoop ``` 这个程序首先初始化定时器T1,然后进入主循环,在每个周期内清空数码管并检查是否触发了中断。如果触发了中断,就切换到下一个显示状态。当定时器溢出时,会自动跳转到中断处理程序,更新显示状态后返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值