关于单片机引脚的设置问题
下面这个程序,红字部分有点问题,也就是,我用p10口的0,1,2作为刷屏幕用的,3号管脚用来做控制指示灯,但是因为我是直接这样赋值:P10OUT=Addr,所以实际上每次赋值都会写第三号引脚,刷屏幕不停的写寄存器,就不停的写。这是不想要的结果。所以我想,怎么赋值才能只更改 P10OUT的后3位的值。我自己改了一个版本的,但是嫌太繁琐了,影响刷屏的速率。
void write_reg(uchar Addr,uchar Data)
{
P5OUT|=BIT4; //RD=1
P5OUT&=~BIT1; //片选有效
P10DIR|=BIT0+BIT1+BIT2;
P10OUT=Addr;
P4OUT=Data; //写数据
P5OUT&=~BIT5; //写有效
P5OUT|=BIT5; //写撤销
P5OUT|=BIT1; //片选无效
}
我自己改的:
void write_reg(uchar Addr,uchar Data)
{
P5OUT|=BIT4; //RD=1
P5OUT&=~BIT1; //片选有效
P10DIR|=BIT0+BIT1+BIT2;
Addr=Addr&0x7+(P10OUT&BIT3);//这样写寄存器时平P10.3不改变,P10的0、1、2根据 Addr改变,实现了只改变P10后3位
P10OUT=Addr
P4OUT=Data; //写数据
P5OUT&=~BIT5; //写有效
P5OUT|=BIT5; //写撤销
P5OUT|=BIT1; //片选无效
}
有没有更加简洁的赋值方式,只改变后三位。
[解决办法]
P10OUT &=~ 0x07;//后三位清零
Addr = Addr&0x07;//截取后三位,保证前面的5位是0
P10OUT |= Addr;
这样应该可以了,我没有测试
[解决办法]
是比较繁琐,但多这几条语句还不至于影响到刷屏速率,相对于刷屏频率来说,这几条语句的执行时间基本可以忽略不计。
可以用C语言的位字段特性,不过这个特性是不可移植的,并且可能还需要编译器支持。看这个例子:
// 假定int占16位,C标准规定了int型的位字段union port_10{ unsigned int port; struct { unsigned int port0_2 :3; // P0_2: 刷屏用 unsigned int port3 :1; // P3:指示灯 unsigned int :12; // 未使用 } Bits;};/* 或者是: union port_10{ unsigned int port; struct { unsigned int :12; // 未使用 unsigned int port3 :1; // P3:指示灯 unsigned int port0_2 :3; // P0_2: 刷屏用 } Bits;};具体是上面一个还是这一个,取决于处理器的大小端模式*//*若编译器扩展支持8位的位字段,则可以是:union port_10{ unsigned char port; struct { unsigned char port0_2 :3; unsigned char port3 :1; unsigned char :4; }}*/union port_10 PORT_10;#define PORT10_CTL PORT_10.Bits.port0_2#define PORT10_DISP PORT_10.Bits.port3// 现在,PORT10_CTL代表低3位,即刷屏用的管脚,PORT10_DISP代表第3位,即显示用管脚,可以直接赋值,比如:PORT10_CTL = 3; PORT10_DISP = 1;