/*******************************************************
简要描述:
利用汉显液晶模块HZ132-64做的一个编辑小程序
做好键盘,烧芯片就可以运行。
实现的功能有:
一、键盘测试:
二、编辑短信:
1.4*4小键盘智能拼音汉字输入(国标一、二级汉字)
2.英文大小写输入
3.标点符号输入(半角全角)
4.数字输入
三、取字演示:
四、删除信息:
五、查看短信:
******************************************************/
//#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;
JonSco
- 粉丝: 88
- 资源: 1万+