电话模拟拨号器

#include
#include
#include
#include
#define KEY P1
#define uc unsigned char

sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
sbit enter=P2^3;
sbit del=P2^4;
sbit LEDOK=P2^6;
sbit LEDERR=P2^7;



uc idata NUM[12]="0123456789*#";
uc idata table[20]=" ";
uc idata j=0;
uc receive[10]=" ";
int k=5;




void delay(uc n);
int KeyScan();
void initial();
void send(uc dat);
void com(uc dictate);
void write_date(uc date);
void init();
void display(uc B[]);

void main()
{
uc m,n,x=0,i=0;
table[0]='A';
table[1]='T';
table[2]='D';
table[3]='+';
table[4]='8';
table[5]='6';
initial(); //启动定时器T1
init(); // 初始化LCD
com(0x80);
delay(10);
while(1)
{
if(!del) //判断DEL按键是否按下
{
if(k>5)
{
table[k]=' ';
k--;
delay(15);
com(0x01);
display(table);
}
}
if(KeyScan()!=20)
{
delay(100);
if(KeyScan()!=20)
{
k++;
n=KeyScan();
table[k]=NUM[n];
send(table[k]);
display(table);
delay(20);
}
}
if(!enter)
{
for(m=0;m<18;m++)
{
send(table[m]);
delay(1);
}
init();
delay(50);
}


if(receive[4]=='O')
{
LEDOK=0;LEDERR=1;delay(10);
write_date('o');
for(j=0;j<10;j++) receive[j]=' ';
j=0;
}

if(receive[4]=='E')
{
LEDERR=0;LEDOK=1;delay(10);
write_date('e');
for(j=0;j<10;j++) receive[j]=' ';
if(x<3)
{
for(m=0;m<18;m++)
{
send(table[m]);
delay(1);
}
x++;
}
else
x=0;

j=0;

}
}
}

void serial() interrupt 4
{
if(RI==1)
{
receive[j]=SBUF;
j++;
RI=0;
}
}


void delay(uc n)
{
uc x,y;
for(x=n;x>0;x--)
for(y=200;y>0;y--);
}

int KeyScan()
{
uc temp=20;
KEY=0xfd; //扫描第1列键
switch(KEY)
{
case 0x7d:temp=1;break;
case 0xbd:temp=4;break;
case 0xdd:temp=7;break;
case 0xed:temp=10;break;
default:break;
}
KEY=0xfb; //扫描第2列键
switch(KEY)
{
case 0x7b:temp=2;break;
case 0xbb:temp=5;break;
case 0xdb:temp=8;break;
case 0xeb:temp=0;break;
default:break;
}
KEY=0xf7; //扫描第3列键
switch(KEY)
{
case 0x77:temp=3;break;
case 0xb7:temp=6;break;
case 0xd7:temp=9;break;
case 0xe7:temp=11;break;
default:break;
}
return(temp); //返回按键键值
}



void send(uc dat)
{
SBUF=dat; //发送数据
while(TI==0); //检查发送完成中断标志如果未完成就等等否则复位发送标志位以便下个数据可以发送
TI=0;
}


void initial()
{
TMOD=0x20;
SCON=0x40;
PCON=0x00;
TH1=0x98;
TL1=0x98;
TR1=1;
REN=1;
EA=1;
ES=1;
}



void com(uc dictate)
{
P0=dictate;
RS=0;
RW=0;
EN=0;
delay(30);
EN=1;
delay(30);
E

N=0;
}

void write_date(uc date)
{ P0=date;
RS=1;
RW=0;
EN=0;
delay(30);
EN=1;
delay(10);
EN=0;
}

void init()
{
com(0x38);
delay(30);
com(0x0c);
delay(30);
com(0x06);
delay(30);
com(0x01);
delay(30);
}

void display(uc B[])
{
uc i;
com(0x80);
for(i=6;i<17;i++)
write_date(B[i]);
}

相关文档
最新文档