LED摇摇棒毕业设计

更新时间:2023-03-14 04:35:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

LED显示棒

摘要:本设计以AT89S52单片机为中央控制器,利用视觉暂留效果和单片机外部中断技术,实现了在摇动过程中形成的扇形平面内清晰显示文字、字母、图案的LED显示棒的制作。整套系统由中央控制模块、LED显示模块、供电模块等部分组成。本设计实现了设计要求显示的全部内容,并且可以实现动态图案的显示。

关键字:LED

视觉暂留 图案 1 引言

LED显示棒,又称摇摇棒,是一种利用视觉暂留效应制作的“高科技”玩具。可以用“静如处子,动如脱兔”来形容它,即当静止时,它只是几个LED发光二极管(后简称LED) ,而一旦按照一定的频率去摇晃它,它就会随着位置的变化而变化(亮或灭),最终显示一幅图片或字符串。

本设计要求制作完成一个LED的显示棒。要求LED灯线状排列,通过摇动时形成的亮灯扇形区域能够分辨出如:“电”、“A”、五环之类的汉字或图案且可以使用按键对显示内容进行切换。

2 系统设计方案 2.1 设计思路

本系统要求设计一个LED显示棒,且需要有按键进行内容切换,它主要是由中央控制部分、LED驱动部分、LED显示部分以及电源部分组成,如图1所示:

图1:LED显示棒系统框图

单片机将提取的字模进行存储,当接收到按键输入的指令时单片机就将相应的字模代码通过I/O口输出,使LED点亮,利用视觉暂留原理最终使图案完整的显示在摆动的显示屏中。

本题的难点在于送数据的时间间隔以及较长画面或文字的完整显示。以下将对各模块的方案进行论证与比较:

2.2 模块方案的论证与比较

2.2.1 LED灯的选择

方案一:传统LED发光二极管。颜色多样,在可以同样显示图案的前提下使用它更为经济,但是颜色较为黯淡,不鲜亮。

方案二:高亮LED发光二极管。正如其名,它的亮度比传统二极管要亮,而且同样也有很多颜色,但是高亮LED的工作电流也要大于传统二极管。

为了使显示的图案清晰、明了,我们选择方案二,经过比较,使用蓝色的LED使得显示画面更为明显、突出,使用3节1.5V电池为其供电,提供足够的

1

电流。

2.2.2 外部中断信号产生方式

通过外部中断可以控制数据开始传输的时刻。选择好外部中断来源是本次制作的难点及重点。

方案一:使用惯性开关。通过摇晃使得惯性开关的摆杆与焊接的左右两个触点接触,利用这种接触产生的电平变化来触发中断,结合软件控制显示,制作简单,使用方便。

方案二:使用光遮断器。在棒上装一个可以摆动的用来遮挡光遮断器光线的细杆,细杆每左右摆动一次这个杆就会通过一次光遮断器,发生电平变化。同样通过这种电平变化,结合软件控制显示。

本次设计中产生的中断是为了实现数据的单程传输。如果使用光遮断器,其触发单片机的时刻处于正中间,不能解决画面因为返回与原来图片重叠的现象。而使用惯性开关,因为在左右都有触点,所以很容易的在往返途中产生两次中断,方便指令控制,所以选择使用方案一。 2.2.3 抗重影方案的选择

方案一:使用外部中断控制数据传输时刻。外部中断信号由惯性开关产生,触发方式为下降沿触发。惯性开关左右两边的触点分别与单片机两个外部中断接口相连,默认为高电平,摇动的摆杆接地。惯性开关处于不同位置进入不同的中断,从而决定何时送数据。该方案简单易行,可以保证数据是单程传输的,避免了重影。不摇动时把惯性开关处在左边就可以使LED棒熄灭,可以达到省电的效果。

方案二:使用定时器与外部中断。当我们在摆动手臂的时候,短时间内摆动位置和左右幅度不会有太大变化,利用我们手臂的这个运动规律,只要能得到棒从一侧摆动到另一侧的时间,然后把这个时间分成N份,在每一份的时间里显示不同的花样就能实现图形的显示。设计中摇动的摆子与左右两个触点接触各一次的时间可以通过外部中断和定时器计算出来,然后用单片机的另一个定时器T1,其定时时间是T0 的N 分之一,每次中断依次显示一列,就可以得到预期显示的图案了。该方法可以控制摇动频率低的时候不显示图形。但程序的稳定性不高,图形之间的间隔不易确定,只要电源开关开着LED始终是点亮的。

