我用74LS595做行驱动,74LS154做列驱动做了一个16×32的双色点阵,急需C语言程序,随便显示什么字。谢谢大
可参考16点阵程序改写。在原来的基础上。
因为595多了两个级联。所以在程序中要多发出两个字节的数据。别的都差不多。
参考我百度空间程序。
各种显示,时间,温度等功能。给你一个参考:
可以去我的博客下载:
LED 点阵汉字显示屏
概 述
这次比赛制作由于时间紧,同时为了降低制作难度, 仅作了四个字的轮流显示,实际使用时可根据这个原理自行扩充显示的字数。
设计制作主要运用于学校的宣传栏,如:本科评估的各种信息,学校学院重要通知,天气预报等各种信息。
系统设计
一 硬件电路
(1)系统组成:
主要硬件电路:LED 点阵条屏是由 16 个 8*8 的 LED 点阵块组成,形成 16*64 矩形点阵,以AT89S51为控制核心。显示屏的其他主要硬件有:
① 带锁存输出的 8位移位寄存器74HC595,作为LED的列线驱动输入;
② 四六译码器 74LS154,作为 LED行线的译码选择(实际制作中考虑成本问题改为两个74HC138联合);
③ 三极管 9012,连接四六译码器的十六个输出端,作为开关使用,驱动LED的行线。
图二 AT89S51单片机最小系统
AT89S51相关器件连接的接脚如下:PA0-PA3连接4-16译码器的输入口A,B,C,D;PB0-PB3连接74HC595的输入口 SI,SCK,RCK;PD6-PD7作串口通信使用连接RxD,TxD 两个三八译码器74LS138组成的16个输出端连接 16 个 9012的三极管的基极 B,发射极E 连接5V电源,集电极C连接到三个汉字点阵的16 个行线控制端。 点阵的 48 列数据线驱动由 6 片 74HC595 级联组成,前一片 74HC595 的 Q’H 引脚连接下一片的SI引脚,各片的SCK、RCK、SRCLR、G引脚分别并联。
(2)LED点阵块
图三 LED点阵块
8*8的LED点阵为单色行共阴模块,单点的工作电压为正向(Vf)=1.8 v ,正向电流(IF)= 8-10 mA 。静态点亮器件时(64点全亮)总电流为 640mA,总电压为 1.8 v,总功率为 1.15 W。动态时取决于扫描频率(1/8或1/16秒),单点瞬间电流可达 80-160 mA。 16*16点阵静态时16*16*10mA,动态时单点电流80-160mA。
实际测试:整机电流700 mA
(2) 移位寄存器74HC595
图四 74HC595内部逻辑图
74HC595是带锁存输出的8位移位寄存器,其管脚见下图,其中SI是串行数据的输入端;VCC、GND分别为电源和地;RCK是存储寄存器的输入时钟,SCK是移位寄存器的输入时钟,SCLR是移位寄存器的输入清除,Q’H是串入数据的输出,G是对输入数据的输出使能控制,QA~QH串入数据的并行输出。从SI口输入的数据在移位寄存器的SCK脚上升沿的作用下输入到74HC595中,在RCK脚的上升沿作用下将输入的数据锁存在74HC595中,当G为低电平时时,数据并行输出。SCLR为移位寄存器的输入清除端。
(3) 74HC138以及驱动电路
图五 74HC138以及驱动电路实物图
4-16线译码器(用两块74HC138组成),其管脚如图所示,A,B,C,D为译码的输入端,值的区间从0000到1111,Y1~Y15是对应A,B,C,D四个输入引脚的输出脚,其中选中的线用输出低电平,没有选中的输出高电平,G1、G2是使能端,只有输入相应D低电平才能使译码器正常工作。
驱动三极管为16个9012,用万能板焊接。
二 软件设计
单片机方的程序设计 单片机在LED点阵汉字显示系统中主要负责数据的接收、存储和扫描显示 LED点阵屏三大主要功能。串行移动的子程序设计 这是一个通用子程序,在显示子程序中都要被调用,功能是移位寄存器 74HC595接收单片机发出的点阵行数据,逐位移动到对应位置后再进行锁存和输出工作,同时对四六译码器进行开关工作,控制屏幕的显示。
部分程序:初始化程序:
#include <AT892051.H>
#define uchar unsigned char
#define uint unsigned int
#define SPEED 3
uchar col,disrow;
uint word;
uchar code HZ[];
uchar BUFF[6];
void loadoneline(void);
void sendoneline(void);
发送部分程序:
void sendoneline(void)
{
char s;uchar inc;
if(col<8)inc=0;else inc=1;
for(s=4+inc;s>=0+inc;s--)
{
SBUF=two_onebyte(BUFF[s],BUFF[s+1]);
while(!TI);TI=0;
}
}
三 调试
调试主要分为硬件调试和软件调试:
硬件调试:在焊接电路板的时候,应该从最基本的最小系统开始,分模块,逐个进行焊接测试。在对各个硬件模块进行测试时,要保证软件正确的情况下去测试硬件,要不然发生错误时,不知道到底是哪一方出错了。当然,在设计的过程中也存在着失误和不足。
软件调试:软件部分是先参考书上的例子,然后自己根据硬件电路写程序,由于以前所学是C语言,所以这个系统在编写程序过程中都采用C语言编写。刚刚开始,编写不会一次性通过,经过仔细分析修改最后编译成功。但是,在实际写如S51中,LED显示屏出现各种各样的乱码,通过再次认真仔细分析多次修改程序后,程序能够正常运行。
四 总结
在 LED点阵汉字显示屏的设计过程中,学到了很多东西,基本了解了整个嵌入式开发的流程。例如,在进行整个设计之前,应该先根据需求分析,对单片机进行选型,然后对各个硬件模块进行搭试。在画PCB电路板的时候,要注意基本的布板原则。例如,在进行PCB布板的时候,滤波电容不够靠近芯片的电源脚和地脚。在进行搭试点阵块的时候,因为电压过高,导致点阵块损坏。这次第一届电子设计制作,本人受益非浅,在以后的电子设计制作过程中一定吸取教训。
参考文献:
[1]何立民.单片机应用技术选编[M].北京:北京航空航天大学出版社.1998.
[2]杜春雷.如何使用Visual Basic 6.0 dP3~ [M].北京:机械工业出版社,1999.
[3]孙育才.新型AT89S51系列单片机及其应用[M].北京:清华大学出版社.2005.
经验小结:
1,在头文件增加“#pragma SRC(LED.ASM)”语句,可以生成汇编文件,对于理解
汇编语言程序是有很大的好处的。
2,在制作PCB板过程中,业余条件下很难做双面板,不地不做的时候考虑如何布
线才能达到最优最好。
3,在“”;Keil C51软件的安装,按照该软件
的安装,可以得到无限量的程序编译。因为在写程序的过程中发现,KEIL C51 只
能编译2K的程序代码,不够用。用C编写,感觉很容易理解。程序编写过程中最好
是先参考别人的程序,再修改能不能实用自己的程序要求,之后才自己去编写完
全属于自己的程序。
4,单片机仿真软件 PROTEUS 也是很不错的。在上面可以仿真很多东西。
设想:
1,可以挂在学校的十字路口,提供日期,时间,温度,湿度等天气信息,服务广大同学。
2,可以和电脑相连接,实现同步显示。做一个完整的系统。
进一步学习下面的软件或者语言(知识):
BV
protel 99 se
keil c51
proteus
c/c++
easy isp 51
Easy 51Pro.exe
2007-5-25
下面为静止显示“农林大学”四个字的程序:
#include <REG51.h>
#define uchar unsigned char
#define uint unsigned int
uchar disrow;
uchar code HZ[];
uchar BUFF[9];
void loadonelineandsend(void);
/********************************************/
/*******************************************************/
void main(void)
{
while(1)
{
for(disrow=0;disrow<16;disrow++)
{
loadonelineandsend();
P1=0x10+disrow;
P1=0x20+disrow;
}
}
}
/******************************************************/
void loadonelineandsend(void)
{
uchar s;
int q;
q=0;
for(s=0;s<4;s++)
{
BUFF[q]=HZ[32*s+disrow*2];
BUFF[q+1]=HZ[32*s+disrow*2+1];
SBUF=255-BUFF[q+1];
while(!TI);TI=0;
SBUF=255-BUFF[q];
while(!TI);TI=0;
}
}
/******************************************************/
/***********农林大学********************************************/
uchar code HZ[]=
{
0x01,0x00,0x01,0x00,0x7F,0xFE,0x41,0x02,0x81,0x04,0x02,0x00,0x02,0x08,0x05,0x18,
0x09,0x20,0x18,0xC0,0x28,0x80,0x48,0x40,0x88,0x30,0x0A,0x0E,0x0C,0x04,0x08,0x00,
0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x24,0xFE,0xFE,0x08,0x20,0x18,0x60,0x1C,0x70,
0x2A,0xA8,0x28,0xAE,0x49,0x24,0x8A,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x02,0x80,
0x02,0x80,0x02,0x40,0x04,0x40,0x04,0x20,0x08,0x10,0x10,0x0E,0x60,0x04,0x00,0x00,
0x22,0x08,0x11,0x08,0x11,0x10,0x00,0x20,0x7F,0xFE,0x40,0x02,0x80,0x04,0x1F,0xE0,
0x00,0x40,0x01,0x84,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,
};
/*****************************************************
16*128 LED点阵屏 C 程序
******************************************************
声明:
本程序供大家学习之用,用勿用于商业用途。尊重版权。
编写:邓椿薪
时间:2006年1月20日 晚
邮箱:love2151@xinhuanet.com
*******************************************************
//595连级输出数据,138行驱动。P0_1为移动速度高速/*点阵显示汉字程串口输出字符数据,
//P2口输出行扫描信号,P2_7输出595锁存信号。*/
#define uchar unsigned char
#define uint unsigned int
#include <REG51.H>
#include <CODESUB.H>
uchar yid,h,d=12; //YID为移动计数器,H为行段计数器。
uint zimuo,zimuo1; //字模计数器
uchar BUFF[18]; //缓存
void in_data(void); //调整数据
void rxd_data(void); //发送数据
void in_data1(char h);
void rxd_data1(void);
void sbuf_out1(void);
void sendsw(uchar k); //发送段代码
void sbuf_out(void); //16段扫描
void key(void);
sbit AN1=P3^4;
sbit AN2=P3^5;
sbit clk=P3^3;
unsigned code sw[16]={0x7f,0x6f,0x5f,0x4f,0x3f,0x2f,0x1f,0x0f,0xf7,
0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0}; /*16行段码*/
/********************************************/
void main(void)
{ uchar i;
zimuo1=sizeof(hanzi)-6*32;//(zishu+9)*32;
yid=0;
zimuo=0;
while(1)
{
while(yid<100) //数据移位。
{
for(i=0;i<D;I++) if(zimuo 后移一个字, zimuo="zimuo+32*5;//zimuo+32;" yid="0;" } 移动一步 yid++; sbuf_out1();key(); { 移动速度>zimuo1) //总数减7个字。
zimuo=0;
}
}
void sbuf_out1()
{
char i;
for(h=0;h<32;h++)
{
in_data1(h);
clk=1;
rxd_data1();
if(h>=16){i=h-16;}
else i=h;
sendsw(sw[i]);
}
}
/******************************************************/
void in_data1(char h)
{
char s,i;
if(h>=16)
{i=(h-16);
for(s=5;s>=0;s--) //h为向后先择字节计数器,zimuoo为向后先字计数器
{
// if(zimuo%32)
BUFF[2*s+1]=hanzi[zimuo+1+32*s+2*i]; //把第一个字模的第一个字节放入BUFF1中,第二个字模和第一个字节放入BUFF3中
BUFF[2*s]=hanzi[zimuo+0+32*s+2*i]; // 把第一个字模的第二个字节放入BUFF0中,第二个字模的第二个字节放入BUFF1中
}
}
else
{
i=h;
for(s=5;s>=0;s--) //h为向后先择字节计数器,zimuoo为向后先字计数器
{
// if(zimuo%32)
BUFF[2*s+1]=hanzi[zimuo+1+32*s+2*i]; //把第一个字模的第一个字节放入BUFF1中,第二个字模和第一个字节放入BUFF3中
BUFF[2*s]=hanzi[zimuo+0+32*s+2*i]; // 把第一个字模的第二个字节放入BUFF0中,第二个字模的第二个字节放入BUFF1中
}
}
}
/*******************************************************/
void rxd_data1(void) //串行发送数据
{
char s;
for(s=0;s<10;s++) //发送5字节数据
{
SBUF=255-BUFF[s];//把BUFF中的字节从大到小移位相或后发送输出。
while(!TI);TI=0; //等待发送中断
}
}
void sendsw(uchar k)
{
TI=0;
SBUF=k;
while(!TI);TI=0;
clk=0;
}
void key(void)
{
uchar a,b;
if(AN1==0)
{
for(a=0;a<10;a++)
{for(b=0;b<14;b++){}}
if(AN1==0)
{while(AN1==0)
{}
if(AN1)
{d++;
if(d>100)
d=100;
}
}
}
if(AN2==0)
{for(a=0;a<10;a++)
{for(b=0;b<14;b++){}}
if(AN2==0)
{while(AN2==0)
{}
if(AN2)
{d--;
if(d==0)
d=1;
}
}
}
}
不是我写的,但我想会对你有用。
基于两片74ls595的数字钟,要求能已数码管形式显示时、分、秒,具有时间...
用两片74LS595驱动数码管显示,分别用于段选和位选。只需要用单片机的3个IO脚即可。至于计时可用定时器计秒,分,小时就行了。
请问74ls595是什么
74LS595是TTL电路,工作电压是5V,74LS595的LS表示普及、通用型产品。595是器件的工作运行速度不同,中间字母代表不同工作速度。74ls595是简单的数据分配器,不需要CP脉冲,也不需要同步,74ls595用着简单的多,而且他是TTL电路。
我用74LS595做行驱动,74LS154做列驱动做了一个16×32的双色点阵,急需C...
② 四六译码器 74LS154,作为 LED行线的译码选择(实际制作中考虑成本问题改为两个74HC138联合); ③ 三极管 9012,连接四六译码器的十六个输出端,作为开关使用,驱动LED的行线。 图二AT89S51单片机最小系统 AT89S51相关器件连接的接脚如下:PA0-PA3连接4-16译码器的输入口A,B,C,D;PB0-PB3连接74HC595的输入口 SI...
怎么用74LS154和74LS595芯片分别构成行、列驱动电路,51单片机控制4个8...
汉字显示用字模生成软件做,主要是将595和154的驱动写好,封装成函数,用定时器定时刷新16行字模数据。154是4线16译码器,你只要输入0000-1111便可指定某一列,行需要将字模移位到595后并行输出。
74LS595驱动8位数码管显示问题
1 采用一片74LS595动态驱动8位数码管是没有问题的,不过由于需要太多的操作时间,你需要认真分配时间间隙,同时需要采用较高速的CPU。若打算降低成本,建议采用两片74LS595动态驱动8位数码管可以大大降低对CPU的要求,同时可以大大简化分配时间间隙,可以有更多的时间完成其他任务。2 目前的数码管主流是...
用c51和74ls595设计的时钟电路!求程序?
用两片74LS595扩展两个8位的并行口,可驱动8位一体的共阴数码管,可节省单片机引脚又解决了数码管的驱动。用数码管显示时钟,用定时器定时,得到秒,分,小时,再由数码管显示出来就可以了。
proteus中74LS595使用方法与各管脚功能
74HC595各个引脚的功能:Q1~7 是并行数据输出口,即储寄存器的数据输出口 Q7' 串行输出口,其应该接SPI总线的MISO接口 STcp 存储寄存器的时钟脉冲输入口 SHcp 移位寄存器的时钟脉冲输入口 OE的非 输出使能端 MR的非 芯片复位端 Ds 串行数据输入端 转自Tony嵌入式论坛,地址:http:\/\/www.cevx.com\/bbs...
74HC595对比74LS595、74HC595对比74HC164、74HC595对比MCP23017_百度...
74LS595:经典TTL对比与74HC595相比,74LS595采用TTL技术,虽然速度较快,但功耗较高且较为老旧。74LS595使用双极性晶体管(BJT),而74HC595则采用CMOS技术,这意味着后者在低功耗和抗干扰性方面具有优势。在选择时,要根据项目的具体需求和功耗预算来衡量。74HC164:串行\/并行转换器74HC164则是一个8位...
嵌入式单片机 74ls595,74hc595,74ls138,74hc138,74hc573,74ls573都...
都是数字电路,LS和HC表示生产工艺区别,一个是TTL工艺,一个是CMOS工艺,两个工艺的区别你自己查百度即可,有详细说明,现在常用的都是HC系列。595属于串行转并行输出寄存器,常用于扩展单片机的IO口,138是3-8线译码器,573是数据寄存器。数码管驱动用HC595和HC138,但是也不是必须的。
51 单片机 74HC595 级联 动态显示 多位数码管 怎么实现的?
74HC595同单片机教材里的74LS164一样,是串入并出移位寄存器,只是驱动能力更大些。14脚为串行输入脚,第一片接单片机的P0.1,后面的依次接前一片的Q7'.11脚是移位时序引脚,所有的都并接在P0.0引脚,同时移位。每一片595都并行输出Q1-Q7,输出段码,分别接A-G,由于你这里不用小数点,所以Q7(DP...
苌蓓浦列: 1 采用一片74LS595动态驱动8位数码管是没有问题的,不过由于需要太多的操作时间,你需要认真分配时间间隙,同时需要采用较高速的CPU.若打算降低成本,建议采用两片74LS595动态驱动8位数码管可以大大降低对CPU的要求,同时可以大大简化分配时间间隙,可以有更多的时间完成其他任务.2 目前的数码管主流是高亮管,没有任何问题.你需要为每个数码管安装一个限流电阻或者595输出每个安装一个电阻.
南皮县17312905235: 为何用74HC154进行行驱动,用74HC595进行级联列驱动的LED点阵屏量示出来的字都是一样的? - ?
苌蓓浦列: 最好把硬件电路帖出来,还有你控制的点数也要说清楚,是8*8还是16*16.假设每2个595输出控制一个字,即16*16点阵,显示的字一样说明每两个为一组的595输入是相同的.首先查看电路,看下是不是4组都接到了相同的端口.其次,每次选通一组输出数据后即进行锁存,再进行下组数据的输出和锁存,这样前一组数据被锁存不变,后一组接收新的数据就会显示4个不同的字了.
南皮县17312905235: 用四个74ls595驱动16x16点阵,为什么在行添加了三极管驱动之后仿真没反应呢?这对实物有影响吗? - ?
苌蓓浦列: 我做仿真也遇过类似问题,但是只要原理对头,拿仿真做一个参考,因为真正我们需要的实物,因此你做实物时,仍然按照你的想法做,照样将三极管添加上去.如果这时将问题排除,这将会使你的实践能力真正地提高了一大步.
南皮县17312905235: 液晶屏到行列驱动电路的哪头用什么焊 - ?
苌蓓浦列: 由于液晶屏的栅极驱动及源极驱动电极引线数量达到数千条之多,所以“栅极驱动电路”及“源极驱动电路”都是集成电路;并且直接焊接在液晶屏的周边. 至于“时序控制电路”,一般就制作一块独立电路板上面,这块电路板并且把逻辑驱动电路的供电、偏压及伽马校正电压都做在一起,一般统称;“时序控制电路”板或“替康”(T-CON)板电路板,图5.6所示,这是一块常见的“奇美”32寸液晶屏(奇美V315B3-LN1 REV.C1屏T-CON板的实物)配套的“时序控制电路板(电路板上面包括了图5.2所示虚线框内所有的电路).应该不是直接焊接的,是通过接插件来实现.焊在板子上插pin座的那是通过锡炉来实现焊接的.
南皮县17312905235: LED点阵驱动芯片要用哪些??
苌蓓浦列: 驱动一般都是行用74ls(或hc)154(4-16译码),列用74ls595,是个串行移位寄存器
南皮县17312905235: 移位寄存器74595如何驱动数码管?
苌蓓浦列: <p>74HC595和74LS164一样,是串入并出的移位寄存器.</p> <p>学过数字电路的,都知道寄存器是可以驱动数码管的.</p> <p>一般的单片机教材上,都给出了164的使用方法,而595是后起之秀,介绍甚少.</p> <p>由于595比164性能更...
南皮县17312905235: 你好,关于那个单片机点阵屏中74hc595的驱动程序中SER=dat&0x80;这句的理解? - ?
苌蓓浦列: 这要从74hc595锁存方式说起,它是串行输入转并行输出的8位数据锁存器,需要串行输入8位二进制,也就是说要求将8位二进制dat,一位一位地送入74hc595数据输入端SD,且每输入一位需要一个时间脉冲CLK,共需要8个时钟脉冲才能将dat...
南皮县17312905235: M74HC595BL是干什么用的? - ?
苌蓓浦列: 就是74hc595了.串转并的一个器件.至于BL是厂家的一些编号.它和74ls595是一样的,但是它的驱动能力更强,驱动小的LED可以不加上拉电阻.具体功能如下:74ls595 8位输出锁存移位寄存器 RESET: 复位信号 shitf clock:移位时钟 ...
南皮县17312905235: 我做的点阵屏为何亮度不够高,我是用74HC595驱动的,595跟点阵屏之间是不是要加放大?还是给595接高压? - ?
苌蓓浦列: 加个74ls245矫正信号再送入595就可以了,祝你成功!
南皮县17312905235: 单片机LED显示系统,如何区分不同的显示屏共阴或共阳,用电源测试 - ?
苌蓓浦列: 分CA,CC两种 看公共端3和8,接高电平就是共阳;反之为共阴.