PIC实现4位数码管扫面显示不正常

2019-03-25 19:49发布

小弟在初学PIC时候遇到了这个难处。
我用PIC扫描时总是不能实现正常显示。以下是我的代码
  1. unsigned int k;
  2. void delay(ms)
  3. {
  4.         int a,b;
  5.         for(a=ms;a>0;a--)
  6.                         for(b=11;b>0;b--);
  7. }

  8. void main()
  9. {

  10.         TRISC=0x00;    //用C口做片选,D口做段选
  11.         TRISD=0x00;
  12.         TRISB2=0;
  13.         while(1)
  14.         {

  15.         PORTD=0XB0;    //D口输出数据表格第1个数据0
  16.         PORTC=0x01;        //点亮第1位数码管
  17.         delay(1);            //延时一定时间,保证数码管亮度

  18.         PORTD=0XA4;    //显示数据1
  19.         PORTC=0x02;
  20.         delay(1);
  21.         
  22.         PORTD=0XF9;    //显示数据2
  23.         PORTC=0x04;
  24.         delay(1);

  25.         PORTD=0XC0;    //显示数据3
  26.         PORTC=0x08;
  27.         delay(1);

  28.      }
  29.        
  30. }
复制代码
这样做不能使数码管显示正常,同学说是因为片选改变时间跟段选数据改变时间不一样有关。于是我又换了种方法。
用D口做8位片选输出,每个输出端与锁存器74LS373相连,通过B2口的高低电平控制锁存器输出端何时关闭与开启,来让片选与段选挫开。

  1. unsigned const char table[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};         //0,1,2,3,4,5,6,7,8,9
  2. unsigned const char table1[]={0x08,0x04,0x02,0x01};         //片选 1000,0100,0010,0001四个
  3. void delay(ms)
  4. {
  5.         int a,b;
  6.         for(a=ms;a>0;a--)
  7.                         for(b=110;b>0;b--);
  8. }
  9. void main()
  10. {

  11.         TRISC=0x00;  //C口做片选
  12.         TRISD=0x00;  //D口做段选

  13.         TRISB2=0;  //用B2口作为控制锁存器是否有效,低电平使锁存器74LS373的(OE)'的有效
  14.         while(1)
  15.         {
  16.                 for(k=4;k>0;k--)
  17.                 {
  18.                         RB2=1;     //关闭锁存器的输出
  19.                         PORTD=table[k-1];   
  20.                         PORTC=table1[k-1];     //先片选
  21.                         RB2=0;                //开启寄存器的输出,开始段选
  22.                          delay(1);         //延时1ms
  23.                  }
复制代码
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。