打印
[国产单片机]

端口 PORTA 没有 LATA 寄存器,同时输入输出的注意事项

[复制链接]
748|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主


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


#include        "SYSCFG.h"

void interrupt ISR(void)
{
}

main()
{
        TRISA=0;              //输出
        PORTA=0;              //输出的电平=0

        TRISB0=1;             //PB0设为输入

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

        TRISB2=1;             //PB2设为输入

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

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

        while(1);

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

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



使用特权

评论回复

相关帖子

沙发
panxiaoyi|  楼主 | 2023-9-3 08:58 | 只看该作者

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


微信图片_20230903085637.png (32.33 KB )

微信图片_20230903085637.png

微信截图_20230903085702.png (204.46 KB )

微信截图_20230903085702.png

使用特权

评论回复
板凳
panxiaoyi|  楼主 | 2023-9-3 09:10 | 只看该作者
问题点请看代码的注释部分

使用特权

评论回复
地板
panxiaoyi|  楼主 | 2023-9-4 08:52 | 只看该作者

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

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

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

PB2=1;

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

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

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

PORTB|= 0x04;
TRISB&=~0x04;
PORTB|= 0x04;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

393

帖子

2

粉丝