基于单片机的光立方设计课程设计.doc
综合实践项目名称 基于单片机光立方设计 专业班级 学生姓名 指导教师 年 月 日第 25 页摘 要本课程设计制作出一个三维立体显示图案LED光立方。主要采用8*8*8 led组成模式。距离是14cm*14cm*20cm(长.宽.高),主要分为三个模块:主控模块、驱动模块、显示模块;我们所做光立方驱动电路,主控电路等都是纯手工焊接。采用主控芯片32K STC89C58芯片,驱动电路是采用我们常用74HC574数字芯片。光立方工作过程中,通过程序对电路控制,可以在LED组成立方体上显示出各种图形。软件采用自上而下模块化设计思想,使系统朝着分布式、小型化方向发展,增强系统可扩展性与运行稳定性。关键词:LED光立方; 74HC574; 51单片机ABSTRACTThis design produced a three-dimensional pattern of the LED light cube. This product can not only like a light-emitting diode dot matrix display plane static or dynamic screen can also display three-dimensional static or dynamic images,and to break the traditional program.While increasing the display patterns and three-dimensional effect can be widely used to display and decorative display for future progress and development to guide the direction,light cube display more visual effects than the light-emitting diode dot matrix,and the picture is more rich colorful. With a combination of graphics and characters more perfect display characteristics.The design is STC89C58 MCU core controller,eight D edge flip-flop 74HC574 (tri-state) expansion I/O port completion of the hardware circuit design. Programmed by software to control the data is downloaded to the MCU to complete the designs of the show. This design software is a top-down modular design,the system moving in the direction of distributed,small development,enhance the stability of the system's scalability and running.Keywords:52single-chip;74HC573latch;8*8*8 LED;目 录摘 要IABSTRACTII第1章 绪论11.1 目及要求11.2 电路设计及元件选择11.2.1 电路设计11.2.2 元件选择2第2章 电路工作原理32.1 设计原理32.2 模块及控制器接口3第3章 方案选择53.1 电源选择53.2 3D显示核心控制器53.2.1 单片机53.2.2 DSP 芯片53.2.3 EDA63.3 I/O口扩展芯片选择63.4 LED发光显示二级管63.4.1 按颜色分类73.4.2 按使用场合分类73.4.3 按发光点直径分类7第4章 焊接84.1 焊接前准备工作84.2 焊接8第5章 程序设计选择及分析105.1 单片机C语言主要特点105.2 单片机C语言及标准C语言区别105.3 数据类型选用115.4 算法设计问题115.5 数据存储器分配125.6 单片机C语言及汇编语言混合编程125.7 程序分析选择14第6章 电路调试及总结15参考文献16附录 程序代码17致谢23第1章 绪论1.1 目及要求(1)目:转眼间我们学习单片机已经有大半学期了,也是到了期末考试时间了,感到安慰是不用考试,但是要做一个实物,做这个实物目是主要回顾我们学习单片机知识与提高我们焊接与其他动手实操能力(包括了数字电路与模拟电路知识)。(2)要求:要有自主创新,其中我们开关是采用触摸型开关,只要由一个I/O口与VCC组成。1.2 电路设计及元件选择1. 电路设计 主要分为三个模块分别是主控模块,驱动模块,显示模块。其中P1位一个触摸型开关,C3为去耦电容防止高频干扰。驱动电路:在驱动电路上,每个锁存芯片电源端都加了一个瓷片电容,主要作用是防止高频干扰显示电路:所有灯负端都是接在一起,下面每一组都是控制光立方一个面,控制是光立方竖起来面,而横着面由图374LS138控制。 元件选择(1)由于光立方程序量比较大,而且要求相对比较高,因此经过考虑之后我们决定用51系列增强型芯片STC89C58,选择理由:STC89C58RD+是单时钟/机器周期(IT)单片机,采集速度较普通51单片机快8一12倍,此外,较宽电压范围(5.5一3.3V)增强了系统适应性。(2)串行移位芯片采用74LS138,它还有亮度调整功能,通过调节R_EXT端电阻大小或者PWM,就可轻松做到亮度可控。层切换是通过3-8线译码器74HC138可代换芯片:74138系列。对控制器输出层信号译码,然后通过P沟道MOS管放大后驱动LED光立方一层二极管阳极,此时对应移位后并行数据就被显示出来了。然后通过协调层数据与层选通,动态显示后就能做到立体控制及显示。(3)由于在刚刚接触锁存器时候,就接触了74HC574,对它使用也比较成熟,因此在驱动部分使用了熟悉74HC574,其优点有:1.高阻态;就是输出既不是高电平,也不是低电平,而是高阻抗状态;在这种状态下,可以多个芯片并联输出2.数据锁存;当输入数据消失时,在芯片输出端,数据仍然保持3.数据缓冲; 加强驱动能力4.这8片74LM574构成了64位静态显示,可显示一层图像也就是一个二维画面。(4)LED灯选择,出于外观与整体形状美观,我们放弃我们经常用草帽型LED,采用是方形高亮LED灯由于草帽光发散比较厉害容易影响视角效果,从而使用方形,同时方形也比较聚光。第2章 电路工作原理2.1 设计原理Y轴X轴每层LED排序如上图D0,D1,D2,D3D62,D63分别为64个LED阵列实际排序方式,也就是光立方俯视图,对应下图分别是其数据信号O(_)U(_)T(_)0,O(_)U(_)T(_)1,O(_)U(_)T(_)2,O(_)U(_)T(_)3O(_)U(_)T(_)62,O(_)U(_)T(_)63;“光立方”是由8层这样布局LED组成,每层位置排列全部一致每层LED所有正极全部接到一起,然后连接138行扫描驱动电路,通过138译码确定使能哪一层数组OUT0代表光立方从第一层D0到第八层D0数据,以此类推数组OUT1 代表光立方从第一层D1到第八层D1数据。这样数组中就包含了光立方完整一帧数据。OUT0位0表示光立方D0所在第一层数据(1为点亮0为熄灭),同样OUT0位1也就是第2层数据。2.2 模块及控制器接口VCC:电源5V可做处理器电源GND:电路地线公共地EN:当模块层扫描信号完成后,使能该信号,低电平有效,必须在下次扫描信号切换前终止使能C,B,A:为层扫描切换,000为第1层,001为第2层,010为第3层,011为第4层,100为第5层,101为第6层,110为第7层,111为第8层。CLK:为串行移位总线时钟时序LE:寄存器输出脉冲,将此时移位寄存器数据传输到输出寄存器DS: SDI为串行移位总线数据时序时钟上升沿锁存数据电源:接5V电源。第3章 方案选择 电源选择方案一:采用普通干电池作为LED系统电源,由于点阵系统耗电量较大,点阵系统一般悬挂在高处上,一直不停工作。使用干电池需经常换电池,不符合节约型社会要求。方案二:采用一块LM7805三端集成稳压器。把市电经变压器降压输入电路,而后整流送到LM7805三端稳压器稳压输出作为工作电压。不仅功率上可以满足系统需要,不需要更换电源,并且比较轻便,使用更加安全可靠。方案三:采用5V电源移动充电宝。基于以上分析,决定选取5V电源移动充电宝供电电源。3.2 3D显示核心控制器控制部分是整个系统核心部分,其功能可以实现及上位机通信接收上位机发送数据与控制指令经处理过后控制显示屏显示内容。其常用电子设计方法有单片机、DSP、及EDA技术。 单片机单片机是集成了CPU,ROM,RAM与I/ O口微型计算机。它有很强接口性能,非常适合于工业控制,因此又叫微控制器(MCU)。单片机品种齐全,型号多样 CPU 从8,16,32到64位,多采用RISC 技术,片上I/O非常丰富,有单片机集成有A/ D,“ 看门狗”,PWM,显示驱动,函数发生器,键盘控制等。它们价格也高低不等,这样极大地满足了开发者选择自由。除此之外单片机还具有低电压与低功耗特点。随着超大规模集成电路发展,单片机在便携式产品中大有用武之地。 DSP 芯片DSP 又叫数字信号处理器。顾名思义,DSP主要用于数字信号处理领域,非常适合高密度,重复运算及大数据容量信号处理。现在已经广泛应用于通信、便携式计算机与便携式仪表、雷达、图像、航空、家用电器、医疗设备等领域。 DSP区别于一般微处理器另一重要标志是硬件乘法器以及特殊指令,一般微处理器用软件实现乘法,逐条执行指令,速度慢。DSP 依靠硬件乘法器单周期完成乘法运算,而且还具有专门信号处理指令。它强大数据处理能力与高运行速度,是最值得称道两大特色。芯片内置544字高速SRAM。外部可寻址64K字程序/数据及I/O,令周期在25ns50ns之间,实时性处理比16位单片机快2倍以上,可取代一般单片机。 EDAEDA(即Electronic Design Automation) 即电子设计自动化,它是以计算机为工具,在EDA 软件平台上,对用硬件描述语言HDL 完成设计文件自动地逻辑编译、逻辑化简、逻辑分割、逻辑综合及优化、逻辑布局布线、逻辑仿真,直至对于特定目标芯片进行适配编译、逻辑影射与编程下载等。而且MCU与DSP都是通过串行执行指令来实现特定功能,不可避免低速,而FPGA/CPLD则可实现硬件上并行工作,在实时测控与高速应用领域前景广阔;另一方面,FPGA/CPLP器件在功能开发上是软件实现,但物理机制却与纯硬件电路一样,十分可靠。基于以上分析,三种设计方式相比较各有优点且都能够实现控制功能,但单片机技术门槛较低开发成本也较低非常适合初学者进行学习与锻炼使用。现在市场上常用单片机主要有MCS-52、AVR、ARM、PIC等。其中应用最广泛单片机首推Intel52系列,由于产品硬件结构合理,指令系统规范,加之生产历史“悠久”,有先入为主优势常作为单片机学习教材。所以决定选取52系列单片机作为控制部分核心器件。3.3 I/O口扩展芯片选择方案一:选取串口输入并口输出芯片74LS164,虽然I/O口使用较少,由于本次设计共需要72路I/O口,列驱动电路就需要8块74LS164。显示数据是先后顺序给送去,显示会有延迟,而LED动态显示刷新时间控制大约10ms,实时性差,效果不好。方案二:74HC573 跟74LS573管脚一样。器件输入是与标准CMOS 输出兼容;加上拉电阻,他们能与HC/ALSTTL 输出兼容。当锁存使能端为高时,这些器件锁存对于数据是透明(也就是说输出同步)。当锁存使能变低时,符合建立时间与保持时间数据会被锁存。8块74HC573共用64个I/O口,数据可以并行写入芯片,延迟时间少,满足设计要求。综合以上比较,决定选取74HC573作为列线驱动IO口扩展芯片。 3.4 LED发光显示二级管LED是一种固体光源,当它两端加上正向电压时就可以发光。采用不同材料,可制成不同颜色发光二极管。作为一种新光源,广受欢迎而得以快速发展。从而在各种各样传媒信息宣传中得以表达。简述其分类方法如下。 按颜色分类单基色显示屏:单一颜色(红色、绿色、黄色、蓝色等等)。双基色显示屏:红与绿双基色,256级灰度、可以显示65536种颜色。全彩色显示屏:红、绿、蓝三基色,256级灰度全彩色显示屏可以显示一千六百多万种颜色。 按使用场合分类室内显示屏:发光点较小,一般3mm-8mm,显示面积一般零点几至十几平方米。 室外显示屏:面积一般几十平方米至几百平方米,亮度高,可在阳光下工作,具有防风、防雨、防水功能。 按发光点直径分类室内屏:3mm、3。75mm、5mm。 室外屏:10mm、12mm、16mm、19mm、21mm、26mm。 基于以上分析结果,加上由于成本与控制难易程度,决定选取单色3mm绿光LED作为本次设计显示色彩,亮度高,显示效果很好。第4章 焊接 焊接前准备工作 准备好烙铁、焊锡丝、钳子等工具,以及LED。LED正负极很好判别,长引脚为+,短为-。LED最好选用直径3mmLED,推荐选绿色。长脚LED可以省很多工作量。实际测量长脚是29mm,短脚为27mm,由于LED光立方板子灯间距决定了,每个LED间距是20mm。这样长短引脚都符合这个尺寸。由于所有LED框架焊接好后,一旦有LED损坏更换难度很大,所以焊接前要测试所有LED,用一般数字显示万用表打到二极管量程,用万用表红表笔接长引脚,黑接短引脚。LED正常发光并且亮度基本一致,这样LED就是好,否则是坏灯。如果为了确保可靠也可以焊接好一层后测试LED是否能点亮。 焊接 将8个LED焊接为一组,可以通过2种方法完成。方法一:需要用钳子将LED正极扭弯,这个弯,一定要小,正好露出LED外围打弯正合适,LED正极折弯后留下引脚长度必须大于LED间距20mm,以确保有足够重合位LED灯脚全部折好后,就可以焊接了,为了方便焊接可以在万能板上面钻几个2mm孔,间距为 8个洞洞置以便焊接。焊接细节,将一个LED正极引脚靠近到另一个LED正极打弯处,然后上焊锡焊接,焊接要光亮可靠,有一定机械强度。这样将全部LED焊接成8个一组LED灯排待用。焊接时避免用过多助焊剂,要不会粘到LED表面,影响外观。焊机避免正负2极短路。注意每一层二极管都是共阴。方法二:需要借助一个工艺设备,这个东西可以自己动手制作,用这个辅助焊接当然要容易些。焊接方法也是一样,将一个LED正极引脚靠近到另一个LED正极打弯处,然后上焊锡焊接,焊接要光亮可靠,有一定机械强度。这样将全部LED焊接成8个一组LED灯排待用。焊接小经验,由于LED灯脚有一定弹性,一个LED引脚靠近到另一个LED正极打弯处时,一松手就又弹远了,所以建议焊接时多掰一点,掰过了之后利用弹性将两个要焊接引脚 靠进,这样焊接会容易许多。第5章 程序设计选择及分析作为一种结构化程序设计语言,C语言特点就是可以使你尽量少地对硬件进行操作,具有很强功能性、结构性与可移植性,常常被优选作为单片机系统编程语言。但是基于单片机C语言与标准C语言有很大区别,如何结合单片机系统资源,用C语言开发符合实际工程需要单片机系统,对用编程者来说具有十分重要意义。5.1 单片机C语言主要特点用C 编写程序比汇编更符合人们思考习惯,开发者可以摆脱及硬件无必要接触,更专心考虑功能与算法而不是考虑一些细节问题,这样就减少了开发与调试时间。C语言具有良好程序结构,适用于模块化程序设计,因此采用C语言设计单片机应用系统程序时,首先要尽可能地采用结构化程序设计方法,将功能模块化,由不同模块完成不同功能1,这样可使整个应用系统程序结构清晰,易于调试与维护。不同功能模块,分别指定相应入口参数与出口参数,对于一些要重复调用程序一般把其编成函数,这样可以减少程序代码长度,又便于整个程序管理,还可增强可读性与移植性。在实际单片机程序设计中,程序结构一般均采用如下结构:#include<reg52.h> /*头文件说明部份*/unsigned char x1,x2; /*全局变量声明部份*/Function1( ) /*功能函数定义部份*/main() inti,j; /*整型变量声明部份*/Function1(); /*功能函数说明部份*/5.2 单片机C语言及标准C语言区别由于现在越来越多产品都采用单片机开发,所完成计算与控制工作也日趋复杂,但是单片机系统是一种资源十分有限系统,这主要表现在程序存储器资源不足,因此在程序设计时如何使用好这些有限资源就显得十分重要。用C语言编程虽然具有许多优点,但是生成代码相对要长,要是编程技术不好,生成代码甚至有可能比汇编语言生成代码长几倍,因此对编程者来说,应该注意到单片机C语言与一般意义上标准C语言区别,对程序进行适当优化。5.3 数据类型选用单片机C语言编程不同于一般C语言编程显著一个特点,就是要与程序存储器资源结合起来,虽然其提供数据据类型十分丰富,但是只有bit与char等数据类型是是机器语言直接支持数据类型,用此类数据类型语句所生成代码较短;而其它数据类型如整型、浮点型等数据要有一定内部程序或内部函数支持,相对来说用该类数据类型语句生成代码要长。有些C语言程序表面上看起来十分简单,但在在实际编译时,生成代码却相当长。因此我们要按照实际需要,合理地选用数据,可以大大减少所生成代码长度。例如在S52中每种数据类型变量所占用存储器字节数与经编译后生成代码长度如表1所示:通过表1我们知道,不同数据类型所生成机器代码长度相差很多,相同类型数据类型有无符号对机器代码长度也有影响。在程序编译时生成机器代码长数据类型优先级越高,不同数据类型在进行程序运算时要转化为高优先级数据类型,相应代码长度也会增长2。因此我们应尽可能地使用bit,char等机器语言直接支持数据类型,无符号数变量应声明为无符号数,尽可能地减少程序中使用数据类型种类。5.4 算法设计问题单片机C语言与标准C语言存在着很大差别,在计算机上进行C语言程序设计时由于不必考虑程序代码长短,只需考虑程序功能实现,但是在单片机上进行C语言程序设计就必须考虑系统硬件资源。有时并不是程序算法越简单、长度越短越好,因为有一些算法要调用一些内部子程序与函数,生成机器代码长度非常长。不同算法对程序代码长度影响十分大,因此在进行程序设计时,就尽量采用程序生成代码短算法,在不影响程序功能实现情况下可以采用一些优化算法2。在单片机C语言编译成机器代码时,不同运算生成机器代码长度相差很大,尽可能地减少程序中对某种数据类型运算种类,越复杂数据类型效果越明显。在进行数据计算时,在一定精度范围内,可以用一些近似计算来完成一些运算,既不损失精度又能减少大量代码。比如:用逻辑AND/&取模比MOD/%操作更有效。在用热敏电阻测量温度时,可根据热敏电阻温度特性公式来求值。数学表达式表示为:RT=RT0expB(1/T-1/T0)如果直接按照公式温度时程序结构简单,算法复杂度不高,但是程序将调用<Math.h>文件中对数函数,在编译成机器码时函数有1K多字节,对于一般只有几K字节单片机系统来说,这是十分不合适。考虑到系统资源问题可以用一种替代方法查表法来实现算法。只要给出一定温度范围内不同温度值对应热敏电阻电阻值,然后建立表格,只要按照系统求出阻值,进行查表,插值,就可以求出相应温度值。这种算法相比前面公式法算法复杂高,C语言程序代码也长,但在编译成机器码时,代码长度却很短,只有一、二百字节。5.5 数据存储器分配单片机内部数据存储器RAM只有几百字节,如果扩展外部存储器RAM来提高数据存储量话必将会增加了硬件成本,使系统更加复杂,访问外部存储器比访问内部存储器所需代码也要长得多。有效地使用片内存储器、提高存储器空间利用率对开发者来说十分关键。内部处理器、内部堆栈、压缩栈、所有程序变量与所有包含进来库函数都将使用数量有限内部数据存储器RAM。因为C语言采用了存储器覆盖技术2,可以在程序进行连接时,它将那些已经被其它程序段释放了存储器空间重新定义给另一个程序段变量使用,当这个程序运行结束时再将这些存储器释放以供其它程序段使用。全局变量作用范围是整个程序,因此不能被释放;静态变量由于在函数调用中专用不变,也不能被释放;只有局部变量中动态变量可以被释放。因此在进行程序设计时应该尽量使用局部变量,提高内部数据存储器使用率。在C语言中程序中间结果及参数传传递是通过内部寄存器来完成,要是内部存储器不够,将会给你程序带来许多莫名其妙错误。例如在进行程序设计时语句不应该太长,一个长语句可以分成多个语句,这样话可以大减少中间变量,当然太长时就会造成临时寄存器不够用,导致计算出错。5.6 单片机C语言及汇编语言混合编程在绝大多数场合采用C语言编程即可完成预期目,但是对实时时钟系统、要求执行效率高系统就不适合采用C语言编程,对这些特殊情况进行编程时要结合汇编语言。汇编语言具有直接与硬件打道、执行代码效率高等特点,可以做到C语言所不能做到一些事情,例如对时钟要求很严格时,使用汇编语言成了唯一选择。这种混合编程2方法将C语言与汇编语言优点结合起来,已经成为目前单片机开发最流行编程方法。目前大多数据单片机系统,在C语言中使用汇编语言有两种情况:一种是汇编程序部分与C程序部分为不同模块,或不同文件,通常由C程序调用汇编程序模块变量与函数(也可称为子程序或过程);另一种是嵌入式汇编,即在C语言程序中嵌入一段汇编语言程序。当汇编程序与C程序为不同模块时程序一般可分为若于个C程序模块与汇编程序模块,C程序模块通常是程序主体框架,而汇编程序模块通常由用C语言实现效率不高函数组成,也可以是已经成熟、没有必要再转化成C语言汇编子程序。在这种混合编程技术中,关键是参数传递与函数返回值。它们必须有完整约定,否则数据交换就可能出错。对于嵌入式汇编,可以在C程序中使用一些关键字嵌入下些汇编程序,这种方法主要用于实现数学运算或中断处理,以便生成精练代码,减少运行时间。当汇编函数不大,且内部没有复杂跳转时,可以用嵌入式汇编实现。AT89S52单片机内置模拟比较器,13脚即P1.1是比较器负输入端,12脚即P1.0是比较器正输入端,比较器输出端做在了CPU内部即P3.6未被引出,CPU可以直接读取P3.6状态来判定两输入端比较结果其与一个外部电阻及一个外部电容器就可以设计成一个A/D转换器,采用RC模拟转换原理,来检测外部P1.1引脚输入电压。由于系统对时钟要求很严格,因此就采用了C语言与汇编语言混合编程技术,程序调用形式如下:汇编子程序: PUBLIC _AD ;入口地址 con SEGMENT CODE ;程序段 RSEG con _AD: SETB P3.7 ;充电 Loop: JB P3.6,AD_END ;开始计数匹配 INC A CJNE A,#100,Loop AD_END: CLR P3.7; 放电 CJNE A,#100,Ret_Val ;看结果是否有溢出,有溢出说明结果不对 SJMP Con_OV;返回值 Ret_Val:DEC A MOV R7, A; A/D转换结果保存在R7中,传递给主程序 Con_OV: RET END单片机C程序:include<reg51.h>unsigned char AD(unsigned char);/在C程序中声明汇编模数转换子程序void timer0(void) interrupt 1 using 1 unsigned char x; x=AD(); /在C程序中调用汇编程序Main /主程序在以上程序中,函数返回值为一无符号字符型数,根据调用规则,返回值在R7中,这样才可保证数据传递不出错。另外,在调用过程中,必须注意寄存器入栈。这样在以后用到A/D转换时,在C语言中调用汇编语言子程序AD()即可。5.7 程序分析选择C语言具有很强功能性与结构性,可以缩短单片机控制系统开发周期,而且易于调试与维护,已经成为目前单片机语言中最流行编程语言。所以本设计选取C语言作为编辑语言。第6章 电路调试及总结完工以后抱着很激动心情,编写了调试程序,主要是检查全部灯是否会亮,但是单把程序烧写进去之后,发现有两列没有点亮,还好两列都在边上,进而如果换灯也相对容易,我们用排除法来检查电路,首先是检查灯线路是否虚焊,断路,果真有一列是断路了,把它接上后这一列也亮了,还剩下另外一列,我们用同样方法来做,从驱动电路到显示都没有问题,而且在输入那一列电压也正常,我们就想不通了,是什么原因呢?我们怀疑是不是有灯坏了,我们又一个一个检查了这一列灯,但是全部都会亮,经过很细心检查,发现有一个灯亮度与其他灯亮度完全不同,相对比较暗,于是我们把它换了下来,接上另外一个,果然是哪个灯问题,原来是由于灯阻抗很大,把那一列电平都拉低了,使灯无法亮起来 ,在电路调试中就出现了这些问题,相对来说还是不错。经过这次课程项目设计,我们更明确了团队合作是要领与精神,再次再一次感谢教师对我们帮助,在以后我们会做更好。参考文献2 华成英,童诗白. 模拟电子技术基础.高等教育出版社,2007年8月附录 程序代码#include<reg52.h>#define uchar unsigned charuchar t,i,k,a,s;sbit d1=P04;sbit d2=P06;sbit q0=P00;sbit q1=P01;sbit q2=P02;sbit q3=P03;sbit key=P05;void delay(uchar z)uchar x,y;for(x=z;x>0;x-)for(y=11;y>0;y-);void yi()P0=0xff;d1=0;d2=1;P2=0xa5;delay(8);P2=0xb5;delay(8);P2=0xc5;delay(8);P2=0xd5;delay(8);P2=0xe5;delay(8);P2=0xf5;delay(8);void er()P0=0xff;d1=1;d2=0;P2=0x00;delay(8);P2=0x03;delay(8);P2=0x04;delay(8);P2=0x07;delay(8);P2=0x0e;delay(8);P2=0x0e;delay(8);P2=0x0f;delay(8);d1=0;d2=1;P2=0x00;delay(8);P2=0x10;delay(8);P2=0x20;delay(8);P2=0x30;delay(8);P2=0x50;delay(8);P2=0x90;delay(8);P2=0xa0;delay(8);P2=0xc0;delay(8);P2=0xf0;delay(8);void san()P0=0xff;d1=1;d2=0;P2=0x00;delay(8);P2=0x03;delay(8);P2=0x04;delay(8);P2=0x07;delay(8);P2=0x0e;delay(8);d1=0;d2=1;P2=0x00;delay(8);P2=0x10;delay(8);P2=0x20;delay(8);P2=0x30;delay(8);P2=0x40;delay(8);P2=0x50;delay(8);P2=0x90;delay(8);P2=0xa0;delay(8);P2=0xc0;delay(8);P2=0xf0;delay(8);void si()P0=0xff;d1=1;d2=0;P2=0x00;delay(8);P2=0x01;delay(8);P2=0x02;delay(8);P2=0x03;delay(8);P2=0x07;delay(8);d1=0;d2=1;P2=0x00;delay(8);P2=0x10;delay(8);P2=0x20;delay(8);P2=0x30;delay(8);P2=0x40;delay(8);P2=0x50;delay(8);P2=0xc0;delay(8);void qi()P0=0xff;d1=1;d2=0;P2=0x03;delay(8);P2=0x04;delay(8);d1=0;d2=1;P2=0x00;delay(8);P2=0x10;delay(8);P2=0x20;delay(8);P2=0x30;delay(8);P2=0x40;delay(8);P2=0x50;delay(8);P2=0xf0;delay(8);void ba()P0=0xff;d1=1;d2=0;P2=0x00;delay(8);P2=0x01;delay(8);P2=0x02;delay(8);P2=0x03;delay(8);P2=0x04;delay(8);P2=0x07;delay(8);P2=0x0e;delay(8);P2=0x0e;delay(8);P2=0x0f;delay(8);d1=0;d2=1;P2=0x00;delay(8);P2=0x10;delay(8);P2=0x20;delay(8);P2=0x30;delay(8);P2=0x40;delay(8);P2=0x50;delay(8);P2=0x90;delay(8);P2=0xa0;delay(8);P2=0xc0;delay(8);P2=0xf0;delay(8);void jiu()P0=0xff;d1=1;d2=0;P2=0x00;delay(8);P2=0x01;delay(8);P2=0x02;delay(8);P2=0x03;delay(8);P2=0x04;delay(8);P2=0x07;delay(8);P2=0x0e;delay(8);P2=0x0e;delay(8);d1=0;d2=1;P2=0x00;delay(8);P2=0x10;delay(8);P2=0x20;delay(8);P2=0x30;delay(8);P2=0x40;delay(8);P2=0x50;delay(8);P2=0x90;delay(8);P2=0xa0;delay(8);P2=0xc0;delay(8);P2=0xf0;delay(8);void bayiqi()switch(t)case 0: P0=0xff;P2=0xfe;ba();break;delay(1);case 1: P2=0xfd;ba();break;delay(1);case 2: P2=0xfb;ba();break;delay(1);case 3: P2=0xf7;ba();break;delay(1);case 4: P2=0xef;ba();break;delay(1);case 5: P2=0xf7;ba();break;delay(1);case 6: P2=0xfb;ba();break;delay(1);case 7: P2=0xfd;ba();break;delay(1);case 8: P2=0xfe;ba();break;delay(1);case 9: P2=0xfe;yi();break;delay(1);case 10: P2=0xfd;yi();break;delay(1);case 11: P2=0xfb;yi();break;delay(1);case 12: P2=0xf7;yi();break;delay(1);case 13: P2=0xef;yi();break;delay(1);case 14: P2=0xf7;yi();break;delay(1);case 15: P2=0xfb;yi();break;delay(1);case 16: P2=0xfd;yi();break;delay(1);case 17: P2=0xfe;yi();break;delay(1);case 18: P2=0xfe;qi();break;delay(1);case 19: P2=0xfd;qi();break;delay(1);case 20: P2=0xfb;qi();break;delay(1);case 21: P2=0xf7;qi();break;delay(1);case 22: P2=0xef;qi();break;delay(1);case 23: P2=0xf7;qi();break;delay(1);case 24: P2=0xfb;qi();break;delay(1);case 25: P2=0xfd;qi();break;delay(1);case 26: P2=0xfe;qi();break;delay(1);void yisanyisi()switch(t)case 0: P0=0xff;P2=0xfe;yi();break;delay(1);case 1: P2=0xfd;yi();break;delay(1);case 2: P2=0xfb;yi();break;delay(1);case 3: P2=0xf7;yi();break;delay(1);case 4: P2=0xef;yi();break;delay(1);case 5: P2=0xf7;yi();break;delay(1);