4*4键盘英文输入法

    本段程序的功能使用4*4键盘来进行26的英文字母和两个标点的输入

#include<at89x52.h>
#include<12864.h>              //12864驱动程序,这个在网上很好找的
#include<44jianpan.h>         //4*4键盘驱动程序
#define uchar unsigned char 
uchar idata h[16]={"                "};  //清显示缓存
uchar code asc[]={'0','1','2','3','4','5','6','7','8','9',' '};
uchar code letter[10][3]={{",.0"},{"abc"},{"def"},{"ghi"},{"jkl"},
                                       {"mno"},{"pqr"},{"stu"},{"vwx"},{"yz0"}};

/*第一个按键和最后一个按键值数组多了一个0是为了让数组长度和其他的一致,在后面的输入时可以使按键值不显示*/
//相应按键的按键字母
4*4键盘英文输入法 - tan_tan_1 - tan_tan_1的博客4*4键盘英文输入法 - tan_tan_1 - tan_tan_1的博客

                   菜单一按键功能                                      菜单二按键功能

uchar code a[]={"输入基站号码:   "};
uchar code b[]={"群发            "};
uchar code c[]={"无此号码!      "};
uchar code d[]={"输入要发送内容: "};
uchar code e[]={"                "};
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();
    }
  }
  }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值