嵌入式系统课程设计_基于嵌入式课程设计
嵌入式系统课程设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“基于嵌入式课程设计”。
《嵌入式系统概论》综合设计报告书
设计题目:用键盘控制LED显示不同图形
中央民族大学 二零零八年十月三十一日
一、设计目的了解LED点阵和矩阵键盘的工作原理。
二、设计内容
编写程序控制用矩阵键盘控制LED点亮,产生不同的图形。
三、设计方案
功能概述:
本设计要实现的功能是通过键盘控制LED点阵图形显示,如果键盘输入0-9十个数字时显示相应的数字,如果输入其他的键,则显示“+”号。
1、程序设计思路
本设计要实现键盘控制LED点阵图形显示,就必须要编写键盘和LED点阵的程序。先通过扫描矩阵键盘,得到键盘值,然后再调用点阵显示子函数,根据扫描的键盘值,在LED点阵上显示不同的图形。
2、主程序设计
主程序要实现的功能是矩阵键盘扫描,得到键盘值,然后把值传给LED显示函数。
程序流程图如下:
3、LED点阵显示函数设计
本函数要实现的功能是根据键盘的值,在LED点阵上显示不同的图形。如果键盘的输入值为0-9则显示相应的数字,如果输入的是其他值,则显示“+”。本程序采用二维数组存放要显示的图形的字模,然后再通过逐行扫描LED点阵,把要显示的图形分8次显示,一次显示一行,利用人眼的视觉暂留效应,是人看到的是一个图形一次显示出来,通过一个循环控制图形显示的时间。程序流程图如下:
4、点阵图形设计
根据8*8 LED点阵的原理,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}
//+
};
四、程序源代码
//*************************************************************** #include #include #include #include // open()close()#include // read()write()#include
#define DEVICE_NAME “/dev/led_ary_ctl” #define DEVICE_NAME1 “/dev/keypad”
void Key(unsigned char b[]);
//------main----int main(void){
int fd;
int ret;
unsigned char buf[2];
double x;
char pre_scancode = 0xff;
printf(“n start keypad_driver test nn”);
fd = open(DEVICE_NAME1, O_RDWR);
printf(“fd = %dn”,fd);
if(fd ==-1){
printf(“open device %s errorn”,DEVICE_NAME1);}
else {
buf[0]=0x22;
while(1)
{
read(fd,buf,1);
if(buf[0]!= pre_scancode)
{
if(buf[0]!=0xff)
{
printf(“key =%xn”,buf[0]);
Key(buf);
}
}
pre_scancode = buf[0];
usleep(50000);
}
// close
ret = close(fd);
printf(“ret=%dn”,ret);
printf(“close keypad_driver testn”);}
return 0;}// end main //***************************************************************************** //---------------void Key(unsigned char b[]){ int fd;
int ret;
int i,j,k;
unsigned char buf[2];
unsigned char buf2[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char 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}
//+
};
// begin of led ary
buf[0]= 1;
buf[1]= 0;
if(b[0]
i=10;
fd = open(DEVICE_NAME, O_RDWR);
printf(“fd = %dn”,fd);
if(fd ==-1)
printf(“open device %s errorn”,DEVICE_NAME);
else {
for(j=0;j
{
for(k=0;k
{
buf[0]=buf1[i][k];buf[1]=buf2[k];
write(fd,buf,2);
}
usleep(1);
}
// close
ret = close(fd);
printf(“ret=%dn”,ret);
printf(“close led_driver testn”);} } //-
五、设计结果
实现键盘控制LED点阵显示,输入0-9十个数字时显示相应的数字,如果输入其他的键,则显示“+”号。
六、心得体会
通过本次实验,我们对linux下的实验更加熟悉了,对LED点阵显示和矩阵键盘的原理有了深入的了解,掌握了点阵图形的设计方法和键盘的输入的读取,并把二者结合起来,实现了键盘控制点阵图形现实。
在实验过程中,我们也出现了问题,最开始时,由于不清楚点阵的C,R的高低位的对应情况,经过试验,才确定。然后就是点阵的显示是一闪即过的,然后我们通过循环控制了点阵的显示时间。总之,通过这次设计,我们都学到了很多东西。