《嵌入式系统概论》综合设计报告书
设计题目:用键盘控制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 \\n\\n\");
fd = open(DEVICE_NAME1, O_RDWR);
printf(\"fd = %d\\n\",fd);
if (fd == -1) {
printf(\"open device %s error\\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);
}
// close
ret = close(fd);
printf (\"ret=%d\\n\",ret);
printf (\"close keypad_driver test\\n\"); }
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 = %d\\n\",fd);
if (fd == -1)
printf(\"open device %s error\\n\",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=%d\\n\",ret);
printf (\"close led_driver test\\n\"); } } //-
五、设计结果
实现键盘控制LED点阵显示,输入0-9十个数字时显示相应的数字,如果输入其他的键,则显示“+”号。
六、心得体会
通过本次实验,我们对linux下的实验更加熟悉了,对LED点阵显示和矩阵键盘的原理有了深入的了解,掌握了点阵图形的设计方法和键盘的输入的读取,并把二者结合起来,实现了键盘控制点阵图形现实。
在实验过程中,我们也出现了问题,最开始时,由于不清楚点阵的C,R的高低位的对应情况,经过试验,才确定。然后就是点阵的显示是一闪即过的,然后我们通过循环控制了点阵的显示时间。总之,通过这次设计,我们都学到了很多东西。