LED点阵屏左移

合集下载

点阵显示左移和不动程序

点阵显示左移和不动程序

×点阵显示左移和不动程序显示左移的程序(串行送数据)#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define SCAN P2 //行驱动接到P2sbit SHCP=P1^0; //595 CLKsbit STCP=P1^1; //595 STRsbit DR=P1^2; //红色sbit DG=P1^3; //绿色sbit ENT=P1^4; //595 OE/Guint word; //字模计数器uchar move; //列指针uchar line; //行指针uchar speed=10; //设定移动速度uchar BUF[12]; //缓存数组uchar code disp[]; //字模数组/********************装载一线点阵数据********************/ void loadline(){uchar s;for(s=0;s<5;s++) //s为要显示的字数+1{BUF[2*s]=disp[word+32*s+2*line];BUF[2*s+1]=disp[word+1+32*s+2*line];}}/********************发送一线移动数据********************/ void sendline(){char s,p;uchar inc,k,j;if(move<8)inc=0;else inc=1;for(s=0+inc;s<=7+inc;s++){if(move<8)j=move;else j=move-8;k=(BUF[s]<<j)|(BUF[s+1]>>(8-j)); //字模左边字节左移j位,右边字节右移j位,2者相或for(p=0;p<8;p++){ DR=(k&0x80); //选择红色显示SHCP=0; //595时钟信号,产生脉冲SHCP=1;k<<=1;//左移一位}}}void main(){char s;uint k;uchar i,y=0;move=0;word=0;ENT=0;ENT=1; //清屏while(1){while(word<448) //(4+10)*32=448{while(move<16) //数据移位{for(i=0;i<speed;i++) //移动速度{for(line=0;line<16;line++) //行扫描{loadline(); //装载一线点阵数据sendline(); //发送一线移动数据SCAN=line; //显示第line行STCP=1; //锁存为高,595锁存信号STCP=0;}}move++; //移动一步(一位)}move=0;word=word+32; //下一个字}word=0;}}uchar code disp[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/*前面四字位置空白显示*/0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/////////////////////////////////////////////////////////////////////////////////* (16 X 16 , 宋体)*/0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0x00,0x01,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFD,0x7F,0xFB,0xBF,0xF7,0xDF,0xEF,0xEF,0xDF,0xF7,0xBF,0xFB,0xFF,0xFF,/*"大",8*//* (16 X 16 , 宋体)*/0xFE,0xFF,0xFE,0xFF,0x00,0x01,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0x80,0x03,0xFF,0xFF,0xFF,0xFF,0xE0,0x0F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xE0,0x0F,0xFF,0xFF,0xFF,0xFF,/*"吉",9*//* (16 X 16 , 宋体)*/0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0x00,0x01,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFD,0x7F,0xFB,0xBF,0xF7,0xDF,0xEF,0xEF,0xDF,0xF7,0xBF,0xFB,0xFF,0xFF,/*"大",10*//* (16 X 16 , 宋体)*/0xFF,0xFD,0xF8,0x7D,0xC3,0xFD,0xFB,0xED,0xFB,0xED,0x80,0x6D,0xFB,0xED,0xFB,0xED,0xF1,0xED,0xEA,0xED,0xDB,0x6D,0xBB,0xAD,0xFB,0xFD,0xFB,0xF5,0xFB,0xF9,0xFF,0xFF,/*&q uot;利",11*//* (16 X 16 , 宋体)*/0xEF,0xFF,0xF7,0x81,0x80,0xBF,0xDD,0xBF,0xEB,0xBF,0x00,0x81,0xF7,0xB7,0xF7,0xB7,0x00,0xB7,0xF7,0xB7,0xE3,0xB7,0xD5,0xB7,0xB6,0xB7,0xE7,0xB7,0xF7,0xB7,0xFF,0xFF,/*&qu ot;新",12*//* (16 X 16 , 宋体)*/0xF7,0xFF,0xF0,0x03,0xF7,0x7F,0xEF,0x7F,0xDF,0x7F,0xB0,0x07,0x77,0x7F,0xF7,0x7F,0xF7,0x7F,0xF7,0x7F,0x00,0x00,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0xFF,/*"年",13*//* (16 X 16 , 宋体)*/0xEF,0xBF,0xEF,0xBF,0xEF,0xBF,0xC4,0x03,0xAB,0xBB,0x6D,0xBB,0xEF,0xBB,0xE8,0x00,0xEF,0xBF,0xEF,0xBF,0xEF,0xBF,0xEF,0x5F,0xEE,0xEF,0xED,0xF7,0xEB,0xFB,0xEF,0xFF,/*"快",14*//* (16 X 16 , 宋体)*/0xFF,0xFF,0xE0,0x07,0xEF,0xFF,0xEF,0x7F,0xEF,0x7F,0xEF,0x7F,0xE0,0x03,0xFF,0x7F,0xFF,0x7F,0xFB,0x6F,0xF7,0x77,0xEF,0x7B,0xDF,0x7D,0xBD,0x7E,0xFE,0xFF,0xFF,0xFF,/*"乐",15*//* (16 X 16 , 宋体)*/////////////////////////////////////////////////////////////////////////////////0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,/*结束后面五字空白显示*/0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,};显示不动(静态显示)的程序(串行送数据)#include "reg52.h"#define uchar unsigned char#define uint unsigned intvoid Keyscan (void); //修改参数按键扫描子程序void Sendping(); //发送半屏子程序sbit CLK =P1^0 ; //74HC595移时钟sbit STB =P1^1 ; // 74HC595锁存信号sbit Red=P1^2 ; //红色数据输出引脚低电平有效sbit Greed=P1^3; //全屏控制使能0,低电平有效sbit EN = P1^4; //全屏使能uchar SendData; //要发送的数据变量uchar shuzu1; //数组一维变量uchar shuzu2; //数组二维变量uchar hang; //行扫描变量(半屏只有16行,所以hang=0到15)void delay(){uint i;for(i=0;i<40;i++);}uchar code data1[8][32]={{//圣[16*16]横排0x00,0x00,0x3F,0xF8,0x10,0x10,0x0C,0x60,0x02,0x80,0x01,0x00,0x02,0xC0,0x0C,0x30,0x31,0x0E,0xC1,0x24,0x1F,0xF0,0x01,0x00,0x01,0x00,0x01,0x04,0xFF,0xFE,0x00,0x00}, {//诞[16*16]横排0x00,0x08,0x40,0x1C,0x2F,0x70,0x21,0x10,0x02,0x10,0x04,0x10,0xEF,0x5C,0x21,0x50,0x29,0x50,0x25,0x50,0x22,0x50,0x2A,0x7C,0x33,0x00,0x24,0x80,0x08,0x46,0x10,0x3C}, {//快[16*16]横排0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x88,0x5B,0xFC,0x54,0x88,0x50,0x88,0x90,0x88,0x10,0x88,0x1F,0xFE,0x10,0x80,0x11,0x40,0x11,0x20,0x12,0x10,0x14,0x0E,0x18,0x04}, {//乐[16*16]横排0x00,0x20,0x00,0xF0,0x1F,0x00,0x10,0x00,0x11,0x00,0x11,0x00,0x21,0x04,0x7F,0xFE,0x01,0x00,0x01,0x00,0x09,0x20,0x09,0x10,0x11,0x08,0x21,0x0C,0x45,0x04,0x02,0x00}, };//------------------------------------//----------字发送子程序-----------void SendByte(void){uchar m;for(m=0;m<8;m++){CLK = 0;Red = !(SendData & 0x80); //红屏显示Greed = !(SendData & 0x80); //红屏显示SendData =SendData<<1;CLK = 1; //移位时钟上升沿}}//-----------------------------------//----------行扫描子程序-------------void RowsCan(void){if (hang>=16){hang =0x00;}P2= P2 & 0xf0;P2= P2 | hang;hang++;}void SendHang(void){uchar m2,shuzu;shuzu = shuzu1*4; //一维数组变量参数传给数组变量EN=1;for(shuzu=0;shuzu<4;shuzu++){for(m2 =0;m2<2;m2++){SendData = data1[shuzu][shuzu2+m2];SendByte();}}STB = 0;STB = 1; //上升沿数据锁存RowsCan(); //行扫描EN = 0;delay();}//---------------------------------------//----------发送一屏数据-----------------void Sendping(void){SendHang();shuzu2++ ;shuzu2++ ;if(shuzu2 ==32) { shuzu2 =0;}}void initial(void){EN = 1;Red = 1;Greed = 1;SendData = 0x00;hang = 0x00;}//;---------主程序循环-------------- void main(){initial();while(1){Sendping();}}。

点阵左移显示原理

点阵左移显示原理

点阵左移显示原理点阵左移显示是一种常见的显示技术,它通过依次改变点阵中的像素点的亮灭状态,从而实现图像或文字的左移显示效果。

这种显示原理广泛应用于LED显示屏、数码显示器、液晶显示屏等各种显示设备中。

点阵左移显示的原理可以简单描述为以下几个步骤:1. 初始化点阵:首先,需要初始化一个点阵图形,点阵是由一系列的像素点组成的矩阵,每个像素点可以表示亮或暗两种状态。

在左移显示之前,需要将点阵图形加载到显示设备的内存中。

2. 移动像素点:接下来,通过改变点阵中像素点的亮灭状态,实现图像或文字的左移显示效果。

通常,左移显示是通过逐列移动像素点来实现的。

首先,将第一列的像素点向左移动一位,然后将第二列的像素点向左移动一位,依次类推,直到将最后一列的像素点向左移动一位。

这样,整个点阵图形就向左移动了一列。

3. 刷新显示:左移显示过程中,需要不断地刷新显示设备的屏幕,以及时显示点阵图形的变化。

刷新显示可以通过改变像素点的亮灭状态来实现,当像素点从暗变为亮时,显示设备对应的像素点会显示出亮的状态;当像素点从亮变为暗时,显示设备对应的像素点会显示出暗的状态。

通过逐列移动像素点并及时刷新显示,就能够实现图像或文字的左移显示。

点阵左移显示原理的关键在于对像素点的控制。

在点阵中,每个像素点都有一个对应的控制电路,通过改变控制电路的状态,可以改变对应像素点的亮灭状态。

常见的控制电路有两种:共阳极(CA)和共阴极(CC)。

在共阳极的控制电路中,当控制电路为低电平时,对应像素点亮;当控制电路为高电平时,对应像素点暗。

而在共阴极的控制电路中,当控制电路为高电平时,对应像素点亮;当控制电路为低电平时,对应像素点暗。

通过控制每个像素点的控制电路,就可以实现点阵左移显示的效果。

点阵左移显示技术具有很多优点。

首先,它可以实现高度可视化的显示效果,使得图像或文字更加生动鲜明。

其次,它具有较低的成本和较高的可靠性,适用于各种规模和类型的显示设备。

led点阵滚动显示原理

led点阵滚动显示原理

led点阵滚动显示原理
Led点阵滚动显示的原理是通过控制各个LED灯的亮灭来显
示出特定的图像或文字。

在点阵显示屏上,每个LED灯都代
表一个像素点,通过同时开启或关闭多个LED灯,可以组合
成不同的形状和图案。

滚动显示是通过逐个像素点的变化来实现的。

首先,需要将要显示的文字或图像通过编程转化为一个个点阵的位图,其中每个点代表一个LED灯的亮灭状态。

然后,通过定时器或者其
他时钟信号,控制LED灯按照一定的顺序进行刷新。

具体的滚动显示过程如下:首先,显示屏幕上的LED点阵全
部熄灭;然后,按照事先设定好的顺序,逐个点亮LED灯,
形成一个移动的图像或文字;接着,根据设定的显示速度和滚动方向,将已显示的LED灯逐个熄灭,并同时点亮下一个需
要显示的LED灯,如此循环往复,直至显示完整个图像或文字。

通过不断地重复上述的点亮和熄灭过程,使得LED点阵显示
屏上的图像或文字能够以滚动的方式连续变化,从而实现了滚动显示效果。

需要注意的是,在滚动显示的过程中,需要保持刷新频率足够高,以确保人眼不能察觉到每个LED灯的亮灭变化,从而产
生流畅的滚动效果。

此外,还需要合理设计点亮和熄灭的顺序,以及滚动的速度和方向,以适应不同的显示要求和观看效果。

16×16点阵汉字设计-左移-右移-翻页-上移-下移-多种方式

16×16点阵汉字设计-左移-右移-翻页-上移-下移-多种方式

一、设计依据16x16点阵需要32个驱动,分别为16个列驱动及16个行驱动。

每个行与每个列可以选中一个发光管,共有256个发光管,采用动态驱动方式。

每次显示一行后再显示下一行。

本设计是利用实验仪上的16×16 LED点阵显示器,编写显示英文、汉字字符程序并进行显示,最好能移动显示。

要求在本设计过程中,通过设计合适的硬件电路及对应的软件,实现上述的控制过程,同时写出合格的课程设计说明书。

二、要求及主要内容1.硬件电路设计(1)完成89C51应用系统设计(晶振电路,上电复位电路等)(2)利用单片机I/O口或以扩展锁存器的方式控制点阵显示。

掌握单片机与16×16点阵块之间接口电路的设计方法。

2.程序设计掌握单片机与16×16点阵块之间接口电路的设计方法及编程要求完成主程序的设计及对应的子程序设计。

3.选芯片, 元件按设计连线4.完成子程序调试5.完成总调试三、途径和方法综合运用单片机和电子电路相关知识,实现本次设计。

进行程序设计时先画流程图再进行程序设计。

子程序调试按以下步骤进行:(1)实验板与PC机联机。

(2)利用实验系统16×16点阵实验单元,以两种方式控制点阵显示。

要求编制程序实现汉字点阵循环显示。

点阵时钟摘要LED点阵显示屏是利用发光二极管点阵模块或像素单元组成的平面式显示屏幕。

它具有发光效率高、使用寿命长、组态灵活、色彩丰富以及对室内外环境适应能力强等优点。

并广泛的应用于公交汽车,码头,商店,学校和银行等公共场合的信息发布和广告宣传。

LED显示屏经历了从单色,双色图文显示屏到现在的全彩色视频显示屏的发展过程,自20世纪八十年代开始,LED显示屏的应用领域已经遍布交通、电信、教育、证券、广告宣传等各方面。

LED点阵显示屏可以显示数字或符号,通常用来显示时间、速度、系统状态等。

文章给出了一种基于MCS-51单片机的16×16 点阵LED显示屏的设计方案。

单片机处理LED点阵书写屏图像拖移方法

单片机处理LED点阵书写屏图像拖移方法
形 ,并 能将 拖 移 过 的轨 迹 消 除 ,恢 复 原 图形 的功 能设计 方法 构思 及相 应程序 。
的处 理 、对 圈 内图 像 坐标 点 的处 理 和 显 示 图像数 1 图像 圈定 点 的处 理 :把 圈上 的 点 按 照 行 )对
进 行排 序 ,取 出列 坐 标的最 大值 和最 小值 。
单片机 处理 图像拖移 的详 细方法 和相 关程序 ,该 程序结 构简 单 ,实用性 、可读 性强 ,可使 用 量大且不定 量的数据处 理编程 。
关键词 : 动态数组 ;指针 ;图像拖移 ;单片机 中图分类号 :T 3 2 1 P0 . 文献标识码 :A 文章编号 :1 0-0 ( 0 1 1 - -o3 -0 9 1 4 2 1 ) (I 0 3 ) l5 3
2 )对 圈 内图 像 坐 标 点 的处 理 :上 一 步取 出的
行 和列 坐 标 的最 大值 和 最小 值 可 以构成 一 个矩 形 , 把矩 形 内的地 址进 行坐 标化并 存入 数组 。
3 )显示 图 像 数 据移 动 :上 述两 步 执 行 后 ,光
笔触 及屏 上 的第一 点 (l 1 x ,y )定为基 准 点 ,第二 点 (2 2 x , )为 结 束 点 ,随 着光 笔移 动 ,而 前 面 被 y
睁 _ 叫 争 争 一 ∈

