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

📄 main.c.bak

📁 拼音输入法用在单片机上.rar
💻 BAK
📖 第 1 页 / 共 2 页
字号:
//汉显液晶模块HZ132-64演示程序
//该模块是一款使用简便,功能多样的汉显模块!
//模块的资料请到 http://www.laogu.com/product/wwwlcm/index.htm 查看
//本例仅用了简单的送数据到串口的方法就实现了文字的任意位置显示,作图,显示图片,t9兼容输入法等操作
//本例程由'51单片机世界http://www.mcu51.com'的版主丁丁编写,Email:mcu52@163.com
//2002年11月24日调试成功
#include "w77e58.h"
#define  uchar  unsigned char
#define  uint   unsigned int
#define  ulong   unsigned long

extern char getbyte(void);				//从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
extern putbyte(char c);					//放入一个字节到发送缓冲区
extern putstring(uchar  *puts);			//发送一个定义在程序存储区的字符串到串口
extern putbytes(uchar *outplace,uint j);//放一串数据到发送缓冲区,需要定义发送的字节数
extern puthex(uchar c);					//发送一个字节的hex码,分成两个字节发。
extern  bit   inbufsign;				//串口接收到数据标志
#define CR putstring("\r\n")			//发送一个回车换行
extern void serial_init (void);    		//串口初始化
extern uchar putuchar(uchar c);
extern getchar(void);


bit  numbers_delete_sign;//最后一位输入数字无效标志
bit  chinese_input_state;//中文输入状态
bit  english_input_state;//英文输入状态
bit  number_input_state;//数文输入状态
bit  edit_0_state;//编辑初状态,没有任何数字键输入时
bit  edit_1_state;//中文输入时 有2~9任一个数字键输入
bit  edit_2_state;//中文输入时 拼音确定后的显示状态 或者有确认键输入的状态
bit  edit_3_state;//中文输入时 插入字符输入的状态
bit  edit_4_state;//英文输入大写状态
bit  edit_5_state;//英文输入小写状态

/*/灰度
void lcd_light(uchar ch)
{
	if(ch>0x3f) 
		return;
	putbyte(0x1b);
	putbyte(0x31);
	putbyte(ch);
}
*/
//清屏
void lcd_cls(void)
{
	putbyte(0x1b);
	putbyte(0x32);
}

//设置光标位置
void lcd_cursor(uchar x, uchar y)      
{
	putbyte(0x1b);
	putbyte(0x33);
	putbyte(x);
	putbyte(y);
}

/*闪烁还是关闭光标
void lcd_showcursor(uchar attr)   
{
	putbyte(0x1b);
	putbyte(0x34);
	putbyte(attr);
}
*/
/*显示一个字符
void lcd_char(uchar attr,uchar c)
{
	putbyte(0x1b);
	putbyte(0x37);
	putbyte(attr);
	putbyte(c);
	putbyte(0x00);
        delay();
}
*/
//显示一个汉字
void lcd_hanzi(uchar attr,uchar *hanzi_p)
{
	putbyte(0x1b);
	putbyte(0x37);
	putbyte(attr);
	putbyte(*hanzi_p++);
	putbyte(*hanzi_p);
	putbyte(0x00);

}
//显示字符串
void lcd_string(uchar attr,uchar *string) 
{
	putbyte(0x1b);
	putbyte(0x37);
	putbyte(attr);	
	putstring(string);
	putbyte(0x00);
}
//显示字符数组中n个字符
void lcd_bytes(uchar attr,uchar *string,uint n)
{
        putbyte(0x1b);
        putbyte(0x37);
        putbyte(attr);
        putbytes(string,n);
        putbyte(0x00);
}
/*画点
void lcd_dot(uchar attr,uchar x,uchar y)  
{
	putbyte(0x1b);
	putbyte(0x38);
	putbyte(attr);
	putbyte(x);
	putbyte(y);
}
*/
/*画线
void lcd_line(uchar attr,uchar x0,uchar y0,uchar x1,uchar y1)
{
	putbyte(0x1b);
	putbyte(0x39);
	putbyte(attr);
	putbyte(x0);
	putbyte(y0);
	putbyte(x1);
	putbyte(y1);	
}
*/
/*画圆
void lcd_circle(uchar attr,uchar ox,uchar oy,uchar rx)
{
	putbyte(0x1b);
	putbyte(0x41);
	putbyte(attr);
	putbyte(ox);
	putbyte(oy);
	putbyte(rx);
}
*/
/*画图片,*picture_data指向图片数据,图片数据的第一二个字节是图片宽度和图片高度
void lcd_picture(uchar attr,uchar x0,uchar y0,uchar *picture_data)
{
	putbyte(0x1b);
	putbyte(0x42);
	putbyte(attr);
	putbyte(x0);
	putbyte(y0);
	putbytes(picture_data,(((*picture_data)+7)/8)*(*(picture_data+1))+2);	
}
*/
/*画ICON
void lcd_icon(uchar attr,uchar ch)
{
	putbyte(0x1b);
	putbyte(0x43);
	putbyte(attr);
	putbyte(ch);
}
*/

//取数字组合的有效拼音组合,
//*num指向输入的数字,
//返回的有效拼音组合放在pinyin[6][7]
//函数返回返回有效拼音的个数
uchar lcd_num2pinyin(uchar *num, uchar pinyin[6][7])
{
	ulong n=0;//超时用
	uchar m,i,j,ch;
	putbyte(0x1b);
	putbyte(0x47);
	putstring(num);
	putbyte(0x00);

	while(1)
	{
		if(inbufsign)//串口接收到了数据
		{
			if(getbyte()==0x1b)
			{
				m=getbyte();//查到的总条数
				for(i=0;i<m;i++)
				{
					
					for(j=0;;j++)
					{
						ch=getbyte();
						pinyin[i][j]=ch;
						if(ch==0)break;
					}
				}
				return(m);
			}
		}
		n++; //超时计时加一
		if(n>1000000)
                {
                        lcd_string(0,"超超时退出!");
                        return(0x00);//超时返回0
                }
	}

}

//取符合拼音字符串的10个汉字,page是取第几页
//返回的汉字串在hz[21];
void lcd_pinyin2hz(uchar page, uchar *pinyin,uchar *hz)
{
	uchar i,ch;
	ulong n=0;
        while(inbufsign)getbyte();
	putbyte(0x1b);
	putbyte(0x48);
	putbyte(10);//在这里修改你需要返回几个汉字
	putbyte(page);
	putstring(pinyin);
	putbyte(0x00);	
	while(1)
	{
		if(inbufsign)//串口接收到了数据
		{
                        for(i=0;i<21;i++)
                        {
                                *(hz+i)=getbyte();
                                if(*(hz+i)==0)
                                        break;
                        }

/*			if(getbyte()==0x1b)
			{
				for(i=0;;i++)
				{
					ch=getbyte();
					*(hz+i)=ch;
					if(ch==0)break;			
				}
				return;
			}
*/			
		}
		n++; //超时计时加一
		if(n>1000000) 
			return;//超时返回
	}		
}

void delay(void)
{
	ulong n;
	uchar i;
	for(i=0;i<2;i++)
		for(n=0;n<60000;n++);
}


/*
  程序功能: 显示拼音串(第i个拼音反显,0<=i<=5)
  输入参数: 拼音个数j,pinyin_buf[i];
  占用资源: 整型变量j,k
  返回参数: 无
*/

void pinyin_display(uchar i,uchar j,uchar pinyin[6][7])
{ 
	uchar k,t=0;
        if((j&0x80)==0x80)
        {
                j=j&0x7f;
                numbers_delete_sign=1;
        }
        else 
                numbers_delete_sign=0;
        t=0;
        //--------------------------------------------------
        //出错停止
        if(j>6||j==0) 
        {
                lcd_string(0,"error need debug!");
                getchar();
        }
        if(i>5)
        {
                lcd_string(0,"error need debug!");
                getchar();
        }
        //
        //--------------------------------------------------
	if((i>=3)&&(i<=5)&&(j>=4)&&(j<=6))t=3;
        for(k=0;k<3;k++)
        {
                lcd_cursor(k*6,3);
                if((k+t)==i)
                        lcd_bytes(1,pinyin[i],6);//反显拼音

                else    
                        lcd_bytes(0,pinyin[k+t],6);
        }

}

/*
  程序功能: 汉字内码显示(j:第j个汉字反显,j=0不反显)
  输入参数: j,hanzi_buf;
  占用资源: 整型变量k,指针变量hanzi_p;
  返回参数: 无
*/
void hanzi_display(uchar j,uchar hanzi_buf[21])
{

        uchar k,* hanzi_p=hanzi_buf;
        //-------------------------
        //出错处理
        if(j>10)
        {
                lcd_string(0,"error");
                getchar();
        }
        //--------------------------
        for(k=1;k<=10;k++)
        {
                lcd_cursor(k*2-2, 4);
                if(k==j)lcd_hanzi(1,hanzi_p);//反黑显示的汉字
                if(k!=j)lcd_hanzi(0,hanzi_p);
                hanzi_p=hanzi_p+2;                
        }
}

