|
单片机源程序如下:- #include <reg52.H>
- #include <string.h>
- #include <stdio.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define LCD_Bus P0 //P0口输出数据
- #define LCD_Busy 0x80
- //---------定义接口----------//
- sbit LCD_RS=P2^7;
- sbit LCD_RW=P2^6;
- sbit LCD_E =P2^5;
- sbit LCD_RST=P2^4;
- sbit key4=P1^0; sbit key8=P1^1; //定义按键的输入端
- sbit key12=P1^2; sbit key16=P1^3;
- sbit key3=P1^4; sbit key7=P1^5;
- sbit key11=P1^6; sbit key14=P1^7;
- sbit key2=P3^0; sbit key6=P3^1;
- sbit key10=P3^2; sbit key15=P3^3;
- sbit key1=P3^4; sbit key5=P3^5;
- sbit key9=P3^6; sbit key13=P3^7;
- sbit key17=P2^1;
- sbit ds=P2^0; //温度传感器信号线
- int tvalue,num1=0;//温度值
- uchar tflag;//温度正负标志
- uchar table[5];
- code char table1[]={"温度:"};
- //--------函数定义区--------//
- void delay (uint t); //延时函数
- void LCD_Rest(); //LCD驱动函数
- void LCD_Init();
- void LCD_Wdata(uchar d);
- void LCD_Wcode(char c);
- void LCD_Rbusy();
- char get_key(); //拼音及汉字输出函数
- display_hanzi(struct t9py_list *ptr);
- display_output_hanzi(struct t9py_list *ptr);
- void display_pinyin(struct t9py_list *ptr);
- void LCD_ShowString(char *st);
- void t9py_result_clear(); //拼音及汉字输出辅助函数
- void t9py_result_add(struct t9py_index *idx);
- void t9py_result_select_next();
- void t9py_result_select_prev();
- void t9py_result_select_reset();
- void t9py_result_hanzi_init();
- void t9py_result_hanzi_select_prev();
- void t9py_result_hanzi_select_next();
- uint t9_table_search();
- char is_t9_key(char e); //字符串处理辅助函数
- void str_uncat_char(char *s);
- void str_cat_char(char *s, char c);
- void str_clear(char *s);
- void LCD_qingchu_34( ); //清除三四行
- void LCD_qingchu_12( );
- void LCD_Clear( );
- int key;
- int weizhi=0;
- char Fkey[8]={""};
- char key_str[8]={""}; // 从键盘输入的T9数字序列
- char *zimu_str;
- char *biaodian_str;
- char pos=0;
- // T9数字字母索引表项
- struct t9py_index {
- char code *t9_str; //按键数字序列
- char code *py_str; //拼音编码字符串
- char code *py_mb; //该拼音对应的汉字码表地址
- };
- // T9数字字母索引结果(多重表项)
- struct t9py_list {
- struct t9py_index * entry[8];
- int ele_num; // 拼音个数
- char ele_idx; // 当前选中的拼音(index)
- int hanzi_num; // 当前选中汉字中的汉字个数
- char hanzi_idx; // 当前选中拼音中的选中的汉字(index)
- char code *hanzi_ptr; // 当前读音候选汉字字符串指针
- };
- //"拼音输入法汉字排列表,码表(mb)"
- code char PY_mb_a[] ={"阿啊"};
- code char PY_mb_ai[] ={"哎哀唉埃挨皑癌爱"};
复制代码
- char code zimu[][9]={"AaBbCc","DdEeFf","GgHhIi","JjKkLl","MmNnOo","PpQqRrSs","TtUuVv","WwXxYyZz"};
- char code biaodian[]={".,?!:;\"'"};
- // 每次查询T9索引表得到的表项结果
- struct t9py_list t9py_result;
- //-------延时函数--------//
- void delay(uint t)
- {
- uint j , k , l;
- for (j=0;j<t;j++)
- for (k=0;k<2;k++)
- for (l=0;l<255;l++);
- }
- //--------写命令--------//
- void LCD_Wcode(char c)
- {
- LCD_Rbusy(); //检测忙信号,如果忙碌,一直在这里循环
- LCD_RS=0;
- LCD_RW=0;
- LCD_Bus=c;
- LCD_E =1;
- delay(10); //延时
- LCD_E=0;
- }
- //---------写数据------//
- void LCD_Wdata(char d)
- {
- LCD_Rbusy();
- LCD_RS=1;
- LCD_RW=0;
- LCD_Bus=d;
- LCD_E =1;
- delay(10);
- LCD_E=0;
- }
- //-------初始化函数------//
- void LCD_Init()
- {
- LCD_RST=1;
- // LCD_PSB=1;
- delay(2);
- LCD_Clear(); //清显示
- delay(2);
- LCD_Wcode(0x06); //地址复位
- delay(2);
- LCD_Wcode(0x0c); //整体显示,关游标,不反白
- delay(2);
- LCD_Wcode(0x30); //基本指令集,选择八位数据流
- delay(2);
- }
- /*DS18B20复位,初始化*/
- void chu18b20()
- {
- uint i;
- ds=0;
- i=103;
- while(i>0)i--;
- ds=1;
- i=4;
- while(i>0)i--;
- }
- /*读1位数据函数*/
- bit du18b20bit()
- {
- uint i;
- bit dat;
- ds=0;i++; //i++延时
- ds=1;i++;i++;
- dat=ds;
- i=8;while(i>0)i--;
- return(dat);
- }
- /*读1个字节数*/
- uchar du18b20()
- {
- uchar i,j,dat;
- dat=0;
- for(i=1;i<=8;i++) //读一个字节数据
- {
- j=du18b20bit();
- dat=(j<<7)|(dat>>1); //读出数据的最低位在前
- }
- return(dat);
- }
- /*向DS18B20写一个字节数据*/
- void xie18b20(uchar dat)
- {
- uint i;
- uchar j;
- bit wei; //定义一个位型变量
- for(j=1;j<=8;j++)
- {
- wei=dat&0x01;
- dat=dat>>1;
- if(wei) //写位'1'
- {
- ds=0;
- i++;i++;
- ds=1;
- i=8;
- while(i>0)i--; //延时
- }
- else
- {
- ds=0; ////写位'0'
- i=8;
- while(i>0)i--;
- ds=1;
- i++;i++;
- }
- }
- }
- /*读取温度值并转换*/
- zh18b20()
- {
- uint a,b;
- chu18b20(); //DS18B20初始化
- delay(1);
- xie18b20(0xcc);//跳过读序列号
- xie18b20(0x44);//启动温度转换
- chu18b20();
- delay(1);
- xie18b20(0xcc);//跳过读序列号
- xie18b20(0xbe);//读取温度
- a=du18b20();
- b=du18b20();
- tvalue=b;
- tvalue<<=8; //组合两个字节
- tvalue=tvalue|a;
- if(tvalue<0x08ff) //判断温度符号
- tflag=0;
- else
- {
- tvalue=~tvalue+1;
- tflag=1;
- }
- tvalue=tvalue*(0.0625)*10;//温度值扩大10倍,精确到1位小数
- return(tvalue);
- }
- /*温度值显示*/
- void xs18b20()
- {
- uchar space,num;
- table[0]=tvalue/1000+0x30;//百位数
- table[1]=tvalue%1000/100+0x30;//十位数
- table[2]=tvalue%100/10+0x30;//个位数
- table[3]=tvalue%10+0x30;//小数位
- if(tflag==0)
- space=0x20;//正温度不显示符号
- else
- space=0x2d;//负温度显示负号:-
- if(table[0]==0x30)
- {
- table[0]=0x20; //如果百位为0,不显示
- if(table[1]==0x30)
- table[1]=0x20; //十位为0也不显示
- }
- LCD_Wcode(0x98+2); //0x80+0x40=0xc0,+4为前面空四列
- for(num=0;num<5;num++)
- LCD_Wdata(table1[num]);
- LCD_Wdata(space);//显示符号位
- LCD_Wdata(table[0]);//显示百位
- LCD_Wdata(table[1]);//显示十位
- LCD_Wdata(table[2]);//显示个位
- LCD_Wdata(0x2e);//显示小数点
- LCD_Wdata(table[3]);//显示小数位
- }
- //-------复位函数-------//
- void LCD_Rest()
- {
- LCD_RST=1;
- delay(10);
- LCD_RST=0;
- delay(10);
- LCD_RST=1;
- delay(10);
- }
- //------检查忙碌函数-----//
- void LCD_Rbusy(void)
- {
- LCD_RS=0;
- LCD_RW=1;
- LCD_E=1;
- LCD_Bus=0xff;
- while ((LCD_Bus&LCD_Busy)==LCD_Busy);
- LCD_E=0;
- }
- //-----清屏函数--------//
- void LCD_Clear()
- {
- LCD_Wcode(0x01);
- }
- //-----清除一二行-------//
- void LCD_qingchu_12( )
- {
- uint i,j ;
- LCD_Wcode(0x80);
- for(i=16;i>0;i--)
- LCD_Wdata(' ');
- LCD_Wcode(0x90);
- for(j=16;j>0;j--)
- LCD_Wdata(' ');
- }
- //-----清除三四行-------//
- void LCD_qingchu_34( )
- {
- uint i,j ;
- LCD_Wcode(0x88);
- for(i=16;i>0;i--)
- LCD_Wdata(' ');
- LCD_Wcode(0x98);
- for(j=16;j>0;j--)
- LCD_Wdata(' ');
- }
- //按键查询函数
- char get_key()
- {
- while(1)
- {
- if(key17==0)
- {
- zh18b20();
- xs18b20();
- }
- if (key1==0)
- {
- delay(10);
- if (key1==0)
- {while(key1==0);
- return 1;}
- }
- else if (key2==0)
- {
- delay(10);
- if (key2==0)
- {while(key2==0);
- return 2;}
- }
- else if (key3==0)
- {
- delay(10);
- if (key3==0)
- {while(key3==0);
- return 3;}
- }
- else if (key4==0)
- {
- delay(10);
- if (key4==0)
- {while(key4==0);
- return 4;}
- }
- else if (key5==0)
- {
- delay(10);
- if (key5==0)
- {while(key5==0);
- return 5;}
- }
- else if (key6==0)
- {
- delay(10);
- if (key6==0)
- {while(key6==0);
- return 6;}
- }
- else if (key7==0)
- {
- delay(10);
- if (key7==0)
- {while(key7==0);
- return 7;}
- }
- else if (key8==0)
- {
- delay(10);
- if (key8==0)
- {while(key8==0);
- return 8;}
- }
- else if (key9==0)
- {
- delay(10);
- if (key9==0)
- {while(key9==0);
- return 9;}
- }
- else if (key10==0)
- {
- delay(10);
- if (key10==0)
- {while(key10==0);
- return 0;}
- }
- else if (key11==0)
- {
- delay(10);
- if (key11==0)
- {while(key11==0);
- return 11;}
- }
- else if (key12==0)
- {
- delay(10);
- if (key12==0)
- {while(key12==0);
- return 12;}
- }
- else if (key13==0)
- {
- delay(10);
- if (key13==0)
- {while(key13==0);
- return 13;}
- }
- else if (key14==0)
- {
- delay(10);
- if (key14==0)
- {while(key14==0);
- return 14;}
- }
- else if (key15==0)
- {
- delay(10);
- if (key15==0)
- {while(key15==0);
- return 15;}
- }
- else if (key16==0)
- {
- delay(10);
- if (key16==0)
- {while(key16==0);
- return 16;}
- }
- }
- }
- /***********************************
- * T9辅助函数 *
- ***********************************/
- // 清空t9py_result
- void t9py_result_clear()
- {
- int i;
- for (i = 0; i < 8; i++)
- t9py_result.entry[i] = NULL;
- t9py_result.ele_num = 0;
- t9py_result.ele_idx = 0;
- t9py_result.hanzi_num = 0;
- t9py_result.hanzi_idx = 0;
- }
- // 判断t9py_result是否为空,空返回1
- uint t9py_result_is_empty()
- {
- if (t9py_result.ele_num == 0)
- return 1;
- return 0;
- }
- // 在t9py_result中增加一项
- void t9py_result_add(struct t9py_index *idx)
- {
- int n=0;
- while (t9py_result.entry[n] != NULL)
- n++;
- t9py_result.entry[n] = idx;
- t9py_result.ele_num++;
- }
- // 在t9py_result中选择下一项(作为当前拼音)
- void t9py_result_select_next()
- {
- if (t9py_result.ele_num == 0) // 无元素,没法选
- return;
- t9py_result.ele_idx++;
- if (t9py_result.ele_idx > t9py_result.ele_num - 1)
- t9py_result.ele_idx = t9py_result.ele_num - 1;
- }
- // 在t9py_result中选择上一项(作为当前拼音)
- void t9py_result_select_prev()
- {
- if (t9py_result.ele_num == 0) // 无元素,没法选
- return;
- t9py_result.ele_idx--;
- if (t9py_result.ele_idx < 0)
- t9py_result.ele_idx = 0;
- }
- // 复位t9py_result中的拼音选择
- void t9py_result_select_reset()
- {
- t9py_result.ele_idx = 0;
- }
- // 初始化当前选中拼音所对应的汉字选择结构
- void t9py_result_hanzi_init()
- {
- if (t9py_result.ele_num == 0)
- return;
- t9py_result.hanzi_ptr =( (t9py_result.entry)[t9py_result.ele_idx])->py_mb;
- t9py_result.hanzi_num = strlen(t9py_result.hanzi_ptr)/2 ;
- t9py_result.hanzi_idx = 0;
- }
- // 选择上一个当前读音的汉字
- void t9py_result_hanzi_select_prev()
- {
- pos--;
- if (pos<0)
- pos=0;
- if (t9py_result.hanzi_num == 0) // 无元素,没法选
- return;
- t9py_result.hanzi_idx--;
- if (t9py_result.hanzi_idx < 0)
- t9py_result.hanzi_idx = 0;
- LCD_Wcode(0x0f);
- LCD_Wcode(0x98+pos);
- }
- // 选择下一个当前读音的汉字
- void t9py_result_hanzi_select_next()
- {
- pos++;
- if(pos==8)
- pos=0;
- if (t9py_result.hanzi_num== 0) // 无元素,没法选
- return;
- t9py_result.hanzi_idx++;
- if (t9py_result.hanzi_idx > (t9py_result.hanzi_num - 1))
- t9py_result.hanzi_idx = t9py_result.hanzi_num - 1;
- LCD_Wcode(0x0f);
- LCD_Wcode(0x98+pos);
- }
- // 查询T9索引表 t9py_table[]
- // 查找数字序列与t9_str字符串相同的表项
- // 如找到匹配项,返回1,将结果存在t9py_result中
- // 如未找到匹配项,返回0,不改变t9py_result
- uint t9_table_search()
- {
- int success;
- char *str;
- struct t9py_index *idx;
- success = 0;
- idx = &(t9py_table[0]);
- str = idx->t9_str;
- t9py_result_clear(); // 清空原来的结果
- for (;strcmp(str,"");)
- {
- if (!strcmp(str, key_str))
- {
- success=1;
- t9py_result_add(idx);
- }
- idx++;
- str = idx->t9_str;
- }
- return success;
- }
- /***********************************
- * 字符串辅助函数 *
- ***********************************/
- // 判断T9数字按键
- char is_t9_key(char e)
- {
- if (e>=2&&e<=9)
- return 1;
- return 0;
- }
- // 删除字符串末尾的字符
- void str_uncat_char(char *s)
- {
- if (!(*s))
- return;
- while (*s)
- s++;
- s--;
- *s = 0;
- }
- // 在字符串末尾添加字符
- void str_cat_char(char *s, char c)
- {
- while (*s)
- s++;
- *s = c;
- s++;
- *s = 0;
- }
- // 清除字符串
- void str_clear(char *s)
- {
- *s = 0;
- }
- /***********************************
- * 显示汉字拼音函数 *
- ***********************************/
- void LCD_ShowString(char *st)
- {
- uint i;
- for(i=0;*st!='\0';i++,st++)
- {
- LCD_Wdata(*st);
- }
- delay(50);
- LCD_Wdata(' ');
- }
- void display_pinyin(struct t9py_list *ptr)
- {
- char *dizhi;
- int j;
- LCD_Wcode(0x88);
- for(j=0;j<ptr->ele_num;j++)
- {
- dizhi=ptr->entry[j]->py_str;
- LCD_ShowString(dizhi);
- }
- }
- //显示选中拼音对应的汉字
- display_hanzi(struct t9py_list *ptr)
- {
- int i, char_num;
- char *hanzi;
- hanzi=ptr->hanzi_ptr;
- char_num=ptr->hanzi_num*2;
- LCD_Wcode(0x98);
- for(i=0;i<char_num;i++)
- LCD_Wdata(*hanzi++);
- }
- //显示最后输出的字
- display_output_hanzi(struct t9py_list *ptr)
- {
- char *hanzi;
- int i;
- char xx=0;
- if(weizhi<=7)
- LCD_Wcode(0x80+weizhi);
- else if(weizhi==16)
- {
- weizhi=0;
- LCD_qingchu_12( );
- LCD_Wcode(0x80+weizhi);
- }
- else
- LCD_Wcode(0x90+weizhi-8);
- xx=(ptr->hanzi_idx)*2;
- hanzi=ptr->entry[ptr->ele_idx]->py_mb+xx;
- for(i=0;i<2;i++)
- LCD_Wdata( *hanzi++);
- delay(5);
- weizhi++;
- }
- /***********************************
- * 主函数 *
- ***********************************/
- #define STATE_PINYIN 1 // 输入拼音阶段
- #define STATE_HANZI 2 // 选择汉字阶段
- #define STATA_ZIMU 3 // 选择字母阶段
- #define STATA_BIAODIAN 4 // 选择标点阶段
- void main()
- {
- uint ok, input_state, i,j;
- LCD_Clear();
- LCD_Rest();
- LCD_Init();
- while (1)
- {
- key = get_key();//获取键盘输入
- if(key==0) //**********数字输入模块*********//
- {
- key=get_key();
- if(key>=0&&key<=9)
- sprintf(Fkey, " %d" , key);
- else
- break;
- if(weizhi<=7)
- LCD_Wcode(0x80+weizhi);
- else if(weizhi==16)
- {
- weizhi=0;
- LCD_qingchu_12( );
- LCD_Wcode(0x80+weizhi);
- }
- else
- { LCD_Wcode(0x90+weizhi-8); }
- LCD_Wdata(Fkey[1]);
- weizhi++;
- }
- if(key==11) //********字母输入模块********//
- {
- input_state=STATA_ZIMU;
- while(1)
- {
- if(input_state==STATA_ZIMU)
- {
- key=get_key();
- if(key>=2&&key<=9)
- {
- zimu_str=zimu[key-2];
- LCD_Wcode(0x98);
- LCD_ShowString(zimu_str);
- }
- else if(key==14) //下键
- {
- zimu_str++;
- }
- else if(key==15) //上键
- {
- zimu_str--;
- }
- else if(key==16)
- {
- if(weizhi<=7)
- LCD_Wcode(0x80+weizhi);
- else if(weizhi==16)
- {
- weizhi=0;
- LCD_qingchu_12( );
- LCD_Wcode(0x80+weizhi);
- }
- else
- LCD_Wcode(0x90+weizhi-8);
- LCD_Wdata(*zimu_str);
- weizhi++;
- LCD_qingchu_34();
- input_state = STATE_PINYIN;
- }
- }
- if(input_state == STATE_PINYIN) break;
- }
- }
- if(key==12) //********标点输入模块*********//
- {
- input_state=STATA_BIAODIAN;
- biaodian_str=biaodian;
- LCD_Wcode(0x98);
- LCD_ShowString(biaodian_str); //把所有的标点符号显示在第四行
- while(1)
- {
- if(input_state==STATA_BIAODIAN)
- {
- key=get_key();
- if(key==14)
- biaodian_str++;
- else if(key==15)
- biaodian_str--;
- else if(key==16)
- {
- if(weizhi<=7)
- LCD_Wcode(0x80+weizhi);
- else if(weizhi==16)
- {
- weizhi=0;
- LCD_qingchu_12( );
- LCD_Wcode(0x80+weizhi);
- }
- else
- LCD_Wcode(0x90+weizhi-8);
- LCD_Wdata(*biaodian_str);
- weizhi++;
- LCD_qingchu_34();
- input_state = STATE_PINYIN;
- }
- }
- if(input_state == STATE_PINYIN) break;
- }
- }
- if(key==13) //13键表示退格,把选出来的字或字母或数字删除
- {
- weizhi--;
- if(weizhi<=7)
- LCD_Wcode(0x80+weizhi);
- else
- LCD_Wcode(0x90+weizhi-8);
- for(j=0;j<=1;j++)
- LCD_Wdata(' ');
- }
- if(key==1) //*********汉字输入程序模块********//
- {
- input_state = STATE_PINYIN;
- while(1)
- {
- key = get_key();
- sprintf(Fkey, " %d" , key);
- if (input_state == STATE_PINYIN)
- {
- if (is_t9_key(key))
- {
- str_cat_char(key_str, Fkey[1]); // 将新输入的字符添加到末尾
- ok = t9_table_search();
- if(ok==1)
- t9py_result_select_reset(); // 新输入成功,复位拼音选择
- display_pinyin(&t9py_result); // 刷新备选拼音显示
- }
- else {
- if (key == 15) //15表示上键
- {
- t9py_result_select_prev();
- }
- else if (key == 14) //14表示下键
- {
- t9py_result_select_next();
- }
- else if(key==13) //按下13退格键把三四行清
- {
- LCD_qingchu_34(); //清屏三四行
- for (i = 0; i < 8; i++)
- key_str[i] = NULL; //复位key_str
- }
- else if (key == 16)
- {
- t9py_result_hanzi_init(); //16表示确定键
- input_state = STATE_HANZI; // 切换为显示汉字模式
- display_hanzi(&t9py_result); // 刷新备选汉字显示
- }
- }
- }
- else if (input_state == STATE_HANZI)
- {
- if (key == 15)
- { //15表示上键
- t9py_result_hanzi_select_prev();
- }
- else if (key == 14) //14表示下键
- {
- t9py_result_hanzi_select_next();
- }
- else if (key == 16) //16表示确定键
- {
- pos=0;
- LCD_Wcode(0x0c);
- input_state = STATE_PINYIN;
- display_output_hanzi(&t9py_result); // 输出选中的汉字
- delay(100);
- LCD_qingchu_34(); //清屏三四行
- for (i = 0; i < 8; i++)
- key_str[i] = NULL; //复位key_str
- }
- }
- if(key==1) break; //当按下10或11或12或13时跳出汉字显示模块 再按相应键进入其他显示模块
- }
- }
- }
- }
复制代码
|
评分
-
查看全部评分
|