LEDD点阵屏左移和上移程序,c51
按键控制LED灯左右移动
按键控制LED 灯左右移动#include <reg51.h> //此文件中定义了51的一些特殊功能寄存器#include <intrins.h>sbit K1 = P1^0; //对应按钮K1sbit K2 = P1^1; //对应按钮K2#define GPIO_LED P0 //led使用P0口void Delay10ms(unsigned int c); //延时10msunsigned char Key_Scan();void main(void){unsigned char ledValue, keyNum;ledValue = 0x01;while (1){keyNum = Key_Scan(); //扫描键盘if (keyNum == 1) //如果键值返回1{ledValue = _crol_(ledValue, 1); //左循环}else if (keyNum == 2){ledValue = _cror_(ledValue, 1); //右循环}GPIO_LED = ledV alue;//点亮LED灯}}unsigned char Key_Scan(){unsigned char keyValue = 0 , i; //保存键值//--检测按键1--//if (K1==0) //检测按键K1是否按下{Delay10ms(1);//消除抖动if (K1==0) //再次检测按键是否按下{keyValue = 1;i = 0;while ((i<25) && (K1==0)) //检测按键是否松开{Delay10ms(1);i++;}}}//--检测按键2--//if (K2==0) //检测按键K1是否按下{Delay10ms(1);//消除抖动if (K2==0) //再次检测按键是否按下{keyValue = 2;i = 0;while ((i<50) && (K2==0)) //检测按键是否松开{Delay10ms(1);i++;}}}return keyValue; //将读取到键值的值返回}void Delay10ms(unsigned int c) //误差0us{unsigned char a, b;for (;c>0;c--){for (b=38;b>0;b--){for (a=130;a>0;a--);}}}。
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显示屏的设计方案。
C51实验程序(流水灯、矩阵键盘、动态显示、串行口、1602液晶)
switch(SBUF)//根据收到的数据决定模式
{ case 'A':LED1=~LED1,LED2=1;break;
case 'B':LED2=~LED2,LED1=1;break;
case 'C': LED1=~LED1,LED2=~LED2;break;
}
}
else
LED1=LED2=1;
TMOD=0x20;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
TI=0;
TR1=1;
while(1)
{ if(K1==0)
{ while(K1==0);
Operation_NO=(Operation_NO+1)%4; //计按键次数决定模式
}
switch(Operation_NO)
{ case 0:LED1=LED2=1;break;
{uchar t;
while(ms--)
{
for(t=0;t<120;t++);
}
}
void main()//主函数
{SCON=0x50;//以下为串行口初始化
TMOD=0x20;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
RI=0;
TR1=1;
LED1=LED2=1;
while(1)
{ if(RI)
DelayMS(10);
}}
#include<reg52.h>(LCD1602)
#define uint unsigned int
#define uchar unsigned char
51单片机驱动LED点阵扫描显示C语言程序
51单片机驱动LED点阵扫描显示C语言程序LED点阵屏发光亮度强,指示效果好,可以制作运动的发光图文,更容易吸引人的注意力,信息量大,随时更新,有着非常好的广告和告示效果。
笔者此处就LED点阵屏动态扫描显示作一个简单的介绍。
1、LED点阵屏显示原理概述图1-1为一种8x8的LED点阵单色行共阳模块的内部等效电路图,对于红光LED其工作正向电压约为1.8v,其持续工作的正向电流一般10ma左右,峰值电流可以更大。
如下图,当某一行线为高电平而某一列线为低时,其行列交叉的点就被点亮,当某一行线为低电平时,无论列线如何,对应的这一行的点全部为暗。
LED点阵屏显示就是通过一定的频率进行逐行扫描,数据端不断输入数据显示,只要扫描频率足够高,由于人眼的视觉残留效应,就可以看到完整的文字或图案信息。
通常有4、8、16线扫描方式,扫描行数越少,点阵的显示亮度越好,但相应硬件数据寄存器需求也越多。
图1-1 点阵内部原理图2、硬件设计微控制器的IO口均不能流过过大的电流,LED点亮时有约10ms 的电流,因此LED点阵引脚不要直接接单片机IO口,应先经过一个缓冲器74HC573。
单片机IO口只需很小的电流控制74HC573即可间接的控制LED点阵某一行(或某一列),而74HC573输出也能负载约10ms的电流。
设置LED每点驱动电流为ID =15ma,这个电流点亮度好,并且有一定的裕度,即使电源输出电压偏高也不会烧毁LED,限流电阻值R = (VCC- VCE – VOL – VLED) / IDVCC为5v供电,VCE为三极管C、E间饱和电压,估为0.2v,VOL为74hc573输出低电平时电压,不同灌电流,此值不一样,估为0.2v,具体查看规格书,VLED为红光驱动电压,估为1.7v,根据上式可算出限流电阻为R = 200R。
LED点阵屏需接收逐个扫描信号,扫描到相应列(或行),对应的列(或行)数据有效,即显示这一列(或行)的信息。
基于C51单片机的LED点阵显示屏的设计
[摘要]当今社会,广告宣传已经成了人们生活中随处可见并重要的一部分。
广告的媒介除了我们常见的报纸、书刊、电台和网络之外,更常见的就是LED点阵广告屏。
这种屏幕具有经济实惠、对环境要求小、节省能源、亮度高、直观等特点,成为了现在常见的一道风景。
不管是大公司的外景宣传,还是小门店的产品介绍,LED点阵屏随处可见。
彩色点阵屏已经渐渐取代了露天的大荧幕,成为常见的广告宣传手段。
与此同时,巨大的信息量和美观性也为丰富人们的日常生活、点缀城市起到了至关重要的作用。
本设计便为基于C52单片机的简单LED点阵显示屏,通过C52控制行列芯片进行动态扫描,显示规定的汉字或者图形。
也可以通过对C52内部烧录改变所需显示的内容。
该设计具有可扩展性,可以扩充LED点阵屏幕的数量来同时显示更多的汉字。
[关键词] 单片机;LED点阵屏;信息显示;广告Abstract: Nowaday's society, advertising has became ubiquitous in people's lives and the important part. In addition to our common advertising media newspapers, books, radio and online, the more common is the LED dot matrix screen advertising. This screen has an economic benefit, environmental requirements of small, energy saving, high brightness, visual characteristics, a common landscape now. Regardless of the location of large companies is publicity, or small stores Products, LED dot matrix display everywhere. Color dot matrix display has gradually replaced the open-air big screen, a common means of advertising. At the same time, we can add more LED dot matrixes to display more informations.Key words:SCM;LED dot matrix display;Information display;Advertisement目录1 绪论 (1)1.1 本课题的研究意义及必要性 (1)1.2 LED的现状和发展趋势 (1)2 硬件总体设计 (3)2.1 主要设计框图及思路 (3)2.2 所需要芯片及各芯片功能介绍 (3)2.2.1各主要芯片简单介绍 (3)2.3 各模块电路图设计及原理 (7)2.4 系统的软件设计 (8)2.4.1 Keil.uVERSION、protues介绍 (8)2.4.2 动态扫描及取字库原理 (8)图2.12 程序流程图 (9)3 详细设计 (10)3.1 电路详细设计 (10)4 程序实现 (14)4.1 主要显示程序原理及实现 (14)4.1.1动态行扫描程序框图 (14)4.1.2实现显示内容的左滚动原理 (15)4.1.3单片机延时子程序 (18)5 设计结果测试 (20)5.1 Proteus和Keil仿真结果 (20)结束语 (21)致谢 (22)参考文献 (23)附录A 部分代码 (24)附录B 总电路图 (29)1 绪论1.1 本课题的研究意义及必要性单片机是一种集成微处理芯片,高密度集成了普通计算机的微型处理器,具有8kB的ROM和P0、P1、P2、P3输入输出接口,且集成了定时器等电路。
c51LED灯控制
#include <reg52.h>//包含头文件#define uchar unsigned char#define uint unsigned intuchar keyscan(void);void delay(uint i);void main(){uchar key;P2=0x0f;//8数码管亮按相应的按键,会显示按键上的字符while(1){key=keyscan();//调用键盘扫描,switch(key){case 0xee:P0=0x3f;break;//0 按下相应的键显示相对应的码值case 0xde:P0=0x06;break;//1case 0xbe:P0=0x5b;break;//2case 0x7e:P0=0x4f;break;//3case 0xed:P0=0x66;break;//4case 0xdd:P0=0x6d;break;//5case 0xbd:P0=0x7d;break;//6case 0x7d:P0=0x07;break;//7case 0xeb:P0=0x7f;break;//8case 0xdb:P0=0x6f;break;//9case 0xbb:P0=0x77;break;//acase 0x7b:P0=0x7c;break;//bcase 0xe7:P0=0x39;break;//ccase 0xd7:P0=0x5e;break;//dcase 0xb7:P0=0x79;break;//ecase 0x77:P0=0x71;break;//f}}}uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法{uchar cord_h,cord_l;//行列值P3=0x0f; //行线输出全为0cord_h=P3&0x0f; //读入列线值if(cord_h!=0x0f) //先检测有无按键按下{delay(100); //去抖cord_h=P3&0x0f; //读入列线值if(cord_h!=0x0f){P3=cord_h|0xf0; //输出当前列线值cord_l=P3&0xf0; //读入行线值return(cord_h+cord_l);//键盘最后组合码值并返回}}return(0xff); //否则返回固定值0xff}void delay(uint i)//延时函数{while(i--);}。
C51中移位运算
在汇编中用RR RRC RL RLC就很容易实现移位,在c51中利用<<,>>就很容易的实现移出。
移入就显得比较麻烦,特别是右移入。
(1:)送数送两个单独字节的数据的程序,左送 &0x80(左移给数) ,从最高位-最低位顺序给数右送 &0x01 (右移给数),最低位-最高位给数bit out;out = low & 0x01;low >>= 1;low |= (high & 0x01)<<7;high >>= 1;( 2):取数(不管怎么移入,第一次操作之后获取的那一位数据必须在接受数据的最高位或者最低位上,从而选择是先取数还是先移位)a:如果是先接受高位后接受低位则先左移一位后接受一位数据(i2c总线)uchar i;uchar temp = 0;uchar date = 0x82;for (i = 0; i < 8; i++){temp <<= 1; //左移temp |= (bit)(date & 0x80);date <<= 1;}b:如果是先接受低位,后接受高位则先接受一位数据后循环右移一位(DS18B20)uchar i;uchar temp = 0;uchar date = 0x82;for (i = 0; i < 8; i ++){temp |= (bit)(date & 0x01);date >>= 1;temp = _cror_(temp,1);//循环右移,应用_cror_()需要包含头文件<intrins.h>}如果不用函数则for循环应该这样写for (i = 0; i < 8; i ++){temp >>= 1;temp |= (date & 0x01) << 7; date >>= 1;}(3.)任意一位的置位或者取反运算置位运算low |= 0x01; (置最低位为1)取反运算low |= ~low & 0x01;(4.)合并和拆分数据1:合并两个单字节数据为一个双字节数据 int len;uchar low;uchar high;Len |= high;Len <<= 8;Len |= low;2: 拆分一个双字节数据为两个单字节数据 int len;uchar low;uchar high;low |= len;high |= len >> 8;。
51单片机8X8点阵滚动显示 - C51源代码
51单片机8X8点阵滚动显示- C51源代码51单片机8X8点阵滚动显示- C51源代码/*--------------------------------------------------------------*///LED8*8滚动显示//列扫描,低电平有效/*--------------------------------------------------------------*///包含头文件#include <reg52.h>#include "74HC595.H"/*--------------------------------------------------------------*///全局变量定义unsigned char i;unsigned int m,n;/*--------------------------------------------------------------*///代码库#define num sizeof(table) //代码长度unsigned char codeaa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char code table[]= {//取模方式阴码列扫描逆向0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/0x00,0x7F,0x7F,0x39,0x6F,0x46,0x00,0x00,/*"R",1 */0x00,0x41,0x7F,0x7F,0x41,0x00,0x00,0x00,/*"I",2 */0x00,0x3E,0x7F,0x41,0x63,0x22,0x00,0x00,/*"C",3 */0x00,0x7F,0x7F,0x08,0x7F,0x7F,0x00,0x00,/*"H",4 */0x00,0x7F,0x7F,0x06,0x7F,0x7F,0x00,0x00,/*"M",5 */0x00,0x3E,0x7F,0x41,0x63,0x22,0x00,0x00,/*"C",6 */0x00,0x3F,0x7F,0x40,0x7F,0x3F,0x00,0x00,/*"U",7 */0x00,0x36,0x7F,0x49,0x7F,0x36,0x00,0x00,/*"8",9 */0x00,0x63,0x7F,0x1C,0x7F,0x63,0x00,0x00,/*"X",1 0*/1*/0x00,0x01,0x7F,0x7F,0x01,0x01,0x00,0x00,/*"T",1 3*/0x00,0x7F,0x7F,0x49,0x49,0x41,0x00,0x00,/*"E",1 4*/0x00,0x26,0x6F,0x49,0x7B,0x32,0x00,0x00,/*"S",1 5*/0x00,0x01,0x7F,0x7F,0x01,0x01,0x00,0x00,/*"T",1 6*/0x00,0x7F,0x7F,0x39,0x6F,0x46,0x00,0x00,/*"R",1 8*/0x00,0x61,0x79,0x5D,0x4F,0x43,0x00,0x00,/*"Z",1 9*/0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00,/*"-",2 0*/0x00,0x62,0x73,0x59,0x4F,0x46,0x00,0x00,/*"2",2 1*/0x00,0x3E,0x7F,0x41,0x7F,0x3E,0x00,0x00,/*"0",2 2*/0x00,0x3E,0x7F,0x41,0x7F,0x3E,0x00,0x00,/*"0",2 3*/4*/0x00,0x7F,0x7F,0x41,0x7F,0x3E,0x00,0x00,/*"D",2 6*/0x00,0x7F,0x7F,0x49,0x49,0x41,0x00,0x00,/*"E",2 7*/0x00,0x7F,0x7F,0x06,0x7F,0x7F,0x00,0x00,/*"M",2 8*/0x00,0x7F,0x7F,0x41,0x7F,0x7F,0x00,0x00,/*"O",2 9*/0x00,0x26,0x6F,0x49,0x7B,0x32,0x00,0x00,/*"S",3 1*/0x03,0x07,0x7C,0x7C,0x07,0x03,0x00,0x00,/*"Y",3 2*/0x00,0x26,0x6F,0x49,0x7B,0x32,0x00,0x00,/*"S",3 3*/0x00,0x01,0x7F,0x7F,0x01,0x01,0x00,0x00,/*"T",3 4*/0x00,0x7F,0x7F,0x49,0x49,0x41,0x00,0x00,/*"E",3 5*/0x00,0x7F,0x7F,0x06,0x7F,0x7F,0x00,0x00,/*"M",3 6*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",37*/};/*--------------------------------------------------------------*///显示函数void Display(void){Ser_IN((aa[i])); //列扫描数据Ser_IN(table[i + n]); //查表取出行扫描数据Par_OUT(); //输出显示i++; if(i == 8) i = 0; //循环扫描m++; if(m == 500) {m = 0; n++;} //滚动速度控制if(n == num-7) n = 0; //循环显示}/*--------------------------------------------------------------*///定时器初始化void T0_init(void){TMOD = 0xf8;TH0 = 0xcc; //5000usTL0 = 0x00;IE = 0x82;TR0 = 1;}/*--------------------------------------------------------------*///定时器中断服务void T0_intservice(void) interrupt 1 using 0 {TH0 = 0xf8;TL0 = 0xcc;Display();}/*--------------------------------------------------------------*///主函数void main (void){T0_init();while(1);}74HC595.H//Note: 74HC595驱动// __ __//Note: MR 主复位接电源正极, OE 使能端,输出有效接电源负极/*--------------------------------------------* /#ifndef __74HC595_H__#define __74HC595_H__/*--------------------------------------------* /sbit SD = P1^4; //串行数据输入sbit ST_CK = P1^5; //存储寄存器时钟输入sbit SH_CK = P1^6; //移位寄存器时钟输入/*--------------------------------------------*///数码管断码和位码的定义//unsigned char codeseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00,0x ff};//0 1 2 3 4 5 6 7 8 9 a b c d e f 8 无//unsigned char codepos[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//1 2 3 4 5 6 7 8/*--------------------------------------------* ///函数声明void Ser_IN(unsigned char Data); //串行数据输入void Par_OUT(void); //串行数据输出//void Ser_Par(unsigned char Data); //串行输入,并行输出/*--------------------------------------------* ///串行数据输入void Ser_IN(unsigned char Data)unsigned char i;for(i = 0; i < 8; i++){SH_CK = 0; //CLOCK_MAX=100MHzSD = Data & 0x80;Data <<= 1;SH_CK = 1;}}/*--------------------------------------------* ///并行数据输出void Par_OUT(void){ST_CK = 0;ST_CK = 1;}/*--------------------------------------------* ///串行输入,并行输出/*void Ser_Par(unsigned char Data){Ser_IN(Data);Par_OUT();}*//*--------------------------------------------* /#endif网站统计Powered by Tiki Wiki CMS Groupware | Theme: Fivealive - Lemon。
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;
89c51单片机控制的LED点阵显示系统+Keil C源程序
/**********分屏显示***********/
void fen(void)
{ do{ xianshi(); }while(xx++<=5); //调用单屏显示
xx=0;
}
/************单屏显示*************/
void xianshi(void)
void rxd_data(void); //左移发送数据
void out_rxd(unsigned char *d); //分屏、上移发送数据
char code sw[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x00}; /*8行段码*/
P2=sw[h]; //输出行信号
h++; //行加一
if(h==8)h=0;
}
}
}
/***************左移显示************/
{qing();}
zuo(); //左移显示
for(ee=30;ee>0;ee--)
{qing();}
}
}
/**********清屏幕*******************/
void qing (void)
{ unsigned char zz,xx=0x0ff;
for (zz=33;zz>0;zz--)
{out_rxd(&xx);}
P1=0xff; P1=0; //锁存为高,74HC595锁存信号
P2=0; //清74LS138的使能端
{ aa=(xx*8+jj)*32+ii;
out_rxd(&hanzi[aa]); //从串口输出第1个字的第1字节。
C51单片机入门实例1---LED篇
C51单片机入门实例1.LED篇LED原理图如下:只有当P2口为低电平,LED灯才会亮,根据原理不同适当改变参数变量,以下C语言编程实例基于此原理图实现。
C语言相关知识点(编译软件为keil):1.#include<reg51.h> 文件定义了单片机的一些特殊功能寄存器2. typedef 重新定义一些常用的关键词,增加程序的可移植性,因为在不同的编译软件上,C语言数据类型的关键词的位宽是不一样的3. 以下用到的delay()延时函数并不能准确延时,只能满足大概时间的延时,在没有要求精确的延时情况下可用。
4._crol_(a,b)循环左移函数,a是左移的值,b是左移的位数,包含在intrins.h库函数里面。
_cror_(a,b)为循环右移函数,如上。
5.sbit关键字定义一个变量名到一个位地址,变量名是自己任意定义且便于记忆和表示的符号。
6.点亮LED灯既可以对某一个位进行复值,也可以对整个P2口进行复值(P2=0xfe等价于P2^0=0)。
7.while(1)使函数死循环于此,无法跳出。
程序1.点亮一位LED灯:说明:程序可点亮一位LED灯#include <reg51.h>sbit led =P2^0; //将单片机的P2.0口定义为LEDvoid main(){while(1){led=0; //P2.0端口设置为低电平,即点亮一位LED灯}}拓展:通过改写变量,可同时点亮1至8位LED灯。
点亮LED灯既可以对某一个位进行复值,也可以对整个P2口进行复值(P2=0xfe等价于P2^0=0)程序2.LED灯闪烁:说明:程序可实现一位LED灯亮灭交替(闪烁)#include <reg51.h>typedef unsigned int u16;sbit led=P2^0; //将单片机p2.0口定义为LEDvoid delay(u16 i) //延时函数,不同的i值实现不同的延时时间,i=1,大约延时10us{while(i--) ;}void main(){while(1){led=0; //点亮delay(40000); //延时,i不可以超过65536(i为16位无符号数)led=1;delay(40000);}}拓展:通过改写变量,可对8个位的LED进行各种闪烁控制程序3.LED流水灯:说明:程序可实现LED灯从右到左,再从左到右依次循环点亮。
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++)<>。
点阵 左移 上移 右移 下移 下拉 等花样显示讲解学习
点阵左移上移右移下移下拉等花样显示#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点阵汉字设计-左移-右移-翻页-上移-下移-多种方式
一、设计依据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显示屏的设计方案。
51单片机控制P2口8位LED灯左移C语言程序
51单片机控制P2口8位LED灯左移C语
言程序
此程序控制P2.0~P2.7口8个LED(P2.0~P2.7)灯逐个依次点这,又从(P2.7~P2.0)这样的顺序一直到全部被点亮。
#include ;//头文件
void delay(unsigned int x)//延时函数
{
while(x--);
}
void main(void)
{
unsigned char i;//定义一个无符号字型局部变量i 取值范围0~255
delay(50000);
P2=0xfe;
for(i=0;i<8;i++)//加入for循环,表明for循环大括号中程序循环执行8次
{
delay(50000);//调用延时函数,更改延时的x变量的值可以更改延时长短,用于改变闪烁频率
P2<<=1;
}
}
知识要点:
1、<<符号。
这个是左移符号,P2<<=1;等效于
P2=P2<<1;
例如:temp=15;
temp<<=1;
15二进制为00001111,左移1位后,右端自动补0,变
成00011110,此时temp=30;数值左移一位相当于乘以2,反之右移一位相当于除以2.。
C51的左移右移
C51的左移右移(转载)非天之光发表于 2006-4-4 8:10:10左移变量1 << 变量2将变量1的二进制位值向左移动由变量2所指定的位数。
例如:a = 0x8f; // 10001111a << 2; // 左端移出的值丢弃,右端补0结果:a = 0x3c (00111100)在keil c51中,内部函数库INTRINS.H中_crol_(m,n)表示将m循环左移n位,与m<<n的效果不同。
前者的低位移进高位移出的位,后者低位填入0右移变量1 >> 变量2将变量1的二进制位值向右移动由变量2所指定的位数。
例1:unsigned char a;a = 0x8f; // 10001111a >> 2; // 右端移出的值丢弃,左端补0结果:a = 0x23 (00100011)例2:char a;a = 0x8f; // 10001111a >> 2; // 右端移出的值丢弃,左端补入原来的符号位// 据说有些编译器采用逻辑右移,即左端补0结果:a = 0xe3 (11100011)例3:在 avr-gcc中,想读出PIND按位取反后将高4位移到低4位的值,然后用开关语句处理。
uint8_t k;k = ~PIND >> 4;switch(k){case 1: ...break;case 2: ...break;case 4: ...break;case 8: ...break;default: ...}没有取得预想效果。
改为如下语句,得到正确效果:uint8_t k;k = ((~PIND) >> 4)& 0x0f; // 左移高位不补零。
编译时,PIND作为了有符号数处理switch(k){case 1: ...break;case 2: ...break;case 4: ...break;case 8: ...break;default: ...}。
LED点阵C语言程序
LED点阵C语言程序2009年09月06日星期日 22:41/* 本程序的功能是在LED点阵上循环显示五个汉字“爱你一万年”字库码通过字库扫描码生成程序得到 */#include <reg51.h> //51芯片管脚定义头文件#include <intrins.h> //内部包含 _nop_();#define uchar unsigned char#define uint unsigned intsbit SDATA_595=P0^0; //串行数据输入sbit SHCP_595 =P2^7; //移位时钟脉冲,上升沿时数据寄存器的数据移位sbit STCP_595 =P0^2; //输出锁存器控制脉冲,上升沿时移位寄存器的数据进入数据存储寄存器sbit XS_74138 =P2^4; //显示允许控制信号端口void write_data(uchar dat); //写数据函数声明void hangxuan(uchar i); //行选函数声明//16X16的显示代码uchar codedaima[][32]={{0xff,0x87,0xc0,0x7f,0xee,0xef,0xf6,0xdf,0x80,0x1,0xbd ,0xfd,0x7d,0xfb,0x80,0x7,0xfb,0xff,0xf8,0xf,0xf5,0xdf,0xf6,0xbf,0xe f,0x7f,0xee,0x9f,0xdd,0xe3,0xf3,0xf7},//爱的字库码{0xee,0xff,0xee,0xff,0xee,0xff,0xdc,0x3,0xdd,0x fb,0x9b,0xf7,0x57,0xbf,0xdf,0xbf,0xde,0xaf,0xde,0xb7,0xdd,0xb3,0xdb ,0xbb,0xdf,0xbf,0xdf,0xbf,0xde,0xbf,0xdf,0x7f},//你{0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf f,0xff,0xfb,0x0,0x1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x ff,0xff,0xff,0xff,0xff,0xff,0xff},//一{0xff,0xff,0xff,0xfb,0x0,0x1,0xfd,0xff,0xfd,0xff,0xfd,0xef, 0xfc,0x7,0xfd,0xef,0xfd,0xef,0xfb,0xef,0xfb,0xef,0xfb,0xef,0xf7,0xe f,0xef,0xef,0xdf,0x5f,0xbf,0xbf},//万{0xf7,0xff,0xf7,0xf7,0xe0,0x3,0xee,0xff,0xde,0xff,0xbe,0xef,0 xe0,0x7,0xee,0xff,0xee,0xff,0xee,0xfb,0x0,0x1,0xfe,0xff,0xfe,0xff,0 xfe,0xff,0xfe,0xff,0xfe,0xff},//年};/*---------延时函数-------------*/void delay(unsigned int ms){unsigned int i;while(ms--){for(i=0;i<80;i++);}}//主函数开始void main(){uchar shuju,i,j,m,hang; //定义变量shuju=0; //给变量赋初值hang=0;P2=0X00;XS_74138=1;//禁止显示while(1)//无限循环{for(i=0;i<5;i++)//三个汉字{for(m=0;m<100;m++)//每个字显示一段时间{for(j=0;j<32;j+=2)//每个汉字有32个代码{shuju=daima[i][j+1];//选择某行,某列,先写某一行代码的右半边部分,因为在移位时,它会移到下一个595STCP_595=0;//为锁存数据,即产生上升沿信号做准备write_data(shuju);//写代码shuju=daima[i][j];//选择某行某列,某一行的左半部分,write_data(shuju);//写代码hangxuan(hang);//行选函数hang++;//行号自增if(hang==16)//如果等于16了,说明已经扫描完一整屏幕的数据,行好代码就要清零hang=0;STCP_595=1;//产生一个上升沿delay(1);//发送完一行代码延时一下}}}}}//向74HC595写数据void write_data(uchar dat){uchar i;for(i=0;i<8;i++)//数据是八位的{SHCP_595=0;//时钟信号的上升沿,数据进入移位寄存器_nop_();_nop_();SDATA_595=dat&0x80;//只要最高位_nop_();_nop_();dat=dat<<1;//左移一位SHCP_595=1;//产生上升沿}}//行选函数void hangxuan(uchar i){uchar k;k=P2&0XF0;//读回行号XS_74138=1;//关显示i&=0x0f;//只要低四位P2=i|k;//高四位不变,只把低四位赋给P2口XS_74138 =0;//开显示}。
单片机处理LED点阵书写屏图像拖移方法
单片机处理LED点阵书写屏图像拖移方法戴娟;孙亚中【摘要】针对8位单片机控制光笔书写、LED点阵显示系统设计方案,以C51语言编程为基础编程完成:利用光笔圈定图像及图像拖移;实现图像任意位置的显示;消除图像拖动轨迹功能;提高单片机内部资源的利用率.提出利用C语言指针构建多个动态一、二维数组,存放图像被圈定的边界信息、需移动位置信息的数据.通过实际项目的编程、调试经历,给出了单片机处理图像拖移的详细方法和相关程序,该程序结构简单,实用性、可读性强,可使用量大且不定量的数据处理编程.【期刊名称】《制造业自动化》【年(卷),期】2011(033)001【总页数】3页(P135-137)【关键词】动态数组;指针;图像拖移;单片机【作者】戴娟;孙亚中【作者单位】南京工业职业技术学院,电气与电子工程学院,南京,210046;中国电子科技集团,第五十五研究所,南京,210046【正文语种】中文【中图分类】TP302.10 引言LED显示屏已经广泛应用于现实社会中,许多从事该行业的人员都经历过相应编程设计,但在LED显示屏实现书写显示功能方面,涉及的人员并不多,相关资料也很少,特别是用单片机控制实现LED显示屏中较复杂功能——图像拖移方面的处理编程,触及的人员和可查资源就更少。
早期在一个N×N点阵LED书写屏中,用单片机实现完成任意圈定图像拖移的功能编程时,采用圈定图像地址中显示数据的搬家、覆盖,出现再次移动时会将原显示图形修改,移动过的区域图像,会出现拖动痕迹,即移动区域的图形不能恢复的问题。
本文给出了一个用51单片机控制系统,借助C语言中的动态数组完成移动圈定图形,并能将拖移过的轨迹消除,恢复原图形的功能设计方法构思及相应程序。
1 设计方法LED点阵书写显示屏结构分:点阵模块,光笔控制器,图像控制器。
结构如图1所示。
图2(a)中光敏电阴与三个运放器构成光笔;图2(b)中使用STC12C5410单片机作控制核心,74HC161与74HC245作译码驱动,共同产生LED点阵屏的行译码信号,LED的列信号则由单片机的端口P1.5串行输出。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void delay(int z)
{
int x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++)
;
}
void WB(char da)//写一个字节的数据
{
char i; for(i=0;i<8;i++)//循环 8 次把编码传给锁存器
{
da=da>>1; //右移一位,取出该字节最低位
{ if(yid<8) tempyid=yid; else tempyid=yid-8; temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid));//h1 左移 tempyidwei 位后和 H2 右移 8-temp 相或,取出移位后的数据
SBUF=temp; while(!TI); TI=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*/
} } #include<reg51.h> sbit 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*/
BUFF1 中 //把第二个字模的第二个字节放
在 BUFF3 中 }
}
void rxd_data(void) // 串行发送数据 { char s; uchar inc,tempyid,temp; if(yid<8) inc=0 else inc=1; for(s=0+inc;s<2+inc;s++) //发送 2 字节数据
move=0;//从头开始
for(a=0;a<43;move*2]);
WB(table[2*a+1+move*2]);
P1=a;
STB=1; STB=0; delay(2); } } }
//输出锁存器中得数据,下降沿
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];// 把 第 一 个 字 模 的 第 二 个 字 节 放 在
#include<reg51.h> #define uchar unsigned char #define uint unsigned int uchar 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,
R=CY;
//将该字节最低位传给 R
CLK=0;
//将数据移入 595 ,上升沿
CLK=1;
}
}
void main()
{
int a,move,speed;
while(1)
{ if(++speed>8) //移动速度控制、
{
speed=0;
move++; }//移位
if(move>16)//是否完成移位一个汉字
void sbuf_out() { for(h=0;h<16;h++) //16 行扫描 { in_data();//调整数据 rxd_data();//串口发送数据 P1=0x7f;//关闭显示 P1_7=1;//锁存为高,595 锁存信号 P1=h;//送行选 } }
void in_data(void) {
void main(void) {
uchar i,d=10; yid=0; zimuo=0; while(1) {
while(yid<16) //数据移位 { for(i=0;i<d;i++)//移动速度
sbuf_out();
yid++;//移动一步 } yid=0; zimuo=zimuo+32;//后移一个字 if(zimuo>=96)//到最后从头开始,由字数决定 zimuo=0; } }