16乘16点阵屏仿真(4个74hc595)+程序
- 格式:doc
- 大小:748.00 KB
- 文档页数:8
16×16点阵LE D显示屏整个过程及C语言程序7.1功能要求设计一个室内用16×16点阵LE D图文显示屏,要求在目测条件下LED显示屏各点亮度均匀、充足,可显示图形和文字,显示图形或文字应稳定、清晰无串扰。
图形或文字显示有静止、移入移出等显示方式。
7.2方案论证从理论上说,不论显示图形还是文字,只要控制与组成这些图形或文字的各个点所在位置相对应的LED器件发光,就可以得到我们想要的显示结果,这种同时控制各个发光点亮灭的方法称为静态驱动显示方式。
16×16的点阵共有256个发光二极管,显然单片机没有这么多端口,如果我们采用锁存器来扩展端口,按8位的锁存器来计算,16×16的点阵需要256/8=32个锁存器。
这个数字很庞大,因为我们仅仅是16×16的点阵,在实际应用中的显示屏往往要大的多,这样在锁存器上花的成本将是一个很庞大的数字。
因此在实际应用中的显示屏几乎都不采用这种设计,而采用另一种称为动态扫描的显示方法。
动态扫描的意思简单地说就是逐行轮流点亮,这样扫描驱动电路就可以实现多行(比如16行)的同名列共用一套列驱动器。
具体就16×16的点阵来说,我们把所有同一行的发光管的阳极连在一起,把所有同一列的发光管的阴极连在一起(共阳的接法),先送出对应第一行发光管亮灭的数据并锁存,然后选通第一行使其燃亮一定的时间,然后熄灭;再送出第二行的数据并锁存,然后选通第二行使其燃亮相同的时间,然后熄灭;……第十六行之后又重新燃亮第一行,这样反复轮回。
当这样轮回的速度足够快(每秒24次以上),由于人眼的视觉暂留现象,我们就能看到显示屏上稳定的图形了。
16×16点阵LED显示屏整个过程及C语言程序7.1功能要求设计一个室内用16×16点阵LED图文显示屏,要求在目测条件下LED显示屏各点亮度均匀、充足,可显示图形和文字,显示图形或文字应稳定、清晰无串扰。
图形或文字显示有静止、移入移出等显示方式。
7.2方案论证从理论上说,不论显示图形还是文字,只要控制与组成这些图形或文字的各个点所在位置相对应的LED器件发光,就可以得到我们想要的显示结果,这种同时控制各个发光点亮灭的方法称为静态驱动显示方式。
16×16的点阵共有256个发光二极管,显然单片机没有这么多端口,如果我们采用锁存器来扩展端口,按8位的锁存器来计算,16×16的点阵需要256/8=32个锁存器。
这个数字很庞大,因为我们仅仅是16×16的点阵,在实际应用中的显示屏往往要大的多,这样在锁存器上花的成本将是一个很庞大的数字。
因此在实际应用中的显示屏几乎都不采用这种设计,而采用另一种称为动态扫描的显示方法。
动态扫描的意思简单地说就是逐行轮流点亮,这样扫描驱动电路就可以实现多行(比如16行)的同名列共用一套列驱动器。
具体就16×16的点阵来说,我们把所有同一行的发光管的阳极连在一起,把所有同一列的发光管的阴极连在一起(共阳的接法),先送出对应第一行发光管亮灭的数据并锁存,然后选通第一行使其燃亮一定的时间,然后熄灭;再送出第二行的数据并锁存,然后选通第二行使其燃亮相同的时间,然后熄灭;……第十六行之后又重新燃亮第一行,这样反复轮回。
当这样轮回的速度足够快(每秒24次以上),由于人眼的视觉暂留现象,我们就能看到显示屏上稳定的图形了。
采用扫描方式进行显示时,每行有一个行驱动器,各行的同名列共用一个列驱动器。
显示数据通常存储在单片机的存储器中,按8位一个字节的形式顺序排放。
显示时要把一行中各列的数据都传送到相应的列驱动器上去,这就存在一个显示数据传输的问题。
直接上图吧,51控制,4个74hc595连接。
,前面的图片是整体的,后面的是局部放大,以免看不清直接复制代码即可运行#include <reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define NUM 1#define NUN 9sbit SH_CP=P2^0;sbit DS=P2^1;sbit ST_CP=P2^2;uchar temp=0x80;uint tem=0;uchar code tab[NUN][32]= {0x10,0x08,0x04,0x3F,0x21,0x21,0x3F,0x21,0x21,0x3F,0x01,0x01,0xFF,0x01,0x01,0x01, //单0x10,0x20,0x40,0xF8,0x08,0x08,0xF8,0x08,0x08,0xF8,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x1F,0x10,0x10,0x10,0x1F,0x10,0x10,0x10,0x20,0x20,0x40, //片0x40,0x40,0x40,0x40,0x40,0xFC,0x00,0x00,0x00,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x10,0x11,0x11,0x11,0xFD,0x11,0x31,0x39,0x55,0x55,0x91,0x11,0x11,0x12,0x12,0x14, //机0x00,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x12,0x12,0x12,0x0E,0x00,0x20,0x20,0x20,0x20,0xFB,0x20,0x20,0x22,0x22,0x24,0x28,0x20,0x21,0x21,0x22,0x24, //协0x80,0x80,0x80,0x80,0xF0,0x90,0x90,0x98,0x94,0x92,0x92,0x90,0x10,0x10,0x50,0x20,0x01,0x01,0x02,0x04,0x08,0x30,0xCF,0x00,0x00,0x7F,0x02,0x04,0x08,0x10,0x3F,0x10, //会0x00,0x00,0x80,0x40,0x20,0x18,0xE6,0x00,0x00,0xFC,0x00,0x00,0x20,0x10,0xF8,0x08,0x00,0x00,0xFC,0x04,0x05,0x49,0x2A,0x14,0x10,0x28,0x24,0x45,0x81,0x02,0x04,0x08, //欢0x80,0x80,0x80,0xFC,0x04,0x08,0x40,0x40,0x40,0xA0,0xA0,0x10,0x10,0x08,0x04,0x02,0x00,0x20,0x13,0x12,0x02,0x02,0xF2,0x12,0x12,0x12,0x13,0x12,0x10,0x28,0x47,0x00, //迎0x00,0x80,0x3C,0x24,0x24,0x24,0x24,0x24,0x24,0xB4,0x28,0x20,0x20,0x20,0xFE,0x00,0x08,0x08,0x08,0x11,0x11,0x32,0x34,0x50,0x91,0x11,0x12,0x12,0x14,0x10,0x10,0x10, //你0x80,0x80,0x80,0xFE,0x02,0x04,0x20,0x20,0x28,0x24,0x24,0x22,0x22,0x20,0xA0,0x40,0x03,0x1F,0x3C,0x70,0x6E,0xDA,0xD2,0xC0,0xC0,0xC8,0x6C,0x67,0x70,0x38,0x1E,0x07, //笑脸0xF0,0xFC,0x1E,0x06,0x3B,0x6B,0x4B,0x03,0x03,0x13,0x33,0xE3,0x06,0x0E,0x18,0xF0, };uchar tab1[NUM][32]={0};bit account=0;uchar count=0;uchar code a[ ]= {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};void delay_ms(unsigned int ms){uchar j;while(ms--)for(j=0;j<123;j++);}void WriteByte(uchar dat){uchar k;SH_CP=0;ST_CP=0;for(k=0;k<8;k++){DS=dat&0x01;dat=dat>>1;SH_CP=1;_nop_();_nop_();SH_CP=0;_nop_(); }}void display(uchar dat[][32]){ uchar i;for(i=0;i<16;i++){WriteByte(dat[0][i]);WriteByte(dat[0][i+16]);if(i<8)WriteByte(a[i]);WriteByte(0xff);}else{WriteByte(0xff);WriteByte(a[i-8]);}ST_CP=1;_nop_();ST_CP=0;delay_ms(1);}}void zzh() //将移动数据存在缓冲区{ uchar i;for(i=0;i<16;i++){if((tab1[0][16+i]&0x80)==0){tab1[0][i]=(tab1[0][i]<<1)&0xfe;}else{tab1[0][i]=(tab1[0][i]<<1)|0x01;}if(((count%16)<8)&&(tem<NUN)){account=tab[tem][i]&temp;}else if(((count%16)<16)&&(tem<NUN)){account=tab[tem][16+i]&temp;}else{account=0;}if(account==0){tab1[0][16+i]=(tab1[0][16+i]<<1)&0xfe;else{tab1[0][16+i]=(tab1[0][16+i]<<1)|0x01;}}temp=(temp>>1)&0x7f;if(temp==0x00){temp=0x80;}}void willseveral() //将缓冲区数都存为0x00 { uchar i,j;for(i=0;i<NUM;i++)for(j=0;j<32;j++){tab1[i][j]=0x00;}}void main(){willseveral();while(1){display(tab1);delay_ms(50);tem=count/16;zzh();count++;if(count==(NUN+1)*16){count=0;}}}。
第一章芯片简介1.1 点阵简介 (2)1.2 74HC154简介 (3)1.3 AT89S52单片机的简介 (4)第二章电路组成设计2.1 总体电路规划 (5)2.2 各部分详细电路 (5)2.2.1 单片机最小系统与说明 (6)2.2.2 16x16点阵的级联实现 (6)2.2.3 两片74HC595级联控制列数据 (7)2.2.4 74HC154信号经8550控制行数据 (7)2.3 硬件设计注意事项 (8)2.4 Keil实现C代码与程序下载 (9)第一章芯片简介1.1 点阵简介:8x8点阵是由64个发光二极管排列成8行8列的矩阵,一个发光二极管控制着点阵的一个点。
这种显示比较逼真,能显示的字符比较多。
实际应用比较广泛,如点阵广告牌,交通灯报站台。
用P0口控制row,P1口控制col。
如果要第一行第一列灯亮,P0.0=1,P1.0=0;可以实现。
若需要显示相应的字符就用循环扫描。
1.274HC595简介:74HC595是8位串行输入,8位串行或并行输出。
●Q A~Q H为并行输出。
可以将信号输送到LED,类似流水灯。
●Q’H为串行输出。
●10号角:移位寄存器清零端,低电平有效。
●11号引脚:移位寄存器时钟脉冲,高电平有效。
●12号引脚:存储寄存器时钟脉冲,高电平有效。
●13号引脚:控制输出的使能端,低电平有效。
●14号角传送串行信号,信号源可以来单片机。
●16,8号引脚分别接VCC,GND。
1.3 74HC 154简介:74HC154是一个类似于74LS138一样的译码器,它为4-16线译码,它为单片机的引脚扩展发挥了很大的作用。
●23,22,21,20号引脚:传送地位到高位的地址码。
●18,19号引脚:154的使能端,低电平有效。
●12,24引脚:分别接GND,VCC。
●Y0~Y15:译码的结果,译出来的是低电平。
1.4 AT89S52简介:AT89S52有P0,P1,P2,P3。
四个口,18,19号引脚提供外部时钟信号。
1.八位移位寄存器74HC595级联送数据(列):2.三八译码器74LS138级联选通行(即采用行扫描):3.与单片机的连接:4:LED点阵的焊接:5:74HC595资料:74HC595是硅结构的CMOS器件,兼容低电压TTL电路,遵守JEDEC标准。
具有8位移位寄存器和一个带锁存功能的存储器;三态输出功能。
移位寄存器和存储器是分别的时钟,两者独立工作。
数据在SHcp(移位寄存器时钟输入)的上升沿输入到移位寄存器中,在STcp(存储器时钟输入)的上升沿输入到存储寄存器中去。
如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE为低电平时,存储寄存器的数据输出到总线,但是OE高电平不影响串行输出(即Q7’)。
由于它自带锁存器,所以其数据在移位寄存器中的移位与锁存器的输出是独立的,当数据移位时,可以保持锁存器输出的数据不改变,等所有8位数据全部串入完成移位操作后,一次性的将数据打入锁存器中,从而实现了并行输出的同步改变。
每最新输入一个数据就放在Q0,Q0的数据被挤到Q1,Q1的数据被挤到Q2……以此类推,Q7的数据被挤出74HC595从Q7’输出。
Q7'也会串行输出移位寄存器中高位的值即Q7的值,也就是说Q7’输出的和Q7一样。
管脚说明:Q0—Q7(Q0为15脚,Q1-Q7分别为1-7): 八位并行输出端DS(14脚):串行输入端Q7'(9脚): 串行输出端(级联时接下一个的串行输入端DS)MR(10脚): 复位引脚,低电平时将移位寄存器的数据清零。
一般情况下接Vcc。
SHCP(11脚):移位寄存器时钟输入引脚,每一个上升沿时数据寄存器的数据移一位。
Q0-->Q1-->Q2-->...-->Q7;下降沿移位寄存器数据不变。
实验名称:16x16 LED点阵实验实验目的:利用单片机I/O口实现LED点阵的行扫描动态显示。
实验原理:1、LED显示器的基本结构:七段显示器:将发光二极管封装成数码显示的形式。
共阳七段显示器:共阴七段显示器:点阵式显示器:发光二极管封装成点阵形式,构成不同的字符甚至汉字、图形。
发光二极管排列成矩阵,由亮与暗来产生字符或图形。
每一行的阳极连在一起,每一列的阴极连在一起。
2、点阵显示的原理:点阵显示器每一列的阴极连在一起,对每一列而言相当于一个共阴显示器。
同时每一行的阳极连在一起,相当于七段显示器的笔划。
这样,可以把5X7的发光二极管点阵看作一个五位显示器。
可采用动态显示电路,以笔划锁存器控制行信号,以位锁存器控制列信号。
3、实验原理图使用两片8位输出锁存移位寄存器74HC595(三态输出、串入并出),将单片机I/O口发出的串行数据转换为并行数据LD_QA~LD_QP,作为16×16 LED点阵显示器的行线,使用另外两片8位74HC595作为 16×16 LED点阵显示器的列线LD_1~LD_16。
当行输出高电平、列输出低电平时,可以点亮点阵。
74HC595:LD-QA~LD-QP:点阵行控制信号LD-1~LD-16:点阵列控制信号SER(14脚):串行数据输入端-SCLR(10脚):低电平时将移位寄存器的数据清零。
通常将它接Vcc。
SCK(11脚):上升沿时将串行数据移入移位寄存器。
RCK(12脚):上升沿时移位寄存器的数据锁存入数据寄存器。
-G(13脚): 高电平时禁止输出(高阻态)时序图:实验内容:在16×16LED点阵上分别用静态方式和滚屏方式显示自己的姓(行扫描)。
实验步骤:使用导线将A2区的P10~P14与C3区的L_DAT_H 、L_DAT_L、L_CLK、L_OE 、 L_STR实验设计:电路图:(修改后加上了74HC595输出端口与LED点阵相连的端口名称)1、静态方式:流程图:代码及注释:HL EQU 70H ;行信号低位内存地址LL EQU 72H ;列信号低位内存地址HD EQU P1.0 ;p1.0口连行信号输入端LD EQU P1.1 ;P1.1口连列信号输入端SCK EQU P1.2 ;P1.2口连移位寄存器OE EQU P1.3 ;P1.3口连使能端RCK EQU P1.4 ;P1.4口连锁存器ORG 8000H ;硬件仿真程序LJMP MAINORG 8100H ;硬件仿真程序MAIN:MOV DPTR,#DISPLAY ;字模表地址MOV R1,#00H ;字模表起始地址偏移量MOV HL,#01H ;行扫描信号的初值0001HMOV HL+1,#00HLOOP:MOV A,R1MOVC A,@A+DPTRMOV LL,A ;找到列低位数据,存入内存地址中INC R1MOV A,R1MOVC A,@A+DPTRMOV LL+1,A ;找到列高位数据,存入内存地址中LCALL SENDD ;调用传输数据的程序LCALL DELAY ;调用延时程序CLR C ;位处理累加器清零MOV A,HLRLC A ;左移行扫描信号低8位MOV HL,AMOV A,HL+1RLC A ;左移行扫描信号高8位MOV HL+1,AINC R1CJNE R1,#20H,LOOP ;判断一轮扫描是否结束LJMP MAINSENDD:CLR OE ;使能信号低电平有效CLR RCK ;RCK信号置0MOV R2,#08HMOV R3,LL+1 ;列信号高八位地址MOV R4,HL+1 ;行信号高八位地址BACK:CLR SCK ;SCK信号置0MOV A,R3RLC AMOV R3,AMOV LD,C ;列信号逐位传输MOV A,R4RLC AMOV R4,AMOV HD,C ;行信号逐位传输SETB SCK ;SCK信号上升沿到来,将串行数据移入移位寄存器DJNZ R2,BACK ;判断高8位信号是否传输完毕MOV R2,#08HMOV R3,LL ;列信号低8位地址MOV R4,HL ;行信号低8位地址BACK1:CLR SCK ;SCK信号置0MOV A,R3RLC AMOV R3,AMOV LD,C ;列信号逐位传输MOV A,R4RLC AMOV R4,AMOV HD,C ;行信号逐位传输SETB SCK ;SCK信号上升沿到来,将串行数据移入移位寄存器DJNZ R2,BACK1 ;判断低8位信号是否传输完毕SETB RCK ;RCK信号上升沿到来,移位寄存器的数据锁存入数据寄存器RETDELAY: ;延时子程序MOV R7,#50DELAY1:MOV R6,#10DELAY2:DJNZ R6,$DJNZ R7,DELAY1RETDISPLAY:DB 0xFF,0xFE,0xE0,0xEE,0xEF,0xCE,0xEF,0xF6,0xE1,0xFA,0xFD,0xFC,0xFD,0xFE,0x3D,0x80;DB 0xE0,0xFA,0xED,0xFA,0xEF,0xF6,0xEF,0xF6,0xEF,0xEE,0xEF,0x9A,0x6B,0xDC,0xF7,0xFE;"张" END2、滚屏方式流程图:代码及注释:HL EQU 70H ;行信号低位内存地址LL EQU 72H ;列信号低位内存地址HD EQU P1.0 ;p1.0口连行信号输入端LD EQU P1.1 ;P1.1口连列信号输入端SCK EQU P1.2 ;P1.2口连移位寄存器OE EQU P1.3 ;P1.3口连使能端RCK EQU P1.4 ;P1.4口连锁存器ORG 8000H ;硬件仿真程序LJMP MAINORG 8100H ;硬件仿真程序MAIN:MOV DPTR,#DISPLAY ;字模表地址MOV R1,#00HMOV R7,#00H ;R7用来表示字模表起始位置偏移量LOOP:MOV R5,#20 ;R5用来表示延时,改变R5的值可改变滚屏速度LOOP1:MOV R6,#10H ;R6用来判断是否扫描完一轮MOV A,R7 ;将R7的值赋值给R1MOV R1,AMOV HL,#01H ;行扫描信号的初值0001HMOV HL+1,#00HLOOP2:MOV A,R1MOVC A,@A+DPTRMOV LL,A ;找到列低位数据,存入内存地址中INC R1MOV A,R1MOVC A,@A+DPTRMOV LL+1,A ;找到列高位数据,存入内存地址中LCALL SENDD ;调用传输数据的程序LCALL DELAY ;调用延时程序CLR C ;位处理累加器清零MOV A,HLRLC A ;左移行扫描信号低八位MOV HL,AMOV A,HL+1RLC A ;左移行扫描信号高八位MOV HL+1,AINC R1DEC R6CJNE R6,#00H,LOOP2 ;通过R6判断是否扫描完一轮,R6减为0,一轮扫描结束DJNZ R5,LOOP1 ;通过R5判断一帧的延时是否达到INC R7 ;改变字模表的偏移量INC R7 ;R7连续加2,相当于换行CJNE R7,#40H,LOOP ;判断字模表是否结束LJMP MAINSENDD:CLR OE ;使能信号低电平有效CLR RCK ;RCK信号置0MOV R2,#08HMOV R3,LL+1 ;列信号高8位地址MOV R4,HL+1 ;行信号高8位地址BACK:CLR SCK ;SCK信号置0MOV A,R3RLC AMOV R3,AMOV LD,C ;列信号逐位传输MOV A,R4RLC AMOV R4,AMOV HD,C ;行信号逐位传输SETB SCK ;SCK信号上升沿到来,将串行数据移入移位寄存器DJNZ R2,BACK ;判断高八位信号是否传输完毕MOV R2,#08HMOV R3,LL ;列信号低八位地址MOV R4,HL ;行信号低八位地址BACK1:CLR SCK ;SCK信号置0MOV A,R3RLC AMOV R3,AMOV LD,C ;列信号逐位传输MOV A,R4RLC AMOV R4,AMOV HD,C ;行信号逐位传输SETB SCK ;SCK信号上升沿到来,将串行数据移入移位寄存器DJNZ R2,BACK1 ;判断低八位信号是否传输完毕SETB RCK ;RCK信号上升沿到来,移位寄存器的数据锁存入数据寄存器RETDELAY: ;延时子程序MOV R2,#50DELAY1:MOV R3,#10DELAY2:DJNZ R3,$DJNZ R2,DELAY1RETDISPLAY:DB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFFDB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF;预留空白DB 0xFF,0xFE,0xE0,0xEE,0xEF,0xCE,0xEF,0xF6,0xE1,0xFA,0xFD,0xFC,0xFD,0xFE,0x3D,0x80;DB 0xE0,0xFA,0xED,0xFA,0xEF,0xF6,0xEF,0xF6,0xEF,0xEE,0xEF,0x9A,0x6B,0xDC,0xF7,0xFE;"张" END实验结果与分析:1、程序正确运行后,可看到16x16 LED点阵显示屏上显示“张”,LED灯的亮暗程度有些不均匀。
16x16点阵设计摘要本设计是一16x16点阵LED电子显示屏的设计,整机以美国ATMEL公司生产的40脚单片机AT89C51为核心,介绍了以它为控制系统的LED点阵电子显示屏的动态设计和开发过程。
通过该芯片控制一个驱动器74HC154和两个列驱动器74HC595米驱动显示。
该电子显示屏可以显示各种文字或单色图像,全屏能显示1个汉字,采用4块8x8点阵LED显示模块米组成16x16点阵显示模式。
显示采用动态显示,是的图形或文字能够实现静止、移入移出等多种显示方式。
文中详细介绍了LED点阵显示的硬件设计思路、硬件电路个个部分的功能原理、相应软件的程序设计,以及使用说明等。
单片机控制系统程序采用单片机汇编语言进行编辑,通过编程控制各显示点对应LED阳极和阴极端的电平,就可以有效的控制各显示点的亮灭。
所显示字符的点阵数据可以自行编写,也可以标准字库中提取。
LED显示以其组构方式灵活、显示稳定、功耗低、寿命长、技术成熟、成本低廉等特点在车站、证券所、运动场馆、公交干道及各种室内外显示场合的信息发布,公益宣传,环境参数实时,重大活动倒计时等等得到广泛的应用。
设计结果证明,该系统显示误差小,性能稳定,结构合理,扩展能力强。
关键词:AT89C51单片机,LED,点阵显示,动态显示,C语言目录1 绪论 (1)1.1课题描述 (1)1.2基本工作原理及框图 (1)2 相关芯片及硬件电路设计 (2)2.1 51系列单片机简介: (2)2.2点阵显示原理 (5)2.3列驱动电路 (6)2.4行驱动电路 (8)2.5硬件总体电路 (9)3 系统软件设计 (10)3.1显示驱动程序 (10)3.2系统的主程序 (11)总结 (12)致谢 (13)参考文献 (14)附录 (15)1 绪论1.1 课题描述单片微型计算机(single chip microcomputer)简称单片机,它是为各类专用控制器而设计的通用或专用微型计算机系统,高密度集成了普通计算机微处理器,一定容量的RAM和ROM以及输入/输出接口,定时器等电路于一块芯片上构成的[1]。
《单片机原理与应用》课程设计基于ATMRGA16单片机16x16LED点阵显示汉字系统设计报告所属系部:电子与通信工程所属班级:20XXXX20XX年 6 月15 日1 绪论1.1 选题背景及研究意义LED的点阵图文显示目前被广泛应用于各个方面,尤其当LED点阵图文显示与功能强大且价格低廉的单片机,其化学效应异常剧烈,单片机不仅丰富了LED点阵图文显示的应用范围,也增强了其实用性。
1.2 系统实现目标在取模软件中输入汉字,通过编码及下载,汉字可在LED点阵显示屏上流动显示汉字“北京XXXX学院”。
在汉字流动显示时,用户可通过按键1控制汉字在LED显示屏上的加速移动;通过按键2控制汉字在LED显示屏上的减速移动;通过按键3控制汉字在LED显示屏上恢复原移动速度;在汉字流动显示处于加速或减速状态时,用户可通过串口助手发送信号使汉字在LED显示屏上恢复原移动速度。
1.3 小组成员及分工XXX 负责检验调整单片机功能实现;XXX 负责制作答辩PPT;XXX 负责完成实验报告;代码由三位成员共同编写。
2 系统设计原理2.1总体设计方案本次课程设计针对ATMega16单片机作为驱动LED的图文显示控制的芯片,将课堂上所学的单片机的硬件结构、工作原理及方式,与自己查阅资料学习LED的工作方式及原理以及相关软件的运行相结合研究单片机对LED点阵显示屏的控制技术。
在以上理论为基础的前提下,本小组设计了搭建基于单片机的16*16LED点阵显示汉字控制的电路,利用相关的元器件,以焊接的形式,实现了单片机对LED点阵显示屏的图文控制,最终达到预期设计要求。
点阵显示屏的控制系统是由主控系统、行驱动模块、列驱动模块和点阵显示模块4个部分组成。
其中,主控系统选择ATMega16单片机,它是使用比较普遍的一种单片机,具有低功耗、低价格的优点,性能好。
行列驱动模块的作用是接收单片机发出的信息,然后输出给点阵显示屏的行列端。
本设计的点阵显示屏有16行列,所以这里选择4个74HC595芯片作为驱动器。
1.八位移位寄存器74HC595级联送数据(列):2.三八译码器74LS138级联选通行(即采用行扫描):3.与单片机的连接:4:LED点阵的焊接:5:74HC595资料:74HC595是硅结构的CMOS器件,兼容低电压TTL电路,遵守JEDEC标准。
具有8位移位寄存器和一个带锁存功能的存储器;三态输出功能。
移位寄存器和存储器是分别的时钟,两者独立工作。
数据在SHcp(移位寄存器时钟输入)的上升沿输入到移位寄存器中,在STcp(存储器时钟输入)的上升沿输入到存储寄存器中去。
如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE 为低电平时,存储寄存器的数据输出到总线,但是OE高电平不影响串行输出(即Q7’)。
由于它自带锁存器,所以其数据在移位寄存器中的移位与锁存器的输出是独立的,当数据移位时,可以保持锁存器输出的数据不改变,等所有8位数据全部串入完成移位操作后,一次性的将数据打入锁存器中,从而实现了并行输出的同步改变。
每最新输入一个数据就放在Q0,Q0的数据被挤到Q1,Q1的数据被挤到Q2……以此类推,Q7的数据被挤出74HC595从Q7’输出。
Q7'也会串行输出移位寄存器中高位的值即Q7的值,也就是说Q7’输出的和Q7一样。
管脚说明:Q0—Q7(Q0为15脚,Q1-Q7分别为1-7): 八位并行输出端DS(14脚):串行输入端Q7'(9脚): 串行输出端(级联时接下一个的串行输入端DS)MR(10脚): 复位引脚,低电平时将移位寄存器的数据清零。
一般情况下接Vcc。
SHCP(11脚):移位寄存器时钟输入引脚,每一个上升沿时数据寄存器的数据移一位。
Q0-->Q1-->Q2-->...-->Q7;下降沿移位寄存器数据不变。
直接上图吧,51控制,4个74hc595连接。
,前面的图片是整体的,后面的是局部放大,以免看不清
直接复制代码即可运行
#include <reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define NUM 1
#define NUN 9
sbit SH_CP=P2^0;
sbit DS=P2^1;
sbit ST_CP=P2^2;
uchar temp=0x80;
uint tem=0;
uchar code tab[NUN][32]= {
0x10,0x08,0x04,0x3F,0x21,0x21,0x3F,0x21,0x21,0x3F,0x01,0x01,0xFF,0x01,0x01,0x01, //单0x10,0x20,0x40,0xF8,0x08,0x08,0xF8,0x08,0x08,0xF8,0x00,0x00,0xFE,0x00,0x00,0x00,
0x00,0x10,0x10,0x10,0x10,0x1F,0x10,0x10,0x10,0x1F,0x10,0x10,0x10,0x20,0x20,0x40, //片0x40,0x40,0x40,0x40,0x40,0xFC,0x00,0x00,0x00,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,
0x10,0x11,0x11,0x11,0xFD,0x11,0x31,0x39,0x55,0x55,0x91,0x11,0x11,0x12,0x12,0x14, //机0x00,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x12,0x12,0x12,0x0E,0x00,
0x20,0x20,0x20,0x20,0xFB,0x20,0x20,0x22,0x22,0x24,0x28,0x20,0x21,0x21,0x22,0x24, //协0x80,0x80,0x80,0x80,0xF0,0x90,0x90,0x98,0x94,0x92,0x92,0x90,0x10,0x10,0x50,0x20,
0x01,0x01,0x02,0x04,0x08,0x30,0xCF,0x00,0x00,0x7F,0x02,0x04,0x08,0x10,0x3F,0x10, //会
0x00,0x00,0x80,0x40,0x20,0x18,0xE6,0x00,0x00,0xFC,0x00,0x00,0x20,0x10,0xF8,0x08,
0x00,0x00,0xFC,0x04,0x05,0x49,0x2A,0x14,0x10,0x28,0x24,0x45,0x81,0x02,0x04,0x08, //欢
0x80,0x80,0x80,0xFC,0x04,0x08,0x40,0x40,0x40,0xA0,0xA0,0x10,0x10,0x08,0x04,0x02,
0x00,0x20,0x13,0x12,0x02,0x02,0xF2,0x12,0x12,0x12,0x13,0x12,0x10,0x28,0x47,0x00, //迎
0x00,0x80,0x3C,0x24,0x24,0x24,0x24,0x24,0x24,0xB4,0x28,0x20,0x20,0x20,0xFE,0x00,
0x08,0x08,0x08,0x11,0x11,0x32,0x34,0x50,0x91,0x11,0x12,0x12,0x14,0x10,0x10,0x10, //你
0x80,0x80,0x80,0xFE,0x02,0x04,0x20,0x20,0x28,0x24,0x24,0x22,0x22,0x20,0xA0,0x40,
0x03,0x1F,0x3C,0x70,0x6E,0xDA,0xD2,0xC0,0xC0,0xC8,0x6C,0x67,0x70,0x38,0x1E,0x07, //笑脸
0xF0,0xFC,0x1E,0x06,0x3B,0x6B,0x4B,0x03,0x03,0x13,0x33,0xE3,0x06,0x0E,0x18,0xF0, };
uchar tab1[NUM][32]={0};
bit account=0;
uchar count=0;
uchar code a[ ]= {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay_ms(unsigned int ms)
{
uchar j;
while(ms--)
for(j=0;j<123;j++);
}
void WriteByte(uchar dat)
{
uchar k;
SH_CP=0;
ST_CP=0;
for(k=0;k<8;k++)
{
DS=dat&0x01;
dat=dat>>1;
SH_CP=1;
_nop_();
_nop_();
SH_CP=0;
_nop_(); }
}
void display(uchar dat[][32])
{ uchar i;
for(i=0;i<16;i++)
{
WriteByte(dat[0][i]);
WriteByte(dat[0][i+16]);
if(i<8)
WriteByte(a[i]);
WriteByte(0xff);
}
else
{
WriteByte(0xff);
WriteByte(a[i-8]);
}
ST_CP=1;
_nop_();
ST_CP=0;
delay_ms(1);
}
}
void zzh() //将移动数据存在缓冲区
{ uchar i;
for(i=0;i<16;i++)
{
if((tab1[0][16+i]&0x80)==0)
{
tab1[0][i]=(tab1[0][i]<<1)&0xfe;
}
else
{
tab1[0][i]=(tab1[0][i]<<1)|0x01;
}
if(((count%16)<8)&&(tem<NUN))
{
account=tab[tem][i]&temp;
}
else if(((count%16)<16)&&(tem<NUN))
{
account=tab[tem][16+i]&temp;
}
else
{
account=0;
}
if(account==0)
{
tab1[0][16+i]=(tab1[0][16+i]<<1)&0xfe;
else
{
tab1[0][16+i]=(tab1[0][16+i]<<1)|0x01;
}
}
temp=(temp>>1)&0x7f;
if(temp==0x00)
{
temp=0x80;
}
}
void willseveral() //将缓冲区数都存为0x00 { uchar i,j;
for(i=0;i<NUM;i++)
for(j=0;j<32;j++)
{
tab1[i][j]=0x00;
}
}
void main()
{
willseveral();
while(1){
display(tab1);
delay_ms(50);
tem=count/16;
zzh();
count++;
if(count==(NUN+1)*16)
{
count=0;
}
}
}。