📄 t9_v1.c
字号:
*函数作用:对LCD做初始化操作
*
**************************************************************************************************/
void init()
{
delay(100);
CS2=1; CS1=0;
delay(100);
write_cmd(DISP_OFF);
write_cmd(PAGE);
write_cmd(START_LINE);
write_cmd(COL);
write_cmd(DISP_ON);
CS2=0; CS1=1;
delay(100);
write_cmd(DISP_OFF);
write_cmd(PAGE);
write_cmd(START_LINE);
write_cmd(COL);
write_cmd(DISP_ON);
}
/**************************************************************************************************
*
*清屏函数
*函数声明:void cls();
*函数参数:无
*函数作用:
*
**************************************************************************************************/
void cls()
{
uchar j,k;
CS2=1;CS1=0;
for(k=0;k<8;k++)
{
write_cmd(PAGE+k);
write_cmd(COL); //列地址0
for(j=0;j<64;j++) //列地址自动加一
write_data(0x00);
}
CS2=0;CS1=1;
for(k=0;k<8;k++)
{
write_cmd(PAGE+k);
write_cmd(COL); //列地址0
for(j=0;j<64;j++) //列地址自动加一
write_data(0x00);
}
}
/**************************************************************************************************
*
*显示12*16点阵的汉字函数
*函数声明:void display_h(uchar page,uchar col,uchar code *str,uchar n);
*函数参数:page为页地址(0-7),col为列地址(0-127),str为数组名,n为要显示第n个汉字点阵
*函数作用:
*
**************************************************************************************************/
void display_h(uchar page,uchar col,uchar code *str,uchar n)
{
uchar i,j;
uchar num;
if(col<=51)
{
CS2=1;CS1=0;
for(j=0;j<2;j++)
{
write_cmd(PAGE+page+j);write_cmd(COL+col);
for(i=0;i<12;i++)
write_data(str[n*24+12*j+i]);
}
}
else if(col>=64)
{
CS2=0;CS1=1;
col=col-64;
for(j=0;j<2;j++)
{
write_cmd(PAGE+page+j);write_cmd(COL+col);
for(i=0;i<12;i++)
write_data(str[n*24+12*j+i]);
}
}
else if(col>51&&col<64) //处理跨屏幕的汉字书写的函数
{
num=64-col;
CS2=1;CS1=0;
for(j=0;j<2;j++)
{
write_cmd(PAGE+page+j);write_cmd(COL+col);
for(i=0;i<num;i++)
write_data(str[n*24+12*j+i]);
}
CS2=0;CS1=1;
col=0;
for(j=0;j<2;j++)
{
write_cmd(PAGE+page+j);write_cmd(COL+col);
for(i=num;i<12;i++)
write_data(str[n*24+12*j+i]);
}
}
}
/**************************************************************************************************
*
*显示6*16点阵的英文函数
*函数声明:void display_e(uchar page,uchar col,uchar code *str,uchar n);
*函数参数:page为页地址(0-7),col为列地址(0-127),str为数组名,n为要显示第n个英文点阵
*函数作用:
*
**************************************************************************************************/
void display_e(uchar page,uchar col,uchar code *str,uchar n)
{
uchar i,j;
if(col<64)
{
CS2=1;CS1=0;
}
else
{
CS2=0;CS1=1;
col=col-64;
}
for(j=0;j<2;j++)
{
write_cmd(PAGE+page+j);write_cmd(COL+col);
for(i=0;i<6;i++)
write_data(str[n*12+6*j+i]);
}
}
/**************************************************************************************************
*显示小数字函数
*函数声明:void display_num(uchar page,uchar col,uchar code *str,uchar n);
*函数参数:page为页地址(0-7),col为列地址(0-127),str为数组名
*函数作用:显示数字0-9
*
*
**************************************************************************************************/
void display_num(uchar page,uchar col,uchar code *str,uchar n)
{
uchar i;
if(col<64)
{
CS2=1;CS1=0;
}
else
{
CS2=0;CS1=1;
col=col-64;
}
write_cmd(PAGE+page);write_cmd(COL+col);
for(i=0;i<5;i++)
write_data(str[5*n+i]);
}
/**************************************************************************************************
*
*主函数
*函数声明:void main (void) ;
*函数参数:无
*函数作用:处理LCD显示
*
**************************************************************************************************/
void main (void)
{
unsigned char *p,input_string[5];
unsigned char *temp;//用于保存上一次查找的汉字
uchar page=0;
uchar i,ii;
uchar cnt=0;
uchar keycode,length=0;
//uchar iic;
unsigned int mem;
uchar length_h=0; //记录输入汉字的长度
init();
cls();
line_v(63,16,15);
line_v(64,16,15);
line_h(0,30,128);
//========================================================
//中间为测试代码
//IICWrite(0x100,84);
//IICWrite(0x150,88);
//iic=IICRead(0x100);
//iic=IICRead(0x150);
p=T9PY("334",3);
mem=(unsigned int)p;
IICWrite(0x150,mem&0xff);
IICWrite(0x151,mem>>8);
mem=IICRead(0x150)+(IICRead(0x151)<<8);
p=(uchar code *)mem;
for(i=0;i<8;i++)display_h(0,12*i,p,i);
//========================================================
for(i=0;i<2;i++)
{
display_h(6,i*12,str_1,i); //显示“确定”
display_h(6,104+i*12,str_1,i+2); //显示“拼音”
}
line_v(0,0,16); //显示光标
while(1)
{
if(cnt==0) //CNT=0时为拼音输入状态
{ //扫描键盘,并且判断是否是在“1”-“9”之间
ii=key_ii();
if(ii!=0xff)
{
if(ii==0)keycode='7';
if(ii==1)keycode='8';
if(ii==2)keycode='9';
if(ii==4)keycode='4';
if(ii==5)keycode='5';
if(ii==6)keycode='6';
if(ii==9)keycode='2';
if(ii==10)keycode='3';
if(ii>=0&&ii<=10&&ii!=3&&ii!=8) //当按键为字母键时
{
for(i=0;i<8;i++) display_h(4,i*16+5,str_1,4);//清屏
for(i=0;i<8;i++)display_num(4,i*16,str_num,10);
input_string[length]=keycode; //将键值赋给input_string数组
p=T9PY(input_string,length+1); //查表,并且取得点阵表的地址
if(PY_num>0) //find为1表示找到了与输入拼音匹配的汉字
{ //保存下此次的汉字点阵地址,一旦下次没找到相匹配的汉字
temp=p; //则调用显示最后匹配的汉字,否则将显示乱码
for(i=0;i<8;i++)display_h(4,i*16+5,T9PY_mb[0]->PY_mb,i); //显示汉字
length++; //length用于记录输入字母的长度,每按一次键length的值加一
for(i=0;i<length;i++)
display_e(2,66+6*i,asc,*(p_py+i)-'a'); //显示输入的拼音,字母的点阵放在asc数组中
line_h(0,30,128);
page=0; //重新输入拼音,page置为0,否则会出错
}
else
{
for(i=0;i<8;i++)display_h(4,i*16+5,temp,i); //显示汉字
}
}
if (ii==15&&(PY_num>0))
{
for(i=0;i<8;i++) display_h(4,i*16+5,str_1,4);//清屏
for(i=0;i<8;i++)display_num(4,i*16,str_num,10);
page++;
if(page==PY_num)page=0;
for(i=0;i<8;i++)display_h(4,i*16+5,T9PY_mb[page]->PY_mb,i); //显示汉字
for(i=0;i<length;i++)
display_e(2,66+6*i,asc,*(T9PY_mb[page]->PY+i)-'a'); //显示输入的拼音,字母的点阵放在asc数组中
line_h(0,30,128);
}
if(ii==3&&length>0)//此键为选汉字键,当此键按下时会在每个汉字的左上角出现小的数字
{
for(i=0;i<8;i++)display_num(4,i*16,str_num,i);
cnt=1;
}
if(ii==12)//当按键为删除键时
{
if (length>0)//当拼音长度大于0时
{
length--;
for(i=0;i<8;i++) display_h(4,i*16+5,str_1,4);//清屏
for(i=0;i<8;i++)display_num(4,i*16,str_num,10);
if(length>0)
{
p=T9PY(input_string,length);
for(i=0;i<8;i++)display_h(4,i*16+5,p,i);//显示汉字
for(i=0;i<6;i++)display_e(2,66+6*i,asc,26);
for(i=0;i<length;i++)
display_e(2,66+6*i,asc,*(p_py+i)-'a');
}
else//当全部删除时,指针P指向数组PY_mb_a
{
p=PY_mb_a;
for(i=0;i<8;i++)display_h(4,i*16+5,p,i);//显示汉字
for(i=0;i<6;i++)display_e(2,66+6*i,asc,26);
}
line_h(0,30,128);
}
else if(length_h>0)
{
length_h--;
display_h(0,length_h*12,str_1,4);
display_h(0,(length_h+1)*12,str_1,4);
line_v(length_h*12,0,16);
}
}
}
}
else if(cnt==1)//选汉字状态,输入数字“0”-“7”,选择相应的汉字
{
ii=key_ii();
if(ii!=0xff)
{
if(ii==0)keycode=7;
if(ii==1)keycode=8;
if(ii==2)keycode=9;
if(ii==4)keycode=4;
if(ii==5)keycode=5;
if(ii==6)keycode=6;
if(ii==8)keycode=1;
if(ii==9)keycode=2;
if(ii==10)keycode=3;
if(ii==13)keycode=0;
if(ii==0||ii==4||ii==5||ii==8||ii==6||ii==9||ii==10||ii==13)
{
if(length_h==10)
{
length_h=0;
for(i=0;i<10;i++)display_h(0,i*12,str_1,4);
display_e(0,120,asc,26);
}
display_h(0,length_h*12,T9PY_mb[page]->PY_mb,keycode);
length_h++;
line_v(length_h*12,0,16);
//清屏
for(i=0;i<8;i++) display_h(4,i*16+5,str_1,4);
for(i=0;i<8;i++)display_num(4,i*16,str_num,10);
for(i=0;i<length;i++)display_e(2,66+6*i,asc,26);
line_h(0,30,128);
length=0;
cnt=0;
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -