找回密码
 立即注册

QQ登录

只需一步,快速开始

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

不带字库12864想让两个汉字上下之间没有间隙紧挨着要怎么做?

[复制链接]
跳转到指定楼层
楼主
想让两个字上下之间没有间隙,我该怎么办啊?

  1. #include <reg51.h>
  2. sbit e=0xb0;//1011 0000
  3. sbit rw=0xb1;//1011 0001
  4. sbit rs=0xb2;//1011 0010
  5. sbit cs2=0xb3;//1011 0011
  6. sbit cs1=0xb4;//1011 0100
  7. sbit busy=0xa7;//1010 0111
  8. //PCtoLCD2002完美版 阴码,逐列式,顺向
  9. //汉字当前点阵大小16*16,字宽19,字高19
  10. char code an[]=        {
  11.                                 0x0A,0x10,0x32,0x10,0x22,0x10,0x23,0x90,0x2E,0xA0,0x62,0x60,
  12.                                 0x22,0x40,0x23,0xA0,0x22,0x20,0x2A,0x10,0x32,0x10,0x00,0x00,/*"安",0*/
  13.                                 };
  14. char code ke[]=        {
  15.                                 0x28,0xC0,0x2B,0x00,0x3F,0xF0,0x4A,0x00,0x49,0x00,0x00,0x80,
  16.                                 0x24,0x80,0x12,0x80,0x00,0x80,0x7F,0xF0,0x01,0x00,0x00,0x00,/*"科",0*/
  17.                 };
  18. void pulse()//puse=使能脉冲
  19.         {
  20.         e=1;
  21.         e=0;
  22.         }
  23. void busy_check(char right)
  24.         {
  25.         P2=0xff;//数据口全部高电平
  26.         if (right==1)
  27.                 {
  28.                 P3=0x13;//0001 0011 CS1=1;CS2=0;RS=0;RW=1;RW=1;左半屏
  29.                 while(!busy);
  30.                 }
  31.         if (right==0)
  32.                 {
  33.                 P3=0x0b;//0000 1011 CS1=0;CS2=1;RS=0;RW=1;RW=1;右半屏
  34.                 while(!busy);                        
  35.                 }
  36.         }

  37. void cmd_w(char cmd,char right)
  38.         {
  39.         busy_check(right);
  40.         if (right==1)
  41.                 {
  42.                 P3=0x10;//0001 0000 CS1=1
  43.                 }
  44.         if (right==0)
  45.                 {
  46.                 P3=0x08;//0000 1000        CS2=0
  47.                 P3=0x08;//0000 1000        CS2=0
  48.                 }
  49.         P2=cmd;
  50.         pulse();//使能脉冲
  51.         }

  52. void data_w(char dat,char right)
  53.         {
  54.         busy_check(right);
  55.         if (right==1)
  56.                 {
  57.                 P3=0x14;//0001 0100 CS1=1; RS=1;
  58.                 }
  59.         if (right==0)
  60.                 {
  61.                 P3=0x0c;//0000 1100 CS2=1; RS=1;
  62.                 }
  63.         P2=dat;
  64.         pulse();
  65.         }

  66. void lcd_init()
  67.         {
  68.         unsigned int i;
  69.         cmd_w(0x3e+1,0);//显示开关 0011 1111
  70.         cmd_w(0xc0+0,0);//修改显示起始行 1100 0000
  71.         cmd_w(0xb8+0,0);//修改页地址 1011 1000
  72.         cmd_w(0x40+0,0);//修改列地址 0100 0000
  73.         cmd_w(0x3e+1,1);
  74.         cmd_w(0xc0+0,1);
  75.         cmd_w(0xb8+0,1);
  76.         cmd_w(0x40+0,1);
  77.         for(i=0;i<256;i++)
  78.                 {
  79.                 data_w(0x00,0);
  80.                 }

  81.         cmd_w(0xb8+4,0);//左边 页地址+4
  82.         cmd_w(0x40+8,0);//左边 列地址+8
  83.         for(i=0;i<256;i++)
  84.                 {
  85.                 data_w(0x00,0);
  86.                 }

  87.         for(i=0;i<256;i++)
  88.                 {
  89.                 data_w(0x00,1);
  90.                 }

  91.         cmd_w(0xb8+4,1);//右边 页地址+4
  92.         cmd_w(0x40+8,1);//右边 列地址+8
  93.         for(i=0;i<256;i++)
  94.                 {
  95.                 data_w(0x00,1);
  96.                 }
  97.         }

  98. char chang(char a)//chang(zhi[i])
  99.         {
  100.         char temp,i;
  101.         for(i=0;i<8;i++)
  102.                 {
  103.                 temp<<=1;//左移1位
  104.                 temp|=(a&0x01);//temp=temp|(a&0x01)
  105.                 a>>=1;//右移1位
  106.                 }
  107.         return(temp);
  108.         }

  109. void hanzi_w(char hang,char lie,char zhi[24])
  110.         {
  111.         unsigned char i;
  112.         if(lie<4)//汉字上半部分;左半屏
  113.                 {
  114.                 cmd_w(0xb8+1*hang,0);
  115.                 cmd_w(0x40+1*lie,0);
  116.                 for(i=0;i<24;i=i+2)
  117.                         data_w(chang(zhi[i]),0);
  118.                 }
  119.         else//汉字上半部分;右半屏
  120.                 {
  121.                 cmd_w(0xb8+1*hang,1);
  122.                 cmd_w(0x40+1*(lie-4),1);
  123.                 for(i=0;i<24;i+=2)
  124.                         data_w(chang(zhi[i]),1);
  125.                 }
  126.         if(lie<4)//汉字下半部分;左半屏
  127.                 {
  128.                 cmd_w(0xb8+1*hang+1,0);
  129.                 cmd_w(0x40+1*lie,0);
  130.                 for(i=1;i<24;i+=2)
  131.                         data_w(chang(zhi[i]),0);
  132.                 }
  133.         else//汉字下半部分;右半屏
  134.                 {
  135.                 cmd_w(0xb8+1*hang+1,1);
  136.                 cmd_w(0x40+1*(lie-4),1);
  137.                 for(i=1;i<24;i+=2)
  138.                         data_w(chang(zhi[i]),1);
  139.                 }
  140.         }

  141. void delay(unsigned char a)
  142.         {
  143.         unsigned char i,j;
  144.         for(i=0;i<a;i++)
  145.                 for(j=0;j<200;j++)
  146.                         ;
  147.         }

  148. void main()
  149.         {
  150.         //unsigned char i;
  151.         lcd_init();
  152.         hanzi_w(0,0,an);
  153.         hanzi_w(2,0,ke);

  154.         while(1)
  155.                 {
  156.                  delay(3);
  157.                 cmd_w(0xc0+1,0);
  158.                 cmd_w(0xc0,1);
  159.                 //i++;
  160.                 //if(i==64)
  161.                         //i=0;
  162.                 }
  163.         }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:379492 发表于 2018-8-21 12:48 | 只看该作者