本次设计要求显示的字符长度较短,使用方案一中的外部中断方法只要控制好延时就可以达到完整显示图案的目的,而且方案一中只使用了外部中断,它所占用的内存比方案二中既使用外部中断又使用两个定时器所占用的单片机资源要少,所以选择使用方案一。 2.2.4 关于创新部分的讨论

本设计的最大特色就是可以使单列的LED组合灯通过一定频率的摇动在摆动的扇形区域内呈现出特定的字符或图形。在题目要求的基础上,我们决定从硬件和软件两部分对此摇动棒进行特别改造,比如美化外形,实现画面的动态显示等。

3 系统设计 3.1 总体设计

2

经过分析论证,我们决定了系统各模块的最终方案,流程图如下:

图2:LED显示棒系统原理框图

整套系统以AT89S52单片机为核心控制系统,使用32只LED灯作为显示屏,其中前24只直接与单片机I/O口相连,后8只由一个74HC595控制。当惯性开关触发中断T1时,单片机向32只LED传送数据,依据人体的视觉暂留原理,随着显示棒的摆动前进,输出数据的列也不会立刻消失而是随着摆动逐渐显示在了形成的扇形区域。(整体电路图见附录图1)

3.2 单元电路设计

3.2.1 按键模块

使用一个按键对显示的所有内容进行切换,通过按钮按下的次数确定显示的内容。

3.2.2 LED显示模块

首先,我们根据LED点阵屏的显示原理:点阵屏的显示分为行扫描与列扫描两种,列扫描是将我们的字模数组通过点阵屏的行驱动进行输入,然后通过列对每一行进行扫描,当列为低(高)电平、行为高(低)电平时则表示该点为图案的一部分,将其读出、显示。它的顺序可以总结为:行不断的送数据,每送完设置的信息后列进行读取,然后行再次送数据,列再次读取??依次循环下去,一幅完整的图案就显示在了显示屏上。

而本次设计的LED显示棒数据传输原理与LED点阵屏相似。可以把LED显示棒看成是LED点阵屏中的一列。为了使显示的图案清晰,我们使用了32个LED管将它们排成一列,整个屏在静止时也就相当于32行×1列。数据传输时我们同样使用行送数据、列扫描。在摆动过程中,应用视觉暂留原理,我们点亮的列不会很快的消失,而是随着摆动的方向继续向前移动,只要移动的速度高于视觉暂留的最短时间显示内容就不会熄灭,至此,一幅图案也就可以这样被“摆动”出来了。

3.2.3 惯性开关模块

惯性开关装置(如附录图2),它由摆杆、触点和导轨组成。当LED显示棒向左摆动到极点时,摆杆 与左边的触点2接触,此时与2相连的P3.2口变为低电平,按照软件的设定:从此刻起禁止对行进行数据传输;同理,当显示棒摆到右边极点时,与3接触,与此相连的P3.3口变为低电平,软件设定从此刻起数

3

据开始传输。整个摆动过程就是这样:摆子摆到左边,禁止数据传输;摆到右边,开始数据传输??。使用这种方法就可以让数据单程传输,解决了双程均传输时产生的重影,使得画面更加清晰、明了。 3.2.4 单片机最小系统的设计

由于本次设计制作的是一个显示棒,基本要求就是要小巧、轻便,所以要将单片机的系统板简化设计。它的最小系统包括晶体振荡电路、复位开关和电源部分。图3为AT89S52单片机的最小系统。

图3 AT89S52单片机最小系统

4 软件设计 4.1 软件设计思路

在摇动LED 棒的时候单片机必须单程送数据否则显示的图形会产生重影,影响视觉效果。因此当系统开始工作后通过惯性开关的位置来使单片机实现单程送数据给LED。如果惯性开关位于右边,则进入外部中断T1并将一变量置1。在变量为1期间让单片机以一定的频率将数据送给LED。如果惯性开关位于左边,则进入外部中断T0并将变量置0,在这期间单片机不会送数据给LED。在送数据时,数据送完后应延时一段时间来使摇动时显示的每个字不会太拥挤。之后再立刻熄灭LED并开始重新判断惯性开关的位置(整体流程图见图4)。

