51单片机16X32LED点阵程序
- 格式:doc
- 大小:42.50 KB
- 文档页数:12
基于51单片机控制的16×16点阵显示C程序设计作者:付文莉谭琼来源:《读书文摘(下半月)》2018年第02期摘要:LED汉字显示屏到处可见,被广泛应用于各种公共场合,如公交车报站器,广告屏以及公告牌等。
本文详细介绍了采用C语言实现16X16点阵屏的控制方法。
关键词:单片机;C语言;16X16点阵单片机,又名单片微型计算机,主要由中央处理器(CPU)、存储器(RAM,ROM)、输入/输出端口(I/O口),定時器系统等组成。
而利用C语言程序设计控制的16X16点阵屏则更凸显出了单片机控制的便捷性和可操作性。
1 16X16点阵屏控制电路由于16X16点阵屏有16根行线和16根列线,在控制的时候,就需要单片机的32个I/O 口,为了节约单片机的端口,本次控制利用芯片74HC154芯片来实现。
74HC154芯片是4-16线译码器,该译码器可以将4个引脚扩展为16个引脚来使用,E1和E2引脚必须同为低电平时才能工作,其连接电路如图1所示。
2 16X16点阵屏C程序设计在字模软件中,每一个字都是由16行16列的点阵组成的,即国标汉子库中的每一个字均由256个点来表示,我们可以把每个点理解为一个像素,把每一个字的字形理解为一副图像。
由于单片机的总线为8位,所以在显示时,我采用74HC154输出的低电平扫描行,用单片机的8位端口分别控制左半屏和右半屏。
#include //包含头文件#define uint unsigned int#define uchar unsigned char#define hang P1 //定义行扫描#define lieg P3 //定义列的高八位数据#define lied P2 //定义列的低八位数据void delay(uint); //定义延时函数uchar code tab0[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; //定义行扫描数据uchar code tab1[]={/*-- 文字:校 --*//*-- 宋体12;此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x40,0x10,0x20,0x10,0x20,0x11,0xFE,0xFC,0x00,0x10,0x88,0x31,0x04,0x3A,0x02,0x54,0x88,0x50,0x88,0x90,0x50,0x10,0x50,0x10,0x20,0x10,0x50,0x10,0x88,0x13,0x06};void main() //主函数{uchar i;while(1){for(i=0;i{hang=tab0[i]; //扫描行lieg=tab1[2*i]; //送左半屏数据lied=tab1[2*i+1]; //送右半屏数据delay(1); //每行延时}}}void delay(uint x) //延时函数延时x X 0.5ms{uint i,j;for(i=0;ifor(j=0;j}运行上述程序,在Proteus仿真中,我们看到了显示的结果如图2所示。
点阵屏显示原理及实验详解讲解标题:LED点阵屏学习攻略共享资料LED点阵屏学习攻略在经历了将近一个学期断断续续的点阵屏学习后,最后终于在AVR平台下完成了128*32点阵屏的无闪烁显示。
现把整个学习过程总结如下:无论是51单片机还是AVR单片机,点阵屏的显示原理是一样的,所以首先从51讲起。
说明:以下所有试验如无特殊说明均在Keil uVision3 + Proteus 6.9 SP5下仿真完成。
一.基于51的点阵屏显示:(1)点亮第一个8*8点阵:1.首先在Proteus下选择我们需要的元件,AT89C52、74LS138、MATRIX-8*8-GREEN(在这里使用绿色的点阵)。
在Proteus 6.9中8*8的点阵总共有四种颜色,分别为MATRIX-8*8-GREEN,MATRIX-8*8-BLUE,MATRIX-8*8-ORANGE ,MATRIX-8*8-RED。
在这里请大家牢记:红色的为上列选下行选;其它颜色的为上行选下列选!而所有的点阵都是高电平选中列,低电平选中行!也就是说如果某一个点所处的行信号为低,列信号为高,则该点被点亮!此结论是我们编程的基础。
2.在选择完以上三个元件后,我们开始布线,具体如下图:这里P2是列选,P3连接38译码器后作为行选。
选择38译码器的原因:38译码器每次可输出相应一个I/O口的低电平,正好与点阵屏的低电平选中行相对,并且节省了I/O口,大大方便了我们的编程和以后的扩展。
3.下面让我们把它点亮,先看一个简单的程序:(将奇数行偶数列的点点亮,效果如下图)下面是源代码:/************8*8LED点阵屏显示*****************/#includevoid delay(int z) //延时函数{int x,y;for(x=0;x<z;x++)< p="">for(y=0;y<110;y++);}void main(){while(1){P3=0; //行选,选择第一行P2=0x55; //列选,即该行显示的数据delay(5); //延时/*****下同*****/P3=2; //第三行P2=0x55;delay(5);P3=4; //第五行P2=0x55;delay(5);P3=6; //第七行P2=0x55;delay(5);}}上面的程序实现了将此8*8点阵的奇数行偶数列的点点亮的功能。
课程设计题目:基于单片机的点阵电子显示屏设计(显示大学人民武装学院信息工程系)毕业论文(设计)原创性声明本人所呈交的毕业论文(设计)是我在导师的指导下进行的研究工作及取得的研究成果。
据我所知,除文中已经注明引用的容外,本论文(设计)不包含其他个人已经发表或撰写过的研究成果。
对本论文(设计)的研究做出重要贡献的个人和集体,均已在文中作了明确说明并表示意。
作者签名:日期:毕业论文(设计)授权使用说明本论文(设计)作者完全了解**学院有关保留、使用毕业论文(设计)的规定,学校有权保留论文(设计)并向相关部门送交论文(设计)的电子版和纸质版。
有权将论文(设计)用于非赢利目的的少量复制并允许论文(设计)进入学校图书馆被查阅。
学校可以公布论文(设计)的全部或部分容。
的论文(设计)在解密后适用本规定。
作者签名:指导教师签名:日期:日期:注意事项1.设计(论文)的容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
3.附件包括:任务书、开题报告、外文译文、译文原文(复印件)。
4.文字、图表要求:1)文字通顺,语言流畅,书写字迹工整,打印字体及大小符合要求,无错别字,不准请他人代写2)工程设计类题目的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技术标准规。
图表整洁,布局合理,文字注释必须使用工程字书写,不准用徒手画3)毕业论文须用A4单面打印,论文50页以上的双面打印4)图表应绘制于无格子的页面上5)软件工程类课题应有程序清单,并提供电子文档5.装订顺序1)设计(论文)2)附件:按照任务书、开题报告、外文译文、译文原文(复印件)次序装订基于单片机的点阵电子显示屏设计摘要:本文介绍了一款以单片机AT89S51为控制器的LED点阵显示屏系统的设计。
课题LED 16*16点阵的汉字显示专业:班级:姓名:学号:一、设计任务显示静止的汉字或者是滚动显示的汉字。
二、设计原理原理:点阵内部结构及外形如下,8X8点阵共由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置1电平,某一列置0电平,则相应的二极管就亮;所用到的单片机为8255和273,对单片机的简单介绍:8255单片机有A,B,C三个端口,都是8位的输入/输出锁存器,默认状态下为输出状态,还有控制口其地址为8003H。
8255有读写使能端口WR 和RD接受由CPU发来的控制信号,来判断是读还是写。
还有复位信号RESET。
本次实验基本上用到这些引脚。
对于273单片机主要用到它的端口地址0A000H。
连线方式为:●8255CS 接Y0,273CS 接Y2,●WR 接XWR,RD 接XRD,●A0 接XA0,A1接XA1,●RESET接RST, D0...D7接XD0...XD7三、设计所用软件与硬件16*16点阵的设计用到的硬件是电脑一台,8255单片机一个,273单片机一个。
所用到的软件是字模提取软件和单片机。
字模提取软件主要的功能就是将所要显示的汉字代码提取出来。
四、设计程序和代码程序为:#include<reg51.h>#include<absacc.h>#define PA XBYTE[0X8000H]#define PB XBYTE[0X8001H]#define PC XBYTE[0X8002H] //对单片机8255和273的#define PD XBYTE[0X8003H] //定义#define PE XBYTE[0XA000H] unsigned char code taa[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0 xff,0xff,0xff};unsigned char code tab[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0x fb,0xfd,0xfe}; //定义0的时候亮1的时候灭tbb[]={0xF0,0x00,0x1F,0x10,0x88,0x30,0x92,0x09,0x54,0x04,0x24,0x2 2,0x10,0x60,0xFF,0x11,0x10,0x28,0x38,0x64,0x58,0x20,0x94,0x11,0x92,0x08,0x11,0x06,0x90, 0x01,0x10,0x00} //’好’字的代码int x,i,j,k;void delayms(x){for(i=x;i>0;i--)for(j=10;j>0;j--);// 表示延时系统}void main(){PD=0x80; //对端口的初始化while(1){for(k=0;k<16;k++){PA=tbb[2*k];PB=tab[k];PC=tbb[2*k+1];PE=taa[k];delayms(3); //主程序}}}五、设计的优缺点设计的优点:本次设计是制作的静态的汉字,所编写的程序与代码简单易懂,适合于初级学员的理解与学习,在提取汉字的代码时直接用到的字模提取软件,很方便的就能获得其代码。
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]。
电子技术综合设计总结报告姓名:专业与班级:设计题目:16*16 LED汉字点阵系统设计起始时间: 2010 ~ 2011 学年第(1)学期第14 周~第 19 周指导教师:成绩:日期:一、系统的基本理论概述⏹1.1前言当今世界,电子技术迅猛发展,点阵式显示器件作为现代信息显示的重要媒体,在金融证券、体育、机场、交通、商业、广告宣传、邮电电信、指挥调度、国防军事等许多领域中得到了广泛应用。
因此点阵式显示器件的研制、生产也的到了迅速的发展,并逐步形成产业,成为光电子行业的新兴产业领域。
由于LED电子显示屏具有所显内容信息量大,外形美观大方,操作使用方便灵活.适用于火车,汽车站,码头,金融证券市场,文化中心,信息中心体育设施等公共场所。
该项目广泛涉及了计算机及电子技术中的电源技术、单片机技术、数据通讯技术、显示技术、存储技术、系统软件技术、接口及驱动等技术。
⏹1.2课题设计内容该电路系统是采用AT89C51单片机为控制器,控制点阵LED显示器进行显示,左移显示“百年矿大盛世华章”的内容。
⏹1.3设计目的1.使学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。
2.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
3.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。
4.培养学生从资料文献、科学实验中获得知识的能力。
5. 对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。
⏹1.4方案比较与选择:对于扫描LED点阵的方法有以下三种:(1)点扫描;(2)行扫描;(3)列扫描。
对于8*8的LED点阵而言:若使用第一种方式,其扫描频率必须大于16×64=1024Hz,周期小于1ms即可。
若使用第二和第三种方式,则频率必须大于16×8=128Hz,周期小于7.8ms即可符合视觉暂留要求。
51单片机并行口驱动LED数码管显示电路及程序介绍利用51单片机的一个并行口实现多个LED数码管显示的方法,给出了利用此方法设计的多路LED显示系统的硬件电路结构原理图和软件程序流程,同时给出了采用51汇编语言编写程序。
1 硬件电路多位LED显示时,常将所有位的段选线并联在一起,由一个8位I/O口控制,而共阴极点或共阳极点分别由另一个8位I/O口控制;也可采用并行扩展口构成显示电路,通常,需要扩展器件管脚的较多,价格较高。
本文将介绍一种利用单片机的一个并行I/O口实现多个LED显示的简单方法,图1所示是该电路的硬件原理图。
其中,74LS138是3线-8线译码器,74LS164是8位并行输出门控串行输入移位寄存器,LED采用L05F型共阴极数码管。
显示时,其显示数据以串行方式从89C52的P12口输出送往移位寄存器74LS164的A、B端,然后将变成的并行数据从输出端Q0~Q7输出,以控制开关管WT1~WT8的集电极,然后再将输出的LED段选码同时送往数码管LED1~LED8。
位选码由89C52的P14~P16口输出并经译码器74LS138送往开关管Y1~Y8的基极,以对数码管LED1~LED8进行位选控制,这样,8个数码管便以100ms的时间间隔轮流显示。
由于人眼的残留效应,这8个数码管看上去几乎是同时显示。
<51单片机并行口驱动LED数码管显示电路>2 软件编程该系统的软件编程采用MCS-51系列单片机汇编语言完成,并把显示程序作为一个子程序,从而使主程序对其进行方便的调用。
图2所示是其流程图。
具体的程序代码如下:<51单片机并行口驱动LED数码管显示程序>pic单片机驱动led数码管显示程序;*****该程序用于驱动led数码管显示,在8个LED数码管上依次显示数字1、2、3、4、5、6、7、8*******;**** 单片机学习网经典程序已测试,led数码管共阴和共阳不同请修改码值转换表部分LIST P=18F458INCLUDE "P18F458.INC";所用的寄存器XIANR EQU 0X20ORG 0X00GOTO MAINORG 0X30;****************以下为码值转换表******************** CONVERT ADDWF PCL,1RETLW 0XC0 ;0,显示段码与具体的硬件连接有关RETLW 0XF9 ;1RETLW 0XA4 ;2RETLW 0XB0 ;3RETLW 0X99 ;4RETLW 0X92 ;5RETLW 0X82 ;6RETLW 0XD8 ;7RETLW 0X80 ;8RETLW 0X90 ;9RETLW 0X88 ;ARETLW 0X83 ;BRETLW 0XC6 ;CRETLW 0XA1 ;DRETLW 0X86 ;ERETLW 0X8E ;FRETLW 0X7F ;"."RETLW 0XBF ;"-"RETLW 0X89 ;HRETLW 0XFF ;DARKRETURN;**************初始化子程序*****************INITIALBCF TRISA,5 ;置RA5为输出方式,以输出锁存信号BCF TRISC,5BCF TRISC,3 ;设置SCK与SDO为输出方式BCF INTCON,GIE ;关闭所有中断MOVLW 0XC0MOVWF SSPSTAT ;设置SSPSTAT寄存器MOVLW 0X30MOVWF SSPCON1 ;设置SPI的控制方式,允许SSP方式,并且时钟下降;沿发送数据,与"74HC595当其SCLK从低到高电平;跳变时,串行输入数据(DI)移入寄存器"的特点相对应MOVLW 0X11 ;显示值寄存器赋初值,每个值占两个字节,MOVWF XIANR ;从8开始显示RETURN ;返回;***************led数码管显示子程序******************;SPI发送显示子模块DISPLAYTRANSMIT CLRF PORTA ;LACK送低电平,为锁存做准备MOVWF SSPBUF ;启动发送WAITBTFSS PIR1,SSPIFGOTO WAIT ;等待发送结束BCF PIR1,SSPIF ;清除中断标志NOPBSF PORTA,5 ;最后给一个锁存信号,代表一显示任务完成RETURN;*****************pic单片机驱动led显示程序的主程序开始*************** MAIN NOPCALL INITIAL ;调用系统初始化子程序LOOP MOVF XIANR,WCALL CONVERT ;查出XIANR的显示段码值CALL DISPLAYDECF XIANRDECF XIANR ;显示值减2,因为按字存放,按字节读取MOVF XIANR,WSUBLW 0X01BTFSS STATUS,ZGOTO LOOP ;若送完显示的数,则退出显示HERE GOTO HEREENDC语言源程序如下:/*************************************************程序名称:8位数码管移位显示0-F简要说明:使用共阳型数码管P0口输出数码管段码,P2口输出数码管位码编写:时间:2008-8-21*************************************************/#include<reg51.h>#define uchar unsigned char#define uint unsigned int#define duan P0 //定义段码输出#define wei P2 //定义位码输出uchar a=0,b=0; //全局变量。
课程设计题目4个8x8点阵LED电子显示屏的设计学院物流学院专业物流工程班级物流ZY1001姓名宋金龙指导教师朱宏辉2013 年 6 月25 日摘要本设计是基于MCS-51的16x16点阵LED电子显示屏的设计,16x16的点阵共有256个发光二极管,我们采用动态扫描的显示方法,更节省锁存器也就节省了成本。
扫描驱动电路就可以实现多行(比如16行)的同名列共用一套驱动器。
具体就16x16的点阵来说,把所有同1行的发光管的阳极连在一起,把所有同1列的发光管的阴极连在一起(即我们采用共阳极的接法)。
采用扫描方式进行显示时,每一行和每一列都有一个行驱动器和列驱动器,各行的同名列和各列的同名行共用一个驱动器。
我们采用四个74LS273锁存器。
显示数据通常存储在单片机的存储器中,按8位一个字节的形式顺序排放。
编写点阵显示程序,利用proteus画出电路原理图并装入程序仿真调试,仿真成功后完成电路焊接并装入程序完成实物设计。
整个设计过程让我们学到许多实践知识!LED显示屏作为一种新型的显示器件,是由多个发光二极管按矩阵形式排列封装而成,通常用来显示时间、图文等信息,由点阵LED组成的汉字显示屏在工工程所应用非常广泛。
LED显示屏显示画面色彩鲜艳,立体感强,静如油画,动如电影,广泛应用于车站、码头、机场、商场、医院、宾馆、银行、证券市场、建筑市场、拍卖行、工业企业管理和其它公共场所。
在实际应用中的显示屏由于成本和可靠性的因素常采用一种称为动态扫描的显示方法。
本文设计的是一个室内用16x16的点阵LED图文显示屏,图形或文字显示有静止、移入移出等显示方式。
本设计是基于MCS-51单片机的16x16显示屏,其中包含了硬件、软件、调试等方案的设计。
此外、该设计只需简单的级联就能实现显示屏的扩展,但级联时要注意不要超过驱动负载范围。
关键字:LED,点阵式,显示屏,AT89C51武汉理工大学《单片机课程设计》报告目录摘要 (2)第一章:绪论 (1)1.1掌握单片机应用系统的一般过程和方法 (1)1.2:设计要求 (1)第二章:硬件电路的设计 (1)2.1设计思路 (1)2.2实验器材 (1)2.2.1 锁存器74LS273介绍 (2)2.3硬件电路设计框图 (2)2.4 16*16点阵LED显示器汉字显示的工作原理 (3)2.5 如何将4片8x8的LED拼接成一片16x16的LED显示屏(显示屏的扩展) (5)2.6 点阵LED显示器与单片机的接口 (6)第三章:系统软件设计 (8)第四章:系统程序设计 (9)ORG 0000H (10)总结: (24)参考文献: (26)附:元件清单及仿真图 (27)武汉理工大学《单片机课程设计》实验报告第一章:绪论1.1掌握单片机应用系统的一般过程和方法综合运用单片机原理与接口技术课程和其它有关先修课程的理论及方法,分析和解决单片机应用系统的设计、分析和实验开发等相关问题,进一步巩固和加深对所学知识的理解。
51单片机16X32LED点阵程序#include<REG52.H>#include "intrins.h"#define uchar unsigned char#define uint unsigned int#define light 3 //定义亮度/*****************************接口定义******************************* */sbit SHCP=P1^6;//595的移位信号sbit STCP=P1^5;//是595的锁存信号 /*如果用的是普通单片机没有P4.1口请改为其他口*/sbit SDA_R=P3^6;//红数据sbit SDA_G=P1^4;//绿数据sbit OE=P1^7;//输出使能sbit IA=P1^0;//行控制线A /*如果用的是普通单片机没有P4.0口请改为其他口*/sbit IB=P1^1;//行控制线Bsbit IC=P1^2;//行控制线Csbit ID=P1^3;//行控制线Dsbit Speek=P2^3;//蜂鸣器/******************************************************************** /#define scan0 {IA=0;IB=0;IC=0;ID=0;}#define scan1 {IA=1;IB=0;IC=0;ID=0;}#define scan2 {IA=0;IB=1;IC=0;ID=0;}#define scan3 {IA=1;IB=1;IC=0;ID=0;}#define scan4 {IA=0;IB=0;IC=1;ID=0;}#define scan5 {IA=1;IB=0;IC=1;ID=0;}#define scan6 {IA=0;IB=1;IC=1;ID=0;}#define scan7 {IA=1;IB=1;IC=1;ID=0;}#define scan8 {IA=0;IB=0;IC=0;ID=1;}#define scan9 {IA=1;IB=0;IC=0;ID=1;}#define scan10 {IA=0;IB=1;IC=0;ID=1;}#define scan11 {IA=1;IB=1;IC=0;ID=1;}#define scan12 {IA=0;IB=0;IC=1;ID=1;}#define scan13 {IA=1;IB=0;IC=1;ID=1;}#define scan14 {IA=0;IB=1;IC=1;ID=1;}#define scan15 {IA=1;IB=1;IC=1;ID=1;}uchar Move,Speed,line; //(移位速度行 ) 定义uint zimuo; //字模计数器uint uiAllData;uchar BUFF[10]; //缓存void DelayMs(void); // 延时void in_data(); // 调整移动数据void rxd_data(); // 发送移动数据const uchar code hanzi[];/******************************************************/ /*****不影响其他端口的扫描*************************/ void scan(unsigned char Value){switch(Value){case 0: scan0;break;case 1: scan1;break;case 2: scan2;break;case 3: scan3;break;case 4: scan4;break;case 5: scan5;break;case 6: scan6;break;case 7: scan7;break;case 8: scan8;break;case 9: scan9;break;case 10:scan10;break;case 11:scan11;break;case 12:scan12;break;case 13:scan13;break;case 14:scan14;break;case 15:scan15;break;default:break;}}/**************************延时***********************/ /*void Delay1ms(unsigned int tima){unsigned int a,b;for(a = tima; a > 0; a--)for(b = 110; b > 0; b--);}*//********************************************/ void Delay_15us(unsigned int time){do{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}while(--time);}/*主函数*/void main(){Move=0;zimuo=0;while(1){//利用sizeof()语句运算字幕有效数据的总数;while(zimuo<uiAllData)//2048)//定义显示字幕数据的长度 2048/32=64 即显示完64个16*16大小的字符后重新循环{for(Move = 0;Move<16;Move++)//数据移位。
{for(Speed=0;Speed<10;Speed++) //移动速度控制{for(line=0;line<16;line++){in_data();//调整移动数据rxd_data(); //装载移动数据scan(line); //输出行扫描STCP=1;//锁存STCP=0;OE=0;//打开屏使能端//Delay1ms(1);//延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象。
//DelayMs();_nop_();_nop_();_nop_();_nop_();_nop_();Delay_15us(6);OE=1;}} //移动一步}zimuo=zimuo+32; //换下一个字}zimuo=0;}}/**********************************************************/void in_data(void) //调整数据一个屏4个字的数据{char s;for(s=4;s>=0;s--) //一个屏能显示4个字取最前面的字发送给595的最前面{//zimuo 是个计算显示到哪个字的计数器 s是取4个字的循环 line是显示到哪一行根据这几个参数计算出一个屏中现在需要显示的数据放入BUFF 内存中等待发送给595BUFF[2*s+0]=hanzi[zimuo+0+32*s+2*line];//要知道为什么这么算就需要知道取模的方向和原理一行有8个字节 (一个中文16*16的字一行有2个字节)BUFF[2*s+1]=hanzi[zimuo+1+32*s+2*line];//把一个字的首字节放入BUFF[0]中后面一个字节放入BUFF[1] 以此类推剩下的3个字}}/***********************发送移动的数据****************************/void rxd_data(void) //串行发送数据{uchar s;uchar inc,tempyid,temp;if(Move<8)inc=0;elseinc=1;for(s=0+inc;s<4+inc;s++) //发送4字节数据{if(Move<8)tempyid=Move;elsetempyid=Move-8;temp=(BUFF[s]<<tempyid)|(BUFF[s+1]>>(8-tempyid));//h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的数据。
temp=255-temp;//temp1=(BUFF1[s]>>tempyid)|(BUFF1[s+1]<<(8-tempyid));//h1左移tempyi d位后和h2右移8-tempyid相或,取出移位后的数据。
//temp1=255-temp1;ACC = temp;//if(zimuo <104) //当显示完512/32=16个字后变绿色显示//{SDA_G=1;/* for(k=0;k<8;k++)//一个字节8位发送给595{SHCP=0; //上升沿移位595SDA_R=(bit)(temp&0x01);//通过IO口送一个位给 595temp=temp>>1; //字节移位准备送下一位SHCP=1;}*///}SHCP = 0; ACC <<= 1; SDA_R = CY; SHCP = 1;SHCP = 0; ACC <<= 1; SDA_R = CY; SHCP = 1;SHCP = 0; ACC <<= 1; SDA_R = CY; SHCP = 1;SHCP = 0; ACC <<= 1; SDA_R = CY; SHCP = 1;SHCP = 0; ACC <<= 1; SDA_R = CY; SHCP = 1;SHCP = 0; ACC <<= 1; SDA_R = CY; SHCP = 1;SHCP = 0; ACC <<= 1; SDA_R = CY; SHCP = 1;SHCP = 0; ACC <<= 1; SDA_R = CY; SHCP = 1;}}//取模说明: 取模软件用PC2002 资料包里有直接打开即可用配置请看此程序目录下的"配置图片"//const uchar code hanzi[]={/*移动显示汉字字模,*///移动显示汉字0x90,0x00,0x90,0x01,0x88,0x20,0xC8,0x7F,0x44,0x20,0x2C,0x12,0x16,0x02, 0x45,0x0A,0xC4,0x12,0x44,0x12,0x24,0x22,0x24,0x62,0x14,0x22,0x84,0x02,0x04,0x01, 0x00,0x00,/*"你",6*/0x40,0x00,0x40,0x00,0xFE,0x7F,0x20,0x00,0x20,0x00,0x10,0x02,0x18,0x02, 0xE8,0x3F,0x0C,0x02,0x0A,0x02,0x09,0x02,0x08,0x02,0x08,0x02,0xE8,0x7F,0x08,0x00, 0x00,0x00,/*"在",7*/0xE0,0x7B,0x4F,0x4A,0x49,0x2A,0x49,0x2A,0xE9,0x2B,0x49,0x1A,0x49,0x2A, 0xF9,0x2B,0x49,0x4A,0x4F,0x4A,0x29,0x4A,0x20,0x5A,0x10,0x2A,0x88,0x0A,0x04,0x09, 0x00,0x00,/*"哪",8*/0xFC,0x1F,0x84,0x10,0x84,0x10,0x84,0x10,0xFC,0x1F,0x84,0x10,0x84,0x10, 0xFC,0x1F,0x80,0x00,0x80,0x00,0xFC,0x1F,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F, 0x00,0x00,/*"里",9*/0x60,0x02,0x1C,0x0A,0x10,0x12,0x10,0x12,0x10,0x02,0xFF,0x7F,0x10,0x02, 0x10,0x12,0x70,0x14,0x1C,0x0C,0x13,0x04,0x10,0x0A,0x90,0x49,0x10,0x50,0x14,0x60, 0x08,0x40,/*"我",10*/0x80,0x00,0x80,0x00,0xFC,0x3F,0x80,0x00,0x90,0x0C,0xA0,0x04,0xC0,0x02, 0xFE,0x7F,0x80,0x01,0xC0,0x02,0xA0,0x04,0x90,0x18,0x8C,0x70,0x83,0x20,0x80,0x00, 0x80,0x00,/*"来",11*/0x00,0x00,0xFE,0x3F,0x00,0x18,0x00,0x06,0x80,0x01,0x80,0x00,0x80,0x00, 0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00, 0x40,0x00,/*"了",12*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00, 0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,/*"!",13*/};uint uiAllData = sizeof( hanzi )-128;。