找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3220|回复: 7
打印 上一主题 下一主题
收起左侧

st7920控制的LCD12864打点法显示汉字

[复制链接]
跳转到指定楼层
楼主
ID:196419 发表于 2020-6-2 18:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教各位大神,最近在玩st7920控制的LCD12864这个屏,有一些疑问,希望大神们带带小白:
用打点法显示自己想要的汉字,具体是怎么实现的啊?比如说,我现在可以任意位置打一个点了,然后我怎么实现我想要的汉字呢?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:452950 发表于 2020-6-2 21:04 | 只看该作者
用数组存该汉字的字模,然后将数组元素逐位放进显示点的函数里。
回复

使用道具 举报

板凳
ID:584814 发表于 2020-6-2 21:59 | 只看该作者
读取点阵汉字的点信息用打点法显示出来
回复

使用道具 举报

地板
ID:696029 发表于 2020-6-2 23:58 | 只看该作者
有生成子模的软件
回复

使用道具 举报

5#
ID:196419 发表于 2020-6-3 08:54 | 只看该作者
网上多是单纯的打点函数,发布者默认,看懂打点函数就会其他,例如汉字,图片,直线,圆,因为点是一切的基本单位,但问题是,总得有个显示的函数通过调用这个打点函数,把要显示的东西联系起来吧,例如,现在想在任意位置显示一个12*12的自定义汉字,用取模软件横向取出字模数组,接下来用什么显示函数(for循环什么的),调用打点函数,把这个字模打点出来,我问的是这个连接函数
回复

使用道具 举报

6#
ID:196419 发表于 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)//打点函数,联系起来呢


回复

使用道具 举报

7#
ID:451718 发表于 2020-6-3 17:02 | 只看该作者
字模的取模方试,行列还是列行?取模走向,高位在前,还是低位在前?  阴码还是阳码?  uchar DrawDots(uchar x,uchar y, ucharcolor)的源代码呢?
回复

使用道具 举报

8#
ID:196419 发表于 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;

  }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表