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();
}
}
求各位师傅帮帮忙啊!
//资源:串行输出存储锁存线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();
}
}
