标题:
st7920控制的LCD12864打点法显示汉字
[打印本页]
作者:
雪山凤凰
时间:
2020-6-2 18:24
标题:
st7920控制的LCD12864打点法显示汉字
请教各位大神,最近在玩st7920控制的LCD12864这个屏,有一些疑问,希望大神们带带小白:
用打点法显示自己想要的汉字,具体是怎么实现的啊?比如说,我现在可以任意位置打一个点了,然后我怎么实现我想要的汉字呢?
作者:
xxpp2011
时间:
2020-6-2 21:04
用数组存该汉字的字模,然后将数组元素逐位放进显示点的函数里。
作者:
man1234567
时间:
2020-6-2 21:59
读取点阵汉字的点信息用打点法显示出来
作者:
dong咚咚
时间:
2020-6-2 23:58
有生成子模的软件
作者:
雪山凤凰
时间:
2020-6-3 08:54
网上多是单纯的打点函数,发布者默认,看懂打点函数就会其他,例如汉字,图片,直线,圆,因为点是一切的基本单位,但问题是,总得有个显示的函数通过调用这个打点函数,把要显示的东西联系起来吧,例如,现在想在任意位置显示一个12*12的自定义汉字,用取模软件横向取出字模数组,接下来用什么显示函数(for循环什么的),调用打点函数,把这个字模打点出来,我问的是这个连接函数
作者:
雪山凤凰
时间:
2020-6-3 09:44
xxpp2011 发表于 2020-6-2 21:04
用数组存该汉字的字模,然后将数组元素逐位放进显示点的函数里。
感谢回答:比如我要画这个字,字模出来了
/*-- 文字: 我 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x04,0x40,0x0E,0x50,0x78,0x48,0x08,0x48,0x08,0x40,0xFF,0xFE,0x08,0x40,0x08,0x44,
0x0A,0x44,0x0C,0x48,0x18,0x30,0x68,0x22,0x08,0x52,0x08,0x8A,0x2B,0x06,0x10,0x02,
怎么将这些数组元素和这个uchar DrawDots(uchar x,uchar y,ucharcolor)//打点函数,联系起来呢
作者:
robinsonlin
时间:
2020-6-3 17:02
字模的取模方试,行列还是列行?取模走向,高位在前,还是低位在前? 阴码还是阳码? uchar DrawDots(uchar x,uchar y, ucharcolor)的源代码呢?
作者:
雪山凤凰
时间:
2020-6-4 15:19
大概的通过查资料,也明白一些,LCD12864就是8192个像素点,1就是点亮,0就是熄灭。比如想显示一个12*12的汉字,先取模,得到字模,然后应该有个函数把这些字模数组和打点函数联系起来,网上多是单纯的打点函数,比较经典的是这个了:
bit lcd_busy() // 读写判断数据的D7读写位,用于判断1602是否忙
{
bitresult;
D7 =1; //数据口D7置1,为读状态做准备
LCD_RS = 0; // 选择指令寄存
LCD_RW = 1; // 选择读控制线
LCD_EN = 1; // 开使能控制线
delayNOP(); // 时序延时
result = D7; // 读D7的电平
LCD_EN = 0; // 关使能
return(result); // 返回值1:忙,0可以执行操作
}
unsigned charreadData(void) //读取数据函数
{
uchar i;
D0 = 1; D1 = 1; D2 = 1; D3 = 1;
D4 = 1; D5 = 1; D6 = 1; D7 = 1;
lcd_busy();
LCD_RS=1; LCD_RW=1;
LCD_EN=0; LCD_EN=1;
B_0=D0;B_1=D1; B_2=D2; B_3=D3;//B_1=B^1,在程序前段有位定义
B_4=D4;B_5=D5; B_6=D6;B_7=D7;
for(i=1;i<=7;i++)
delayNOP();//这个函数是{_nop_();_nop_();_nop_();_nop_();};
LCD_EN=0;
returnB;
}
uchar DrawDots(uchar x,uchar y,ucharcolor)//打点函数
{
ucharrow,xlabel,xlabel_bit;
uchar Read_H=0,Read_L=0;
lcd_wcmd(0x34); //扩充指令
lcd_wcmd(0x36); //绘图指令
xlabel=x>>4; //去16*16首地址
xlabel_bit=x & 0x0F;
if(y<32) row=y;
else
{
row=y-32;
xlabel+=8;
}
lcd_wcmd(row+0x80);
lcd_wcmd(xlabel+0x80);
readData();
Read_H=readData();
Read_L=readData();
lcd_wcmd(row+0x80);
lcd_wcmd(xlabel+0x80);
if(xlabel_bit<8)
{
switch(color)
{
case 0:Read_H&=(~(0x01<<(7-xlabel_bit))); break; //变暗,看不见
case 1:Read_H |=(0x01<<(7-xlabel_bit));break; //变亮 ,看得见
case 2:Read_H ^=(0x01<<(7-xlabel_bit));break; //反转
default:break;
}
lcd_wdat(Read_H);
lcd_wdat(Read_L);
}
else
{
switch(color)
{
case 0:Read_L&=(~(0x01<<(15-xlabel_bit))); break; //变暗 ,看不见
case 1:Read_L |=(0x01<<(15-xlabel_bit));break; //变亮 ,看得见
case 2:Read_L ^=(0x01<<(15-xlabel_bit));break; //反转
default:break;
}
lcd_wdat(Read_H);
lcd_wdat(Read_L);
}
lcd_wcmd(0x30);//恢复正常模式
}
如果你的单片机和12864接口不是乱的,那可以这样写读取函数
unsigned charreadData(void)
{
uchar i ,data;
P0=0xFF;
lcd_busy();
LCD_RS=1; LCD_RW=1;//
LCD_EN=0; LCD_EN=1;
data=P0;
for(i=1;i<=7;i++)
delayNOP();
LCD_EN=0;
returndata;
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1