⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yejing.c

📁 5151程序集51programmeYEJING.rar5151程序集51programmeYEJING.rar
💻 C
字号:
#include <reg52.h>
#include<stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define x     0x80
#define y     0x80
#define comm  0
#define dat   1
sbit cs   = P2^7;
sbit std  = P2^6;
sbit sclk = P2^5;

void wr_lcd (uchar dat_comm,uchar content);
void delay (uint us);

uchar code tab1[]={
"青岛大学电子系"
"Qingdao University"                  //开机画面
};

/*------------------初始化-----------------*/
void init_lcd (void)
{
  wr_lcd (comm,0x30);              //30---基本指令动作
  wr_lcd (comm,0x01);              //清屏,地址指针指向00H
  delay (80);
  wr_lcd (comm,0x06);              //光标的移动方向
  wr_lcd (comm,0x0c);              //开显示,关游标
}
/*---------------显示汉字或字符----------------*/
void chn_disp1 (uchar code *chn)
{
  uchar i,j;
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x80);
  j=0;
  for(i=0;i<16;i++)
  wr_lcd (dat,chn[j*16+i]);
  wr_lcd (comm,0x90);
  j=1;
  for(i=0;i<16;i++)
  wr_lcd (dat,chn[j*16+i]);
}
/*-------显示一段长为CH--LONG的字符串---------*/
void chn_disp2 (uchar ch_long,uchar code *chn)
{
  uchar i;
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x90);           //在显示屏第二行显示
  for (i=0;i<ch_long;i++)
  wr_lcd (dat,chn[i]);
}
/*---------------显示单个汉字或字符----------------*/
void chn_disp3 (uchar code *chn)
{
  uchar i,j;
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x80);
  j=0;
  for(i=0;i<2;i++)
  wr_lcd (dat,chn[j*16+i]);
}
/*--------------清DDRAM------------------*/
void clrram (void)
{
  wr_lcd (comm,0x30);
  wr_lcd (comm,0x01);
  delay (120);
}
/*---------------------------------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
  uchar a,i,j;
  delay (40);
  a=content;
  cs=1;
  sclk=0;
  std=1;
  for(i=0;i<5;i++)
  {
    sclk=1;
    sclk=0;
  }
  std=0;
  sclk=1;
  sclk=0;
  if(dat_comm)
    std=1;   //data
  else
    std=0;   //command
  sclk=1;
  sclk=0;
  std=0;
  sclk=1;
  sclk=0;
  for(j=0;j<2;j++)
  {
    for(i=0;i<4;i++)
    {
      a=a<<1;
      std=CY;
      sclk=1;
      sclk=0;
    }
    std=0;
    for(i=0;i<4;i++)
    {
      sclk=1;
      sclk=0;
    }
  }
}
/*---------------------------------------*/
void delay (uint us)   //delay time
{
  while(us--);
}
void delay1 (uint ms)
{
  uint i,j;
  for(i=0;i<ms;i++)
  for(j=0;j<15;j++)
  delay(1);
}
code struct index               //键值结构体定义
  {  uint aa;
     uint p_y[6];
     uchar pinyinma[16];       //存放拼音字符,在选择拼音时显示在显示屏上
  };
code struct index py[16]=        //以16个键值为例
{
 {2,{0x0000},{"a               "}},          // a
 {22,{0x0001,0x0002},{"ba ca           "}},    //ba,ca
 {3,{0x0003},{"e               "}},              // e
 {32,{0x0004,0x0005},{"da fa           "}},    //da,fa
 {42,{0x0006,0x0007},{"ga ha           "}},   //ga,ha
 {43,{0x0008,0x0009},{"ge he           "}},   // ge,he
 {52,{0x000a,0x000b},{"ke la           "}},   // ke,la
 {53,{0x000c,0x000d},{"ka ce           "}},   // ka,ce
 {62,{0x000e,0x000f},{"ma na           "}},  // ma,na
 {63,{0x0010,0x0011},{"me ne           "}},  // me,ne
 {72,{0x0012,0x0013},{"pa sa           "}},   // pa,sa
 {73,{0x0014,0x0015},{"re se           "}},   // re,se
 {82,{0x0016},{"ta              "}},           // ta
 {83,{0x0017},{"te              "}},           // te
 {92,{0x0018,0x0019,0x001a},{"wa ya za        "}},// wa,ya,za
 {93,{0x001b,0x001c},{"ye ze           "}}   // ye,ze
};
code struct index1          //汉字结构体定义
  {
     uint hh;
     uchar ii;            //该组中的汉字个数
     uint h_z[20];        //20表示一个汉字的拼音最多有20个对应得汉字
  };