《 一— } @_ - 《 . — r . @一r 1 @ r 日 r {
@ @ @ ・@ — H { @ { @ r 『 r r 卜 @ @ @ ・@ 一0 }@ ‘ ・@ r 『 f r F
争 Ct 一 — —一■叫f — +l一 ④一 『 _ 粤 @
圈 中 的 点跟 随基 准 点移 动 ,当单 片机 处 理 速 度 比

LED点阵屏左移

LED点阵屏左移
//*********************************************************************************
//***********横向取模,左边为高位*****************
//***********每个汉字共32字节*********
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//*******************************以上字码用作黑屏**********************************
}
}
/*******************发送一行的子函数************************/
void sendoneline(void)
{char s;uchar inc;
if(col<8)inc=0;else inc=1;
for(s=0+inc;s<=15+inc;s++) //s=2*要显示的数字-1
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
sbit temp10=temp1^0;
sbit temp11=temp1^1;
sbit temp12=temp1^2;

LED点阵显示控制概述

LED点阵显示控制概述

LED点阵显示控制概述引言LED点阵显示控制是一种常用的电子显示技术,广泛应用于各种数字显示、文本滚动、图形展示等领域。

本文将介绍LED点阵显示控制的基本原理、常见的控制方案以及应用场景等内容。

基本原理LED点阵显示的结构LED点阵显示由多个LED单元组成,每个单元都有一个发光二极管(LED)和驱动电路。

LED点阵显示通常以矩阵的形式排列,每个单元都有一个行和列的编号。

LED点阵显示的控制方式LED点阵显示的控制方式主要有共阳极和共阴极两种。

在共阳极的控制方式下,LED点阵的阳极被连接在一起,而各个LED的阴极则分别与控制芯片相连,通过控制芯片输出高电平来点亮LED。

在共阴极的控制方式下,LED点阵的阴极被连接在一起,而各个LED的阳极则分别与控制芯片相连,通过控制芯片输出低电平来点亮LED。

LED点阵显示的扫描方式为了实现对LED点阵显示的控制,扫描方式是至关重要的。

常见的扫描方式有静态扫描和动态扫描两种。

静态扫描是指同时点亮LED点阵中的多个LED,通常需要较多的I/O口和驱动电源。

动态扫描是指按照一定的顺序逐个点亮LED点阵中的每个LED,通过快速的扫描频率,人眼无法感知到灯的闪烁,从而实现高质量的显示效果。

常见的控制方案单片机控制单片机是一种集成了处理器、存储器、输入/输出接口以及定时器等功能的芯片。

通过连接适当的驱动电路,单片机可以实现对LED点阵显示的控制。

单片机控制具有灵活性高、成本低等优点,广泛应用于各种小型嵌入式系统中。

MAX7219芯片控制MAX7219芯片是一种专用的点阵驱动控制芯片,可以同时控制多个LED点阵显示。

它采用串行通信方式与控制器连接,通过输入特定的控制指令,控制LED点阵的亮灭状态和显示内容。

MAX7219芯片控制具有简单、稳定的特点,被广泛应用于各种数字显示和文本滚动等场合。

FPGA控制FPGA(Field Programmable Gate Array)是一种可编程逻辑器件,具有较高的灵活性和可扩展性。

32×64双色点阵屏左移显示32×32汉字的方法与C51程序

32×64双色点阵屏左移显示32×32汉字的方法与C51程序
0x00,0x06,0x07,0xFF,0x07,0xFF,0x00,0x1C,0x00,0x18,0x3F,0xFF,0x3F,0xFF,0x00,0x70,
0x00,0xE0,0x03,0xC3,0x07,0x83,0x1E,0xC3,0x3D,0xE3,0x18,0xE3,0x00,0x63,0x00,0x03,
{
uchar temp,tempcol;//输出变量;列移动位数变量。
if(col<8) tempcol=col;
else tempcol=col-8;
temp=(h1<<tempcol)|(h2>>(8-tempcol));
temp=255-temp;
return temp;//将显示数据返回显示输出函数。
void sendoneline(void)//输出显示数据函数
{
char s;uchar inc;
if(col<8)inc=0;else inc=1;
for(s=7+inc;s>=inc;s--)
{
SBUF=two_onebyte(BUFF[s],BUFF[s+1]);while(!TI);TI=0;
0x00,0x00,0xFF,0xE0,0xFF,0xE0,0x00,0x00,0x00,0x00,0xFF,0xFC,0xFF,0xFC,0x0E,0x00,
0x07,0x00,0x83,0x80,0x81,0xE0,0x80,0xFC,0x86,0x38,0x8E,0x08,0x8C,0x00,0xF8,0x00,
}
}
/*********************************************************************************

LED点阵显示仿真----由浅入深之8X8,16X16,24X24LED点阵流动显示

LED点阵显示仿真----由浅入深之8X8,16X16,24X24LED点阵流动显示

一直以来,对LED点阵显示很感兴趣,特别是流动点阵显示。

论坛里有不少例子,效果都不是很满意。

于是,自己动手。

先试作了8X8点阵。

8X8的点太少,只适合数字显示,从0 ~9流动,效果还不错。

有了8X8的经验,对流动显示的原理已经了解,又试了16X16的,觉得也不难。

但16X16的点仍嫌少了,又做了个24X24的,汉字漂亮。

动画可能效果差些,软件运行显示效果好多了。

8X8初学点阵仿真,常点不亮LED 。

首先,可能是点阵的极性没有正确的接线。

下面的简单方法可判断点阵的逻辑引脚。

运行proteus,在编辑区里放上一个8X8LED,如MA TRIX-8x8-GREEN。

在某些引脚上接上电源和地,试试能不能点亮。

8X8默认是上下引脚,按习惯接法,上面接电源,下面接地,不亮(图左)。

用左下角垂直翻转工具,垂直翻转,再接上电源和地,就可以点亮了(下图)。

如果是做左移显示,可再左旋90°。

如图:这里可看到,左边引脚是行控制,右边引脚是列控制。

然后就可以画线路图了,点阵就保持上面那个方向。

由于点阵引线较多,特别是以后做24X24点阵,所以布线方式不用连线,而用终端加上网络标号,这样可以使画面简洁明了。

连续标号的快捷画法,我以前有帖子介绍过。

这里还是再啰嗦一下。

proteus有一个很好用的PA T(Property Assignment Tool),即属性分配工具。

可以用来做快捷标注,当然还可以用作其它操作。

再连上其它接线,一个线路图很快就可以作好。

下面,就可以写程序的源文件了。

点击菜单\Source,下拉菜单第一条Add/Remove Source Files,按键New,在跳出的对话框里写上新文件名,如8X8.asm,打开。

提示这个文件不存在,要创建吗?是。

然后点Code Gereration tool小箭头,选ASM51 ,点OK。

然后,菜单\Source,看到多了个8X8.asm,点击,出现proteus自带的汇编编辑器,就可以在里面写代码了。

点阵 左移 上移 右移 下移 下拉 等花样显示讲解学习

点阵 左移  上移 右移 下移 下拉 等花样显示讲解学习

点阵左移上移右移下移下拉等花样显示#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define sudu 20/***各种声明的声明*****/sbit LAT_port=P2^0;sbit CLK_port=P2^1;sbit DI_port=P2^2;sbit G_port=P2^3;sbit A_port=P2^4;sbit B_port=P2^5;sbit C_port=P2^6;sbit D_port=P2^7;uchar move; //上移下移用的全局变量uchar temp; //缓冲用的uchar han;uchar zi;uchar code ziku[]={0xFF,0xFF,0xC7,0xE3,0x83,0xC1,0x79,0x9E,0xFE,0x7F,0xFE,0x7F,0xFE,0x7 F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC,0x3F,0xF9,0x9F,0xE3,0xC7,0xC7,0xF1,0x1F,0xF C,0x7F,0xFE,/*"未命名文件",0*/0x7F,0xFF,0x7F,0xFF,0x01,0xC0,0x3F,0xFE,0x5F,0xFD,0x6F,0xFB,0x73,0xE 7,0x7C,0x9F,0x0F,0xF8,0xFF,0xFD,0xFF,0xFE,0x00,0x80,0x7F,0xFF,0x7F,0xFF,0x5F,0xF F,0xBF,0xFF,/*"李",0*/0xF7,0xF7,0x80,0x80,0xF7,0xF7,0xC1,0xC1,0xF7,0xF7,0x80,0x80,0xF7,0xF 7,0x03,0xE0,0xFF,0xEF,0x07,0xE0,0xFF,0xEF,0x03,0xE0,0x7F,0xFF,0xED,0xDE,0xED,0xB 7,0x1E,0xB0,/*"慧",1*/0xFF,0xFF,0x07,0xF0,0xF7,0xF7,0xF7,0xF7,0xB7,0xF7,0x77,0xF7,0x77,0xF 7,0xF7,0xF7,0x00,0x80,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFB,0xF7,0xFB,0xF7,0xFD,0xF 5,0xFE,0xFB,/*"丹",2*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,};uchar code ziku1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0xFF,0xFF,0x07,0xF0,0xF7,0xF7,0xF7,0xF7,0xB7,0xF7,0x77,0xF7,0x77,0xF 7,0xF7,0xF7,0x00,0x80,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFB,0xF7,0xFB,0xF7,0xFD,0xF 5,0xFE,0xFB,/*"丹",2*/0xF7,0xF7,0x80,0x80,0xF7,0xF7,0xC1,0xC1,0xF7,0xF7,0x80,0x80,0xF7,0xF 7,0x03,0xE0,0xFF,0xEF,0x07,0xE0,0xFF,0xEF,0x03,0xE0,0x7F,0xFF,0xED,0xDE,0xED,0xB 7,0x1E,0xB0,/*"慧",1*/0x7F,0xFF,0x7F,0xFF,0x01,0xC0,0x3F,0xFE,0x5F,0xFD,0x6F,0xFB,0x73,0xE 7,0x7C,0x9F,0x0F,0xF8,0xFF,0xFD,0xFF,0xFE,0x00,0x80,0x7F,0xFF,0x7F,0xFF,0x5F,0xF F,0xBF,0xFF,/*"李",0*/0xFF,0xFF,0xC7,0xE3,0x83,0xC1,0x79,0x9E,0xFE,0x7F,0xFE,0x7F,0xFE,0x7 F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC,0x3F,0xF9,0x9F,0xE3,0xC7,0xC7,0xF1,0x1F,0xF C,0x7F,0xFE,/*"未命名文件",0*/};uchar BUF[4];/***子函数申明****/void delay(uint t);void xie595(uchar dat);void hangxuan(uchar han);void huanchong();void zhuanhuanzuoyi();void zhuanhuanyouyi();/***延时****///void delay(uint t){while(t--) ;}/****595输入函数****///void xie595(uchar dat){uchar i;CLK_port=0;for(i=0;i<8;i++){if((dat&0x80)!=0)DI_port=1;elseDI_port=0;CLK_port=1; //上升沿输入数据CLK_port=0;dat<<=1;}}/*******行扫描程序*******///void hangxuan(uchar han){switch(han){case 0:A_port = 0; B_port = 0; C_port = 0;D_port = 0;break;case 1:A_port = 1; B_port = 0; C_port = 0;D_port = 0;break;case 2:A_port = 0; B_port = 1; C_port = 0;D_port = 0;break;case 3:A_port = 1; B_port = 1; C_port = 0;D_port = 0;break;case 4:A_port = 0; B_port = 0; C_port = 1;D_port = 0;break;case 5:A_port = 1; B_port = 0; C_port = 1;D_port = 0;break;case 6:A_port = 0; B_port = 1; C_port = 1;D_port = 0;break;case 7:A_port = 1; B_port = 1; C_port = 1;D_port = 0;break;case 8:A_port = 0; B_port = 0; C_port = 0;D_port = 1;break;case 9:A_port = 1; B_port = 0; C_port = 0;D_port = 1;break;case 10:A_port = 0; B_port = 1; C_port = 0;D_port = 1;break;case 11:A_port = 1; B_port = 1; C_port = 0;D_port = 1;break;case 12:A_port = 0; B_port = 0; C_port = 1;D_port = 1;break;case 13:A_port = 1; B_port = 0; C_port = 1;D_port = 1;break;case 14:A_port = 0; B_port = 1; C_port = 1;D_port = 1;break;case 15:A_port = 1; B_port = 1; C_port = 1;D_port = 1;break;}}/*****缓冲****************/void huanchong(){uchar i;for(i=0;i<2;i++){BUF[i*2+1]=ziku[zi*32+i*32+han*2+1]; //右半部分屏的数据BUF[i*2]=ziku[zi*32+i*32+han*2]; //左半部分屏数据}}/*********左右转换********/void zhuanhuanzuoyi() //向左子函数{uchar wy;if(move<8){wy=move;temp=((BUF[2]<<(8-wy))|(BUF[1]>>wy)); //右半屏的数据处理准备移动的屏左移(8-wy)位;看得见的右移wy位xie595(temp);temp=((BUF[1]<<(8-wy))|(BUF[0]>>wy)); //左半屏同上xie595(temp);}else{wy=(move-8);temp=((BUF[3]<<(8-wy))|(BUF[2]>>wy)); //同上xie595(temp);temp=((BUF[2]<<(8-wy))|(BUF[1]>>wy));xie595(temp);}}void zhuanhuanyouyi() //向右子函数统统同上方向改变{uchar wy;if(move<8){wy=move;temp=((BUF[0]>>(8-wy))|(BUF[1]<<wy));xie595(temp);temp=((BUF[3]>>(8-wy))|(BUF[0]<<wy));xie595(temp);}else{wy=(move-8);temp=((BUF[3]>>(8-wy))|(BUF[0]<<wy));xie595(temp);temp=((BUF[2]>>(8-wy))|(BUF[3]<<wy));xie595(temp);}}/***一般显示***********/void yiban(){zi=0;han=0;LAT_port=0; // 锁住595G_port=1; //138 不使能for(zi=0;zi<4;zi++) //多少个字循环多少次{uint i;for(i=0;i<2000;i++) //刷屏N 次{xie595(ziku[zi*32+han*2+1]);xie595(ziku[zi*32+han*2]);LAT_port=1;//上升沿595输出数据LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;//关屏han++;if(han==16)han=0;}}}/**********下拉******/void xiala(){uint i,j=0;uint k;zi=0;han=0;LAT_port=0;G_port=1;for(k=0;k<64;k++) //一个字要16 {for(i=0;i<sudu*15;i++) //{xie595(ziku[zi*32+han*2+1]); //先写高位xie595(ziku[zi*32+han*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;if(han>j)han=0;}j++;if(j>15){G_port=1;j=0;delay(50000);zi++;if(zi==4)zi=0;}}}/*********上移***********/void shangyi(){uint i=0,j=0;uchar move=0;G_port=1;LAT_port=0;zi=0;han=0;for(j=0;j<(zi+1)*16;j++){for(i=0;i<(sudu*15);i++){xie595(ziku[zi*32+han*2+1+move*2]);//......xie595(ziku[zi*32+han*2+move*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;}move++;if(move==16){move=0;zi++;if(zi==4)zi=0;}}}/*********下移***********/void xiayi(){uint i=0,j=0;uchar move=0;G_port=1;LAT_port=0;zi=4;han=0;for(j=0;j<(zi+2)*16;j++){for(i=0;i<(sudu*15);i++){xie595(ziku1[zi*32+han*2+1-move*2]);xie595(ziku1[zi*32+han*2-move*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;}move++;if(move==16){move=0;zi--;if(zi<0)zi=4;}}}/*******左移***************/void zuoyi(){uchar i;LAT_port=0;G_port=1;zi=0;han=0;for(zi=0;zi<4;zi++){for(move=0;move<16;move++){for(i=0;i<sudu;i++){for(han=0;han<16;han++){huanchong();zhuanhuanzuoyi();LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;}}}}}/********右移**********/void youyi(){uchar i;LAT_port=0;G_port=1;zi=0;han=0;for(zi=0;zi<4;zi++){for(move=0;move<16;move++) //移动16次置0{for(i=0;i<sudu;i++){for(han=0;han<16;han++){huanchong();zhuanhuanyouyi();LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;}}}}}void main(){while(1){yiban();delay(30000);xiala();delay(30000);shangyi(); //各种调用delay(30000);xiayi();delay(30000);zuoyi();delay(30000);youyi();}}。

16×16点阵汉字设计-左移-右移-翻页-上移-下移-多种方式

16×16点阵汉字设计-左移-右移-翻页-上移-下移-多种方式

一、设计依据16x16点阵需要32个驱动,分别为16个列驱动及16个行驱动。

每个行与每个列可以选中一个发光管,共有256个发光管,采用动态驱动方式。

每次显示一行后再显示下一行。

本设计是利用实验仪上的16×16 LED点阵显示器,编写显示英文、汉字字符程序并进行显示,最好能移动显示。

要求在本设计过程中,通过设计合适的硬件电路及对应的软件,实现上述的控制过程,同时写出合格的课程设计说明书。

二、要求及主要内容1.硬件电路设计(1)完成89C51应用系统设计(晶振电路,上电复位电路等)(2)利用单片机I/O口或以扩展锁存器的方式控制点阵显示。

掌握单片机与16×16点阵块之间接口电路的设计方法。

2.程序设计掌握单片机与16×16点阵块之间接口电路的设计方法及编程要求完成主程序的设计及对应的子程序设计。

3.选芯片, 元件按设计连线4.完成子程序调试5.完成总调试三、途径和方法综合运用单片机和电子电路相关知识,实现本次设计。

进行程序设计时先画流程图再进行程序设计。

子程序调试按以下步骤进行:(1)实验板与PC机联机。

(2)利用实验系统16×16点阵实验单元,以两种方式控制点阵显示。

要求编制程序实现汉字点阵循环显示。

点阵时钟摘要LED点阵显示屏是利用发光二极管点阵模块或像素单元组成的平面式显示屏幕。

它具有发光效率高、使用寿命长、组态灵活、色彩丰富以及对室内外环境适应能力强等优点。

并广泛的应用于公交汽车,码头,商店,学校和银行等公共场合的信息发布和广告宣传。

LED显示屏经历了从单色,双色图文显示屏到现在的全彩色视频显示屏的发展过程,自20世纪八十年代开始,LED显示屏的应用领域已经遍布交通、电信、教育、证券、广告宣传等各方面。

LED点阵显示屏可以显示数字或符号,通常用来显示时间、速度、系统状态等。

文章给出了一种基于MCS-51单片机的16×16 点阵LED显示屏的设计方案。

LED点阵左移 128X32

LED点阵左移  128X32
//发送屏一线点阵数据 void Send_one_line(void) {
char s; uchar TEMP0,TEMP1,i,inc;
if(32<=col&&col<40) inc=4;
if(col<8) inc=0;
if(8<=col&&col<16) inc=1;
if(16<=col&&col<24) inc=2;
if(112<=col&&col<120) inc=21;
if(104<=col&&col<112) inc=22;
for(s=0+inc;s<=16+inc;s++) {
TEMP0=Combine_2byte(BUFFDOWN[s],BUFFDOWN[s+1]);
TEMP1=Combine_2byte(BUFF__UP[s],BUFF__UP[s+1]);
uchar T_date,tempcol; tempcol=coll; T_date=(h1>>tempcol)|(h2<<(8-tempcol)); return T_date; }
//分别装载上、下半屏点阵数据 void Load_one_line(void) //一次性发的汉字数 {
BUFF__UP[0]=Table[word][disrow*4+0];//装载上半屏一线点阵数据 BUFF__UP[1]=Table[word][disrow*4+1]; BUFF__UP[2]=Table[word][disrow*4+2]; BUFF__UP[3]=Table[word][disrow*4+3];

LEDD点阵屏左移和上移程序,c51

LEDD点阵屏左移和上移程序,c51

LEDD点阵屏左移和上移程序,c51#include#define uchar unsigned char#define uint unsigned intuchar yid,h; //YID为移位计数器,H为行段计数器uint zimuo;//字模计数器uchar code hanzi[];//汉字字模uchar BUFF[4];//缓存void in_data(void);//调整数据void rxd_data(void);//发送数据void sbuf_out();//16段扫描sbit P1_7=P1^7;uchar code table1[]={0x04,0x00,0xE8,0x7F,0x08,0x10,0x00,0x10,0x11,0x10,0xD2,0x13,0x4A,0x12,0x48,0x12,0x44,0x12,0xC4,0x13,0x47,0x12,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x14,0x04,0x08,/*"河",0*/0x80,0x00,0x80,0x20,0xFF,0x7F,0x80,0x00,0x40,0x00,0xFC,0x3F,0x24,0x24,0x44,0x22,0xF4,0x2F,0x84,0x20,0xFC,0x3F,0x84,0x20,0x84,0x20,0x84,0x28,0x84,0x10,0x00,0x00,/*"南",1*/0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,0x40,0x01,0x40,0x01,0x40,0x02,0x20,0x02,0x20,0x04,0x10,0x08,0x08,0x18,0x04,0x70,0x02,0x20,/*"大",2*/0x80,0x10,0x08,0x31,0x30,0x13,0x10,0x09,0xFE,0x7F,0x02,0x20,0xF1,0x17,0x00,0x02,0x00,0x01,0xFE,0x7F,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x40,0x01,0x80,0x00};/*"学",3*/{uchar i,d=10;yid=0;zimuo=0;while(1){while(yid<16) //数据移位{for(i=0;i<="">sbuf_out();yid++;//移动一步}yid=0;zimuo=zimuo+32;//后移一个字if(zimuo>=96)//到最后从头开始,由字数决定zimuo=0;}}void sbuf_out(){for(h=0;h<16;h++) //16行扫描{in_data();//调整数据rxd_data();//串口发送数据P1=0x7f;//关闭显示P1_7=1;//锁存为高,595锁存信号P1=h;//送行选}}{char s;for(s=1;s>=0;s--) //h为向后选择字节计数器,zimuo为向后选择字节计数器{BUFF[2*s+1]=table1[zimuo+1+32*s+2*h];//把第一个字模的第一个字节放在BUFF0中//把第二个字模的第一个字节放在BUFF2中BUFF[2*s]=table1[zimuo+32*s+2*h];//把第一个字模的第二个字节放在BUFF1中//把第二个字模的第二个字节放在BUFF3中}}void rxd_data(void) // 串行发送数据{char s;uchar inc,tempyid,temp;if(yid<8)inc=0elseinc=1;for(s=0+inc;s<2+inc;s++) //发送2字节数据{if(yid<8)tempyid=yid;elsetempyid=yid-8;temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid));//h1左移tempyidwei 位后和H2右移8-temp相或,取出移位后的数据SBUF=temp;while(!TI);TI=0;}}#includesbit R=P2^0;sbit CLK=P2^1;sbit STB=P2^2;char code table[]={0x00,0x01,0x08,0x03,0x08,0x01,0x08,0x11,0xF8,0x3F,0x04,0x01,0x04,0x01,0x02,0x11,0xF9,0x3F,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x21,0xFE,0x7F,0x00,0x00,/*"生",0*/ 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08,0x00,0x00,0x00,0x00,};/*"日",1*/ void delay(int z){int x,y;for(x=0;x<z;x++)< p="">for(y=0;y<110;y++);}void WB(char da)//写一个字节的数据{char i;for(i=0;i<8;i++)//循环8次把编码传给锁存器{da=da>>1; //右移一位,取出该字节最低位R=CY; //将该字节最低位传给RCLK=0; //将数据移入595 ,上升沿CLK=1;}}void main(){int a,move,speed;while(1){if(++speed>8) //移动速度控制、{speed=0;move++;}//移位if(move>16)//是否完成移位一个汉字move=0;//从头开始for(a=0;a<16;a++){WB(table[2*a+move*2]);WB(table[2*a+1+move*2]);P1=a;STB=1; //输出锁存器中得数据,下降沿STB=0; delay(2);}}}</z;x++)<>。

实习单元五单键控制LED左右移

实习单元五单键控制LED左右移

實習單元五:單鍵控制LED左右移一、實習目的:(1)練習埠輸入指令MOV的用法。

(2)練習跳躍指令的用法。

(3)練習單鍵控制2種動作的方法。

二、執行結果:(1)開始全亮。

(2)按PB1一下時開始持續單燈左移,再按一下,開始持續單燈右移,只要按一下PB1,單燈LED可隨時左右移。

三、接線步驟:(1)將模擬器的40腳單晶片模擬插座插入MCS–51模組。

(2)用26PIN排線連接MCS–51模組與廣告燈模組。

(3)用16PIN排線連接MCS–51模組與開關模組之P1。

(4)連接5P電源線到所用之模板。

否右移呼叫左移六、程式範例:1: /*file_name:lab-5.c*/2: #include "io51.h"3: /*-----------------------------------------------------------*/ 4: void delay (unsigned int count) /*延遲時間=countx1mS */ 5: {6: unsigned int i,j;7: for (i=0; i<count ; i++)8: for (j=0; j<75; j++)9: ;10: }11: /*-----------------------------------------------------------*/ 12: unsigned char rr (unsigned char rotate) /* 右旋轉 */13: {14: unsigned char i;15: i=rotate%2;16: rotate=rotate>>1;17: if (i==1) {rotate=rotate+0x80;}18: return (rotate);19: }20: /*-----------------------------------------------------------*/ 21: unsigned char rl (unsigned char rotate) /* 左旋轉 */22: {23: unsigned char i;24: i=rotate/128;25: rotate=rotate<<1;26: if (i==1) {rotate=rotate+0x01;}27: return (rotate);28: }29: /*-----------------------------------------------------------*/ 30: void main (void) /* 主程式 */31: {32: unsigned char i;33: i=0xfe; /*設定位移初值*/34: P2=0x00; /*P2全亮*/35:36: while (P1_0==1) { } /*等待PB1按下*/37: P2=i;38: while (1)39: {40: while (P1_0==0) { } /*等待PB1放開*/41: while (P1_0==1) /*判斷PB1是否再次按下*/ 42: {43: i=rl(i); /* i左旋轉 */44: P2=i;45: delay(300); /* 延遲0.3秒 */46: }47:48: while (P1_0==0) { } /*等待PB1放開*/49: while (P1_0==1) /*判斷PB1是否再次按下*/ 50: {51: i=rr(i); /* i右旋轉 */52: P2=i;53: delay(300); /* 延遲0.3秒 */54: }55: }56: }57: /*-----------------------------------------------------------*/七、程式說明:本單元程式的重點在於如何利用單一鍵控制開關執行兩種動作,亦就是當按一下開關時單燈左移,再按一下開關時,單燈右移。

任务三 点阵显示屏移位显示数字

任务三  点阵显示屏移位显示数字

( )移位显示驱动程序的编写 ( 33 ) LED点阵硬件驱动程序
COL2=0;//字模数据输出选通 DATAPORT=(zm[dzbuf[3]][i]>>mc)|(zm[dzbuf[4]][i]<<(8mc));//第四个字模的数据 COL3=1; COL3=0;//字模数据输出选通 DATAPORT=row%256;//点阵扫描上屏 ROW0=1; ROW0=0;//扫描线输出选通 DATAPORT=row/256;//点阵扫描下屏 ROW1=1; ROW1=0;//扫描线输出选通 delay(20);//短延时 row=row<<1;//改变行扫描线 } DATAPORT=0xff;//拉高数据 }
3、程序说明
(1)程序中设立了数字字符的字模索引数组szindex[],该数组的内容 就是对应的数字字模在二维数组中的行编号。函数通过搜索索引来查 找对应的字符的字模并返回其编号,这样定位字符的字模不仅不易出 错,而且函数的通用性强、调用方便了。这种方法也适用于对汉字等 字符的搜索。 (2)查找字符串并送显示缓冲区子函数get_char( )中,调用C51库函 数strlen()来计算要显示的字符串的长度。字符上加入引号表示是它一 个字符串,字符串使用szindex[i]!=0来判断字符串是否搜索到最后。循 环中使用j=(j+1)%len是为了当字符递增到最后一个字符后能够返回第 一个字符。 (3)变量count的值决定了要显示字符串的位置,其递增的速度决定 了字符移动的速度。
项目四led点阵屏广告牌制作任务三任务三led点阵显示屏移位显示数字任务要求任务要求任务分析任务分析硬件电路的硬件电路的设计与搭建设计与搭建软件编写软件编写任务实施任务实施使用yl236单片机实训考核装置显示模块中的led点阵显示屏单元上电后点阵显示屏向左移位循环显示123456780其中数字的点阵大小为816

点阵 左移 上移 右移 下移 下拉 等花样显示讲解学习

点阵 左移  上移 右移 下移 下拉 等花样显示讲解学习

点阵左移上移右移下移下拉等花样显示#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define sudu 20/***各种声明的声明*****/sbit LAT_port=P2^0;sbit CLK_port=P2^1;sbit DI_port=P2^2;sbit G_port=P2^3;sbit A_port=P2^4;sbit B_port=P2^5;sbit C_port=P2^6;sbit D_port=P2^7;uchar move; //上移下移用的全局变量uchar temp; //缓冲用的uchar han;uchar zi;uchar code ziku[]={0xFF,0xFF,0xC7,0xE3,0x83,0xC1,0x79,0x9E,0xFE,0x7F,0xFE,0x7F,0xFE,0x7 F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC,0x3F,0xF9,0x9F,0xE3,0xC7,0xC7,0xF1,0x1F,0xF C,0x7F,0xFE,/*"未命名文件",0*/0x7F,0xFF,0x7F,0xFF,0x01,0xC0,0x3F,0xFE,0x5F,0xFD,0x6F,0xFB,0x73,0xE 7,0x7C,0x9F,0x0F,0xF8,0xFF,0xFD,0xFF,0xFE,0x00,0x80,0x7F,0xFF,0x7F,0xFF,0x5F,0xF F,0xBF,0xFF,/*"李",0*/0xF7,0xF7,0x80,0x80,0xF7,0xF7,0xC1,0xC1,0xF7,0xF7,0x80,0x80,0xF7,0xF 7,0x03,0xE0,0xFF,0xEF,0x07,0xE0,0xFF,0xEF,0x03,0xE0,0x7F,0xFF,0xED,0xDE,0xED,0xB 7,0x1E,0xB0,/*"慧",1*/0xFF,0xFF,0x07,0xF0,0xF7,0xF7,0xF7,0xF7,0xB7,0xF7,0x77,0xF7,0x77,0xF 7,0xF7,0xF7,0x00,0x80,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFB,0xF7,0xFB,0xF7,0xFD,0xF 5,0xFE,0xFB,/*"丹",2*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,};uchar code ziku1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0xFF,0xFF,0x07,0xF0,0xF7,0xF7,0xF7,0xF7,0xB7,0xF7,0x77,0xF7,0x77,0xF 7,0xF7,0xF7,0x00,0x80,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFB,0xF7,0xFB,0xF7,0xFD,0xF 5,0xFE,0xFB,/*"丹",2*/0xF7,0xF7,0x80,0x80,0xF7,0xF7,0xC1,0xC1,0xF7,0xF7,0x80,0x80,0xF7,0xF 7,0x03,0xE0,0xFF,0xEF,0x07,0xE0,0xFF,0xEF,0x03,0xE0,0x7F,0xFF,0xED,0xDE,0xED,0xB 7,0x1E,0xB0,/*"慧",1*/0x7F,0xFF,0x7F,0xFF,0x01,0xC0,0x3F,0xFE,0x5F,0xFD,0x6F,0xFB,0x73,0xE 7,0x7C,0x9F,0x0F,0xF8,0xFF,0xFD,0xFF,0xFE,0x00,0x80,0x7F,0xFF,0x7F,0xFF,0x5F,0xF F,0xBF,0xFF,/*"李",0*/0xFF,0xFF,0xC7,0xE3,0x83,0xC1,0x79,0x9E,0xFE,0x7F,0xFE,0x7F,0xFE,0x7 F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC,0x3F,0xF9,0x9F,0xE3,0xC7,0xC7,0xF1,0x1F,0xF C,0x7F,0xFE,/*"未命名文件",0*/};uchar BUF[4];/***子函数申明****/void delay(uint t);void xie595(uchar dat);void hangxuan(uchar han);void huanchong();void zhuanhuanzuoyi();void zhuanhuanyouyi();/***延时****///void delay(uint t){while(t--) ;}/****595输入函数****///void xie595(uchar dat){uchar i;CLK_port=0;for(i=0;i<8;i++){if((dat&0x80)!=0)DI_port=1;elseDI_port=0;CLK_port=1; //上升沿输入数据CLK_port=0;dat<<=1;}}/*******行扫描程序*******///void hangxuan(uchar han){switch(han){case 0:A_port = 0; B_port = 0; C_port = 0;D_port = 0;break;case 1:A_port = 1; B_port = 0; C_port = 0;D_port = 0;break;case 2:A_port = 0; B_port = 1; C_port = 0;D_port = 0;break;case 3:A_port = 1; B_port = 1; C_port = 0;D_port = 0;break;case 4:A_port = 0; B_port = 0; C_port = 1;D_port = 0;break;case 5:A_port = 1; B_port = 0; C_port = 1;D_port = 0;break;case 6:A_port = 0; B_port = 1; C_port = 1;D_port = 0;break;case 7:A_port = 1; B_port = 1; C_port = 1;D_port = 0;break;case 8:A_port = 0; B_port = 0; C_port = 0;D_port = 1;break;case 9:A_port = 1; B_port = 0; C_port = 0;D_port = 1;break;case 10:A_port = 0; B_port = 1; C_port = 0;D_port = 1;break;case 11:A_port = 1; B_port = 1; C_port = 0;D_port = 1;break;case 12:A_port = 0; B_port = 0; C_port = 1;D_port = 1;break;case 13:A_port = 1; B_port = 0; C_port = 1;D_port = 1;break;case 14:A_port = 0; B_port = 1; C_port = 1;D_port = 1;break;case 15:A_port = 1; B_port = 1; C_port = 1;D_port = 1;break;}}/*****缓冲****************/void huanchong(){uchar i;for(i=0;i<2;i++){BUF[i*2+1]=ziku[zi*32+i*32+han*2+1]; //右半部分屏的数据BUF[i*2]=ziku[zi*32+i*32+han*2]; //左半部分屏数据}}/*********左右转换********/void zhuanhuanzuoyi() //向左子函数{uchar wy;if(move<8){wy=move;temp=((BUF[2]<<(8-wy))|(BUF[1]>>wy)); //右半屏的数据处理准备移动的屏左移(8-wy)位;看得见的右移wy位xie595(temp);temp=((BUF[1]<<(8-wy))|(BUF[0]>>wy)); //左半屏同上xie595(temp);}else{wy=(move-8);temp=((BUF[3]<<(8-wy))|(BUF[2]>>wy)); //同上xie595(temp);temp=((BUF[2]<<(8-wy))|(BUF[1]>>wy));xie595(temp);}}void zhuanhuanyouyi() //向右子函数统统同上方向改变{uchar wy;if(move<8){wy=move;temp=((BUF[0]>>(8-wy))|(BUF[1]<<wy));xie595(temp);temp=((BUF[3]>>(8-wy))|(BUF[0]<<wy));xie595(temp);}else{wy=(move-8);temp=((BUF[3]>>(8-wy))|(BUF[0]<<wy));xie595(temp);temp=((BUF[2]>>(8-wy))|(BUF[3]<<wy));xie595(temp);}}/***一般显示***********/void yiban(){zi=0;han=0;LAT_port=0; // 锁住595G_port=1; //138 不使能for(zi=0;zi<4;zi++) //多少个字循环多少次{uint i;for(i=0;i<2000;i++) //刷屏N 次{xie595(ziku[zi*32+han*2+1]);xie595(ziku[zi*32+han*2]);LAT_port=1;//上升沿595输出数据LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;//关屏han++;if(han==16)han=0;}}}/**********下拉******/void xiala(){uint i,j=0;uint k;zi=0;han=0;LAT_port=0;G_port=1;for(k=0;k<64;k++) //一个字要16 {for(i=0;i<sudu*15;i++) //{xie595(ziku[zi*32+han*2+1]); //先写高位xie595(ziku[zi*32+han*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;if(han>j)han=0;}j++;if(j>15){G_port=1;j=0;delay(50000);zi++;if(zi==4)zi=0;}}}/*********上移***********/void shangyi(){uint i=0,j=0;uchar move=0;G_port=1;LAT_port=0;zi=0;han=0;for(j=0;j<(zi+1)*16;j++){for(i=0;i<(sudu*15);i++){xie595(ziku[zi*32+han*2+1+move*2]);//......xie595(ziku[zi*32+han*2+move*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;}move++;if(move==16){move=0;zi++;if(zi==4)zi=0;}}}/*********下移***********/void xiayi(){uint i=0,j=0;uchar move=0;G_port=1;LAT_port=0;zi=4;han=0;for(j=0;j<(zi+2)*16;j++){for(i=0;i<(sudu*15);i++){xie595(ziku1[zi*32+han*2+1-move*2]);xie595(ziku1[zi*32+han*2-move*2]);LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;han++;if(han==16)han=0;}move++;if(move==16){move=0;zi--;if(zi<0)zi=4;}}}/*******左移***************/void zuoyi(){uchar i;LAT_port=0;G_port=1;zi=0;han=0;for(zi=0;zi<4;zi++){for(move=0;move<16;move++){for(i=0;i<sudu;i++){for(han=0;han<16;han++){huanchong();zhuanhuanzuoyi();LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;}}}}}/********右移**********/void youyi(){uchar i;LAT_port=0;G_port=1;zi=0;han=0;for(zi=0;zi<4;zi++){for(move=0;move<16;move++) //移动16次置0{for(i=0;i<sudu;i++){for(han=0;han<16;han++){huanchong();zhuanhuanyouyi();LAT_port=1;LAT_port=0;hangxuan(han);G_port=0;delay(30);G_port=1;}}}}}void main(){while(1){yiban();delay(30000);xiala();delay(30000);shangyi(); //各种调用delay(30000);xiayi();delay(30000);zuoyi();delay(30000);youyi();}}。

8位 LED左移

8位 LED左移

8位 LED左移#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit P20 = P2^0;//这是为了关闭开发板上的数码管实际应用去掉sbit P21 = P2^1;//这是为了关闭开发板上的数码管实际应用去掉sbit P35 = P3^5;//这是为了关闭开发板上的点阵实际应用去掉void Delay(unsigned int t); //函数声明void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255 P1=0x00;//这是为了关闭开发板上的数码管实际应用去掉P20=0; //这是为了关闭开发板上的数码管实际应用去掉P21=0; //这是为了关闭开发板上的数码管实际应用去掉P35=0; //这是为了关闭开发板上的点阵实际应用去掉P1=0xFF;//P1口置1Delay(50000);P1=0xfe; //赋初始值for(i=0;i<8;i++) //加入for循环,表明for循环大括号中的程序循环执行8次{Delay(50000);P1<<=1;}while (1) //主循环{//主循环中添加其他需要一直工作的程序}}延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}led循环左移#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义/*-------------------------IO口定义----------------------------*/sbit P20 = P2^0;//这是为了关闭开发板上的数码管实际应用去掉sbit P21 = P2^1;//这是为了关闭开发板上的数码管实际应用去掉sbit P35 = P3^5;//这是为了关闭开发板上的点阵实际应用去掉void Delay(unsigned int t); //函数声明void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255 P1=0x00;//这是为了关闭开发板上的数码管实际应用去掉P20=0; //这是为了关闭开发板上的数码管实际应用去掉P21=0; //这是为了关闭开发板上的数码管实际应用去掉P35=0; //这是为了关闭开发板上的点阵实际应用去掉P1=0xFF;//P1口置1Delay(50000);P1=0xfe; //赋初始值while (1) //主循环{for(i=0;i<8;i++) //加入for循环,表明for循环大括号中的程序循环执行8次{Delay(50000);P1<<=1;P1=P1|0x01; //左移后,最右端自动赋值0,所以需要该语句赋值1}P1=0xfe; //重新赋初始值//主循环中添加其他需要一直工作的程序}}void Delay(unsigned int t){while(--t);}查表led显示#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit P20 = P2^0;//这是为了关闭开发板上的数码管实际应用去掉sbit P21 = P2^1;//这是为了关闭开发板上的数码管实际应用去掉sbit P35 = P3^5;//这是为了关闭开发板上的点阵实际应用去掉unsigned char code table[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0x00,0x55,0x55,0xaa,0xaa};//rom允许情况可以无限添加void Delay(unsigned int t); //函数声明void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255 P1=0x00;//这是为了关闭开发板上的数码管实际应用去掉P20=0; //这是为了关闭开发板上的数码管实际应用去掉P21=0; //这是为了关闭开发板上的数码管实际应用去掉P35=0; //这是为了关闭开发板上的点阵实际应用去掉P1=0xFF;//P1口置1while (1) //主循环{for(i=0;i<16;i++) //加入for循环,表明for循环大括号中的程序循环//执行16次,表明表格中有16个元素{P1=table[i];Delay(30000);}//主循环中添加其他需要一直工作的程序}}不同频率闪烁1个LED#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义LED到P1.0端口,//LED是自己任意定义且容易记忆的符号sbit P20 = P2^0;//这是为了关闭开发板上的数码管实际应用去掉sbit P21 = P2^1;//这是为了关闭开发板上的数码管实际应用去掉sbit P35 = P3^5;//这是为了关闭开发板上的点阵实际应用去掉void Delay(unsigned int t); //函数声明void main (void){//此方法使用bit位对单个端口赋值unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255 P1=0x00;//这是为了关闭开发板上的数码管实际应用去掉P20=0; //这是为了关闭开发板上的数码管实际应用去掉P21=0; //这是为了关闭开发板上的数码管实际应用去掉P35=0; //这是为了关闭开发板上的点阵实际应用去掉P1=0xFF;//P1口置1while (1) //主循环{for(i=0;i<10;i++) //加入for循环,表明for循环大括号中的程序循环执行10次{LED0=0; //将P1.0口赋值0,对外输出低电平Delay(5000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将P1.0口赋值1,对外输出高电平Delay(5000);}for(i=0;i<10;i++){LED0=0; //将P1.0口赋值0,对外输出低电平Delay(60000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将P1.0口赋值1,对外输出高电平Delay(60000);}//主循环中添加其他需要一直工作的程序}}void Delay(unsigned int t){while(--t);}不同频率闪烁多个LED#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit P20 = P2^0;//这是为了关闭开发板上的数码管实际应用去掉sbit P21 = P2^1;//这是为了关闭开发板上的数码管实际应用去掉sbit P35 = P3^5;//这是为了关闭开发板上的点阵实际应用去掉sbit LED0=P1^0;// 用sbit 关键字定义LED到P1.0端口,LED是自己任意定义且容易记忆的符号sbit LED1=P1^1;sbit LED2=P1^2;sbit LED3=P1^3;sbit LED4=P1^4;sbit LED5=P1^5;sbit LED6=P1^6;sbit LED7=P1^7;void Delay(unsigned int t); //函数声明void main (void){//此方法使用bit位对单个端口赋值unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255 P1=0x00;//这是为了关闭开发板上的数码管实际应用去掉P20=0; //这是为了关闭开发板上的数码管实际应用去掉P21=0; //这是为了关闭开发板上的数码管实际应用去掉P35=0; //这是为了关闭开发板上的点阵实际应用去掉P1=0xFF;//P1口置1while (1) //主循环{for(i=0;i<10;i++) //加入for循环,表明for循环大括号中//的程序循环执行10次{LED0=0; //将P1.0口赋值0,对外输出低电平LED2=1;LED4=0;Delay(5000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将P1.0口赋值1,对外输出高电平LED2=0;LED4=1;Delay(5000);}for(i=0;i<10;i++){LED0=0; //将P1.0口赋值0,对外输出低电平LED2=1;LED4=0;Delay(60000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将P1.0口赋值1,对外输出高电平LED2=0;LED4=1;Delay(60000);}//主循环中添加其他需要一直工作的程序}}延时函数,含有输入参数 unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535void Delay(unsigned int t){while(--t);}双灯左移右移闪烁#include<reg52.h> //包含头文件,一般情况不需要改动,sbit P20 = P2^0;//这是为了关闭开发板上的数码管实际应用去掉sbit P21 = P2^1;//这是为了关闭开发板上的数码管实际应用去掉sbit P35 = P3^5;//这是为了关闭开发板上的点阵实际应用去掉void Delay(unsigned int t); //函数声明void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围unsigned char temp;//定义临时变量用于转换P1=0x00;//这是为了关闭开发板上的数码管实际应用去掉P20=0; //这是为了关闭开发板上的数码管实际应用去掉P21=0; //这是为了关闭开发板上的数码管实际应用去掉P35=0; //这是为了关闭开发板上的点阵实际应用去掉P1=0xFF;//P1口置1while (1) //主循环{temp=0xfc;P1=temp;for(i=0;i<7;i++) //加入for循环,表明for循环大括号//中的程序循环执行7次{Delay(50000); //调用延时程序;更改延时数字可//以更改延时长度;用于改变闪烁频率temp<<=1;temp=temp|0x01; //也可以直接把temp换成P1P1=temp; //之所以加入temp做中间变量,转换//完成后直接赋值到端口,防止直接//操作端口造成的短暂闪烁}temp=0x3f;P1=temp;for(i=0;i<7;i++) //加入for循环,表明for循环大括号//中的程序循环执行7次{Delay(50000); //调用延时程序;更改延时数字可以//更改延时长度;用于改变闪烁频率temp>>=1;temp|=0x80; //等效于temp=temp|0x80P1=temp;}for(i=0;i<3;i++) //加入for循环,表明for循环大括号//中的程序循环执行3次{P1=0xff;Delay(50000);P1=0x00;Delay(50000);} //主循环中添加其他需要一直工作的程序}}void Delay(unsigned int t){while(--t);}。

LED点阵显示仿真由浅入深之8X8,16X16,24X24LED点阵流动显示

LED点阵显示仿真由浅入深之8X8,16X16,24X24LED点阵流动显示

一直以来,对LED点阵显示很感兴趣,特别是流动点阵显示。

论坛里有不少例子,可是在我的电脑上大多无法正常运行。

有的一运行就S机,能运行的,也是字符不清。

于是,自己动手。

先试作了8X8点阵。

8X8的点太少,只适合数字显示,从0 ~9流动,效果还不错。

有了8X8的经验,对流动显示的原理已经了解,又试了16X16的,觉得也不难。

但16X16的点仍嫌少了,又做了个24X24的,汉字漂亮。

动画可能效果差些,软件运行显示效果好多了。

一、8X8初学点阵仿真,常点不亮LED 。

首先,可能是点阵的极性没有正确的接线。

下面的简单方法可判断点阵的逻辑引脚。

运行proteus,在编辑区里放上一个8X8LED,如MA TRIX-8x8-GREEN。

在某些引脚上接上电源和地,试试能不能点亮。

8X8默认是上下引脚,按习惯接法,上面接电源,下面接地,不亮(图左)。

用左下角垂直翻转工具,垂直翻转,再接上电源和地,就可以点亮了(图右)。

如果是做左移显示,可再左旋90°这里可看到,左边引脚是行控制,右边引脚是列控制。

然后就可以画线路图了,点阵就保持上面那个方向。

由于点阵引线较多,特别是以后做24X24点阵,所以布线方式不用连线,而用终端加上网络标号,这样可以使画面简洁明了。

连续标号的快捷画法,我以前有帖子介绍过。

这里还是再啰嗦一下。

proteus有一个很好用的PA T(Property Assignment Tool),即属性分配工具。

可以用来做快捷标注,当然还可以用作其它操作。

再连上其它接线,一个线路图很快就可以作好。

下面,就可以写程序的源文件了。

点击菜单\Source,下拉菜单第一条Add/Remove Source Files,按键New,在跳出的对话框里写上新文件名,如8X8.asm,打开。

提示这个文件不存在,要创建吗?是。

然后点Code Gereration tool小箭头,选ASM51 ,点OK。

然后,菜单\Source,看到多了个8X8.asm,点击,出现proteus自带的汇编编辑器,就可以在里面写代码了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//*********************************************************************************
//***********横向取模,左边为高位*****************
TI=0;
}
}
/*******************************************************/
void send(uint k)
{uchar i;
H_CLK=0;
for(i=0;i<16;i++) //一次发送16位数据
{
H_SDA = k&0x8000; //发送最高位
H_CLK=1; //时钟信号产生一个脉冲来锁存数据
H_CLK=0;
k=k<<1; //左移一位
}
}
/*******************************************************/
void delay(uchar t)
定义两个可位寻址的变量,用于对字模数据的顺序调整,
因为这块屏的连接没有按正常顺序,需对每位数据从新
编排,才能使用一般的字模工具产生的字模
*****************************************************/
uchar bdata temp0;
uchar bdata temp1;
sbit temp16=temp1^6;
sbit temp17=temp1^7;
uchar col,disrow; //col为位移变量,disrow为行变量
uint word;
uchar code HZ[];
uchar BUFF[18];
void loadoneline(void);
temp14=temp03;
temp15=temp02;
temp16=temp01;
temp17=temp00;
V_OE = 0; //关显示
SBUF=temp1; //发送字模数据
while(TI==0); //等待发送完毕
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
#include <AT89x52.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define SPEED 1 //定义速度
#define light 1 //定义亮度
{temp0=two_onebyte(BUFF[s],BUFF[s+1]); //取出字模数据(数据地址为行基址i+偏移地址j)
temp10=temp07; //对字模数据进行顺序调整
temp11=temp06;
temp12=temp05;
temp13=temp04;
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
sbit temp07=temp0^7;
sbit temp10=temp1^0;
sbit temp11=temp1^1;
sbit temp12=temp1^2;
sbit temp13=temp1^3;
sbit temp14=temp1^4;
sbit temp15=temp1^5;
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
V_OE= 1;
delay(light)_(hang,1);//行选信号调整,选中下一行
}
}
/*******************发送一行的子函数************************/
void sendoneline(void)
{char s;uchar inc;
if(col<8)inc=0;else inc=1;
for(s=0+inc;s<=15+inc;s++) //s=2*要显示的数字-1
void loadoneline(void)
{uchar s;
for(s=0;s<9;s++) //s为要显示的数字+1
{BUFF[2*s]=HZ[word+32*s+2*disrow];
BUFF[2*s+1]=HZ[word+1+32*s+2*disrow];
V_RCK = 1; //锁存已发送的整一行的数据
V_RCK = 0;
V_OE = 0; //关闭显示
send(hang); //发送行选择数据
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//*******************************以上字码用作黑屏**********************************
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
*****************************************************/
sbit V_RCK = P1^7;
sbit V_OE = P1^5;
sbit H_SDA = P1^6;
sbit H_CLK = P1^4;
/*****************************************************
while(1)
{while(col<16)
{for(i=0;i<SPEED;i++)
{for(disrow=0;disrow<16;disrow++)
{ loadoneline();
sendoneline();
sbit temp00=temp0^0;
sbit temp01=temp0^1;
sbit temp02=temp0^2;
sbit temp03=temp0^3;
sbit temp04=temp0^4;
sbit temp05=temp0^5;
sbit temp06=temp0^6;
}
}
col++;
}
col=0;word=word+32;
if(word>=4740)word=0;//字数*32
}
}
/****************把字模移入数组的子函数********************/
void main(void)
{uchar i;
col=0;word=0;
SCON = 0x00; //串口工作方式0
V_RCK = 0; //先拉低V_RCK
V_OE=0; //关闭显示
hang=0xfffe; //行选信号初始化
if(col<8) tempcol=col;
else tempcol=col-8;
temp=(h1<<tempcol)|(h2>>(8-tempcol));
return temp;
}
/*******************************************************/
void delay(uchar t);
void sendoneline(void);
void send(uint k);
/********************************************/
uchar two_onebyte(uchar h1,uchar h2)
{uchar temp,tempcol;
相关文档
最新文档