首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

关于单片机引脚的设置有关问题

2012-02-15 
关于单片机引脚的设置问题下面这个程序,红字部分有点问题,也就是,我用p10口的0,1,2作为刷屏幕用的,3号管脚

关于单片机引脚的设置问题
下面这个程序,红字部分有点问题,也就是,我用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语言的位字段特性,不过这个特性是不可移植的,并且可能还需要编译器支持。看这个例子:

C/C++ code
// 假定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; 

热点排行