本段程序的功能使用4*4键盘来进行26的英文字母和两个标点的输入
#include<at89x52.h>
#include<12864.h> //12864驱动程序,这个在网上很好找的
#include<44jianpan.h> //4*4键盘驱动程序
#define uchar unsigned char
uchar idata h[16]={" "}; //清显示缓存
uchar co
uchar co
{"mno"},{"pqr"},{"stu"},{"vwx"},{"yz0"}};
/*第一个按键和最后一个按键值数组多了一个0是为了让数组长度和其他的一致,在后面的输入时可以使按键值不显示*/
//相应按键的按键字母
菜单一按键功能 菜单二按键功能
uchar co
uchar co
uchar co
uchar co
uchar co
uchar i,x,number,let,di;
bit menu,nl,ci,qun,qq,ps;
//i输入数据个数标识,x发送数据个数标识
//ps发送状态标识,nl数字字母切换标识
//menu菜单页数标志位,number基站号码标志位,qun群发标识
//ci按键次数标识,let案件之暂存,di同一个按键被按次数
void ser(void)interrupt 4
{
TI=0;
RI=0;
ES=0;
ps=1;
}
void set(void) //串口发送
{
if(x<16)
{
ES=1;
SBUF=h[x];
x++;
}
if(x==16)
{
x=0;
}
ps=0;
}
void dis() //显示提示内容和输入的内容
{
uchar t;
lcdpos(0,0);
for(t=0;t<=15;t++)
{
write(1,d[t]);
}
lcdpos(1,0);
for(t=0;t<=15;t++)
{
write(1,h[t]);
}
}
void clr(uchar y) //清楚y行的内容
{
uchar t;
lcdpos(y,0);
for(t=0;t<16;t++)
{
write(1,e[t]);
}
}
void menu1(void)
{
uchar temp,t;
temp=key_scan();
//选择所要发送的基站号
lcdpos(0,0);
for(t=0;t<16;t++)
{
write(1,a[t]);
}
if(temp==0x0e) //重置机号
{
write(0,0x01);
}
if(temp<=9) //判断按键值是否小于9
{
clr(1);clr(2);
ci=1;
number=temp;
lcdpos(1,0);
write(1,asc[temp]);
}
if(temp==0x0a) //判断是否群发按键被按下
{
clr(2);
lcdpos(1,0);
for(t=0;t<16;t++)
{
write(1,b[t]);
}
qun=1;
}
if(temp==0x0b) //判断清除按键是否被按下
{
write(0,0x01);
qun=0;
}
if(temp==0x0f) //判断确定键是否被按下
{
if(number>7) //判断机号是否大于7,否则输出提示
{
number=0;
lcdpos(2,0);
for(t=0;t<16;t++)
{
write(1,c[t]);
}
ci=0;
}
if((number<=7)&&(ci==1)||(qun==1)) //判断机号是否小于7,是则转向menu2
{
menu=2;
write(0,0x01);
ci=0;
}
}
}
void menu2(void)
{
uchar temp,t;
temp=key_scan();
dis();
if(temp==0x0d) //判断数字字母切换是否被按下
{
if(nl==0)
{
nl=1;
ci=0;
}
else if(nl==1)
{
nl=0;
ci=0;
}
}
if(temp<=9) //判断按键是否为数字字母
{
if(i<15) //判断显示缓存h[]是否满
{
if(nl==0) //判断按键是否为为数字功能
{
if(qq==1)
{i++;di=0;}
h[i]=asc[temp];
i++;
qq=0;
}
if(nl==1) //判断按键是否为字母功能
{
qq=1;
if(ci==0) //判断是否为第一次按键
{
let=temp; //暂存按键值
ci=1;
h[i]=letter[let][0];
}
if(ci==1) //判断是否已有按键按下过
{
if(let==temp) //判断本次按键值与上次按值是否相等
{
if((di>2)||(letter[let][di]=='0')) // 未确定字母时,使显示值在本按键值之间循环
{ di=0; } //
if((di<=2)&&(letter[let][di]!='0')) //
{ //
h[i]=letter[let][di];
di++;
}
}
if(let!=temp) //判断本次按键与上次按键是否不同
{
i++;di=0;
let=temp;
h[i]=letter[let][di];
di++;
}
}
}
}
else
{i=0;}
}
if(temp==0x0c) //判断发送键是否被按下
{
ps=1;
}
if(temp==0x0b) //判断清除键是否被按下
{
di=0;
let=0;
for(t=0;t<16;t++)
{
h[t]=0x20;
}
i=0;
ci=0;
}
if(temp==0x0e) //判断重置机号键是否被按下
{ menu=1;
write(0,0x01);
lcdpos(1,0);
qun=0;ci=0;i=0;nl=0;
for(t=0;t<16;t++)
{
h[t]=0x20;
}
}
if(temp==0x0f) //判断字母确定键是否被按下
{
if((nl==1)&&(ci==1))//判断按键功能是否为字母且已有按键按下过,及已有字母在LCD上显示
{
ci=0;
i++;
}
}
}
void init(void) //单片机串口初始化,如果不用和其他芯片通信可以不用
{
menu=1;
TMOD=0X20;
TH1=0XE8;
TL1=0XE8;
PCON=0X00;
TR1=1;
SCON=0X40;
EA=1;
lcdinit();
}
void main()
{
init();
while(1)
{
if(menu==1) //是否为菜单一
{
menu1();
}
if(menu==0) //是否为菜单二
{
menu2();
if(ps==1)
{
set();
}
}
}
}