📄 main.c
字号:
return 0;//超时返回
}
}while(1);
}
/*********************************************************
程序功能: 显示拼音串(第i个拼音反显,0<=i<=5) *
输入参数: 第i个拼音反显,拼音个数j,拼音串地址pinyin_buf *
占用资源: 整型变量k,t *
返回参数: 无 *
*********************************************************/
void pinyin_display(uchar i,uchar j,uchar pinyin[6][7])
{
uchar n,k,t=0;
n=0;
//--------------------------------------------------
//出错停止
if(j>6||j==0)
{
lcd_string(0,"get pin error2!");
getchar();
}
if(i>5)
{
lcd_string(0,"get pin error3!");
getchar();
}
//--------------------------------------------------
if(i>2)
if(i<6)
if(j>3)
if(j<7)
t=3;
lcd_cursor(0,3);
for(k=0;k<3;k++)
{
if((k+t)==i)
{
while(pinyin[k+t][n]!='\0')n++;
lcd_bytes(1,pinyin[i],n);//反显拼音
lcd_clear_bytes(6-n);
}
else
{
lcd_bytes(0,pinyin[k+t],6);
if(k==2)lcd_clear_bytes(2);
}
}
//--------------------------------------------------
lcd_cursor(16,3);
if(j>3)
if(j<7)
{
if(i<3)
lcd_string(0,">>");//下页有拼音提示
if(i>2)
lcd_string(0,"<<");//上页有拼音提示
}
}
/*********************************************************
程序功能: 汉字内码显示(j:第j个汉字反显,j=0不反显) *
输入参数: j,hanzi_buf; *
占用资源: 整型变量k,指针变量hanzi_p; *
返回参数: 无 *
*********************************************************/
void hanzi_display(uchar j,uchar hanzi_buf[21])
{
uchar k;
uchar * hanzi_p=hanzi_buf;
//-------------------------
//出错处理
if(j>10)
{
lcd_string(0,"j>return_hz_total");
getchar();
}
//--------------------------
lcd_cursor(0, 4);
for(k=1;k<=10;k++)
{
if(*hanzi_p=='\0')//取到汉字的个数少于给定的数目,原来显示位置的汉字要清除掉
{
lcd_clear_bytes(2);
hanzi_p+=2;
}
else if(k==j)hanzi_p=lcd_hanzi(1,hanzi_p);//反黑显示的汉字
else if(k!=j)hanzi_p=lcd_hanzi(0,hanzi_p);
}
//--------------------------
}
/*********************************************************
程序功能: 将数字键输入分别化为大小写字母,放入汉字缓存 *
输入参数: 数字键输入2~9 *
返回参数: 英文大小写 字母 *
如数字键输入2对应返回a b c A B C *
*********************************************************/
void english_letters(uchar c,uchar hanzi_buf[21])
{
uchar i,m,n,k,t=0;
k=0;
if(c>0x39||c<0x32)return;
if(c=='7'||c=='9')k=1;
if(c==0x38||c==0x39)t=1;
m = 0x61+3*(c-0x32)+t;//小写字母
n = 0x41+3*(c-0x32)+t;//大写字母
for(i=0;i<(6+k);m++)
{
hanzi_buf[i++]=m;
hanzi_buf[i++]=' ';
}
for(;i<(11+(k*4));n++)
{
hanzi_buf[i++]=n;hanzi_buf[i++]=' ';
}
for(;i<20;i++)
hanzi_buf[i]=' ';
}
/*********************************************************
程序功能:取半角或全角标点符号 *
人口参数:参见下面列表 *
*********************************************************/
void biaodian_process(uchar page,uchar hanzi_buf[21],uchar * bd_bj,uchar * bd_qj)
{
uchar i,j,k;
if(edit_2_state)
{ edit_4_state=1;
if(edit_5_state)//全角符号状态
{
if(page>(qj_len/20))
page=1;
k=(page-1)*20;
for(i=0;i<20;i++)
hanzi_buf[i]=bd_qj[i+k];
return;
}
//半角标点符号
if(page>(bj_len/10))//30个半角标点符号限制
page=1;
k=(page-1)*10;
for(i=0,j=0;i<20;j++)
{
hanzi_buf[i++]=bd_bj[j+k];
hanzi_buf[i++]=' ';
}
}
}
/*********************************************************
函数功能:查询当前光标在编辑内容的那一页 *
特别说明:每页18个汉字 32字节 *
*********************************************************/
uchar which_screen(uchar * save_p,uchar save_buf[50])
{
uchar screen;
screen=(save_p-save_buf)/38;
return screen;
}
/*********************************************************
函数功能:闪烁光标,定位光标在从(0,0)开始第n个字符之后 *
在编辑区提示字符的输入位置 *
*********************************************************/
/*
void show_char_position(uchar n)
{
uchar i,j;
i=n%20;
j=n/20;
lcd_cursor(i, j);
lcd_showcursor(1);
}
*/
/*********************************************************
函数功能:显示编辑区某一页的内容 *
当光标位于此页时闪烁光标 *
*********************************************************/
uchar screen_display(uchar * save_p,uchar virtual_screen,uchar save_buf[50])
{
uchar total_screen,virtual_screen2,k,t=0;
uchar * screen_p;
if(virtual_screen>2)return 0;
//**************************************
//内存有限,这里限制virtual_screen=0; *
//save_buf[50]本来该放到xdata里 *
//暂时防止显示错误 *
if(virtual_screen>0)virtual_screen=0;//*
//**************************************
//---------------------------------------------------
//液晶每行显示10个汉字,如果最后剩下1字节的空隙,
//自动将汉字往下一行显示,指针做为光标有时就差半个汉字
//搞不定算了
/*
screen_p=&save_buf[40*virtual_screen];
for(total_screen=0;total_screen<20;total_screen++)
if(*(screen_p++)<0x80)k++;//统计第一行半角字符个数
screen_p--;
if(k%2)//字符是奇数个
if(*screen_p>0x80)//如果大于0x80,那么最后一个字节是某个汉字的前一半
{
k=save_p-&save_buf[virtual_screen*38];
if(k>19)
t=1;//第二行补偿光标的显示位置
else
t=0;
}
*/
//---------------------------------------------------
virtual_screen2=which_screen(save_p,save_buf);//当前光标在哪一屏/页
//---------------------------------------------------
screen_p=save_buf;
while(*screen_p!='\0')screen_p++;
total_screen=which_screen(screen_p,save_buf);//共多少屏字符
//---------------------------------------------------
lcd_cursor(0,0);
lcd_bytes(0,&save_buf[36*virtual_screen],38);//显示编辑区字符
//---------------------------------------------------
//简单提示
lcd_cursor(0,2);
lcd_string(0,"第 页");
lcd_cursor(2,2);
lcd_byte(0,virtual_screen+0x31);
//---------------------------------------------------
//当前页是光标所在那一页,则显示光标
if(virtual_screen==virtual_screen2)
{
//show_char_position(save_p-&save_buf[virtual_screen*38]+t);//显示光标
k=save_p-&save_buf[virtual_screen*38];
t=k%20;
k=k/20;
lcd_cursor(t, k);
lcd_showcursor(1);
}
//---------------------------------------------------
return total_screen;
}
/*********************************************************
程序功能:保存第j个被选择的汉字到save_buf[50] *
光标不在末尾时插入汉字到save_buf[50] *
*********************************************************/
uchar * edit_save_send0(uchar j,uchar * save_p,uchar hanzi_buf[21],uchar save_buf[114])
{
uchar * save_p1,* save_p2 = save_buf;
if(save_p>(save_buf+50))return save_p;//存储区已满
if(!edit_3_state)
{
save_p1=save_p;
goto save_process0;
}
if(edit_3_state)//插入字符处理
{
while(*save_p2!='\0')
save_p2++;//指向'\0'
save_p1=save_p2;//指向'\0'
save_p2++;
if(chinese_input_state)
if(hanzi_buf[2*j-2]>0x80)
if(hanzi_buf[2*j-1]>0x80)
save_p2++;//插入全角字符时需要空出2个字节位置
//-----------------------------------------------------------------
//移动字符串的情况
//123456789abcdefghijklmn\0 //原来的状况
//123456789abcde fghijklmn\0 //新状况1
//123456789abcde fghijklmn\0 //新状况2
//移动字符串,save_p所指位置留给新字符使用
while(save_p1!=save_p)
{
*save_p2=*save_p1;
save_p2--;
save_p1--;
}
*save_p2 = *save_p1;
}
save_process0:
*save_p1++=hanzi_buf[2*j-2];//这里保存英文半角字符
if(hanzi_buf[2*j-2]==0x20)goto save_end_return;
if(chinese_input_state)
*save_p1++=hanzi_buf[2*j-1];
//----------------------------------
save_end_return:
return save_p1;
}
/**************************************************************
程序功能:把字符串string向前移动1~2个字节(删除光标前的字符) *
例如: *
123456789abcdefghijklmn\0 //原来的状况0 *
12345678abcdefghijklmn\0 //新状况0 *
12345678删除abcdefghijklmn\0 //原来的状况1 *
12345678删abcdefghijklmn\0 //新状况1 *
12345678abcdefghijklmn删除\0 //原来的状况2 *
12345678abcdefghijklmn删\0 //新状况2 *
12345678abcdefghijklmn\0 //原来的状况3 *
12345678abcdefghijklm\0 //新状况3 *
**************************************************************/
uchar * move_string(uchar n,uchar *string)
{
uchar *p1,*save_p=string-n;
p1=save_p;
if(*string=='\0')goto move_string0;
while(*string!='\0')
*p1++=*string++;
move_string0:
*p1++=*string;
if(n==2)*p1='\0';
return save_p;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -