📄 t9_v1.c
字号:
}
}
/**************************************************************************************************
*
*显示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,num;
if(col<=58)
{
CS2=1;CS1=0;
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]);
}
}
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<6;i++)
write_data(str[n*12+6*j+i]);
}
}
else if(col>58&&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*12+6*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<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]);
}
/**************************************************************************************************
*
*界面1函数
*函数声明:void screen_1();
*函数参数:无
*函数作用:显示欢迎界面
*
**************************************************************************************************/
void screen_1()
{
uchar i;
uchar ii,iii;
init();
cls();
for(i=0;i<7;i++)display_h(2,20+12*i,str_2,i);
for(i=0;i<3;i++)display_h(4,44+12*i,str_2,i+7);
for(i=0;i<10;i++)display_h(6,4+12*i,str_2,10+i);
while(1)
{
ii=key_ii();
iii=key();
if(ii!=0xff||iii!=0)
{
state=1;
break;
}
}
}
/**************************************************************************************************
*
*界面2函数
*函数声明:void screen_2();
*函数参数:无
*函数作用:
*
* 1:[读短信]
* 2:[写短信]
* 确定 取消
**************************************************************************************************/
void screen_2()
{
uchar i;
uchar ii,iii;
uchar cnt=0;
init();
cls();
display_h(2,40-12,symbol,0);
display_h(2,40+36,symbol,1);
display_h(2,40,symbol,2);
display_h(2,40+12,symbol,4);
display_h(2,40+24,symbol,5);
display_e(2,5,b_num,1);
display_e(2,5+6,b_num,10);
display_e(4,5,b_num,2);
display_e(4,5+6,b_num,10);
for(i=0;i<3;i++)display_h(4,40+12*i,symbol,3+i);
for(i=0;i<2;i++)display_h(6,12*i,str_1,i); //显示“确定”
for(i=0;i<2;i++)display_h(6,100+12*i,symbol,6+i); //显示“取消”
while(1)
{
iii=key();
ii=key_ii();
if(ii==8)
{
display_h(2,40-12,symbol,0); //“〔”
display_h(2,40+36,symbol,1); // “〕”
display_h(4,28,str_1,4);
display_h(4,76,str_1,4);
cnt=0;
}
else if(ii==9)
{
display_h(4,40-12,symbol,0); //“〔”
display_h(4,40+36,symbol,1); // “〕”
display_h(2,28,str_1,4);
display_h(2,76,str_1,4);
cnt=1;
}
if (iii==6)
{
if(cnt==1)
{
state=2;
break;
}
else if(cnt==0)
{
state=3;
break;
}
}
if(iii==7)
{
state=0;
break;
}
}
}
/**************************************************************************************************
*
*界面3函数
*函数声明:void screen_3();
*函数参数:无
*函数作用:用于写短信
*
**************************************************************************************************/
void screen_3()
{
unsigned char *p,input_string[5];
unsigned char *temp;//用于保存上一次查找的汉字
uchar page=0;
uchar i,ii,iii;
uchar cnt=0;
uchar keycode,length=0;
//uchar iic;
//unsigned char *p_mem;
unsigned int mem,cmp;
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)
{
iii=key();//判断“确定”键是否被按下
if(iii==6)
{
state=1;
break;
}
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==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);
//在AT24C64的0-255地址空间开辟一个缓存,用于存储当前正在编辑的短信
mem=(unsigned int)(T9PY_mb[page]->PY_mb)+keycode*24;
do
{
IICWrite(length_h*2,mem&0xff);
//delay(200);
IICWrite(length_h*2+1,mem>>8);
//在此加入防错程序,先把汉字点阵的地址写入AT24C64,然后读出直到相等时结束
//cmp=IICRead(2*length_h);
cmp=IICRead(2*length_h)+(IICRead(2*length_h+1)<<8);
//此处优先级一定要注意,“+”的优先级大于“<<”,所以后面的括号不要忘记了!
}while(mem!=cmp);
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;
}//end if(ii==0||ii==4||ii==5||ii==8||ii==6||ii==9||ii==10||ii==13)
}//end if(ii!=0xff)
}
}//end while(1)
}//end main()
void screen_4()
{
uchar i,iii;
unsigned char code *p_mem;
init();
cls();
display_h(0,0,symbol,8);
for(i=0;i<2;i++)
{
p_mem=(uchar code *)(IICRead(2*i)+(IICRead(2*i+1)<<8));
//此处优先级一定要注意,“+”的优先级大于“<<”,所以后面的括号不要忘记了!
display_h(0,20+12*i,p_mem,0);
}
display_e(0,44,b_num,12);
display_e(0,50,b_num,1);
display_e(0,50+6,b_num,11);
display_e(0,50+12,asc,'t'-'a');
display_e(0,50+18,asc,'x'-'a');
display_e(0,50+24,asc,'t'-'a');
while(1)
{
iii=key();
if(iii==7)
{
state=1;
break;
}
}
}
/**************************************************************************************************
*
*主函数
*函数声明:void main (void) ;
*函数参数:无
*函数作用:实现一个有限的状态机
*
**************************************************************************************************/
void main ()
{
while(1)
{
if(state==0) screen_1();//欢迎界面
else if(state==1) screen_2();
else if(state==2) screen_3();//写短信界面
else if(state==3) screen_4();//读短信界面
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -