#include<reg51.h>
#include<string.h>
#include<stdio.h>
#include<SoundPlay.h>
#define uint unsigned int
#define uchar unsigned char
uchar keycode,DDram_value=0xc0;
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
sbit speaker=P2^3;
uchar y=23;
uchar m=07;
uchar d=20;
uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x20};//0x30:0011 0000 代表数字3...以此类推
unsigned char code Music_Girl[]={ 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03,
0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03,
0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03,
0x17,0x03,0x18,0x66, 0x16,0x02, 0x17,0x02, 0x15,0x00,
0x00,0x00};
void lcd_delay();//LCD延时
void delay(uint n);//延时
void lcd_init(void);//LCD显示初始化
void lcd_busy(void);//判断LCD是否繁忙
void lcd_wr_con(uchar c);//向LCD写命令
void lcd_wr_data(uchar d);//向LCD写数据
void lcd_wr_str(uchar *str);
uchar checkkey(void);// 检测有无按键按下
uchar keyscan(void);//键盘扫描函数
void getDate(uchar y,uchar m,uchar d);//获取时间
void lcd_scroll(uchar *str);//滚动
void main()
{
lcd_init();
InitialSound();
lcd_wr_con(0x80);//设置数据指针起点,从第一行第一个位置开始写
lcd_wr_str("Designer by XXX");
while(1)
{
keycode=keyscan();
if(keycode==15)
{
lcd_scroll("...Dialing... ");
// Play(Music_Girl,0,3,360);//在拨号后实现响铃效果
break;
}
if((keycode>=0)&&(keycode<=9)||((keycode>=18&&keycode<=24)))
{
lcd_wr_con(0x06);
lcd_wr_con(DDram_value);//第二行的地址
if(keycode==18)
{
lcd_wr_con(0x80);
getDate(y,m,d);
lcd_wr_con(0xc0);
lcd_wr_str(" Welcome! ");
delay(5000);
break;
}
if(keycode==24)
{
lcd_wr_data(0x2a);
}
else if(keycode==21)
{
lcd_wr_data(0x23);
}
lcd_wr_data(table[keycode]);
DDram_value++;
}
else if(keycode==0x0a)//10按下点.清除一位的功能
{
lcd_wr_con(0x04);
DDram_value--;
if(DDram_value<=0xc0)
{
DDram_value=0xc0;
}
else if(DDram_value>=0xcf)
{
DDram_value=0xcf;
}
lcd_wr_con(DDram_value);
lcd_wr_data(table[10]);
}
else if(keycode==0x0b)//按下星*
{
uchar i,j;
j=0xc0;
for(i=0;i<=15;i++)
{
lcd_wr_con(j);
lcd_wr_data(table[10]);
j++;
}
DDram_value=0xc0;
}
}
}
void lcd_delay()//LCD延时
{
uchar y;
for(y=0;y<0xff;y++)
{
;}
}
void lcd_init(void)//LCD显示初始化
{
lcd_wr_con(0x01);
lcd_wr_con(0x06);
lcd_wr_con(0x0c);
lcd_wr_con(0x38);
}
void lcd_busy(void)//判断LCD是否繁忙
{
P0=0xff;
rs=0;
rw=1;
e=1;
e=0;
while(P0&0x80)
{
e=0;
e=1;
}
lcd_delay();
}
void lcd_wr_con(uchar c)//向LCD写命令
{
lcd_busy();
e=0;
rs=0;
rw=0;
P0=c;
e=1;
delay(10);
e=0;
lcd_delay();
}
void lcd_wr_data(uchar d)//向LCD写数据
{
lcd_busy();
e=0;
rs=1;
rw=0;
P0=d;
delay(10);
e=1;
e=0;
lcd_delay();
}
void delay(uint n)//延时
{
uchar i;
uint j;
for(i=50;i>0;i--)
for(j=n;j>0;j--);
}
uchar checkkey(void)// 检测有无按键按下
{
uchar temp;
P1=0xf0;
temp=P1;
temp=temp&0xf0;
if(temp==0xf0)
{
return(0);//无按键按下
}
else
{
return(1);//有按键按下
}
}
uchar keyscan(void)
{
uchar hanghao,liehao,keyvalue,buff;
if(checkkey()==0)//无按键按下,返回0xff
{
return(0xff);//全为高电平
}
else//否则扬声器发声
{
uchar sound;
for(sound=50;sound>0;sound--)
{
speaker=0;
delay(1);
speaker=1;
delay(1);
}
P1=0x0f;// 初始化,行号P1.0-P1.3置为高电平,列号P1.4-P1.7为低电平。
buff=P1;//读取按键状态
if(buff==0x0e)
{
hanghao=0;
}
else if(buff==0x0d)
{
hanghao=3;
}else if(buff==0x0b)
{
hanghao=6;
}else if(buff==0x07)
hanghao=9;
}
P1=0xf0;//行号P1.0-P1.3为0,列号P1.4-P1.7为1
buff=P1;
if(buff==0xe0)
{
liehao=2;
}
else if(buff==0xd0)
{
liehao=1;
}else if(buff==0xb0)
{
liehao=0;}
else if(buff==0x70)
{
liehao=15;
}
keyvalue=hanghao+liehao;
while(P1!=0xf0);
return(keyvalue);
}
void lcd_wr_str(uchar *str)
{
while(*str)
lcd_wr_data(*str++);
}
void getDate(uchar year,uchar month,uchar day)
{ uchar i;
lcd_wr_con(0x80);
lcd_wr_data(year/10+'0');
lcd_wr_data(year%10+'0');
lcd_wr_data('/');
lcd_wr_data((month/10)+'0');
lcd_wr_data((month%10)+'0');
lcd_wr_data('/');
lcd_wr_data((day/10)+'0');
lcd_wr_data((day%10)+'0');
for(i=0;i<16;i++)
{
lcd_wr_data(0x20);
}
}
//滚动
void lcd_scroll(uchar *str)
{
uchar i,j,m;
uchar len=strlen(str);
for(m=0;m<2;m++){
for(i=0;i<len;i++)
{
lcd_init();
for(j=0;j<16;j++)
{
if(i+j>=len)
{
lcd_wr_data(' ');
}
else{
lcd_wr_data(str[i+j]);
}
}
lcd_wr_con(0xc0);
delay(500);
}}
}