4.2 软件系统流程图

4

图4:软件流程图

4.3 动态图片的实现

设计中实现单个图形或者一个词组的显示方法是将要显示的内容一次性送出,延时一段时间后再进行第二次传送数据。而要显示一个动态图片,仿照动画制作方法,先要将一个连贯的动作分为几幅独立的动作,分别提取字模,输出数据是一幅接一幅的连续送,当动作结束后延时一会,再进行第二次连贯动作的传输。同样利用视觉暂留原理,当摇动显示棒时,几幅图接连出现覆盖前面的画面,相同的部分将一直显示,不同的部分就形成了动态的动作,以此一幅动态画面就出现了。

4.4 软件实现功能的完善

本次设计的一个难点是去除重影,我们的解决方法是使用外部中断让数据单程传输。

第二个难点是当显示如“Welcome”这类较长字符时不能完整的显示在一次摇摆的扇形区域内。通过反复试验,我们改变了送数据方式:由一个字符接一个字符传送改为一组字符一起传送,传送结束后再延时,通过不断调试实现了完整显示的功能,同时也解决了画面连续出现没有间断的问题。

综上,只要控制好数据传输方式以及每次传输数据间的延时就可以实现多

5

种数据的显示方法。

5 系统测试

5.1设计要求部分的测试

1、基本显示部分:

能够清晰的显示并辨认出“A”、“电”以及五环,可以通过按键进行内容的切换。

2、发挥部分:

能够清晰的显示并辨认出“Welcome”、“美亚”以及北京奥运会会徽。

综上,本次设计实现了设计要求的全部功能。

5.2创新部分的测试

在创新部分中我们实现的功能有:

1、可以清晰的看到一个行走的动态行人;

2、可以清晰的看到一个正在微笑的动态笑脸;

3、在显示五环的同时,可以显示“北京”与“2008”两个词组的自动切换。 4、设置外部电源插针,在不使用电池供电时可以利用插针进行外部供电。

6 设计总结

本次设计完成了题目要求的所有内容,包括基本部分的“A”、“电”以及五环的显示、发挥部分的“Welcome”、“美亚”以及北京奥运会会徽的显示,除此外还扩展了显示类别,除了文字、字母、静态图案外,还可以显示动态图案。如:行走的人、微笑的脸等。考虑到显示棒使用干电池供电较为费电的方面,我们又设计了专门的外接电源插排,可以实现两种方式的供电。这些创新点的增加都为

6

本次设计增添不少趣味性和实用性。

在这四天三夜中,我们体会到了酸甜苦辣种种滋味,有过不成功的失落感,也有实现功能后的成就感。这四天我们几乎没有好好睡过觉,但是对胜利的追逐始终支撑着我们精神充沛。在比赛中,我们小队的团结合作、互相照料、互相理解的精神完全的体现出来,彼此之间的配合也十分的融洽,这些无不是我们完成制作的最好根据。在讨论中我们不断的完善我们的方案,对每个组员提出的问题都仔细的分析推敲。在这些因素的前提下,我们最终提前实现了所有的设计要求,让我们很是欣慰!

从培训到比赛结束这段时间,对我们来说都是极大的锻炼,不仅在学习能力上有了很大的提高,同时锻炼培养了我们的沟通能力。比赛快要结束了,给我们最大的感觉就是累却快乐着??

参考文献:

[1]《电子技术基础 数字部分》 康华光 编 高等教育出版社

[2]《单片机C51程序设计教程与实验》 祁伟 杨亭 编 北京航空航天大学出版社

[3]《LED及其工程应用》 杨清德 康娅编 人民邮电出版社 [4]《C程序设计》 谭浩强 编 清华大学出版社

[5]《全国大学生电子设计竞赛试题精解选》 陈永真 编 电子工业出版社

附录:

附录1:元器件明细表:

1、单片机AT89S52 1片; 2、驱动芯片 74HC595 1片; 3、发光二极管 32只; 4、是12M晶振 1个 5、电阻、电容 若干 附录2:电路图图纸

