这个程序比较简单主要就是实现矩阵键盘扫描,并在lcd1602上显示具体功能如下
(1)系统运行时将所按下的键盘显示在液晶屏上;
(2)电话号码键盘上的DELETE键能实现退格功能;
(3)电话号码键盘上的CLEAR键能实现清屏功能;
(4)每按下一个键盘能够发出声音;
(5)在LCD屏的第一行显示成员名字。
本系统包括单片机晶振复位电路和显示电路矩阵键盘和扬声器模块组成。其中显示,是由LCD 1602来做显示屏;矩阵键盘是4*3作为输入由单片机将输入的信号处理,然后在LCD屏上显示出来。
3 软件设计
void lcd_init()
{
lcd_write(0x38);
lcd_write(0x0c);
lcd_write(0x06);
lcd_write(0x01);
}
void lcd_write(uchar x) //写命令
{
lcd_busy();
e=0; rs=0; rw=0;
e=1; P0=x;
e=0;
lcd_delay();
}
void lcd_busy() //判断LCD是否忙
{
P0=0xff;
rs=0; rw=1;
e=1; e=0;
while(P0&0x80)
{
e=0;e=1;
}
lcd_delay();
}
键盘扫描模块
uchar checkkey() //检测有无按键按下
{
uchar temp;
P1=0xf0;
temp=P1;
temp=temp&0xf0;
if(temp==0xf0)
{return(0);}
else {return(1);}
}
uchar keyscan() //键盘扫描函数
{
uchar hang,lie,keyvalue,buff;
if(checkkey()==0)//无按键按下
{return(0xff);}
else //有则扬声器发声
{
uchar sound;
for(sound=50;sound>0;sound--)
{
speaker=0;
delay(1);
speaker=1;
delay(1);
}
P1=0x0f;//看哪一行按下
buff=P1;
if(buff==0x0e)
{hang=0;}
else if(buff==0x0d)
{hang=3;}
else if(buff==0x0b)
{hang=6;}
else if(buff==0x07)
{hang=9;}
P1=0xf0;//看那一列按下
buff=P1;
if(buff==0xe0)
{lie=2;}
else if(buff==0xd0)
{lie=1;}
else if(buff==0xb0)
{lie=0;}
keyvalue=hang+lie;
while(P1!=0xf0);
return(keyvalue);
}
}
3.3 主函数模块
主函数先调用初始化子函数实现初始化,然后显示第一行我们小组的个人信息,用一个while循环调用键盘扫描函数并将结果处理传递给显示屏,即将数字显示出来,并实现删除和清屏的功能,
void main() //主函数
{
uchar a;
lcd_init(); //调用初始化函数
for(a=0;a<6;a++)
{
lcd_data(designer[a]);//显示第一行信息
}
while(1)
{
num=keyscan();//调用键盘扫描函数
if((num>=0)&&(num<=9))
{
lcd_write(DDram_value);
lcd_data(table[num]);
DDram_value++;
}
else if(num==10)
{
DDram_value--;
if(DDram_value<=0xc0)
{DDram_value=0xc0;}
else if(DDram_value>=0xcf)
{DDram_value=0xcf;}
lcd_write(DDram_value);
lcd_data(0x20);//实现清除用空格
}
else if(num==11)
{
uchar p,q;
q=0xc0;
for(p=0;p<=15;p++)
{
lcd_write(q);
lcd_data(0x20);
q++;
}
DDram_value=0xc0;
}
}
}
仿真图



