sccode=0xFE;/*every scan initiative value,11111110*/
while(sccode!=0xEF)/*sccode is not 11101111,follow;or return 0*/
{
PORTA=sccode;/*send scan code 11111110 to portA*/
PORTA=sccode;/*send scan code 11111110 to portA*/
if((PINA&0xF0)!=0xF0)/*read portA,if high 4 bits are not 1111,key pressed in this line*/
{
recode=(PINA&0xF0)|0x0F;/*portA high 4 bits reserved,low 4 bits are 1111*/
while((PINA&0xF0)!=0xF0)
{};
/*read portA,if portA high 4 bits are not 1111,key
;pressed,
if key pressed,we must wait,wait for key released*/
return((~sccode)+(~recode));/*return row+column*/
}
else
{
sccode=(sccode<<1)|0x01;
/*scan code left shift 1 bit, add 1 to right,11111101*/
}
}
最终返回的扫描结果包括按键所在的行值和列值。判断步骤是:先将端口A的高4比特记录在扫描变量recode中,低4比特置为1111。再次读入端口A的高4比特,由此判断按键是否松开。用户还未松开按键时,高4比特当中有低电平0存在,此时只能循环等待。只有当用户松开按键之后,才将高4比特与低4比特进行按位反操作,并复合形成最终返回的扫描结果。如果没有检测到有按键按下,则将扫描变量sccode向左移位1比特,继续进行下一次扫描。
3.2 液晶显示模块
用户在多次进行输入频率以及“+1Hz”和“-1Hz”微调后,专注于观察信号输出对下一级电路的影响,往往忘了目前系统的输出频率。这样导致在精确测试中要求微调时也不知该向高调整还是向低调整。为了告知用户系统所处的当前频率,我们扩展了液晶显示模块,实现了当前频率在液晶显示模块上实时显示。液晶显示模块占用了单片机Atmega16L的PD0-PD7作为数据接口,采用了单片机的PB0-PB4作为控制端口。图3给出了液晶显示模块与控制器电路设计电路图。
PB0引脚选择液晶显示模块的数据存储器或指令存贮器,PB1引脚表明此次操作是读液晶显示模块还是写液晶显示模块,PB2则构成上升沿与下降沿完成读写时序。PB3负责选中液晶显示模块的左半部分,PB4负责选中右半部分,通常PB3与PB4都置为1。需要注意的是,在数据或指令准备好了之后,再让PB2进行电平变化,否则读写会出错。
本设计借助单片机Atmega16L的大容量程序存贮器,将英文字母和若干汉字的字型点阵作为数组存入单片机的程序存贮器中。需要显示某字符时直接调用数组,从而简化了设计,实现了英文、汉字以及图形的显示。本设计显示界面友好,操作可控性强。
图3 液晶显示模块与控制器电路设计
4 结论
为了方便现代化工业生产与精确的频率测试,我们设计了基于AVR单片机的高精度频率调节器。在本设计中,可以使用小键盘上的“+1Hz”键和“-1Hz”键,方便地进行频率精确到1Hz的调节。此频率调节器体积小而功能强,由Atmel公司的AVR单片机Atmega16L作控制核心,用户可随时调整系统输出频率。采用了4×4键盘输入用户设定的频率值,占位小而效率高,编制程序让AVR单片机扫描即可得到频率,省去了专用键盘接口芯片8279。液晶显示模块可实时显示当前频率,显示界面友好,操作可控性强。本系统可以产生方波和正弦波。
本设计的硬件与软件均已经应用在某频率测试生产线中。工业生产与测试使用表明,本设计简化了频率调节过程,用户使用方便,具有节电、低成本、抗干扰能力强、频率控制精度高速度快的特点。
|