code struct index1 hanzi[30]=         //以30组汉字为例
{        
{0x0000,2,{0xB0A1,0xB0A2}},       //啊,阿
{0x0001,9,{0XB0C7,0XB0C8,0XB0C9,0XB0CA,0XB0CB,0XB0CC,0XB0CD,0XB0CE,0XB0CF}},//扒,叭,吧,笆,八,疤,巴,拔,跋
{0x0002,1,{0XB2C1}}, //擦
{0x0003,9,{0XB6EA,0XB6EB,0XB6EC,0XB0ED,0XB6EE,0XB6EF,0XB6F0,0XB6F1,0XB6F2 }},//蛾,峨,鹅,俄,额,讹,娥,恶,厄
{0x0004,1,{0XB4EE,0XB4EF,0XB4F0,0XB4F1,0XB4F2,0XB4F3}},//搭
{0x0005,5,{0XB7A2,0XB7A3,0XB7A4,0XB7A5,0XB7A6}},//发,罚,筏,乏,阀
{0x0006,2,{0XB8C1,0XB8C2}},         //噶,嘎
{0x0007,1,{0XB9FE}},                 //哈
{0x0008,10,{0XB8E7,0XB8E8,0XB8E9,0XB8EA,0XB8EB,0XB8EC,0XB8ED,0XB8EE,0XB8EF,0XB8F0}},//哥,歌,搁,戈,鸽,胳,疙,割,革,葛
{0x0009,10,{0XBAC7,0XBAC8,0XBAC9,0XBACA,0XBACB,0XBACC,0XBACD,0XBACE,0XBACF,0XBAD0}},//呵,喝,荷,菏,核,禾,和,何,合, 盒
{0x000a,10,{0XBFC2,0XBFC3,0XBFC4,0XBFC5,0XBFC6,0XBFC7,0XBFC8,0XBFC9,0XBFCA,0XBFCB}},//柯,棵,磕,颗,科,壳,咳,可,渴,克
{0x000b,5,{0XC0AC,0XC0AD,0XC0AE,0XC0AF,0XC0B0}},//垃,拉,喇,蜡,腊
{0x000c,3,{0XBFA6,0XBFA7,0XBFA8}},//咯,咖,卡
{0x000d,5,{0XB0DE,0XB0DF,0XB0E0,0XB0E1,0XB0E2}},//厕,策,侧,册,测
{0x000e,9,{0XC2E8,0XC2E9,0XC2EA,0XC2EB,0XC2EC,0XC2ED,0XC2EE,0XC2EF,0XC2F0}},//妈,麻,玛,码,蚂,马,骂,嘛,吗
{0x000f,5,{0XC4C3,0XC4C4,0XC4C5,0XC4C6,0XC4C7}},//拿,哪,呐,钠,那
{0x0010,1,{0XC3B4}},         //么
{0x0011,1,{0XC4D8}},         //呢
{0x0012,4,{0XC5BF,0XC5C0,0XC5C1,0XC5C2}},    //趴,爬,帕,怕
{0x0013,3,{0XCBF6,0XCBF7,0XCBF8}},    //撒,洒,萨
{0x0014,1,{0XC8C8}},        //热
{0x0015,3,{0XC9AA,0XC9AB,0XC9AC}},    //瑟,色,涩
{0x0016,5,{0XCBFA,0XCBFB,0XCBFC,0XCBFD,0XCBFE}},//塌,他,它,她,塔
{0x0017,1,{0XCCD8}},       //特
{0x0018,5,{0XCDDA,0XCDDB,0XCDDC,0XCDDD,0XCDDE}},//挖,哇,蛙,洼,娃
{0x0019,5,{0XD1B9,0XD1BA,0XD1BB,0XD1BC,0XD1BD}},//压,押,鸦,鸭,呀
{0x001a,3,{0XD4D1,0XD4D2,0XD4D3}},//匝,砸,杂
{0x001b,5,{0XD2B0,0XB2B1,0XB2B2,0XB2B3,0XB2B4}},//野,冶,也,页,腋
{0x001c,4,{0XD4F0,0XD4F1,0XD4F2,0XD4F3}},//责,择,则,泽
};
void delay2()           //延时程序
{uchar i;
 for(i=300;i>0;i--);
 }
