[国产单片机] 端口 PORTA 没有 LATA 寄存器,同时输入输出的注意事项

[复制链接]
 楼主| panxiaoyi 发表于 2023-9-3 08:53 | 显示全部楼层 |阅读模式


很多低端芯片,端口 PORTA 是没有 LATA 寄存器的,当同一个 IO 口有输入又有输出时,有一些问题是需要注意的,这里以 PORTB 为例


  1. #include        "SYSCFG.h"

  2. void interrupt ISR(void)
  3. {
  4. }

  5. main()
  6. {
  7.         TRISA=0;              //输出
  8.         PORTA=0;              //输出的电平=0

  9.         TRISB0=1;             //PB0设为输入

  10.         while(1)              //PB2输出高电平时点亮LED试验
  11.         {
  12.         TRISB2=0;             //PB2设为输出
  13.         PB2=1;                //PB2输出的电平=1

  14.         TRISB2=1;             //PB2设为输入

  15.         if(TRISB0) PB3=0;     //这个22句23句只保留其中1句
  16. //        if(TRISB0) NOP();     //这个22句23句只保留其中1句

  17.         TRISB2=0;             //PB2设为输出
  18.         NOP();

  19.         while(1);

  20.         //如果上电前就对地短路PB2,来到这里后再解除短路,结果:
  21.         //如果只保留22句,此时PB2输出的是0,LED不亮
  22.         //如果只保留23句,此时PB2输出的是1,LED点亮
  23.         //假设第22句是在中断函数里面,并且PB的某些端口驱动的是三态数码管
  24.         //如果数码管扫描程序不是在中断里面运行,而是在主程序里面运行
  25.         //这时,三态数码管就会不定时的出现不该显示的暗显示
  26.         //结论:数据手册的【写操作实际执行 ‘读-修改-写’ 的过程】是不完整的

  27.         //当然,知道了这个现象,解决的办法就很多,欢迎大家讨论解决办法
  28.         }
  29. }



 楼主| panxiaoyi 发表于 2023-9-3 08:58 | 显示全部楼层

我使用的是 辉芒微 FT61E133,完整的代码测试、还有配置选项,如图


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| panxiaoyi 发表于 2023-9-3 09:10 | 显示全部楼层
问题点请看代码的注释部分
 楼主| panxiaoyi 发表于 2023-9-4 08:52 | 显示全部楼层

  1. //在主程序中,
  2. //代码运行到本注释时,如果 TRISB2=1,就是输入,如果想变成输出1,
  3. //那么下面的操作,就可以兼顾效率与安全,不再惧怕中断的打扰。

  4. PB2=1;       //因为端口还是在输入状态,此句不能保证输出锁存器的 Bit2=1
  5. TRISB2=0;    //设置成输出

  6. //如果这时候(因为外部下拉)输出的还是0(即使外部下拉在这里被撤销),
  7. //那么下面的这条语句就可以保证后面输出的是1
  8. //如果上面输出的已经是1,则下面的语句不会给电路造成任何影响

  9. PB2=1;

  10. //注意,上面的3条语句,不能写成下面的2条

  11. TRISB2=0;    //这时候端口输出的有可能是1,有可能是0
  12. PB2=1;

  13. //如果没有位操作的,可以写成下面的语句

  14. PORTB|= 0x04;
  15. TRISB&=~0x04;
  16. PORTB|= 0x04;

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

本版积分规则

53

主题

414

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

53

主题

414

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部