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

📄 t9_v1.c

📁 基于单片机的拼音输入程序
💻 C
📖 第 1 页 / 共 2 页
字号:


	  }

}



/**************************************************************************************************
*
*显示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 + -