键盘控制LED显示不同图形嵌入式系统课程设计.docx
《键盘控制LED显示不同图形嵌入式系统课程设计.docx》由会员分享,可在线阅读,更多相关《键盘控制LED显示不同图形嵌入式系统课程设计.docx(12页珍藏版)》请在冰点文库上搜索。
键盘控制LED显示不同图形嵌入式系统课程设计
《嵌入式系统概论》
综合设计报告书
设计题目:
键盘控制LED显示不同图形
学院:
信息工程学院
班级:
09自动化
学号:
姓名:
指导老师:
完成地点:
完成时间:
2011年12月29号
一、设计目的
了解LED点阵和矩阵键盘的工作原理
二、设计内容
编写程序控制用矩阵键盘控制LED点亮,产生不同的图形
三、设计方案
功能概述:
本设计要实现的功能是通过键盘控制LED点阵图形显示,如果键盘输入0-9十个数字时显示相应的图形,如果输入其他的键,则显示“+”号。
程序设计思路
本设计要实现键盘控制LED点阵图形显示,就必须要编写键盘和LED点阵的程序。
先通过扫描矩阵键盘,得到键盘值,然后再调用点阵显示子函数,根据扫描的键盘值,在LED点阵上显示不同的图形。
主程序设计
主程序要实现的功能是矩阵键盘扫描,得到键盘值,然后把值传给LED显示函数。
程序流程图如下:
LED点阵显示函数设计
本函数要实现的功能是根据键盘的值,在LED点阵上显示不同的图形。
如果键盘的输入值为0-9则显示相应的数字,如果输入的是其他值,则显示“+”。
本程序采用二维数组存放要显示的图形的字模,然后再通过逐行扫描LED点阵,把要显示的图形分8次显示,一次显示一行,利用人眼的视觉暂留效应,是人看到的是一个图形一次显示出来,通过一个循环控制图形显示的时间。
程序流程图如下:
点阵图形设计
根据8*8LED点阵的原理,8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;
先绘制出要显示的图形如下:
根据图形中点亮的LED灯的位置,得到相应图形的16进制数,存放在二维数组Buf1[11][8]中。
所以要显示的图形的字模如下:
buf1[11][8]={{0x3c,0x24,0x24,0x24,0x24,0x24,0x3c,0x00},//0
{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},//1
{0x3c,0x20,0x20,0x3c,0x04,0x04,0x3c,0x00},//2{0x3c,0x20,0x20,0x3c,0x20,0x20,0x3c,0x00},//3{0x24,0x24,0x24,0x3c,0x20,0x20,0x20,0x00},//4{0x3c,0x04,0x04,0x3c,0x20,0x20,0x3c,0x00},//5{0x3c,0x04,0x04,0x3c,0x24,0x24,0x3c,0x00},//6{0x3c,0x20,0x20,0x20,0x20,0x20,0x20,0x00},//7
{0x3c,0x24,0x24,0x3c,0x24,0x24,0x3c,0x00},//8
{0x3c,0x24,0x24,0x3c,0x20,0x20,0x3c,0x00},//9
{0x08,0x08,0x08,0x3e,0x08,0x08,0x08,0x00}//+
};
四、设计结果
通过以上设计实现键盘控制LED点阵显示,输入0时显示“元”,输入1时显示“旦”,输入2时显示“快”,输入3时显示“乐”,输入4和5时显示两个笑脸,输入7—9时显示相应的数字,如果输入其他的键,则显示“+”号。
得出的图像如下所示:
五、心得体会
通过这次编写程序控制用矩阵键盘控制LED点亮,产生不同的图形的实验,我们不仅对linux系统的实验更加熟悉而且还掌握了LED点阵显示的编译和烧写和矩阵键盘的的编译和烧写,点阵图形的设计方法和键盘的输入的读取,并把二者结合起来,实现了键盘控制点阵图形的实验。
这次课程设计对于我们来说虽然做的时候比较复杂,不是很顺利,但是从整个过程和结果来看是受益匪浅的。
在实验过程中,我们出现的问题不少,耗费了许多时间,从最开始的换电脑到后面的编译程序我们都遇到很多困难,由于我们原来的电脑出现问题我们不得不重新换电脑做实验,这就意味着一切都要从头开始,我们从编译烧写linux系统开始到led点阵烧写和键盘的点阵烧写都用了不少时间,后来编写程序设计所要显示的图像也花费了许多时间。
虽然我们在各个环节花费的时间比较多但是最后我们都很顺利的完成了实验,而且从中学到不少关于linux系统的知识。
更重要的是,做实验的过程,思考问题的方法,让我们在实验中提升自我。
附录:
程序源代码
根据以上步骤和图形的数模编码我们写出程序的源代码:
//***************************************************************
#include
#include
#include
#include//open()close()
#include//read()write()
#include
#defineDEVICE_NAME"/dev/led_ary_ctl"
#defineDEVICE_NAME1"/dev/keypad"
voidKey(unsignedcharb[]);
//-------------------------------------main-----------------------------------
intmain(void)
{
intfd;
intret;
unsignedcharbuf[2];
doublex;
charpre_scancode=0xff;
printf("\nstartkeypad_drivertest\n\n");
fd=open(DEVICE_NAME1,O_RDWR);
printf("fd=%d\n",fd);
if(fd==-1)
{
printf("opendevice%serror\n",DEVICE_NAME1);
}
else
{
buf[0]=0x22;
while
(1)
{
read(fd,buf,1);
if(buf[0]!
=pre_scancode)
{
if(buf[0]!
=0xff)
{
printf("key=%x\n",buf[0]);
Key(buf);
}
}
pre_scancode=buf[0];
usleep(50000);//延迟us为单位
}
//close
ret=close(fd);
printf("ret=%d\n",ret);
printf("closekeypad_drivertest\n");
}
return0;
}//endmain
//*****************************************************************************
//-----------------------------------------------------------------------------
voidKey(unsignedcharb[])
{
intfd;
intret;
inti,j,k;
unsignedcharbuf[2];
unsignedcharbuf2[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsignedcharbuf1[11][8]={{0x00,0x3c,0x00,0x7e,0x28,0x28,0x66,0x00},//
{0x00,0x3c,0x24,0x3c,0x24,0x3c,0x7e,0x00},//
{0x22,0x72,0x63,0xff,0x22,0x52,0x8a,0x00},//
{0x10,0x08,0x14,0x14,0x7c,0x54,0x9a,0x10},//
{0x42,0x42,0xa5,0xa5,0x00,0x24,0x18,0x00},//
{0x00,0x42,0xa5,0xad,0x10,0x08,0x10,0x08},//
{0x3c,0x04,0x04,0x3c,0x24,0x24,0x3c,0x00},//6
{0x3c,0x20,0x20,0x20,0x20,0x20,0x20,0x00},//7
{0x3c,0x24,0x24,0x3c,0x24,0x24,0x3c,0x00},//8
{0x3c,0x24,0x24,0x3c,0x20,0x20,0x3c,0x00},//9
{0x08,0x08,0x08,0x3e,0x08,0x08,0x08,0x00}//+
};
//beginofledary
buf[0]=1;
buf[1]=0;
if(b[0]<=9)i=b[0];
elsei=10;
fd=open(DEVICE_NAME,O_RDWR);
printf("fd=%d\n",fd);
if(fd==-1)
printf("opendevice%serror\n",DEVICE_NAME);
else
{
for(j=0;j<=5;j++)
{
for(k=0;k<8;k++)
{
buf[0]=buf1[i][k];buf[1]=buf2[k];
write(fd,buf,2);
}
usleep
(1);
}
//close
ret=close(fd);
printf("ret=%d\n",ret);
printf("closeled_drivertest\n");
}
}
//