/*第j个被选择的汉字保存至save_buf[32];含插入汉字的处理
void edit_save_display(uchar j,uchar * save_p,uchar hanzi_buf[21],uchar save_buf[32])
{
        char *save_p1,*save_p2 = save_buf;
        if(!edit_3_state)
        {
                save_p1=save_p;
                goto save_process0;
        }
        if(edit_3_state)
        {
                while(*save_p2!='\0')save_p2++;
                save_p1=save_p2;//指向'\0'
                save_p2=save_p+2;//插入汉字时需要空出2个字节位置
        
                //if(save_p>=save_p2||save_p<save_buf)return;//指针出错 指向编辑汉字的指针出错处理
        
                //插入光标位置后的字符串向后移动2个字节
                while(save_p1!=save_p)*save_p2--=*save_p1--;
                *save_p2=*save_p1;
        }
save_process0:
         *save_p1++=hanzi_buf[2*j-2];
         *save_p1=hanzi_buf[2*j-1];
        //----------------------------------
        lcd_cursor(0,0);
        lcd_string(0,save_buf);
}
*/
//定义一个图片
uchar code pic[]={
0x48, 0x1c, //这两个字节是图形块的长和宽,下面的才是图形数据
0x00, 0x4E, 0x20, 0x00, 0x00, 0xF0, 0x40, 0x00, 0x00, 0x00, 0x7B, 0xE0, 0x01, 0x01, 0xF8, 0xC0, 
0x00, 0x00, 0x01, 0xFF, 0x7C, 0xFF, 0xF1, 0xFD, 0xC0, 0x00, 0x00, 0x00, 0x7F, 0xC6, 0xFF, 0xC1, 
0x9F, 0xC3, 0xF8, 0x00, 0x00, 0x7F, 0xFC, 0xFF, 0xF3, 0x0F, 0xBF, 0xC0, 0x00, 0x00, 0x7F, 0xE6, 
0x1F, 0xFE, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x77, 0xFC, 0x07, 0xE7, 0x07, 0xFF, 0xC0, 0x00, 0x00, 
0x77, 0xFB, 0x07, 0xFB, 0x87, 0xBF, 0x00, 0x00, 0x00, 0x67, 0xFF, 0xF7, 0xA7, 0x7E, 0x00, 0x00, 
0x00, 0x00, 0x67, 0xFF, 0xF7, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x67, 0xFF, 0xEF, 0xE1, 0xFF, 
0x98, 0x00, 0x00, 0x00, 0x63, 0xFF, 0xEF, 0xFF, 0xFF, 0xB8, 0x00, 0x44, 0x00, 0x03, 0xFF, 0xEF, 
0xFF, 0xFF, 0xFC, 0x08, 0xC6, 0x04, 0x01, 0xFF, 0xEF, 0xFF, 0xFF, 0xF4, 0x04, 0x8E, 0x0C, 0x43, 
0xFE, 0x6F, 0xFF, 0xFF, 0xE6, 0x05, 0x9F, 0x98, 0x43, 0xFF, 0x8F, 0xFF, 0xFB, 0xC3, 0xC7, 0x9F, 
0x99, 0xE7, 0x7F, 0xFF, 0xFF, 0xFD, 0xC1, 0xE7, 0xFF, 0xD9, 0xE6, 0xFD, 0xFF, 0xFF, 0xDF, 0xF0, 
0x0F, 0xFF, 0xFF, 0xA7, 0xE1, 0x9F, 0xFF, 0x0F, 0xF8, 0x5B, 0xFF, 0xEE, 0x8F, 0x81, 0x87, 0xE0, 
0x00, 0x0C, 0x00, 0x00, 0x00, 0x1E, 0x01, 0x8F, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x3C, 0x01, 
0x9E, 0xF3, 0xC4, 0x15, 0xE2, 0x08, 0x00, 0xF8, 0x00, 0xF8, 0x91, 0x24, 0xFC, 0x02, 0x08, 0x03, 
0x98, 0x00, 0xE0, 0x93, 0xD4, 0x90, 0x77, 0x88, 0x7E, 0x30, 0x01, 0x80, 0xF8, 0x94, 0xEA, 0x22, 
0x88, 0x38, 0x30, 0x07, 0x00, 0x0B, 0xD4, 0xAC, 0x2A, 0x80, 0x00, 0x60, 0x3C, 0x01, 0xE8, 0x84, 
0xAC, 0x36, 0x88, 0x00, 0x40, 0x38, 0x00, 0x1B, 0xED, 0x76, 0x6D, 0x80
};

void main(void)
{
        uchar i,j,m,c,ch1;
        uchar page;        
        uchar ch2;

	uchar numbers[6] = "7426";//键盘输入
	//uchar pinyin_total;//拼音个数
	uchar idata pinyin_buf[6][7];//拼音串
	uchar idata hanzi_buf[21];//汉字内码
	uchar save_buf[32]="输入的汉字在后:";//编辑保存
        uchar * numbers_p;
	uchar * save_p;


        numbers_delete_sign = 0;
	i=0;					//i=0,第0个拼音串pinyin_buf[i]反显
	j=0;					//j=0,无汉字反显,1<=j<=10,反显第j个汉字
	page=1;					//设置拼音串pinyin_buf[i]返回汉字页码
        numbers_p = numbers;
        ch2= 0;
        edit_0_state = 1;
        save_p=save_buf;
        //while(*save_p!='\0')save_p++;
        ch1=0;
        c=0;
	serial_init();
        delay();
        //lcd_cls();
        /*
        lcd_cursor(0,0);
        lcd_string(0,"进入编辑对话:\n\r");
        //delay();
        //delay();
        lcd_string(0,"没有任何问题:\n\r");
        //delay();
        //delay();
        //delay();
        //delay();lcd_cls();
        //lcd_cursor(0,2);
        lcd_string(0,"不太对劲儿呢:\n\r");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -