端口 PORTA 没有 LATA 寄存器,同时输入输出的注意事项
很多低端芯片,端口 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的某些端口驱动的是三态数码管
//如果数码管扫描程序不是在中断里面运行,而是在主程序里面运行
//这时,三态数码管就会不定时的出现不该显示的暗显示
//结论:数据手册的【写操作实际执行 ‘读-修改-写’ 的过程】是不完整的
//当然,知道了这个现象,解决的办法就很多,欢迎大家讨论解决办法
}
}
我使用的是 辉芒微 FT61E133,完整的代码测试、还有配置选项,如图
问题点请看代码的注释部分
//在主程序中,
//代码运行到本注释时,如果 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;
页:
[1]