微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 74LS595和74ls138驱动的点阵

74LS595和74ls138驱动的点阵

时间:10-02 整理:3721RD 点击:
本人最近在网上买了一块点阵,在弄程序的时候出了一个大问题  求哪位大神帮帮小弟解决下。参考程序(能够正常的显示0——9):

求各位师傅帮帮忙啊!
//资源:串行输出存储锁存线RCK
//      串行数据输入时钟线SCK
//      串行数据输入线SER
//      C信号=P2.3  B信号=P2.4  A信号=P2.5
//说明:ABC信号是74HC138的输入行选信号,其它信号是串行输入列显示数据,逐行扫描动态显示0-9
#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit RCK=P2^4;         //声明SER接口
sbit SCK=P2^5;         //声明RCK接口
sbit SER=P2^3;         //声明SCK接口
sbit HC=P2^2;         //声明C信号接口
sbit HB=P2^1;         //声明B信号接口
sbit HA=P2^0;         //声明A信号接口
#define ROW1 HC=0;HB=0;HA=0;  //定义使能第1行,请参考74HC138逻辑表
#define ROW2 HC=0;HB=0;HA=1;  //定义使能第2行,请参考74HC138逻辑表
#define ROW3 HC=0;HB=1;HA=0;  //定义使能第3行,请参考74HC138逻辑表
#define ROW4 HC=0;HB=1;HA=1;  //定义使能第4行,请参考74HC138逻辑表
#define ROW5 HC=1;HB=0;HA=0;  //定义使能第5行,请参考74HC138逻辑表
#define ROW6 HC=1;HB=0;HA=1;  //定义使能第6行,请参考74HC138逻辑表
#define ROW7 HC=1;HB=1;HA=0;  //定义使能第7行,请参考74HC138逻辑表
#define ROW8 HC=1;HB=1;HA=1;  //定义使能第8行,请参考74HC138逻辑表
uchar dat[12][8]=        //定义0-9共10个数字的点阵数据
{
        {0x00,0x3C,0x24,0x24,0x24,0x24,0x24,0x3C},        //0
        {0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04},        //1
        {0x00,0x3C,0x04,0x04,0x3C,0x20,0x20,0x3C},  //2
        {0x00,0x3C,0x04,0x04,0x3C,0x04,0x04,0x3C},        //3
        {0x00,0x24,0x24,0x24,0x3C,0x04,0x04,0x04},        //4
        {0x00,0x3C,0x20,0x20,0x3C,0x04,0x04,0x3C},        //5
        {0x00,0x3C,0x20,0x20,0x3C,0x24,0x24,0x3C},        //6
        {0x00,0x3C,0x04,0x04,0x04,0x04,0x04,0x04},        //7
        {0x00,0x3C,0x24,0x24,0x3C,0x24,0x24,0x3C},        //8
        {0x00,0x3C,0x24,0x24,0x3C,0x04,0x04,0x3C},        //9
  {0x00,0x10,0x38,0x54,0x10,0x10,0x10,0x00},
        {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}
};
uchar h;
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void delay(uint z)  //延时函数,单位ms
{                                                                                                                                                                                          
    uint i,j;
    for(i=z;i>0;i--)
        for(j=110;j>0;j--);
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void ROW(void)         //行驱动函数
{
         switch(h)
         {
                 case 0: ROW1;break;
                 case 1: ROW2;break;
                 case 2: ROW3;break;
                 case 3: ROW4;break;
                 case 4: ROW5;break;
                 case 5: ROW6;break;
                 case 6: ROW7;break;
                 case 7: ROW8;break;
         }
         RCK=1;       
         RCK=0;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void in_data(uchar n)        //数据打入74HC595函数,时序请参考74HC595规格书
{
        uchar x,y;
        y=n;
        for(x=8;x>0;x--)
        {
                if(y&0x01)           //特别注意先打入的是高位对应第8列,最后打入低位对应第1列
                        SER=1;
                else
                        SER=0;
                y=y>>1;                   //对应先高位后对位应往右移位数据
                SCK=1;
                SCK=0;
        }
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//主函数
void main(void)
{
        uchar a=3,b=0;        
        RCK=0;          //清零锁存线
        SCK=0;          //清零时钟线               
        while(1)
        {
                for(h=0;h<8;h++)                 //控制8行数据
                {
                        in_data(dat[h]);         //打入对应的数据
                        ROW();                                 //行驱动
                        delay(1);                         //稳定显示
                }
                a--;                                         //控制1个数字显示一段时间
                if(a==0)
                {
                        a=30;
                        if(b++==10)
                                b=10;
                }                                          
        }
}
自己对照参考程序改写的关于点阵的部分程序(只能定在0上不走了,说明b变量没有完成加一,这里不解啊)
void in_data(uchar n)        //数据打入74HC595函数,时序请参考74HC595规格书
{
        uchar x,y;
        y=n;
        for(x=8;x>0;x--)
        {
                if(y&0x01)           //特别注意先打入的是高位对应第8列,最后打入低位对应第1列
                        SER=1;
                else
                        SER=0;
                y=y>>1;                   //对应先高位后对位应往右移位数据
                SCK=1;
                SCK=0;
        }
}
void dianzhen()
{
        uchar a=3,b=0;
  for(h=0;h<8;h++)                 //控制8行数据
                {
                        in_data(dat[b][h]);         //打入对应的数据
                        ROW();                                 //行驱动
                        delay(1);                         //稳定显示
                }
                a--;                                         //控制1个数字显示一段时间
                if(a==0)
                {
                        a=30;
                        if(b++==10)
                                b=10;
                }                                                 
}
//-----------------------------------------------------------------------------
void main()
{       
        init_devices();
        display();
  P0=0xff;
  delay(1000);       
        RCK=0;          //清零锁存线
        SCK=0;          //清零时钟线
        TR0=1;
        TR1=1;
        while(1)
        {
                        dianzhen();
        }
}
          

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top