7

附录图1:LED显示棒电路图

附录图2:惯性开关立体图 附录图2:惯性开关实物图

附录3:程序清单 #include

sbit a=P3^0;//开关接口,用于切换显示的内容 sbit clock=P3^4;//74ls595时钟信号 sbit so=P3^5;//锁存信号 sbit seg=P3^6;//主信号

8

unsigned int i=1;

unsigned char ID;//键盘标准 unsigned char flag; //标准位 unsigned char k=0; /*逐行式提取字*/

unsigned char code dian[1*32]={

0xFF,0xFF,0xFF,0xF1,0xFF,0xFD,0xE0,0x0D,0xED,0xDD,0xED,0xDD,0xED,0xDD,0xED,0xDD,

0x00,0x03,0xED,0xDF,0xED,0xDF,0xED,0xDF,0xED,0xDF,0xE0,0x0F,0xFF,0xFF,0xFF,0xFF,//电

};

unsigned char code A[1*32]={

0xFF,0xFF,0xFF,0xFB,0xFF,0xFB,0xFF,0xE3,0xFF,0x83,0xFE,0x0B,0xF8,0x3F,0xE1,0xBF,

0xE7,0xBF,0xE7,0xBF,0xF9,0xBF,0xFE,0x3B,0xFF,0x9B,0xFF,0xE3,0xFF,0xFB,0xFF,0xFB,//A

};

unsigned char code Welcome[7*32]={

0xFF,0xFF,0xFF,0xFF,0xFF,0xB7,0xFF,0x37,0xFE,0xBB,0xFE,0xBB,0xFE,0xBB,0xFE,0xBB,

0xFE,0xBB,0xFE,0xBB,0xFE,0xB3,0xFF,0x37,0xFF,0x07,0xFF,0x8F,0xFF,0xFF,0xFF,0xFF,//e

0xFF,0xFF,0xFF,0xFB,0xFE,0x03,0xFE,0x03,0xFE,0xFB,0xFE,0xFF,0xFE,0xFB,0xFE,0x03,

0xFE,0x03,0xFE,0xFB,0xFE,0xFF,0xFF,0x7B,0xFE,0x03,0xFE,0x03,0xFE,0xFB,0xFF,0xFF,//m

0xFF,0xFF,0xFF,0x8F,0xFF,0x07,0xFF,0x77,0xFE,0x73,0xFE,0xFB,0xFE,0xFB,0xFE,0xFB,

0xFE,0xFB,0xFE,0xFB,0xFE,0x73,0xFF,0x77,0xFF,0x07,0xFF,0x8F,0xFF,0xFF,0xFF,0xFF,//o

0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0x77,0xFE,0x7B,0xFE,0xFB,0xFE,0xFB,0xFE,0xFB,

0xFE,0xFB,0xFE,0xFB,0xFE,0x7B,0xFF,0x77,0xFF,0x07,0xFF,0x8F,0xFF,0xFF,0xFF,0xFF,//c

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFB,0xFF,0xFB,0xFF,0xFB,0xE0,0x03,

0xE0,0x03,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,//l

9

0xFF,0xFF,0xFF,0xFF,0xFF,0xB7,0xFF,0x37,0xFE,0xBB,0xFE,0xBB,0xFE,0xBB,0xFE,0xBB,

0xFE,0xBB,0xFE,0xBB,0xFE,0xB3,0xFF,0x37,0xFF,0x07,0xFF,0x8F,0xFF,0xFF,0xFF,0xFF,//e

0xEF,0xFF,0xEF,0xFF,0xE1,0xFF,0xEE,0x3F,0xFF,0xC7,0xFF,0x83,0xEC,0x0F,0xE0,0x7F,

0xE0,0x7F,0xEF,0x1F,0xFF,0xE7,0xEF,0x83,0xE8,0x0F,0xE0,0x7F,0xE3,0xFF,0xEF,0xFF,//W

};

