daw85 发表于 2024-1-29 16:48:13

中断中改变输出端口的疑问

编写一个中断服务程序时遇到个问题。在如下代码中,如何按需要改变PortA? 即按需要在需要的端口输出高电平(其他端口状态不变)。

void T0_Isr()   interrupt 1
{
PortA =   1;
us2count ++
if   (us2count ==   50)
{
us2count =   0;
}
}

Lkck8210 发表于 2024-1-29 17:03:05

void T0_Isr()   interrupt 1
{
PortA |=   1<<x;
us2count ++
if   (us2count ==   50)
{
us2count =   0;
}
}

daw85 发表于 2024-1-29 18:17:11

Lkck8210 发表于 2024-1-29 17:03


PortA 是表示单片机的一个引脚,如P1^2,而另一个输出引脚是P5^3,所以你这个流水灯的方法不行。有没有更好一点的方法?
我当前想到的方法是:设计一个变量,在中断中根据这个变量值来控制输出品。
如变量为0x01时,P1^2输出,变量为0x02时P5^3输出,依此类推。
但有一个问题时,定时值TH0=0xff,TL0=0xD0,这会导致中断程序中不能有过多代码,要尽量少代码。

王昱顺 发表于 2024-1-29 18:23:21

daw85 发表于 2024-1-29 18:17
PortA 是表示单片机的一个引脚,如P1^2,而另一个输出引脚是P5^3,所以你这个流水灯的方法不行。有没有更 ...

你说的这种方法叫端口重映射,因为引脚是不连续的,所以就只能用if一个一个对应。
至于你说的中断中占用时间不能过长的问题。可以在中断中改变一个无符号字符型变量。
然后在主循环中对这个变量进行解析,并且映射到相应的端口中去。

21cnsound 发表于 2024-1-29 18:57:58

王昱顺 发表于 2024-1-29 18:23
你说的这种方法叫端口重映射,因为引脚是不连续的,所以就只能用if一个一个对应。
至于你说的中断中占用 ...

从你的需求描述看,用switch的方式逐个位/引脚控制输出高电平效率最高。

challis 发表于 2024-1-30 09:33:24

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,使这个上升沿被吞了?

daw85 发表于 2024-1-31 10:43:18

21cnsound 发表于 2024-1-29 18:57
从你的需求描述看,用switch的方式逐个位/引脚控制输出高电平效率最高。

用switch试了,可以,谢谢!
页: [1]
查看完整版本: 中断中改变输出端口的疑问