中断中改变输出端口的疑问
编写一个中断服务程序时遇到个问题。在如下代码中,如何按需要改变PortA? 即按需要在需要的端口输出高电平(其他端口状态不变)。void T0_Isr() interrupt 1
{
PortA = 1;
us2count ++
if (us2count == 50)
{
us2count = 0;
}
}
void T0_Isr() interrupt 1
{
PortA |= 1<<x;
us2count ++
if (us2count == 50)
{
us2count = 0;
}
} Lkck8210 发表于 2024-1-29 17:03
PortA 是表示单片机的一个引脚,如P1^2,而另一个输出引脚是P5^3,所以你这个流水灯的方法不行。有没有更好一点的方法?
我当前想到的方法是:设计一个变量,在中断中根据这个变量值来控制输出品。
如变量为0x01时,P1^2输出,变量为0x02时P5^3输出,依此类推。
但有一个问题时,定时值TH0=0xff,TL0=0xD0,这会导致中断程序中不能有过多代码,要尽量少代码。 daw85 发表于 2024-1-29 18:17
PortA 是表示单片机的一个引脚,如P1^2,而另一个输出引脚是P5^3,所以你这个流水灯的方法不行。有没有更 ...
你说的这种方法叫端口重映射,因为引脚是不连续的,所以就只能用if一个一个对应。
至于你说的中断中占用时间不能过长的问题。可以在中断中改变一个无符号字符型变量。
然后在主循环中对这个变量进行解析,并且映射到相应的端口中去。 王昱顺 发表于 2024-1-29 18:23
你说的这种方法叫端口重映射,因为引脚是不连续的,所以就只能用if一个一个对应。
至于你说的中断中占用 ...
从你的需求描述看,用switch的方式逐个位/引脚控制输出高电平效率最高。 Lkck8210 发表于 2024-1-29 17:03
这里的 PortA |= 1<<x
我用P1 |= 0x01 举例子,
如果P1.0-P1.3的前4个引脚做io输出,P1.4-P1.7做io输入
P1 |= 0x01 实际上是 P1 = P1 | 0x01 吧?
会不会在取出并计算P1|0x01的时候,P1.4-P1.7突然有个上升沿,然后程序执行P1 = P1 | 0x01时,导致会用之前的P1.4-P1.7覆盖新的P1.4-P1.7,使这个上升沿被吞了? 21cnsound 发表于 2024-1-29 18:57
从你的需求描述看,用switch的方式逐个位/引脚控制输出高电平效率最高。
用switch试了,可以,谢谢!
页:
[1]