搜索
bottom↓
回复: 5

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

[复制链接]

出0入0汤圆

发表于 2020-6-2 18:37:34 | 显示全部楼层 |阅读模式
请教各位大神,最近在玩st7920控制的LCD12864这个屏,有一些疑问,希望大神们带带小白:
用打点法显示自己想要的汉字,具体是怎么实现的啊?比如说,我现在可以任意位置打一个点了,然后我怎么实现我想要的汉字呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入420汤圆

发表于 2020-6-2 18:48:58 | 显示全部楼层
汉子取模后,按照取模顺序打点就好了,记得当初 用12*12的汉字,128*64 可以显示5行

出0入0汤圆

 楼主| 发表于 2020-6-2 18:57:56 | 显示全部楼层
感谢回复,能详细说下嘛?真的没有头绪,基础差,取模后是一长串数字,然后怎么用打点去处理这个数组字模呢?

出0入0汤圆

发表于 2020-6-2 20:24:37 | 显示全部楼层
LCD和点阵一样的

出0入0汤圆

 楼主| 发表于 2020-6-3 08:46:30 | 显示全部楼层
大概的通过查资料,也明白一些,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;

  }













出0入0汤圆

发表于 2020-6-3 09:10:49 | 显示全部楼层
串口控制器不能用这种方式实现12*12的字符,因为12不能被8整除
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 16:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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