unsigned char code meiya[70]={

0xFF,0xFF,0xBF,0xFB,0xBB,0xF3,0xB0,0xFB,0xBF,0x3B,0xBF,0xDB,0x80,0x03,0xBF,0xFB,

0xBF,0xFB,0x80,0x03,0xBF,0xFB,0xBF,0x1B,0xBC,0xFB,0xBB,0xFB,0xBF,0xFB,0xFF,0xFB,//亚

0xFF,0xFF,0xFE,0xFF,0xDE,0xDD,0xD6,0xDC,0xD6,0xD9,0x56,0xDB,0x96,0xD7,0xD6,0xCF,

0xC0,0x1F,0xD6,0xCF,0x96,0xD7,0x56,0xDB,0xD6,0xDD,0xDE,0xDD,0xDE,0xFE,0xFF,0xFE,//美

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,//这里加空格是让两个字之间留有空隙,显示时不会一个接一个

};

unsigned char code wuhuan[3*68]={

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0xFF,0xDF,0x7F,0xBF,0xBF,0x7F,0xDF,0x7F,0xDF,

0x7F,0xDF,0x7F,0x87,0x7F,0x5B,0x7E,0xDD,0xA0,0xBE,0xDD,0x7E,0xA0,0xBE,0x7D,0xDE,

0x7D,0xDE,0x7E,0x85,0x7F,0x5B,0x7E,0x85,0x7D,0xDE,0xA0,0xBE,0xDD,0x7E,0xA0,0xBE,

0x7D,0xDE,0x7E,0xDD,0x7F,0x5B,0x7F,0x87,0x7F,0xDF,0x7F,0xDF,0xBF,0xBF,0xDF,0x7F,

0xE0,0xFF,0xFF,0xFF,//五环

0xFF,0xFF,0xFF,0xFF,0xDF,0xF7,0x9F,0xE3,0xD8,0x4F,0xDB,0x5F,0xDB,0x7F,0xDB,0x7F,

0x9B,0x01,0x5B,0x7E,0xDB,0x7D,0xDB,0x4F,0xD8,0x67,0xDF,0xF7,0xDF,0xFB,0xFF,0xFF,//京

0xFF,0xFF,0xF7,0xE1,0xE7,0xFD,0xF3,0xFD,0xFB,0xFD,0xFD,0xFD,0x00,0x03,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0x00,0x01,0xFB,0xDF,0xFB,0xEF,0xFB,0xE7,0xFB,0xF3,0xFF,0xF7,//北

10

0xFF,0xFF,0xFF,0xFF,//北京。这里加空格是让两个字之间留有空隙,显示时不会一个接一个,也可以用延时来控制

0xFF,0xFF,0xF1,0xC7,0xEE,0xBB,0xEF,0x7B,0xEF,0x7B,0xEE,0xBB,0xF1,0xC7,0xFF,0xFF,//8

0xFF,0xFF,0xF8,0x0F,0xF7,0xF7,0xEF,0xFB,0xEF,0xFB,0xF7,0xF7,0xF8,0x0F,0xFF,0xFF,//0

0xFF,0xFF,0xF8,0x0F,0xF7,0xF7,0xEF,0xFB,0xEF,0xFB,0xF7,0xF7,0xF8,0x0F,0xFF,0xFF,//0

0xFF,0xFF,0xF1,0xF3,0xEE,0x7B,0xEF,0xBB,0xEF,0xDB,0xEF,0xEB,0xF1,0xF3,0xFF,0xFF,//2

0xFF,0xFF,0xFF,0xFF, };

unsigned char code huihui[64]={

0xFC,0x00,0xCE,0x00,0xC7,0x00,0x83,0x80,0x81,0x80,0x81,0xFE,0x00,0xFF,0x1C,0xE3,

0x3C,0xC1,0x18,0xE3,0x00,0x7F,0x00,0x7E,0x80,0x60,0xC0,0x60,0xE0,0xC0,0xF0,0xC0,//上半身,可以显示印章的

0x00,0x03,0x07,0x81,0x0F,0xE0,0x1F,0xE0,0x3C,0xF1,0x78,0x3F,0x70,0x1F,0xE0,0x0F,

0xFC,0x00,0xFF,0x00,0x07,0x80,0x03,0xC1,0x3F,0xC1,0x3F,0x81,0x30,0x03,0x10,0x0F,//下半身

};

