#include<reg52.h>
#include<math.h>
#include<absacc.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0X40,0X00};
void send_char(unsigned char txd);
unsigned char tmp;
sbit dula=P2^6;
sbit wela=P2^7;
sbit lcden=P3^5;
sbit lcdrs=P3^7;
uchar code tab[]="0123456789abcdef";
uchar tab_key[50];
uchar n=0,temp,key;
void lcd_disp();
void lcd_init();
void display(unsigned char);
void write_com(uchar);
void write_data(uchar);
void delay(unit);
void key_scan();
void key_manage1();
void key_manage2();
void key_manage3();
void key_manage4();
void key_manage5();
void key_manage6();
void key_manage7();
void key_manage8();
void key_manage9();
void key_manage10();
void key_manage11();
void key_manage12();
void key_manage13();
void key_manage14();
void key_manage15();
void key_manage16();
void lcd_disp()
{
uchar a,i=0;
write_com(0x80);
i=0;
while(i<n)
{
a=tab_key[i];
write_data(tab[a]);
i++;
if(i==15)
{
write_com(0x80+0x40);
}
}
}
void lcd_init()
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
// write_com(0x80+0x40);
}
void write_com(uchar com)
{
lcdrs=0;
P2=com;
delay(3);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar dat)
{
lcdrs=1;
P2=dat;
delay(3);
lcden=1;
delay(5);
lcden=0;
}
void key_scan()
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee: key_manage1();display(0); break;
case 0xde: key_manage2();display(1); break;
case 0xbe: key_manage3();display(2); break;
case 0x7e: key_manage4();display(3); break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed: key_manage5();display(4); break;
case 0xdd: key_manage6();display(5); break;
case 0xbd: key_manage7();display(6); break;
case 0x7d: key_manage8();display(7); break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb: key_manage9();display(8); break;
case 0xdb: key_manage10();display(9); break;
case 0xbb: key_manage11();display(10); break;
case 0x7b: key_manage12();display(11); break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7: key_manage13();display(12); break;
case 0xd7: key_manage14();display(13); break;
case 0xb7: key_manage15();display(14); break;
case 0x77: key_manage16();display(15); break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
}
void display(unsigned char S)
{
P0 = table[S];
delay(200);
P2 = 0x7f;
}
void delay(uint k)
{
uint i,j;
for(i=k;i>0;i--)
for(j=50;j>0;j--);
}
void key_manage1()
{
tab_key[n]=0;
n++;
}
void key_manage2()
{
tab_key[n]=1;
n++;
}
void key_manage3()
{
tab_key[n]=2;
n++;
}
void key_manage4()
{
tab_key[n]=3;
n++;
}
void key_manage5()
{
tab_key[n]=4;
n++;
}
void key_manage6()
{
tab_key[n]=5;
n++;
}
void key_manage7()
{
tab_key[n]=6;
n++;
}
void key_manage8()
{
tab_key[n]=7;
n++;
}
void key_manage9()
{
tab_key[n]=8;
n++;
}
void key_manage10()
{
tab_key[n]=9;
n++;
}
void key_manage11()
{
tab_key[n]=10;
n++;
}
void key_manage12()
{
tab_key[n]=11;
n++;
}
void key_manage13()
{
tab_key[n]=12;
n++;
}
void key_manage14()
{
tab_key[n]=13;
n++;
}
void key_manage15()
{
tab_key[n]=14;
n++;
}
void key_manage16()
{
tab_key[n]=15;
n++;
}
void InitUART(void)
{
SCON = 0x52;
TMOD = 0x20;
TCON = 0x69;
TH1 = 0xf3;
}
void main()
{
lcd_init();
write_com(1);
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 启动定时器1
IE = 0x0; // 禁止任何中断
P2=0x7f;
while(1)
{ if(RI) // 是否有数据到来
{
RI = 0;
tmp = SBUF; // 暂存接收到的数据
P0 = tmp; // 数据传送到P0口
send_char(tmp); // 回传接收到的数据
}
key_scan();
lcd_disp();
if(n>15)
write_com(0x80+0x40);
{
P3= 0x10;
delay(10);
P3= 0x18;
delay(10);
P3= 0x04;
delay(10);
P3= 0x08;
delay(10);
P3= 0x0c;
delay(10);
P3= 0x1c;
delay(10);
P3= 0x14;
delay(10);
}
}
}
void send_char(unsigned char txd)
// 传送一个字符
{
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}
|