RSsam007 发表于 2020-6-2 18:37:34

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

请教各位大神,最近在玩st7920控制的LCD12864这个屏,有一些疑问,希望大神们带带小白:
用打点法显示自己想要的汉字,具体是怎么实现的啊?比如说,我现在可以任意位置打一个点了,然后我怎么实现我想要的汉字呢?

hameyou 发表于 2020-6-2 18:48:58

汉子取模后,按照取模顺序打点就好了,记得当初 用12*12的汉字,128*64 可以显示5行{:lol:}

RSsam007 发表于 2020-6-2 18:57:56

感谢回复,能详细说下嘛?真的没有头绪,基础差,取模后是一长串数字,然后怎么用打点去处理这个数组字模呢?

flash3g 发表于 2020-6-2 20:24:37

LCD和点阵一样的

RSsam007 发表于 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;

}













elchb 发表于 2020-6-3 09:10:49

串口控制器不能用这种方式实现12*12的字符,因为12不能被8整除
页: [1]
查看完整版本: st7920控制的LCD12864打点法显示汉字