圣龙扬特-AVR电子

标题: 数码管的8段 不是接在一个P口 程序中要怎么处理 [打印本页]

作者: oszp1688com    时间: 2013-3-5 21:59
标题: 数码管的8段 不是接在一个P口 程序中要怎么处理
数码管的8段  不是接在一个P口  而是接在不同的P口   程序中要怎么处理


作者: avrbase_lei    时间: 2013-3-5 22:42
数码管不是分了共阴极和共阳极的么?
不在同一个P口,你就不会先关闭数码管,再送数据,然后再开启这个“共阴”“共阳”的控制脚么?这不就很好的完成了么?
作者: 枯恋凡尘    时间: 2013-3-5 22:46
本帖最后由 枯恋凡尘 于 2013-3-5 23:09 编辑

比如分2个口,P1 P0,P1占用高4BIT,P0占用低4BIT
void display(unsigned char dat)
{  
   /*位选代码省略*/
    P1&=(dat|0x0F);
    P0&=(dat|0XF0);
}
这种是比较集中的IO,再分散的用指针,你现在也看不懂,不写了吧。
/*下面的是指针版本,没有验证过,有错请提出*/
typedef struct seg    {   
         void (*set_a)(unsigned char i);   
         void (*set_b)(unsigned char i);   
         void (*set_c)(unsigned char i);   
         void (*set_d)(unsigned char i);   
         void (*set_e)(unsigned char i);   
         void (*set_f)(unsigned char i);   
         void (*set_g)(unsigned char i);   
         void (*set_h)(unsigned char i);   
} seg_led,*p_seg_led;
/*定义一个变量*/
seg_led seg;
void set_io_a(unsigned char dat)
{
         if(dat!=0)
         {
                 P1.0=1;
         }
         else
         {
                 P1.0=0;
         }
}
void init_seg(p_seg_led seg)
{
         seg.set_a=set_io_a;
        .....其他一致懒的写
}

void display(p_seg_led s,unsigned char dat)
{
      s->set_a(dat>>7);
       .....其他一致
}


作者: 多啦A梦    时间: 2013-3-5 22:52
刚开始的时候这个问题确实我点绕!想通了就好了!
作者: 小毛驴    时间: 2013-3-5 22:54
阿黄加油~加油lu
作者: 北美海豹    时间: 2013-3-5 22:59
void subDisplay(char charDaata)
{
    if(charDaata&0x01)
  {
     PORTA|=1<<6;
  }
  else
{
    PORTA&=~(1<<6);

}

--------
    if(charDaata&0x80)
  {
     PORTB|=1<<7;
  }
  else
{
    PORTB&=~(1<<7);

}


}


作者: oszp1688com    时间: 2013-3-5 23:13
谢谢各位  嘿嘿
作者: avrbase_lei    时间: 2013-3-5 23:47
  1. #define M_SET_BIT(B,n)  do{B |= (0x01<<n);}while(0)
  2. #define M_CLR_BIT(B,n)  do{B &= ~(0x01<<n);}while(0)

  3. #define M_OPEN_SEG_A()  M_SET_BIT(P1, 0) //表示P1口第一个引脚, P10
  4. #define M_CLOSE_SEG_A() M_CLR_BIT(P1, 0)
  5. //ABCDEFGH, 类推

  6. int main(void)
  7. {
  8.     M_OPEN_SEG_A();
  9.     //...
  10.    
  11.     return 0;
  12. }
复制代码
这样行么?
作者: 铜河    时间: 2013-3-6 08:45
阿黄,高!
作者: yingmulufei    时间: 2013-3-6 09:14
路过!!
作者: ★一辉︿♂︿    时间: 2013-3-6 12:05
大黄是马蜂吗 浑身指针
作者: oszp1688com    时间: 2013-3-6 20:54
枯恋凡尘 发表于 2013-3-5 22:46
比如分2个口,P1 P0,P1占用高4BIT,P0占用低4BIT
void display(unsigned char dat)
{  

写具体一点点咯  本来看的就很吃力了  最好来点注释 嘻嘻
作者: 箫天    时间: 2013-3-6 21:52
别人主要提供思路和方法,具体还要靠自己不断琢磨。
作者: xzwj    时间: 2013-3-9 18:34
别把 PA的8个 口 当成一个 口用,其实8个口是独立的!PORTA=0xff;与(PORTA|=0x80;  PORTA|=0x40;  PORTA|=0x20;··········)的现象差不多。




欢迎光临 圣龙扬特-AVR电子 (http://avr.cnta.net/) Powered by Discuz! X2.5