- 打卡等级:以坛为家II
- 打卡总天数:501
- 最近打卡:2025-05-09 08:51:43
荣誉版主
- 积分
- 3541
|
发表于 2024-5-7 21:14:20
|
显示全部楼层
楼上坛友提了三个问题.
1,关于中西文混合输入(显示);
2,关于LCD显示屏的横竖屏切换;
3,关于PC机向单片机发送文本文件专用软件.
试试逐一回答... 水平有限, 仅供参考的...
1, 关于中西文混合输入(显示);
从字面看, "混合输入", 使我想起了我曾经做过的单片机实际产品项目, 仅用六个键实现了"中西文全拼联想输入法". 难道需要介绍中西文输入法吗?
但是从问题的举例来看, 好像是在说, 在屏幕显示时, 中西文是分开显示的, 要想做到一次性显示. 这就是关于"中西文混合显示"的话题了. 应该是这个意思吧?
这又使我回忆起十七年之前, 我曾经撰写投稿在2006年第11期《无线电》月刊杂志上刊出的《一种直观简单的单片机中西文混合显示方法》一文,
多年来我一直沿用着这种自己编写的方法来处理单片机显示中西文的.
其特点是, 简单, 直观, 源程序可读性强.
这在当年, 或许算是一种创新了, 但现在看来, 当然是很幼稚的. 让人见笑了...
本论坛中的多位高手的例程中, 方法稍有不同, 但是都已体现中西文混合显示的技巧了...
其实思路原理并不复杂:
首先是建立西文ASCII字符点阵模库,和中文点阵模小字库(或者全字库, 本贴例程就是用全字库,字库是放在外部存储器中的).
其次就是处理要显示的字符串了, 在C语言中, 就是利用字符串和字节数组是相通的特点来处理,
比如举例显示16点阵的字符串"X坐标:",
这"X坐标:" 就是字符串, 如果变量名是Str,那么这变量名为Str的字符串长度是6字节 (一个西文字符占一字节, 一个汉字占两字节).
因为:
'X' 的ASCII码 0x58
"坐"的机内码 0xD7 和 0xF8
"标"的机内码 0xB1 和 0xFA
':'的ASCII码 0x3A
所以, 其实就是数组Str[]的各字节是:
Str[0] = 0x58; //'X'的ASCII码
Str[1] = 0xD7; //"坐"字机内码的高位字节
Str[2] = 0xF8; //"坐"字机内码的低位字节
Str[3] = 0xB1; //"标"字机内码的高位字节
Str[4] = 0xFA; //"标"字机内码的低位字节
Str[5] = 0x3A; // ':'的ASCII码
Str[6] = 0; //C语言中字符串的结束标志...
需要显示时, 走一个循环,下标0..5,依次读取各字节
凡是遇到ASCII码小于0x7F的, 都是西文字符, 大于0xA0 (十进制为160)的汉字机内码了(GB2312编码),
如果是西文字符, 每次取一字节, 指针加一, 计算其点阵模库的偏移位置, 用显示西文的方法, 取模显示之, 一个字符点阵模16字节;
如果是中文字的, 每次取两字节, 指针加二, 将机内码转换乘区位码,计算其点阵模偏移位置, 用显示中文的方法, 取模显示之, 一个汉字点阵模32字节;
假如显示函数原型为:
/*=========================================================================
** 在彩色LCD液晶显示屏显示16点阵中西文混合字符串函数(小字库字模取自ROM)
** 参数: X列Y行坐标, * str串指针, Fcolor字前景色,Bcolor字背景色,约定:背景色号80为透明
==========================================================================*/
void H16(unsigned short X,unsigned short Y, char *str,unsigned char Fcolor,unsigned char Bcolor);
源程序写法就很简单直观了:
比如在左上角显示"X坐标:",黑底白字.
那么, 程序就这样写:
H16(0,0,"X坐标:",15,0); //15白色 0 黑色 (沿用DOS年代, 中文UCDOS的定义)
一看就懂.
具体实例, 本人在"新手学用STC32G12K128, 实践与思考(都是干货,盖楼砖瓦,实用基础)" 一贴中相关彩色显示屏的例程中,
其实已经给出, 欢迎下载研究和指正, 或改编成为自己的东西.
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4800&extra=&page=3
|
|