1、8*8双色点阵实际上是两个8*8点阵,必须增加一个端口来控制是使用哪个颜色的8*8点阵;或者连接成一个8*16点阵来控制。C语言代码和控制8*8点阵类似,增加扫描端口就可以了。
2、例程:
#include <reg51.h>unsigned char code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}
unsigned char code digittab[10][8]={
{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0
碰冲乎 {0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1
{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2
{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3
{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4
{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5
{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6
{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7
{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8
笑悉 {0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00} //9
}
unsigned int timecount
unsigned char cnta
unsigned char cntb
void main(void)
{
TMOD=0x01
TH0=(65536-1000)/256
TL0=(65536-1000)%256
TR0=1
ET0=1
EA=1
while(1)
{
}
}
void t0(void) interrupt 1 using 0
{
TH0=(65536-1000)/256
TL0=(65536-1000)%256 判兄
P3=tab[cnta]
P1=digittab[cntb][cnta]
cnta++
if(cnta==8)
{
cnta=0
}
timecount++
if(timecount==333)
{
timecount=0
cntb++
if(cntb==10)
{
cntb=0
}
}
}
各种显示,时间,温度等功能。给你一个参考:
可以去我的博客下载:
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 suchar inc
if(col<8)inc=0else inc=1
for(s=4+incs>=0+incs--)
{
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=0disrow<16disrow++)
{
loadonelineandsend()
P1=0x10+disrow
P1=0x20+disrow
}
}
}
/******************************************************/
void loadonelineandsend(void)
{
uchar s
int q
q=0
for(s=0s<4s++)
{
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,
}
设计过一个12位配没帆的,你可以根据你的需要适当改一下!希望能帮到你!希望你能通过自己的学习有所长进! model small .stack .data -------------------data-------------------------------------------------- YEAR dw ? MONTH db ? DAY db ? HOUR db ? MIN db ? SEC db ? MSEC db ? FUNKEY db ? 功能设置使用 keySw db 00h 是否按键开关 SWITCH db 0FFh 刷新开关,真,则不断在定时器中断函数中刷新,否则不刷新 n db 0dh,0ah,'$' count dw 1 sMsg db '***** welcome to my clock ****',0dh,0ah,'$' qMsg db '**** Please Input q to quit ****',0dh,0ah,'$' testStr db 02h,02h,02h,0dh,0ah db 2,0,2,0dh,0ah db 2,2,2,0dh,0ah,'$' s0 db 0,2,2,2,0 db 1,2,0,2,0 db 2,2,0,2,0 db 3,2,0,2,0 db 4,2,2,2,0 db '$' s1 db 0,0,2,0,0 db 1,0,2,0,0 db 2,0,2,0,0 db 3,0,2,0,0 db 4,0,2,0,0 db '察闹$' s2 db 0,2,2,2,0 db 1,0,0,2,0 db 2,2,2,2,0 db 3,2,0,0,0 db 4,2,2,2,0 db '$' s3 db 0,2,2,2,0 db 1,0,0,2,0 db 2,2,2,2,0 db 3,0,0,2,0 db 4,2,2,2,0 db '$' s4 db 0,2,0,2,0 db 1,2,0,2,0 db 2,2,2,2,0 db 3,0,0,2,0 db 4,0,0,2,0 db '$' s5 db 0,2,2,2,0 db 1,2,0,0,0 db 2,2,2,2,0 db 3,0,0,2,0 db 4,2,2,2,0 db '$' s6 db 0,2,2,2,0 db 1,2,0,0,0 db 2,2,2,2,0 db 3,2,0,2,0 db 4,2,2,2,0 db '$' s7 db 0,2,2,2,0 db 1,0,0,2,0 db 2,0,0,2,0 db 3,0,0,2,0 db 4,0,0,2,0 db '$' s8 db 0,2,2,2,0 db 1,2,0,2,0 db 2,2,2,2,0 db 3,2,0,2,0 db 4,2,2,2,0 db '$' s9 db 0,2,2,2,0 db 1,2,0,2,0 db 2,2,2,2,0 db 3,0,0,2,0 db 4,0,0,2,0 db '$' num dd 0 xpoint db ? ypoint db ? ------------------------------------------------------------------------- .code PUSHA1 MACRO PUSH DS PUSH AX PUSH BX PUSH CX PUSH DX ENDM POPA1 MACRO POP DX POP CX POP BX POP AX POP DS ENDM leaNum macro outNum lea di, s&outNum endm --------------------Main--------------------------------------------------- start: mov ax, @data mov ds, ax push ds call GETTIME 取得系统时间 call initUI 初始化培雹界面欢迎分享,转载请注明来源:内存溢出
评论列表(0条)