/*---------------键盘扫描程序----------------*/
uchar keyscan()         //键盘扫描程序,返回16进制扫描码
 {
       uchar a,b,c,d;
       P1=0xf0;       //给行送高电平,列送低电平
       if((P1&0xf0)!=0xf0)     //读p1口值,判断是否有键按下
        {
          a=P1&0xf0;         //p1的值送a
          P1=0x0f;            //给列送高电平,行送低电平
          b=P1&0x0f;         //读p1值送b
          c=a|b;               //a,b的值相与得16进制扫描码送c
        }
       delay2();               //延时去抖动
       P1=0xf0;               //以下对键盘进行第二次扫描
       if((P1&0xf0)!=0xf0)
        {
          a=P1&0xf0;
          P1=0x0f;
          b=P1&0x0f;
          d=a|b;               //第二次扫描的16进制扫描码送d
        }
       if(c==d)                //判断两次扫描结果是否相同
        {
         P1=0xf0;
         do{;}while((P1&0xf0)!=0xf0);          //等待按键松开
         return(c);                           //返回16进制扫描码
        }
       else return 0;
}
/*---------------键值转换程序----------------*/
uchar htod(uchar icode)       //将16进制实际键值转换为十进制键值
{
  uchar input;
  switch(icode)
{
case 0x7b: input=1;break;
case 0xbb: input=2;break;
case 0xdb: input=3;break;
case 0xeb: input=11;break;  //11为上翻键
case 0x7d: input=4;break;
case 0xbd: input=5;break;
case 0xdd: input=6;break;
case 0xed: input=14;break;  //14为下翻键
case 0x7e: input=7;break;
case 0xbe: input=8;break;
case 0xde: input=9;break;
case 0xee: input=12;break;  //12为确定键
case 0x77: input=10;break;  //10为*键
case 0xb7: input=0;break;
case 0xd7: input=15;break;  //15为#键
case 0xe7: input=13;break;  //13为退格键
}
return(input);
}
/*---------------拼音查询程序----------------*/
uint pinyinchaxun(uint pp)
{
  uchar ff,xxx,yyy;
  uint addr1;
    for (ff=0;ff<16;ff++)
     {
      if(py[ff].aa==pp)
      {
       chn_disp2(16,py[ff].pinyinma);
       delay1 (4000);

 loop1:xxx=keyscan();         //键盘扫描
       delay(150);
       yyy=htod(xxx);              //键值转换
       if((yyy>0)&&(yyy<9))        //输入数字选择需要拼音
         {
           addr1=py[ff].p_y[0]+yyy-1;
         }
       else
         {
           goto loop1;                  //按键无效,返回键盘扫描
         }
      }
     }
   return(addr1);
}
/*---------------汉字查询程序----------------*/
uint hanzichaxun(uint pa)
{
  uchar e,mmm,nnn;
  uint addr2;
  uint code *k1,*k2;
   for(e=0;e<30;e++)
    {
     if(pa==hanzi[e].hh)
      {
       clrram();
       chn_disp2(hanzi[e].ii*2,hanzi[e].h_z);
       delay1 (4000);
       k1=&hanzi[e].h_z[0];

 loop2:mmm=keyscan(); //键盘扫描
       delay(150);
       nnn=htod(mmm);//键值转换
       if((nnn>0)&&(nnn<9))        //输入数字选择需要汉字
         {
           addr2=*k1+nnn-1;
         }
       else if(nnn==14)           //下翻
         {
           k2=k1+16;
           k1=k2;
           clrram();
           chn_disp2(16,k1);
           delay1 (4000);
           goto loop2;
         }
       else if(nnn==11)           //上翻
         {
           k2=k1-16;
           k1=k2;
           clrram();
           chn_disp2(16,k1);
           delay1 (4000);
           goto loop2;
         }
       else
         {
           goto loop2;         //按键无效,返回键值扫描
         }
     }
   return(addr2);
  }
}
/*---------------汉字显示程序----------------*/
void hanzixianshi(uint ss)
{
 uint *bb;
 bb=&ss;
 chn_disp3(bb);
}
/*---------------键盘中断处理程序----------------*/
void jianpan() interrupt 1
 {
   uchar key1,key,keyn,a;
   uint sa,aaa,bbb;
   sa=0x0000;
   key1=0x50;
   EA=0;                //关中断
   clrram();
   key1=keyscan();        //键盘扫描
   delay(150);
   key=htod(key1);        //键值转换
   keyn=key;
   if((keyn>1)&&(keyn<10))     //第一次按键为数字有效
      {
        a=keyn;              //保存第一个键值
        while((key>1)&&(key<10)&&(key!=12))     //12为确定键
           {
             sa=sa*10+key;
             key1=keyscan(); //键盘扫描
             delay(150);
             key=htod(key1);//键值转换
           }
         if(keyn==12)
           {
             aaa=pinyinchaxun(sa);          //拼音查询
             bbb=hanzichaxun(aaa);          //汉字查询
             hanzixianshi(bbb);             //汉字显示
           }
         else
           {
             EA=1;                  //开中断
             TH1=0xB1;
             TL1=0xE0;              //置初值,定时20ms
             return;                  //按键无效返回
           }
        }
    else
      {
        EA=1;                   //开中断
        TH1=0xB1;
        TL1=0xE0;               //置初值,定时20ms
        return;
      }
 }
/*------------------主程序--------------------*/
void main()
{
 SP=0x5f;
 TMOD=0x01;          //定时器t0工作于方式1
 TH1=0xB1;
 TL1=0xE0;            //置初值,定时20ms
 EA=1;
 ET0=1;
 TR0=1;
 init_lcd ();
 clrram();
 wr_lcd (comm,0x34);
 chn_disp1 (tab1);
 delay1 (8000);
 do{;}while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -