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

📄 main.c

📁 拼音输入法用在单片机上.rar
💻 C
📖 第 1 页 / 共 4 页
字号:
/*******************************************************
利用汉显液晶模块HZ132-64做的一个编辑小程序
实现的功能有:
一、键盘测试:
二、编辑短信:
1.4*4小键盘智能拼音汉字输入(国标一、二级汉字)
2.英文大小写输入
3.标点符号输入(半角全角)
4.数字输入
三、取字演示:
四、删除信息:
五、查看短信:
/--------------------------------------------------
参考例程:51单片机世界http://www.mcu51.com
          汉显液晶主页http://www.hzlcd.com 的demo程序
******************************************************/
//#include "w77e58.h"
#include  <reg51.h>
#define   uchar  unsigned char
#define   uint   unsigned int
#define   ulong  unsigned long
#define   bj_len 40                            //半角标点符号固定表的长度
#define   qj_len 60                            //全角特殊符号固定表的长度
extern    bit    inbufsign;                    //串口接收到数据标志
extern    char   getbyte(void);                //从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
extern    void   serial_init (void);           //串口初始化
extern    char   getchar(void);
bit       chinese_input_state;                 //中文输入状态(这里仅有拼音输入)
bit       english_input_state;                 //英文输入状态
bit       numbers_input_state;                 //数文输入状态
bit       edit_0_state;                        //编辑初状态,没有任何数字键输入时
bit       edit_1_state;                        //有拼音输入但没有回车的状态(拼音反显的情况)
bit       edit_2_state;                        //中文,英文,标点符号待选择的状态(汉字,英文,标点符号反显的情况)
bit       edit_3_state;                        //字符插入输入状态标志
bit       edit_4_state;                        //中英文下标点符号待选择状态(标点符号反显的情况)
bit       edit_5_state;                        //全角/半角符号输入标志 1:全角 0:半角

/*******************************************
延时子程序                                 *
*******************************************/
void delay(void)
{
	ulong n;
	uchar i;
	for(i=0;i<2;i++)
		for(n=0;n<60000;n++);
}
/*******************************************
延时子程序2                                *
等待接收中断完毕 防止时序混乱              *
*******************************************/
void wait(uchar c)
{
	ulong n;
	uchar i;
	for(i=0;i<=c;i++)
		for(n=0;n<0x100;n++);

}
/*******************************************
灰度设置                                   *
*******************************************/

