16×16LED点阵屏原理图及驱动程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
16×16LED点阵屏原理图及驱动程序
这是我玩LED点阵屏的第一块电路板,也是学习单片机入门的第一个实验器材。它由4片30mm×30mm的8×8红色高亮点阵模块与两片74HC595、两片74HC138、16只8550晶体管、一片74HC244集装在一块宽高65mm×210mm的双面PCB板上,它应该是一组级联安装的LED 屏的一个单元模块,拿到它时,我正在学习《无线电》杂志2007/11期刊上杜洋的一组文章,刚刚做好了ISP下载线,只做了“一个发光二极管的控制实验”,面对这个既好玩又陌生的玩意,真是无从下手,通过上网学习,解析研究,前后弄了两个多月,最后在《无线电》杂志2005/12期的配文程序的帮助下,终于踏进了点阵控制的门槛,两年过去了,我又玩了许多单片机控制器件,但这块屏却一直摆在我的桌案上,每当遇到难题时,看看它那稳定清晰的显示,我都能找到许多灵感;最近、在摆弄一块并行驱动的16×64点阵屏时(前几篇文章介绍了)时,因为用的还是这段程序,就又想起了它,虽然程序已经详解过了,但是,为了留记一段经历、一段回忆,决定还是“貂续狗尾”写在这里,留着自己欣赏吧。
一.原理图:
二.汉字左右移动驱动程序
/****************************************************************************** ********
16×16LED点阵屏原理图及C源汉字左右移动显示驱动程序————wannenggong
单片机:AT89S52
引脚说明:P0.0/P0.1/P0.2/P0.3控制由两片74HC138组成的行驱动控制4-16译码器的A/B/C/D端
P1.0/P1.1控制列驱动控制74HC595的OE/ST端,595的14脚(DS)经244连接RXD,595的12脚(SH)经244连接TXD。
******************************************************************************* ********/
#include
#define uchar unsigned char
#define uint unsigned int
#define K 5 //移动速度控制变量。
uchar col,disrow; //列移动计数变量。行扫描计数变量。
uint word,zishu; //字形码计数变量。
uchar code HZ[];
uchar BUFF[5]; //64列时应将数值设为11
void two_out(); //显示数据输出函数
void loadoneline_L(void); //取字码数据函数
//void loadoneline_R(void);
void sendoneline_L(void); //生成显示数据函数
//void sendoneline_R(void);
/********************************************************************
关于595第13脚的问题:原附图中13脚是接GND的,是电路板的原始设计,调试过程中将IC引脚与电路板隔离后经244引出做为OE引脚,其作用仅为配合延时适度的调整屏显亮度,若13脚接GND,则为全亮度显示,与其他控制并无干涉。
********************************************************************/
sbit OE=P1^0; //显示开关(595第13脚)。
sbit ST=P1^1; //锁存控制(595第11脚)。此处原错标为12脚,特此更正!
/****************************************************************************** *******/
void delay(uint p){
uint i,j;
for(i=0;i
for(j=0;j<5;j++)
{;}}
}
/****************************************************************************** ********
左移显示数据生成模块:(功能相当于有返回值的函数 )
******************************************************************************* ********/
uchar two_onebyteL(uchar h1,uchar h2)
{
uchar temp,tempcol; //输出变量;列移动位数变量。
if(col<8) tempcol=col;
else tempcol=col-8;
temp=(h1<
temp=255-temp;
return temp; //将显示数据返回显示输出函数。
}
/**************************************************************************
右移显示数据生成模块:
***************************************************************************/ /*uchar two_onebyteR(uchar h1,uchar h2)
{
uchar temp,tempcol;
if(col<8) tempcol=col;
else tempcol=col-8;
temp=(h1>>tempcol)|(h2<<(8-tempcol)); //右移显示
temp=255-temp;
return temp;
}*/
/****************************************************************************** *******
左移待显示数据调取函数
******************************************************************************* ******/
void loadoneline_L(void)
{
char s; //此处不要用uchar定义s
for(s=0;s<2;s++) //s值为屏数加1(16*16为一屏)
{
BUFF[2*s]=HZ[word+32*s+2*disrow];
BUFF[2*s+1]=HZ[word+1+32*s+2*disrow]; //左移显示
}
}
/****************************************************************************** ******
右移待显示数据调取函数
******************************************************************************* ******/
/*void loadoneline_R(void)
{
char s; //此处不要用uchar定义s
for(s=0;s<2;s++)
{
BUFF[2*s+1]=HZ[word+32*s+2*disrow];
BUFF[2*s]=HZ[word+1+32*s+2*disrow]; //右移显示
}