- 打卡等级:以坛为家II
- 打卡总天数:498
- 最近打卡:2025-05-06 07:30:52
荣誉版主
- 积分
- 3496
|
发表于 2024-4-12 22:50:50
|
显示全部楼层
试解释一下...
//西文ASCII字符的点阵模数组.下标从0开始...8X16点阵每字符占16字节点阵模数据...
const unsigned char code F8X16[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0 这里的"0"姑且称为行计数,便于函数中变量c的解释.. 每行16字节点模数据.显示一个字符...
0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//!1
0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//"2
......
} //更多的代码没有贴上,大家知道意思。(原注释)
// 西文8x16点阵字符串显示函数
// 形式参数: x,y,字符串左上角显示坐标, ch[] 需要显示字符串数组...
// OLED是128*64像素 映射到内存为 128*8字节显示缓存, 则 x=0..127(横向128点), y=0..7(纵向8行,每行纵向8点像素,用一字节表达)
void OLED_P8x16Str(unsigned char x,unsigned char y,unsigned char ch[])
{
unsigned char c=0; //字符所在点模数组的行下标
unsigned char i=0; //8像素点计数器
unsigned char j=0; //字符串数组下标计数器,初始化为0,如实例"123ABC", 即 j=0..5
while (ch[j]!='\0') //C语言中字符串结尾标志为0, 如果ch[j]不等于0,则循环... 每一循环j+1
{
c =ch[j]-32; //计算待显示字符的点阵模数组的行计数下标...
//取字符串中的一个字符..将其ASCII码减32,即为点阵模行下标,
//例如'1'的ASCII为0x31(就是49),减0x20(就是减32),即得'1'所在数组的行下标0x11(就是17)
if( x>122){ x=0; y++; } //如果x点坐标大于122, 即无法再显示一个宽度为8点的字符了,需要换行...
OLED_Set_Pos(x,y); //显示定位点坐标(每一字符上半部的左上角位置)
for(i=0;i<8;i++) //循环显示8字节(即一个字符的上半部分)
OLED_WrDat(F8X16[c*16+i]); //写点阵模数据...一字节显示纵向8个像素点...
//实例"123ABC", 以首字符'1'来解释点模取法: F8X16[c*16+i],
//由以上解释可知'1'所在为第16行,即'1'的点模数据,从F8X16[]数组偏移17*16字节起始取数16字节点模数据...上半部分取前8字节...
OLED_Set_Pos(x,y+1); //显示定位点坐标(已下移一行(8点))(即每字符下半部的左上角位置)
for(i=0;i<8;i++) //循环显示8字节(即一个字符的下半部分)
OLED_WrDat(F8X16[c*16+i+8]); //写点阵模数据...一字节显示纵向8个像素点... //下半部分取后8字节...[c*16+i+8]表示再偏移8字节
x+=8; //经过两次8字节的循环, 一个字符16字节显示完毕, x坐标要右移8点了...
j++; //字符串中一个字符显示完毕,右移下一字符(如果下一字符为0,即字符串显示结束)
}
}
//主程序
void main()
{
OLED_P8x16Str(1,1,"123ABC")
while(1)
}
以上解释只是针对所给出的函数的本人理解的解释, 仅供参考... 当然, 显示字符串函数, 这不是唯一的算法...
|
|