void lcd_light(uchar ch)
{
	if(ch>0x3f)return;
        while(inbufsign)getbyte();//清空接收缓冲区,此时inbufsign=0;
        SBUF=0x1B;      while(!TI);TI=0;
        SBUF=0x31;      while(!TI);TI=0;
        SBUF=ch;        while(!TI);TI=0;
        wait(1);
        while(!inbufsign);//此句检测液晶模块是否响应所发指令
                          //相当于检测在发送数据期间是否有RI为1的情况(是否发生过接收中断)
                          //因为清空接收缓冲区后,若发生接收中断则inbufsign被赋值为1,
                          //以下的while(inbufsign)getbyte();
                          //      ......................
                          //      while(!inbufsign);
                          //不再注释,因为功能相同,即检测液晶模块响应指令后才退出该函数
}
/******************************************
清屏                                      *
******************************************/
void lcd_cls(void)
{
        while(inbufsign)getbyte();
        SBUF=0x1B;      while(!TI);TI=0;
        SBUF=0x32;      while(!TI);TI=0;
        wait(1);
        while(!inbufsign);
}
/******************************************
设置光标位置                              *
******************************************/
void lcd_cursor(uchar x, uchar y)
{
        while(inbufsign)getbyte();
        SBUF=0x1B;      while(!TI);TI=0;
        SBUF=0x33;      while(!TI);TI=0;
        SBUF=x;         while(!TI);TI=0;
        SBUF=y;         while(!TI);TI=0;
        wait(1);
        while(!inbufsign);
}
/******************************************
arrt=1,闪烁光标;attr=0,关闭光标闪烁       *
******************************************/
void lcd_showcursor(uchar attr)   
{
        while(inbufsign)getbyte();
        SBUF=0x1B;      while(!TI);TI=0;
        SBUF=0x34;      while(!TI);TI=0;
        SBUF=attr;      while(!TI);TI=0;
        wait(1);
        while(!inbufsign);
}
/******************************************
显示一个ASCII字符(1字节)                  *
******************************************/
void lcd_byte(uchar attr,uchar c)
{
        while(inbufsign)getbyte();
        SBUF=0x1B;      while(!TI);TI=0;
        SBUF=0x37;      while(!TI);TI=0;
        SBUF=attr;      while(!TI);TI=0;
        SBUF=c;         while(!TI);TI=0;
        SBUF=0x00;      while(!TI);TI=0;
        wait(1);
        while(!inbufsign);
}
/******************************************
显示一个汉字                              *
返回指针加2指向下一个汉字或其它           *
******************************************/
uchar * lcd_hanzi(uchar attr,uchar *hanzi_p)
{
        while(inbufsign)getbyte();
        SBUF=0x1B;      while(!TI);TI=0;
        SBUF=0x37;      while(!TI);TI=0;
        SBUF=attr;      while(!TI);TI=0;
        SBUF=*hanzi_p++;while(!TI);TI=0;
        SBUF=*hanzi_p++;while(!TI);TI=0;
        SBUF=0x00;      while(!TI);TI=0;
        wait(1);
        while(!inbufsign);
        return hanzi_p;
}
/******************************************
显示字符串                                *
******************************************/
void lcd_string(uchar attr,uchar *string) 
{
        if(*string=='\0')return;
        while(inbufsign)getbyte();
        SBUF=0x1B;while(!TI);TI=0;
        SBUF=0x37;while(!TI);TI=0;
        SBUF=attr;while(!TI);TI=0;
        for(;*string!=0;)
        {
                SBUF=*string;
                while(!TI);
                TI=0;
                string++;
        }
        SBUF=0x00;while(!TI);TI=0;
        wait(1);
        while(!inbufsign);
}
/******************************************
显示n个字符,字符个数小于n个,则发送空格   *
******************************************/
void lcd_bytes(uchar attr,uchar *string,uchar n)
{
        if((n>38)||!n)return;
        while(inbufsign)getbyte();
        SBUF=0x1B;while(!TI);TI=0;
        SBUF=0x37;while(!TI);TI=0;
        SBUF=attr;while(!TI);TI=0;
        for(;n;)
        {
                if(*string)
                        SBUF=*string;
                else 
                        SBUF=0x20;
                while(!TI);
                TI=0;
                string++;
                n--;
        }
        SBUF=0x00;while(!TI);TI=0;
        wait(1);
        while(!inbufsign);
}
/******************************************
此函数发送若干空格清除某区域的显示        *
起始位置:当前光标之后                     *
清除区域:n个字节                          *
******************************************/
void lcd_clear_bytes(uchar n)
{
        if(!n)return;
        while(inbufsign)getbyte();
        SBUF=0x1B;while(!TI);TI=0;
        SBUF=0x37;while(!TI);TI=0;
        SBUF=0x00;while(!TI);TI=0;
        for(;n;)
        {      
                SBUF=0x20;
                while(!TI);
                TI=0;
                n--;
        }
        SBUF=0x00;while(!TI);TI=0;
        wait(1);
        while(!inbufsign);
}
/********************************************
函数功能:取数字组合的有效拼音组合           *
入口参数:*num,指向输入的数字;pinyin[6][7],  *
         返回的有效拼音组合放在pinyin[6][7] *
出口参数:函数返回返回有效拼音的个数         *
********************************************/
uchar lcd_num2pinyin(uchar *num, uchar pinyin[6][7])
{
	uint  n=0;//超时用
	uchar m,i,j,ch;
        for(i=0;i<6;i++)
                for(j=0;j<7;j++)
                        pinyin[i][j]='\0';
        while(inbufsign)getbyte();
        SBUF=0x1B;while(!TI);TI=0;
        SBUF=0x47;while(!TI);TI=0;
        do
        {
                SBUF=*num++;
                while(!TI);
                TI=0;
        }while(*num!='\0');
        SBUF=0x00;while(!TI);TI=0;
        do
	{
		if(inbufsign)//串口接收到了数据
		{
			if(getbyte()==0x1b)
			{
				m=getbyte();//查到的总条数
				for(i=0;i<(m&0x7f);i++)
				{
					
					for(j=0;;j++)
					{
						ch=getbyte();
						pinyin[i][j]=ch;
						if(ch==0)break;
					}
				}
				return(m);
			}
		}
                n++;
		if(n>0xf000)//超时计时加一
                {
                        lcd_string(0,"get pin error1!");
                        getchar();
                        return(0x00);//超时返回0
                }
	}while(1);

}
/*******************************************
函数名称:lcd_pinyin2hz                     *
入口参数:page,pinyin,hz                    *
函数功能:取符合拼音字符串的若干个汉字      *
其它说明:pinyin指向拼音串的存放地址        *
         page是取第几页                    *
         hz指向返回的汉字串的存放地址hz    *
出口参数:函数返回所得汉字个数              *
*******************************************/
uchar lcd_pinyin2hz(uchar page, uchar *pinyin,uchar *hz)
{
	uchar i,ch=21;
	uint  n=0;
        while(ch--)
                *(hz+ch)='\0';//清空汉字缓存
        while(inbufsign)getbyte();
        SBUF=0x1B;while(!TI);TI=0;
        SBUF=0x48;while(!TI);TI=0;
        SBUF=0x0A;while(!TI);TI=0;//设置返回汉字的个数
        SBUF=page;while(!TI);TI=0;
        do
        {
                SBUF=*pinyin++;
                while(!TI);
                TI=0;
        }while(*pinyin!='\0');
        SBUF=0x00;while(!TI);TI=0;
        do
	{
		if(inbufsign)//串口接收到了数据
		{
			if(getbyte()==0x1b)
			{
				for(i=0;;i++)
				{
					ch=getbyte();
					*(hz+i)=ch;
					if(ch==0)break;			
				}
                                for(i=0;*(hz+i)!='\0';i++);
                                i=i>>1;
				return i;
			}
		}
                n++;
		if(n>0xf000)//超时计时加一
                {	
                        lcd_string(0,"get hanzi error!");
                        getchar();

⌨️ 快捷键说明

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