unsigned char code moving_people[4*32]={

0xFF,0xFF,0xFE,0x3F,0xFE,0x3F,0xFC,0x7F,0xFC,0xFF,0x08,0x00,0x10,0xFE,0x31,0xFE,

0x53,0xFE,0x63,0xFE,0x18,0x00,0xFC,0xFF,0xFE,0x7F,0xFE,0x3F,0xFF,0x3F,0xFF,0x1F,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x7F,0xF0,0x00,0x01,0x00,0x00,0x00,0x00,

0x03,0x86,0x60,0x0F,0xF0,0x1F,0xF8,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,//人的第一个姿势

0xFF,0xFF,0xFF,0xFF,0xFF,0xF9,0xFF,0xF3,0xFF,0xE7,0x08,0x00,0x13,0xFE,0x30,0x7E,

0x50,0x1E,0x63,0x86,0x18,0x00,0xFF,0xF3,0xFF,0xF9,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xE1,0xFF,0x80,0xFC,0x00,0x60,0x0E,0x00,0x3F,0x07,0xFF,0

11

x07,0xFF,

0x00,0xFF,0x60,0x1F,0xFC,0x07,0xFE,0x01,0xFF,0xC0,0xFF,0xF0,0xFF,0xFC,0xFF,0xFC,//人的第二个姿势

};

unsigned char code xiaolian[64]={

0xF0,0x0F,0xE7,0xE7,0xCD,0xF3,0x9B,0xF9,0x3B,0xFD,0x7B,0xEE,0x7D,0xF6,0x7F,0xF6,

0x7F,0xF6,0x7D,0xF6,0x7B,0xEE,0x3B,0xFD,0x9B,0xF9,0x8D,0xF3,0xC7,0xE7,0xF0,0x0F,

0xF0,0x0F,0xE7,0xE7,0xCF,0xF3,0x9D,0xF9,0x35,0x7D,0x78,0xDE,0x7D,0xE6,0x7F,0xEA,

0x7F,0xEA,0x7D,0xE6,0x7B,0xDE,0x3B,0xFD,0x9B,0xF9,0x8D,0xF3,0xC7,0xE7,0xF0,0x0F,

};

unsigned char code dianzi[2*32]={

0xFF,0xFF,0xFF,0xF1,0xFF,0xFD,0xE0,0x0D,0xED,0xDD,0xED,0xDD,0xED,0xDD,0xED,0xDD,

0x00,0x03,0xED,0xDF,0xED,0xDF,0xED,0xDF,0xED,0xDF,0xE0,0x0F,0xFF,0xFF,0xFF,0xFF,//电

0xFF,0xFF,0xFF,0x7F,0xFE,0x7F,0xFF,0x7F,0xBF,0x7F,0x9F,0x7F,0xAF,0x7F,0xB7,0x7F,

0xB8,0x01,0xBF,0x7E,0xBF,0x7D,0xBF,0x7F,0xBF,0x7F,0xBF,0x7F,0xFF,0x7F,0xFF,0x7F,//子

};

void Delay(unsigned int delaytime); void Key();

void send8bit(unsigned char n); void Move(); void xiao_lian(); void qiehuan();

void t0(void) interrupt 0//外部中断INT0的动作 {

P0=0xff;P2=0xff; flag=0; }

void t1(void) interrupt 2//外部中断INT1的动作 {

P0=0xff;P2=0xff; flag=1;//第一次进中断 }

12