想让安和科两个字上下紧挨着,我怎么实现不了啊?求大神赐教
回复

使用道具 举报

板凳
ID:379492 发表于 2018-8-22 10:25 | 只看该作者
850787641@qq.co 发表于 2018-8-21 12:48
想让安和科两个字上下紧挨着,我怎么实现不了啊?求大神赐教

请大师指点一下
回复

使用道具 举报

地板
ID:387733 发表于 2018-8-22 11:43 | 只看该作者
12864的液晶横向128个点,纵向64个点,显示16*16点阵汉字就是横向8个汉字,纵向4个汉字。一般16*16点阵字库实际不是用足16*16个点阵,而是在下面和右面各留一个点阵作为间隙,如果要想不留间隙,就需要更换字库成真正16*16的字库
回复

使用道具 举报

5#
ID:387733 发表于 2018-8-22 11:51 | 只看该作者
更换字库
回复

使用道具 举报

6#
ID:379492 发表于 2018-8-22 14:57 | 只看该作者
sxhwdz 发表于 2018-8-22 11:43
12864的液晶横向128个点,纵向64个点,显示16*16点阵汉字就是横向8个汉字,纵向4个汉字。一般16*16点阵字库 ...

我的子模是取的12*12,想显示5行汉字,5*12=60,每行之间间隔一个像素,刚好是64,能实现吗?
回复

使用道具 举报

7#
ID:387733 发表于 2018-8-22 16:53 | 只看该作者
这个比较麻烦,因为每字节8位,纵向64点是8个字节,那必须对字库进行移位拼接,不是一点点麻烦,不建议
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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