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

📄 t9_v1.c

📁 基于单片机的拼音输入程序
💻 C
📖 第 1 页 / 共 2 页
字号:
*函数作用:对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 + -