找回密码
 立即注册
查看: 770|回复: 6

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:408
  • 最近打卡:2025-06-12 11:42:35

8

主题

87

回帖

158

积分

注册会员

积分
158
发表于 2024-1-29 16:48:13 | 显示全部楼层 |阅读模式
编写一个中断服务程序时遇到个问题。在如下代码中,如何按需要改变PortA? 即按需要在需要的端口输出高电平(其他端口状态不变)。

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1837

积分

金牌会员

积分
1837
发表于 2024-1-29 17:03:05 | 显示全部楼层
  1. void T0_Isr()   interrupt 1
  2. {
  3.   PortA |=   1<<x;
  4. us2count ++
  5. if   (us2count ==   50)
  6. {
  7. us2count =   0;
  8. }
  9. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:408
  • 最近打卡:2025-06-12 11:42:35

8

主题

87

回帖

158

积分

注册会员

积分
158
发表于 2024-1-29 18:17:11 | 显示全部楼层

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

点评

你说的这种方法叫端口重映射,因为引脚是不连续的,所以就只能用if一个一个对应。 至于你说的中断中占用时间不能过长的问题。可以在中断中改变一个无符号字符型变量。 然后在主循环中对这个变量进行解析,并且映射到  详情 回复 发表于 2024-1-29 18:23
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:508
  • 最近打卡:2025-06-28 10:05:05
已绑定手机
已实名认证

113

主题

2423

回帖

6159

积分

版主

积分
6159
发表于 2024-1-29 18:23:21 | 显示全部楼层
daw*** 发表于 2024-1-29 18:17
PortA 是表示单片机的一个引脚,如P1^2,而另一个输出引脚是P5^3,所以你这个流水灯的方法不行。有没有更 ...

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:512
  • 最近打卡:2025-06-30 08:59:51
已绑定手机

14

主题

1322

回帖

3424

积分

论坛元老

积分
3424
发表于 2024-1-29 18:57:58 | 显示全部楼层
王*** 发表于 2024-1-29 18:23
你说的这种方法叫端口重映射,因为引脚是不连续的,所以就只能用if一个一个对应。
至于你说的中断中占用 ...

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:247
  • 最近打卡:2025-02-25 19:02:50

13

主题

198

回帖

1175

积分

金牌会员

积分
1175
发表于 2024-1-30 09:33:24 | 显示全部楼层

这里的 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,使这个上升沿被吞了?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:408
  • 最近打卡:2025-06-12 11:42:35

8

主题

87

回帖

158

积分

注册会员

积分
158
发表于 2024-1-31 10:43:18 | 显示全部楼层
21cns*** 发表于 2024-1-29 18:57
从你的需求描述看,用switch的方式逐个位/引脚控制输出高电平效率最高。

用switch试了,可以,谢谢!
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-30 10:30 , Processed in 0.137184 second(s), 94 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表