当前位置:文档之家› LED点阵书写显示屏设计方案

LED点阵书写显示屏设计方案

LED点阵书写显示屏设计方案第一章设计任务及要求1.1、任务设计并制作一个基于32x32点阵LED模块的书写显示屏,其系统结构如图1所示。

在控制器的管理下,LED点阵模块显示屏工作在人眼不易觉察的扫描微亮和人眼可见的显示点亮模式下;当光笔触及LED点阵模块表面时,先由光笔检测触及位置处LED点的扫描微亮以获取其行列坐标,再依据功能需求决定该坐标处的LED是否点亮至人眼可见的显示状态(如下图中光笔接触处的深色LED点已被点亮),从而在屏上实现“点亮、划亮、反显、整屏擦除、笔画擦除、连写多字、对象拖移”等书写显示功能。

图1.1 LED点阵书写显示屏系统结构示意图1.2、要求(1)在“点亮”功能下,当光笔接触屏上某点LED时,能即时点亮该点LED,并在控制器上同步显示该点LED的行列坐标值(左上角定为行列坐标原点)。

(2)在“划亮”功能下,当光笔在屏上快速划过时,能同步点亮划过的各点LED,其速度要求2s能划过并点亮40点LED。

(3)在“反显”功能下,能对屏上显示的信息实现反相显示(即:字体笔画处不亮,无笔画处高亮)。

(4)在“整屏擦除”功能下,能实现对屏上所显示信息的整屏擦除。

第二章系统整体框架系统整体框架图如图一所示,分为控制模块、显示模块、光笔模块、LED点阵模块和辅助模块(包括键盘、数据存储等)。

图2.1 系统整体框架图第三章方案论证与比较3.1、控制模块在数字信号处理中,常用的控制器有FPGA、DSP及嵌入式51单片机。

FPGA可以直接用硬件扫描、编码、解码、纠错,速度快、稳定性高,但其价格昂贵,很多的功能在本设计难以使用到。

DSP都有较快的数据处理速度,能实时地、快速地监测信号量的变化,但其受采样频率的限制,处理频率围有限。

AT89S52 是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程Flash 存储器。

使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。

片上Flash允许程序存储器在系统可编程,亦适于常规编程器。

在单芯片上,拥有灵巧的8位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案,具有硬件的设计十分简单,软件开发周期短等特点。

考虑到价格、功耗及系统的要求,最终选用AT89S52单片机为控制系统。

3.2、光笔模块光笔设计的关键是选择合适的传感器件,只有具有很高的灵敏度和一定的响应时间的传感器才能完成系统的要求及功能。

方案一:采用核心部件为光敏电阻制成的光笔检测系统。

光敏电阻是将光能转换为电能的一种传感器件,它是构成光电式传感器的主要部件。

光敏电阻结构简单、使用方便、价格便宜,但其响应时间长,不易检测。

方案二:采用光敏二极管,与光敏电阻相比有较好的高频特性,具有较好的可靠性,功耗低,且同样价格低廉,使用方便。

比较两种器件,系统设计中选用光敏二极管制作光笔模块。

3.3、LED点阵模块LED点阵的显示方式有以下几种:1)在LED点阵上贴上一层触摸屏,形成压膜式LED点阵。

把触摸屏的信息通过微处理器处理来控制LED点阵显示。

这种显示方式准确,反应速度快,光笔制作简单,但造价高。

2)用普通的LED点阵,在LED点阵的边上加上红外线传感接收器,构成32×32的红外线网,同样光笔制作简单,但硬件复杂,造价也比较高。

3)用普通的LED点阵,通过自制的光笔传递信息送入89S52单片机,由AT89S52单片机编程确定LED点阵坐标。

虽然编程复杂,但硬件简单,而且造价最低。

综合各方面的因素,选择了第三个方案。

第四章系统硬件设计4.1、系统的总体设计本设计以AT89S52为核心部件结合按键、数码管显示、光笔检测及LED点阵驱动显示等部分组成。

