单片机/MCU论坛
直播中

赖工

12年用户 78经验值
擅长:EDA/IC设计
私信 关注
[问答]

74HC595级联驱动数码管问题,求高手帮忙

用1片74HC138,2片74HC595级联,驱动两个4位数码管,使其循环显示1-9,但不知为何第5位数码管显示的不是5、6、7、8,而是4、5、6、7,求解答!程序与仿真文件附上。
QQ截图20150813213719.jpg QQ图片20150813213619.png

  1. void main(void)
  2. {
  3.         uint16_t i;
  4.         GPIO_config();
  5.         DS1302_Init();
  6.         LEDSCK=0;          //清零锁存线
  7.         LEDRCK=0;          //清零时钟线       
  8.         while(1)
  9.         {
  10.                 for(i=1;i<9;i++)
  11.                 {
  12.                         In_Data(Digital_Code[i]);   //送数据百位
  13.                         ROW(i);
  14.                          delay_ms(100);
  15.                 }
  16.         }
  17. }               
  1. //74HC138定义
  2. #define ROW1 LEDA2=0;LEDA1=0;LEDA0=0;  //0111 Y0
  3. #define ROW2 LEDA2=0;LEDA1=0;LEDA0=1;  //1011 Y1
  4. #define ROW3 LEDA2=0;LEDA1=1;LEDA0=0;  //1101 Y2
  5. #define ROW4 LEDA2=0;LEDA1=1;LEDA0=1;  //1110 Y3                                                                 
  6. #define ROW5 LEDA2=1;LEDA1=0;LEDA0=0;  //1110 Y4
  7. #define ROW6 LEDA2=1;LEDA1=0;LEDA0=1;  //1101 Y5
  8. #define ROW7 LEDA2=1;LEDA1=1;LEDA0=0;  //1011 Y6
  9. #define ROW8 LEDA2=1;LEDA1=1;LEDA0=1;  //0111 Y7
  10. /*****************************************************
  11. 函数名:74HC138驱动函数
  12. *****************************************************/
  13. void ROW(uint8_t h)       
  14. {
  15.          switch(h)
  16.          {
  17.                  case 1: ROW1;break;
  18.                  case 2: ROW2;break;
  19.                  case 3: ROW3;break;
  20.                  case 4: ROW4;break;
  21.                  case 5: ROW5;break;
  22.                  case 6: ROW6;break;
  23.                  case 7: ROW7;break;
  24.                  case 8: ROW8;break;
  25.          }
  26.          LEDRCK=1;       
  27.                 _nop_();
  28.          LEDRCK=0;
  29.                 _nop_();
  30. }

  31. /*****************************************************
  32. 函数名:74HC595驱动函数
  33. *****************************************************/
  34. void In_Data(uint8_t m)
  35. {
  36.         uint8_t x;
  37.         for(x=0;x<8;x++)
  38.         {
  39.                 if(m&0x80)       
  40.                 {   
  41.                         LEDSER=1;
  42.                 _nop_();
  43.                 }
  44.                 else
  45.                 {
  46.                         LEDSER=0;
  47.                 _nop_();
  48.                 }
  49.                 m=m<<1;       
  50.                 LEDSCK=1;
  51.                 LEDSCK=0;
  52.         }
  53.         LEDRCK=0;
  54.         LEDRCK=1;
  55.         LEDRCK=0;
  56. }




已退回10积分

回帖(7)

赖工

2015-8-14 19:56:31
本帖最后由 VIVIAN0753 于 2015-8-14 20:27 编辑

谁能帮忙看看啊
举报

李家俊

2015-10-27 10:25:45
   while(1)
        {
                for(i=1;i<9;i++)
                {
                        In_Data(Digital_Code[i]);   //送数据百位
                        ROW(i);
                         delay_ms(100);
                }
        }
}            
把数字9改成数字10就好了,你的i只能够数到1,2,3,4,5,6,7,8   
举报

gjbb163

2015-10-28 17:47:45
只有8位数码管,这没有错,
举报

gjbb163

2015-10-28 17:51:30
你看看138译码器的第四位和第五位是一样的,所以第五位显示的和第四位的一样

#define ROW4 LEDA2=0;LEDA1=1;LEDA0=1;  //1110 Y3                                                                  
#define ROW5 LEDA2=1;LEDA1=0;LEDA0=0;  //1110 Y4
举报

aaa

2015-10-29 14:33:05
不用看程序了,你看一下你数码管的编码吧,应该是你数码管编码出现混乱了
举报

qcs

2016-6-22 14:44:41
用一个595不可以吗
举报

帶不走的回憶

2017-12-20 15:34:55
74HC595级联驱动数码管问题我也在研究呢
举报

更多回帖

发帖
×
20
完善资料,
赚取积分