当前位置:文档之家› 单片机课程设计LED报告

单片机课程设计LED报告

中国地质大学(武汉)单片机课程设计报告学院:机械与电子信息学院班级:072121姓名:目录一方案设计 (2)1 题目意义 (2)2 系统功能 (2)二模块描述 (2)1 LED模块 (2)2 键盘模块 (3)3 串口通信模块 (4)三各功能程序设计 (4)1 LED滚动程序设计 (4)(1)左滚动 (5)(2)右滚动 (5)(3)上滚动 (6)(4)下滚动 (6)2 键盘扫描程序设计 (7)3 串口通信程序设计 (9)4 滚动暂停程序设计 (10)(1)键盘控制 (10)(2)串口控制 (11)5 显示截断程序设计 (12)(1)键盘控制 (12)(2)串口控制 (13)6 总体程序设计 (14)四课程设计体会 (15)五附录 (15)一方案设计1 题目意义点阵显示是集微电子技术、计算机技术、信息处理于一体的新型显示方式。

具有:亮度高、工作电压低、功耗小、小型化、寿命长、耐冲击和性能稳定等优点,所以受到广泛重视而达到迅速发展,LED的发展前景极其广阔,目前正朝着更高亮度、更高耐气候性、更高的发光密度、更高的发光均匀性,可靠性、全色化方向发展。

在当今现代信息化社会的高速发展过程中,大屏幕显示已经从公共信息展示等商业应用向消费类多媒体应用渗透。

随着宽带网络的发展,数字化的多媒体内容将在信息世界中占据主流,新型的大屏幕显示设备将代替传统带内实际成为人们享受信息和多媒体内容的中心。

与传统的显示设备相比,这种未来的巨大希求让大屏幕显示技术成为众人目光的焦点:LED显示屏色彩丰富,显示方式变化多样(图形、文字、三维、二维动画、电视画面等)、亮度高、寿命长、是信息传播设施划时代的产品。

LED显示屏是集微电子技术、计算机技术、信息处理于一体的高技术产品,可用来显示文字、计算机屏幕同步的图形。

它以其超大画面、超强视觉、灵活多变的显示方式等独具一格的优势,是目前国际上使用广泛的显示系统。

LED显示屏应用广泛,金融证券,银行利率,商业广告,文化娱乐等方面,有着巨大的社会效益和丰厚的经济效益。

2 系统功能本文设计的系统是基于Lab8000通用微控制器实验系统的16x16 LED点阵显示系统。

本系统可实现如下功能:1、通过键盘输入命令使LED点阵显示屏显示汉字并呈现出左滚动、右滚动、上滚动、下滚动的循环显示效果。

2、可通过键盘输入命令使正在滚动显示的显示屏汉字暂停或继续滚动。

3、当显示屏滚动显示时,如果按下按键,会使当前显示的汉字截断,显示新的汉字及效果。

4、通过串口调试助手输入命令使LED点阵显示屏显示汉字并呈现出左滚动、右滚动、上滚动、下滚动的循环显示效果。

5、可通过串口调试助手输入命令使正在滚动显示的显示屏汉字暂停或继续滚动。

6、当显示屏滚动显示时,如果通过串口调试助手输入命令,会使当前显示的汉字截断,显示新的汉字及效果。

二模块描述1 LED模块16x16点阵需要32个驱动,分别为16个列驱动及16个行驱动。

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

每次显示一行,10ms后再显示下一行。

在此拿行扫描举例说明原理:首先给列寄存器赋值第一行的数据,然后通过行寄存器点亮第一行,再给列寄存器赋值第二行的数据,再点亮第二行,以此方法点亮显示屏的十六行,这便是一次屏幕的扫描显示,屏幕按上面的方法不断扫描显示,便会使屏幕上持续显示出内容。

由于一次全屏扫描显示时间非常短,所以人眼会认为这是十六行同时显示。

这便是显示屏的原理。

2 键盘模块读回行码(0X001H)数据总线列码(0X002H)实验仪提供了一个6×4的小键盘,向列扫描码地址(0X002H)逐列输出低电平,然后从行码地址(0X001H)读回。

如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高。

这样就可以通过输出的列码和读取的行码来判断按下的是什么键。

在判断有键按下后,要有一定的延时,防止键盘抖动。

地址中的X 是由KEY/LED CS 决定,参见地址译码。

做键盘和LED 实验时,需将KEY/LED CS 接到相应的地址译码上。

以便用相应的地址来访问。

例如将KEY/LED CS 信号接CS0上,则列扫描地址为08002H ,行码地址为08001H 。

列扫描码还可以分时用作LED 的位选通信号。

3 串口通信模块串口通信的原理是用串口调试助手通过电脑的端口将数据通过串口线传输到串口线的txd 、rxd 端,然后通过与单片机的txd 、rxd 连接,将数据传输到单片机,然后单片机将数据寄存在串口数据寄存器SBUF 中,然后单片机通过判断SBUF 的值及可执行相应的命令。

三 各功能程序设计1 LED 滚动程序设计程序执行的框图如下所示(1)左滚动显示屏的左滚动要采用的取模必须是逐列式,按照以上显示框图,先将行寄存器赋值第一列的数据,点亮第一列,再给行寄存器赋第二列的数据,点亮第二列,以次类推,将可以对全屏进行显示。

