AVR键盘设计Word文档下载推荐.docx
《AVR键盘设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《AVR键盘设计Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
L7805稳压器
8M石英晶体
22pF电容
ATmega16单片机
SPI程序下载端口
LED发光二极管
按键
4
拨动式开关
120Ω电阻
5.1kΩ电阻
共阴型数码管
集成电路插座40脚
数据下载线
排针、跳线
若干
4、设计步骤
硬件设计
设计要点
1、但键盘中按键数量较多时,为了减少对I/O口的占用,通常用将按键排列成矩阵形式。
2、如其原理图所示,首先由一个I/O口来控制其列电平,与此同时对各行对应的I/O口依次进行检测,当符合检测条件时,即确定该按键按下,而后进行对应的软件操作。
3、如图,5V电源经过5.1kΩ和120Ω的电阻接到PD0口,设置PD0口为列电平;
在5.1kΩ和120Ω的电阻之间分别将四个按键的一端连接起来,另一端则分别于PD1、PD2、PD3、PD4相连。
电路图
行扫描法也称为逐行扫描法,其按键识别过程如下:
①:
首先将行线PD1~PD4设置为低电平输出,然后读PD0中有无低电平出现,如果有低电平出现,则说明有按键按下;
如果读到的是高电平,则表示无按键按下。
②:
在确定有按键按下后,则要确定具体是哪个按键,其思路是依次将行设置为低电平,并检测列线的输入,进而确认具体的按键位置。
当PD2输出低电平时(PD1=1、PD2=0、PD3=1、PD4=1),测得PD0为低电平(PD0=0),则可以确认是S5按下。
PCB图(未铺地)
PCB图(已铺地)
实物图
软件设计
功能:
设计简单的程序,使得按键操作可以控制数码管的递加数字,并可以控
制数码管再任何时候停止递加。
程序说明:
1、首先要对数码管动态扫描子程序进行编程;
2、对各个按键的状态进行扫描,确定被按下的按键;
3、对工作停止按键的程序进行编程,使其能够使数码管停止工作,
而且再次工作时,数码管数字从零开始计数。
程序内容:
/*****************************************************
Thisprogramwasproducedbythe
CodeWizardAVRV1.25.7aEvaluation
AutomaticProgramGenerator
?
Copyright1998-2007PavelHaiduc,HPInfoTechs.r.l.
Project:
Version:
Date:
2011-11-8
Author:
Freeware,forevaluationandnon-commercialuseonly
Company:
Comments:
Chiptype:
ATmega16
Programtype:
Application
Clockfrequency:
4.000000MHz
Memorymodel:
Small
ExternalSRAMsize:
0
DataStacksize:
256
*****************************************************/
#include<
mega16.h>
delay.h>
#defineKey_mask0b00000001
flashunsignedcharled_7[10]=
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
flashunsignedcharposition[2]={0xFD,0xFE};
unsignedchardis_buff[2];
unsignedcharposit,digital=0,key_value,key_line;
voiddisplay(void)//数码管动态扫描显示子程序
{
unsignedchari;
for(i=0;
i<
100;
i++)
{
PORTC=0xFF;
PORTA=led_7[dis_buff[posit]];
PORTC=position[posit];
if(++posit>
=2)posit=0;
delay_ms(10);
}
}
voiddigital_to_disbuff(void)//将数据送至缓存区子程序
unsignedchari=0;
dis_buff[i++]=digital%10;
dis_buff[i]=digital/10;
voidmain(void)
unsignedcharkey_temp;
unsignedinti;
PORTA=0x00;
DDRA=0xFF;
PORTC=0x03;
DDRC=0x03;
PORTD=0x1F;
DDRD=0x1E;
2;
i++)
{
dis_buff[i]=0;
}
while
(1)
key_line=0b00000010;
for(i=1;
4;
PORTD=~key_line;
key_value=Key_mask&
PIND;
if(key_value==Key_mask)//判定是否有按键按下
key_line<
<
=1;
else
if(key_line==0b00000010)//如果是第一个按键按下
while
(1)
digital_to_disbuff();
display();
if(++digital>
=100)digital=0;
key_line=0b00010000;
key_temp=Key_mask&
if(key_temp!
=Key_mask)//检测复位键是否按下
digital=0;
PORTA=0x00;
break;
if(key_line==0b00000100)//如果是第二个键按下
++digital;
}
if(key_line==0b00001000)//如果是第三个键按下
digital+=2;
五、键盘操作的测试结果
当按下第一个键时,数码管自动加1至99,而后自动返回零继续自加;
当按下第二个键时,数码管自动加2至98,而后自动返回零继续自加;
当按下第三个键是,数码管自动加3至99,而后自动返回零继续自加;
当按下复位键是,在自加中的数码管自动熄灭,再次操作1、2、3键时,数码管从零自加。
数码管自加状态
右面的小面板上有四个按键,其中三个分别控制数码管自动加1、加2、加3,另外一个按键对数码管进行复位操作。
复位数码管
当按下去复位键时,数码管停止工作。
六、总结
通过本次作业,最大的收获是掌握了扫描键盘的工作原理,以及两位数码管的工作原理和他们电路焊接,并锻炼了自己独立编程能力,不足之处是自己看的程序太少,许多东西还是要受别人所编程序的启发才能编写出来。
另外,在作业中的程序编写上,首先使用中断来进行对数码管的控制的,但缺点是不能进行复位操作,只能关闭电源,重新启动单片机才能使得其他按键起作用,后来借鉴书本上的编程思想,编写出用扫描的方式控制各个P口,从而实现各个按键对各P口电位的控制,实现了扫描式键盘的功能,工作稳定可靠,并可以在不断电的情况下实现程序的中断和再次运行。
7、参考文献
[1]马潮.AVR单片机嵌入式系统原理与应用实践[M].北京:
北京航空航天大学出
版社,2009.
[2]Protel相关视频资料