void main(void) {

a=1;flag=0; ID=0; PX0=1; PX1=0;

TCON=0x05;//打开外部中断T0 EX0=1;//启动外部中断0 EX1=1;//启动外部中断0

EA=1;//定时器和中断的总控制端,高电平有效 while(1) {

Key();P0=0xff;P2=0xff;P2=0xff;send8bit(0xff); while(flag==1) {

if(ID==2) {//横着显示\ for(i=1;i<=223;i+=2) {

P0=Welcome[i-1];P2=Welcome[i]; Delay(40); }

Delay(300);//让两个字之间留有空隙,显示时不会一个接一个 }

else if(ID==3) {//横着显示\美亚\ for(i=1;i<69;i+=2) {

P0=meiya[i-1];P2=meiya[i];

Delay(100);//P0=0xff;P2=0xff;P1=0xff;send8bit(0xff); }

Delay(400);//让两个字之间留有空隙,显示时不会一个接一个 }

else if(ID==4) {//显示五环和下方的北京与2008切换显示 for(i=1;i<=67;i+=2) { P0=wuhuan[i-1];

P2=wuhuan[i]; qiehuan();

Delay(80);//P0=0xff;P2=0xff;P1=0xff;send8bit(0xff); }

Delay(500);

k++; if(k==50) { k=0; } }

if(ID!=4) {

for(i=1;i<=31;i+=2) {

switch(ID) {

13

case 0: P0=dian[i-1]; P2=dian[i]; P1=dian[i-1]; send8bit(dian[i]);break;

case 1: P0=A[i-1]; P2=A[i]; P1=A[i-1]; send8bit(A[i]); break; case 5: P0=dianzi[i-1]; P2=dianzi[i]; P1=dianzi[i+31];send8bit(dianzi[i+32]); break;//竖着显示\电子\

case 6: P0=huihui[i-1]; P2=huihui[i]; P1=huihui[i+31];send8bit(huihui[i+32]); break;

case 7: Move();break; case 8: xiao_lian();break; }

if(ID==0||ID==1||ID==5||ID==6||ID==7||ID==8) { Delay(120); P0=0xff;P1=0xff;P2=0xff;send8bit(0xff); }

}

Delay(500);//让两个字之间留有空隙,显示时不会一个接一个 if(ID==7) { k++; if(k==50) { k=0; } } }

P0=0xff;P2=0xff;P1=0xff;send8bit(0xff); } } }

void Move()//显示跑动的小人 {

if(k>=0&&k<25) {

P0=moving_people[i-1]; P2=moving_people[i];

P1=moving_people[i+31];send8bit(moving_people[i+32]); }

else if(k>=25&&k<50) {

P0=moving_people[i+63]; P2=moving_people[i+64];

P1=moving_people[i+95];send8bit(moving_people[i+96]); } }

void xiao_lian() {

if(k>=0&&k<25) { //控制人每个动作的时间间隔 P0=xiaolian[i-1]; P2=xiaolian[i]; }

else if(k>=25&&k<50) { //控制人每个动作的时间间隔 P0=xiaolian[i+31];P2=xiaolian[i+32]; } }

void qiehuan() {

14

if(k>=0&&k<25) { P1=wuhuan[i+67]; send8bit(wuhuan[i+68]); }

else if(k>=25&&k<50) { P1=wuhuan[i+135]; send8bit(wuhuan[i+136]); } }

void Delay(unsigned int delaytime) {

while(delaytime--); }

void Key() {

if(a==0) {

Delay(1000); if(a==0) {

ID++; if(ID==9) { ID=0; } }

while(a==0); } }

void send8bit(unsigned int n)//用于74ls595串口发送机内码送子程序 {

unsigned char q; for(q=0;q<8;q++) {

seg=(n>>q)&0x01;

clock=1;//寄存器时钟上跳沿,将一位数据存入移位寄存器。 clock=0; }

so=1;//锁存器上跳沿,8位数据存入所存器,e为底允许发送,数据从并口发送

so=0; }

附录4:显示图案效果图

15

if(k>=0&&k<25) { P1=wuhuan[i+67]; send8bit(wuhuan[i+68]); }

else if(k>=25&&k<50) { P1=wuhuan[i+135]; send8bit(wuhuan[i+136]); } }

void Delay(unsigned int delaytime) {

while(delaytime--); }

void Key() {

if(a==0) {

Delay(1000); if(a==0) {

ID++; if(ID==9) { ID=0; } }

while(a==0); } }

void send8bit(unsigned int n)//用于74ls595串口发送机内码送子程序 {

unsigned char q; for(q=0;q<8;q++) {

seg=(n>>q)&0x01;

clock=1;//寄存器时钟上跳沿,将一位数据存入移位寄存器。 clock=0; }

so=1;//锁存器上跳沿,8位数据存入所存器,e为底允许发送,数据从并口发送

so=0; }

附录4:显示图案效果图

15

本文来源:https://www.bwwdw.com/article/kevx.html

Top