左滚动的效果核心是在取模时按一定的规律进行。

程序如下所示:void zuo(uint zuo1,uint zuo2) //左滚动,通过两个参数控制显示的汉字{for(j=zuo1; j<zuo2; j++){for(k=0;k<17;k++){ //控制滚动时取模for(count =0; count <5; count ++){ //全屏扫描的次数if(t==1)count--; //用于滚动中断bitmask = 0x01; //给指向点亮列赋初值for(i=16;i>0;i--){ //控制显示列的循环ColLow = 0xff; //首先清屏ColHigh = 0xff;a=k+j; //用于取模RowLow = Font[j][a*2+2*i]; //给行寄存器写出一行数据RowHigh= Font[j][a*2+2*i+1];ColLow = ~bitmask & 0xff; //点亮此列ColHigh = ~bitmask >> 8;bitmask <<= 1; //移位,指向下一行delay(1);}}}}(2)右滚动右滚动的原理和左滚动一样,不同之处即为控制显示列的循环时不同。

void you(uint you1,uint you2 ){for(j=you1; j<you2; j++){for(k=0;k<17;k++){for(count =0; count <5; count ++){if(t==1)count--;bitmask = 0x01;for(i=0;i<16;i++){ //与左滚动不同之处ColLow = 0xff; //首先清屏ColHigh = 0xff;a=k+j;RowLow = Font[j][a*2+2*i]; //写出一行数据RowHigh= Font[j][a*2+2*i+1];ColLow = ~bitmask & 0xff; //点亮此列ColHigh = ~bitmask >> 8;bitmask <<= 1; //移位,指向下一行delay(1);}}}} }(3)上滚动上滚动的原理和其他滚动一样,不同之处即为控制显示列的循环时不同与赋值时行寄存器和列寄存器相反。

void shang(uchar shang1,uchar shang2){for(j=shang1; j<shang2; j++){for(k=0;k<16;k++){for(count =0; count <5; count ++){if(t==1)count--;bitmask = 0x01;for(i=16;i>0;i--){RowLow = 0x00; //首先清屏RowHigh = 0x00;ColLow = ~ Font[j][i*2+2*k]; //给列寄存器写出一行数据ColHigh = ~ Font[j][i*2+2*k+1];RowLow = bitmask & 0xff; //点亮此行RowHigh = bitmask >> 8;bitmask <<= 1; //移位,指向下一行delay(1);}}} } }(4)下滚动void xia(uchar xia1,uchar xia2){for(j=xia1; j<xia2; j++){for(k=0;k<16;k++){for(count =0; count <5; count ++){if(t==1)count--;bitmask = 0x01;for(i=0;i<16;i++){RowLow = 0x00; //首先清屏RowHigh = 0x00;ColLow = ~ Font[j][i*2+2*k]; //给列寄存器写出一行数据ColHigh = ~ Font[j][i*2+2*k+1];RowLow = bitmask & 0xff; //点亮此行RowHigh = bitmask >> 8;bitmask <<= 1; //移位,指向下一行delay(1);}}} }}2 键盘扫描程序设计上图即为键盘扫描程序框图程序执行时先给列码发送0x00,如果没有按键按下,则行码返回0x0f,如果有按键按下,则执行按键判断函数,先给第一列发送0,如果行码返回0x0f,则便是按键不是第一列,则程序给第二列发送0,如果行码返回0x0f,则便是按键不是第二列,如果行码返回不是0x0f,则根据返回的值用二维坐标即可判断出是哪个键按下,根据键码即可以给按键返回值赋予相应的数字,此即按键扫描。

程序如下所示:unsigned char TestKey() //按键检测函数{OUTBIT = 0; // 输出线置为0return (~IN & 0x0f); // 读入键状态(高四位不用)}code unsigned char KeyTable[] = { // 键码定义0x16, 0x15, 0x14, 0xff,0x13, 0x12, 0x11, 0x10,0x0d, 0x0c, 0x0b, 0x0a,0x0e, 0x03, 0x06, 0x09,0x0f, 0x02, 0x05, 0x08,0x00, 0x01, 0x04, 0x07};unsigned char GetKey() //取得按键值的函数{unsigned char Pos;unsigned char i;unsigned char k;i = 6;Pos = 0x20; // 寻找按键时给寻找值赋初值,此时指向第一列do {OUTBIT = ~ Pos; //给列码赋值,因为低有效,所以取反Pos >>= 1; //右移一位,准备下一列扫描k = ~IN & 0x0f; //返回按键所在列} while ((--i != 0) && (k == 0));// 键值= 列x 4 + 行if (k != 0) {i *= 4;if (k & 2) //判断是否第二列i += 1;else if (k & 4) //判断是否第三列i += 2;else if (k & 8) //判断是否第四列i += 3;OUTBIT = 0;do Delay1(10);while (TestKey()); // 等键释放return(KeyTable[i]); // 取出键码} else return(0xff);}3 串口通信程序设计本系统中我采用串口中断,这种方法的好处是在显示屏扫描的过程中可以通过中断迅速的接收串口数据,不用等显示完再进行串口数据接收判断,在显示截断功能中有很大的用处。

相关主题