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

2019-07-15 16:17发布

用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. }
复制代码



595级联测试.zip 下载积分: 积分 -1 分
140.23 KB, 下载次数: 46, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
VIVIAN0753
1楼-- · 2019-07-15 19:03
 精彩回答 2  元偷偷看……
kindle
2楼-- · 2019-07-15 22:32
   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
3楼-- · 2019-07-15 22:50
只有8位数码管,这没有错,
gjbb163
4楼-- · 2019-07-16 01:22
你看看138译码器的第四位和第五位是一样的,所以第五位显示的和第四位的一样

#define ROW4 LEDA2=0;LEDA1=1;LEDA0=1;  //1110 Y3                                                                  
#define ROW5 LEDA2=1;LEDA1=0;LEDA0=0;  //1110 Y4
hzj_jason
5楼-- · 2019-07-16 05:03
不用看程序了,你看一下你数码管的编码吧,应该是你数码管编码出现混乱了
qcs
6楼-- · 2019-07-16 10:25
 精彩回答 2  元偷偷看……

一周热门 更多>