系统框图如图4.1所示:4.2图4.2 光电笔电路图采用C语言2分法查寻需要10次,每查寻一次的时间为5ms。

普通的光敏二极管反应时间在30μs左右,完全可以满足设计要求。

电路见图4.2。

4.3、点阵屏驱动参数设计本系统采用共阳极型低态扫描高态显示信号驱动电路和74LS373锁存器。

系统的锁存器低态输出,其I可达24mA,足以驱动一个LED。

我们把32×32LED点阵,等分为OL四个16×16的LED点阵来驱动,设定驱动每列LED的电流为15mA,则流过驱动三极管的总电流为240mA,8550三极管最大的工作电流可达500mA,因此选择8550三极管驱动。

电路图见图4.3和4.4。

图4.3 由74LS373锁存器组成的驱动电路图4.4 驱动原理图4.5、电源电路图4.5 电源部分滤波电路电源输入电源部分采用采用体积小,效率高的开关电源,为系统提供稳定的5V直流电压。

其电路图如图4.5所示。

4.6、单片机人机界面电路图4.6.1、键盘电路键盘是使用比较简单的独立式键盘,而且具有发光二极管指示功能模块。

在程序中采用中断扫描的方式,在没有键操作时CPU执行正常程序,只在有键操作时才处理键盘程序。

其电路如图4.6所示:图4.6 键盘输入4.6.2、LED显示电路为了满足系统在工作时能准确显示光笔对应亮点所处的行列坐标值,本设计中采用型号为LCM103的液晶显示器显示。

LCM103为10位多功能通用型8段式液晶显示模块,含看门狗时钟发生器2种频率的蜂鸣驱动电路置显示RAM,可显示任意字段笔画划3-4线串行接口可与任何单片机接口。

其电路图如图4.7所示。

图4.7 LED显示电路第五章程序设计5.1、系统程序流程图本设计中,要实现的功能基本都要通过单片机程序来实现。

由于采用的是普通的光敏二极管,在一定程度上限制了反应速度,因此编程采用了多路信号同时输入和数学中的二分法思想编程,提高了系统的执行效率。

系统的程序流程图如图5.1所示:图5.1 系统的程序流程图5.2、程序源码//x轴显示#include "reg51.h"#define uc unsigned char#define ui unsigned int#define uli unsigned long int//T0定时时间设定#define T0_time_init 1124 //1.25ms#define d_ray 2#define time0_H ((65535-T0_time_init)/256)#define time0_L ((65535-T0_time_init)%256)#define address_h P2#define data_io P0#define code_add P1#define y_one 0x8f#define y_ten 0xaf#define y_hun 0xcf#define y_kilo 0xef#define y_5 0xbf#define y_4 0x9f#define y_6key 0xdf#define y_7key 0xff#define y_no 0x0fuc code show_code[]={0xc0,0xcf,0x64,0x46,0x4b,0x52,0x50,0xc7,0x40,0x42,0x41,0x58,0xf0,0x4c,0x70, 0x71,0xff,};/*uc xdata data_q[0x7fff] _at_ 0x0000;//uc xdata y_6key _at_ 0xdf00;//uc xdata y_7key _at_ 0xff00;data_q[]={0xc0,0xcf,0x64,0x46,0x4b,0x52,0x50,0xc7,0x40,0x42,0x41,0x58,0xf0,0x4c,0x70, 0x71,0xff,} ; */uc xdata data_x1[8][128] _at_ 0x0000;uli xdata data_xt[32] _at_ 0x0800;uli xdata data_xn[32] _at_ 0x0a00;uli xdata data_xm[32] _at_ 0x0c00;//uli data_xt[32]={0};sbit black_ray=P3^5;sbit black_louch=P3^4; sbit await_con=P3^2;sbit clssed_screen=P3^3; bit flag_key_read=0;bit flag_time_manage=0; bit flag_screen_out=0; bit flag_bf_clr=0;bit flag_open_await=0; bit flag_fast_xy=1;bit flag_fast_move=1; bit flag_count_fre=0; bit flag_fre_first=0; uc key_reg;uc indata;uc coo_x=32;uc coo_y=32;uc await=5;uc show_page=0;ui await_count=0;uc move_jraw=0;uc x0;uc x1;uc x2;uc y0;uc y1;uc y2;uc move_y;uc move_x;uc move_x0;uc move_x1;uc move_x2;uc move_y0;uc move_y1;uc move_y2;init(); //初始化工作//key_read(); //键盘读入//data_out_manage(); //数据输出处理//time_manage(); //定时处理//number_show(ui,bit); //数码显示//key_code(uc,uc); //按键译码//led_scon(); //LED扫描//led_scon_y(uc); //扫描Y轴//number_show_two(uc,uc); //二个单字节delay_1ms(uc);delay_10us(uc);screen_out(); //屏幕输出coo_manage(); //坐标处理//choose_draw();move_draw_mamage();restore_mamage();//*************************************************************// //主程序////*************************************************************// main(){data_xt[32]=11;init(); //初始化工作//while(1){if(flag_key_read==1){ flag_key_read=0;key_read(); //键盘读入//if(key_reg!=0){ data_out_manage(); //数据输出处理//}if(black_louch==0){ led_scon(); //LED扫描if(coo_y<32){ if(flag_count_fre==0){number_show_two(coo_x,coo_y);coo_manage(); //坐标处理//await_count=0;coo_y=99; //防止多次进入}}}}if(flag_time_manage==1){ flag_time_manage=0;time_manage();}if(flag_screen_out==1){ flag_screen_out=0;screen_out(); //屏幕输出}}}//*************************************************************// //主程序_end////*************************************************************////*************************************************************// //初始化工作 ////*************************************************************//init(){ uc c;//定时器设置(5点)TMOD=0x51; //T0计时器设置//TMOD: GATE C/!T M1 M0 GATE C/!T M1 M0 // T1 外双控 =1计数工作方式01:16位|| T0EA=1;ET0=1;TH0=time0_H;TL0=time0_L;TR0=1;//id口处理address_h=y_no;data_io=0xff;//存数据处理//调试口number_show_two(0,0); /* key_reg=11;delay_1ms(250);data_out_manage();move_jraw=1;coo_x=8;coo_y=8;delay_1ms(250);coo_manage();coo_x=16;coo_y=16;coo_manage();delay_1ms(250);move_jraw=2;coo_x=16;coo_y=16;delay_1ms(250);coo_manage();coo_x=16;coo_y=16;delay_1ms(250);coo_manage();coo_x=20;coo_y=20;delay_1ms(250);coo_manage();*/}//***********************************/**************************/ //初始化工作 _end////*************************************************************////*************************************************************// //键盘读入////*************************************************************//key_read(){ static n=0; //0一直无按键 1上次进入按键 2一直有按键 3上次退出按键uc a,b;bit point;data_io=0xff;address_h=y_6key;a=data_io;address_h=y_7key;b=data_io;address_h=y_no;// number_show(a*0x100+b,1);if(a==0xff&b==0xff)point=0; //无按键else{point=1; //有按键// number_show(6666,0);}switch (n){case 0:if(point==1)n=1;elsen=0;break;case 1:if(point==1){ n=2;key_code(a,b);}elsen=0;break;case 2:if(point==1)n=2;elsen=3;break;case 3:if(point==1)n=2;elsen=0;break;default:break;}}key_code(uc a,uc b) //按键译码// { //number_show(5555,0);switch (b){case 0xfe:key_reg=1;break;case 0xfd:key_reg=2;break;case 0xfb:key_reg=3;break;case 0xf7:key_reg=4;break;default:key_reg=0xff; //错误信号break;}}//*************************************************************// //键盘读入_end////*************************************************************// //*************************************************************// //输出处理 ////*************************************************************// data_out_manage(){ uc c,n;uli data_long,t;// number_show(key_reg,0);switch (key_reg){case 1: //反选for(c=0;c<128;c++){ t=data_x1[show_page][c];t=~t;data_x1[show_page][c]=t;}break;case 2: //整屏清除for(c=0;c<128;c++){data_x1[show_page][c]=0xff;}break;case 3:flag_bf_clr=1;number_show(10,0);break;case 4:flag_bf_clr=0;number_show(0,0);break;}key_reg=0;}//*************************************************************// //输出处理_end////*************************************************************// //*************************************************************// //数码显示////*************************************************************// number_show(ui datas,bit point){ uc a;if(point==0){a=datas%10; //个位address_h=y_one;data_io=show_code[a];a=datas/10%10; //十位address_h=y_ten;data_io=show_code[a];a=datas/100%10; //百位address_h=y_hun;data_io=show_code[a];a=datas/1000; //千位address_h=y_kilo;data_io=show_code[a];}else{ a=datas%0x10; //个位address_h=y_one;data_io=show_code[a];a=datas/0x10%0x10; //十位address_h=y_ten;data_io=show_code[a];a=datas/0x100%0x10; //百位address_h=y_hun;data_io=show_code[a];a=datas/0x1000; //千位address_h=y_kilo;data_io=show_code[a];}address_h=y_no;data_io=0xff;}//二个单字节 <100number_show_two(uc c,uc b){ uc a;a=b%10;address_h=y_one;data_io=show_code[a];a=b/10;address_h=y_ten;data_io=show_code[a];a=c%10;address_h=y_hun;data_io=show_code[a];a=c/10;address_h=y_kilo;data_io=show_code[a];address_h=y_no;data_io=0xff;}//*************************************************************// //数码显示_end////*************************************************************// //*************************************************************// //LED扫描////*************************************************************// led_scon(){ uc i;data_io=0; //扫描0-15//code_add=8;code_add=10;code_add=12;code_add=14;code_add=6; //关闭373// while(1);data_io=0xff;code_add=9;code_add=11;code_add=13;code_add=15;code_add=7; //关闭373for(i=0;i<16;i++){code_add=i<<4;clssed_screen=0; //开扫描delay_10us(d_ray);if(black_ray==0) //有光返回{coo_x=i;i=i<<4;coo_y=led_scon_y(i); //扫描Y轴clssed_screen=1; //关扫描return;}clssed_screen=1; //关扫描}data_io=0xff; //扫描16-31//code_add=8;code_add=10;code_add=12;code_add=14;code_add=6; //关闭373data_io=0;code_add=9;code_add=11;code_add=13;code_add=15;code_add=7; //关闭373for(i=0;i<16;i++){code_add=i<<4;clssed_screen=0; //开扫描delay_10us(d_ray);if(black_ray==0){coo_x=i+16;i=i<<4;coo_y=led_scon_y(i); //扫描Y轴clssed_screen=1; //关扫描return;}clssed_screen=1; //关扫描}coo_x=32;coo_y=32;}//扫描Y轴led_scon_y(uc scon_x){ uc i;data_io=0; //第一排373code_add=8;code_add=9;code_add=1; //关闭373data_io=0xff;code_add=10;code_add=11;code_add=12;code_add=13;code_add=14;code_add=15;code_add=7; //关闭373code_add=scon_x;data_io=0xff;clssed_screen=0; //开扫描delay_10us(d_ray);if(black_ray==0) //有光返回{ clssed_screen=1; //关扫描for(i=0;i<8;i++){ data_io=~1<<i; //第一排373code_add=8;code_add=9;code_add=1; //关闭373code_add=scon_x;clssed_screen=0; //开扫描delay_10us(d_ray);if(black_ray==0) //有光返回{ clssed_screen=1; //关扫描return i;} clssed_screen=1; //关扫描}}clssed_screen=1; //关扫描data_io=0; //第二排373code_add=10;code_add=11;code_add=3; //关闭373data_io=0xff;code_add=8;code_add=9;code_add=12;code_add=13;code_add=14;code_add=15;code_add=7; //关闭373code_add=scon_x;clssed_screen=0; //开扫描delay_10us(d_ray);if(black_ray==0) //有光返回{ clssed_screen=1; //关扫描for(i=0;i<8;i++){ data_io=~1<<i;code_add=10;code_add=11;code_add=3; //关闭373code_add=scon_x;clssed_screen=0; //开扫描delay_10us(d_ray);if(black_ray==0) //有光返回{ clssed_screen=1; //关扫描return (i+8);}clssed_screen=1; //关扫描}}clssed_screen=1; //关扫描data_io=0; //第三排373code_add=12;code_add=13;code_add=5; //关闭373data_io=0xff;code_add=8;code_add=9;code_add=10;code_add=11;code_add=14;code_add=15;code_add=7; //关闭373code_add=scon_x;clssed_screen=0; //开扫描delay_10us(d_ray);if(black_ray==0) //有光返回{ clssed_screen=1; //关扫描for(i=0;i<8;i++){ data_io=~1<<i;code_add=12;code_add=13;code_add=5; //关闭373code_add=scon_x;clssed_screen=0; //开扫描delay_10us(d_ray);if(black_ray==0) //有光返回{ clssed_screen=1; //关扫描return (i+16);}}}clssed_screen=1; //关扫描data_io=0; //第四排373code_add=14;code_add=15;code_add=7; //关闭373data_io=0xff;code_add=8;code_add=9;code_add=10;code_add=11;code_add=12;code_add=13;code_add=5; //关闭373code_add=scon_x;clssed_screen=0; //开扫描delay_10us(d_ray);if(black_ray==0) //有光返回{ clssed_screen=1; //关扫描for(i=0;i<8;i++){ data_io=~1<<i;code_add=14;code_add=15;code_add=7; //关闭373code_add=scon_x;clssed_screen=1; //关扫描delay_10us(d_ray);clssed_screen=0; //开扫描delay_10us(d_ray);if(black_ray==0) //有光返回{ clssed_screen=1; //关扫描return (i+24);}clssed_screen=1; //关扫描}clssed_screen=1; //关扫描}return 24;}//*************************************************************// //LED扫描_end////*************************************************************// //*************************************************************// //坐标处理////*************************************************************// coo_manage(){ uc xt,yt,a;clssed_screen=1; //关if(move_jraw==0){if(coo_y<8){ yt=coo_x;xt=coo_y%8;}else if(coo_y<16){ yt=coo_x+32;xt=coo_y%8;}else if(coo_y<24){ yt=coo_x+64;xt=coo_y%8;}else if(coo_y<32){ yt=coo_x+96;xt=coo_y%8;}a=data_x1[show_page][yt]; //第一位亮起11111110xt=1<<xt;if(flag_bf_clr==0){ a=~a; //00000001a=a|xt;a=~a;}else{ a=a|xt;}data_x1[show_page][yt]=a;}else{switch (move_jraw){case 1:choose_draw();break;case 2:move_draw_mamage();break;default:break;}restore_mamage();clssed_screen=1;}}//*************************************************************// //坐标处理_end////*************************************************************// //*************************************************************// //屏幕输出////*************************************************************// screen_out(){ static uc a=0;uc c,t;clssed_screen=1;for(c=0;c<8;c++) //8次{ t=c<<4;code_add=c+8; //选址data_io=data_x1[show_page][a+t];}code_add=--c; //关选址code_add=a<<4;clssed_screen=0;if(a++==15){ a=0;}}//*************************************************************// //屏幕输出_end////*************************************************************//第六章测试方案与测试结果基本功能测试:对系统的基本功能进行测试,主要测试了系统的稳定性及基本功能的完成情况,具体的测试结果见表一和表二,从测试结果来看,该系统完全实现了设计要求的“点亮、划亮、反显、整屏擦除”等基本功能,并在“划亮”功能上进行了创新,实现了比设计要求更快的速度。

相关主题