📄 yejing.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 + -