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

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

[复制链接]
  • TA的每日心情
    奋斗
    8 小时前
  • 签到天数: 185 天

    [LV.7]常住居民III

    7

    主题

    82

    回帖

    301

    积分

    中级会员

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

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

    使用道具 举报

  • TA的每日心情
    慵懒
    9 小时前
  • 签到天数: 71 天

    [LV.6]常住居民II

    5

    主题

    88

    回帖

    520

    积分

    高级会员

    积分
    520
    发表于 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. }
    复制代码
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    8 小时前
  • 签到天数: 185 天

    [LV.7]常住居民III

    7

    主题

    82

    回帖

    301

    积分

    中级会员

    积分
    301
     楼主| 发表于 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
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 148 天

    [LV.7]常住居民III

    39

    主题

    416

    回帖

    2244

    积分

    荣誉版主

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    10 小时前
  • 签到天数: 135 天

    [LV.7]常住居民III

    11

    主题

    652

    回帖

    1169

    积分

    金牌会员

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

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

    使用道具 举报

  • TA的每日心情
    开心
    18 小时前
  • 签到天数: 109 天

    [LV.6]常住居民II

    13

    主题

    199

    回帖

    623

    积分

    高级会员

    积分
    623
    发表于 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,使这个上升沿被吞了?
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    8 小时前
  • 签到天数: 185 天

    [LV.7]常住居民III

    7

    主题

    82

    回帖

    301

    积分

    中级会员

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-6-13 18:58 , Processed in 0.064524 second(s), 53 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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