找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求大侠解惑,单片机+12864显示问题

[复制链接]
跳转到指定楼层
楼主
ID:57747 发表于 2020-4-25 01:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题:
1、x坐标转换时,写汉字与写字母分别取x坐标的高四位x1和低四位x2,用了不同的算法,但写字母求x1x2我弄不明白怎么取得高四位与低四位,我试验了可以正常运行。
2、这两种算法得到的x1x2的值是不一样的,但为什么能正常运行。

下面是程序:
  1. /*******************************************************************************
  2. * 函 数 名         : LCD12864_Write16CnCHAR
  3. * 函数功能                   : 在12864上面书写16X16的汉字
  4. * 输    入         : x, y, cn
  5. * 输    出         : 无
  6. * 说    明                   : 该函数可以直接书写字符串,但是书写是从右到左,所以输入的时
  7. *                  * 侯注意输入。汉字的取模方式请观看文件夹下的《汉字取模软件的
  8. *                  * 使用说明》
  9. ******************************************************************************/

  10. #ifdef  CHAR_CODE

  11. #include"charcode.h"

  12. uchar Lcd12864_Write16CnCHAR(uchar x, uchar y, uchar *cn)
  13. {
  14.         uchar j, x1, x2, wordNum;

  15.         //--Y的坐标只能从0到7,大于则直接返回--//
  16.         if(y > 7)
  17.         {
  18.                 return 0;
  19.         }

  20.         //--X的坐标只能从0到128,大于则直接返回--//
  21.         if(x > 128)
  22.         {
  23.                 return 0;
  24.         }
  25.         y += 0xB0;           //求取Y坐标的值
  26.         //--设置Y坐标--//
  27.         LcdSt7565_WriteCmd(y);
  28.         while ( *cn != '\0')         //在C语言中字符串结束以‘\0’结尾
  29.         {        
  30.         
  31.                 //--设置Y坐标--//
  32.                 LcdSt7565_WriteCmd(y);

  33.                 x1 = (x >> 4) & 0x0F;   //由于X坐标要两句命令,分高低4位,所以这里先取出高4位
  34.                 x2 = x & 0x0F;          //去低四位
  35.                 //--设置X坐标--//
  36.                 LcdSt7565_WriteCmd(0x10 + x1);   //高4位
  37.                 LcdSt7565_WriteCmd(0x04 + x2);        //低4位

  38.                 for (wordNum=0; wordNum<50; wordNum++)
  39.                 {
  40.                     //--查询要写的字在字库中的位置--//
  41.                         if ((CN16CHAR[wordNum].Index[0] == *cn)
  42.                              &&(CN16CHAR[wordNum].Index[1] == *(cn+1)))
  43.                         {
  44.                                 for (j=0; j<32; j++) //写一个字
  45.                                 {               
  46.                                         if (j == 16)         //由于16X16用到两个Y坐标,当大于等于16时,切换坐标
  47.                                         {
  48.                                                 //--设置Y坐标--//
  49.                                                    LcdSt7565_WriteCmd(y + 1);
  50.                         
  51.                                                 //--设置X坐标--//
  52.                                                 LcdSt7565_WriteCmd(0x10 + x1);   //高4位
  53.                                                 LcdSt7565_WriteCmd(0x04 + x2);        //低4位
  54.                                         }
  55.                                         LcdSt7565_WriteData(CN16CHAR[wordNum].Msk[j]);
  56.                                 }
  57.                                 x += 16;
  58.                         }//if查到字结束               
  59.                 } //for查字结束        
  60.                 cn += 2;
  61.         }        //while结束
  62.         return 1;
  63. }


  64. /*这一个是写字母数字8*16*/


  65. uchar Lcd12864_Write8CnCHAR(uchar x, uchar y, uchar *cn)
  66. {
  67.         uchar j, x1, x2, wordNum;

  68.         //--Y的坐标只能从0到7,大于则直接返回--//
  69.         if(y > 7)
  70.         {
  71.                 return 0;
  72.         }

  73.         //--X的坐标只能从0到128,大于则直接返回--//
  74.         if(x > 128)
  75.         {
  76.                 return 0;
  77.         }
  78.         y += 0xB0;           //求取Y坐标的值
  79.         //--设置Y坐标--//
  80.         LcdSt7565_WriteCmd(y);
  81.         while ( *cn != '\0')         //在C语言中字符串结束以‘\0’结尾
  82.         {        
  83.         
  84.                 //--设置Y坐标--//
  85.                 LcdSt7565_WriteCmd(y);

  86.                 x1 = x/10;   //由于X坐标要两句命令,分高低4位,所以这里先取出高4位
  87.                 x2 = x%10;          //去低四位
  88.                 //--设置X坐标--//
  89.                 LcdSt7565_WriteCmd(0x10 + x1);   //高4位
  90.                 LcdSt7565_WriteCmd(0x04 + x2);        //低4位

  91.                 for (wordNum=0; wordNum<50; wordNum++)
  92.                 {
  93.                     //--查询要写的字在字库中的位置--//
  94.                         if ((CN8CHAR[wordNum].Index == *cn))
  95.                         {
  96.                                 for (j=0; j<16; j++) //写一个字
  97.                                 {               
  98.                                         if (j == 8)         //由于16X16用到两个Y坐标,当大于等于16时,切换坐标
  99.                                         {
  100.                                                 //--设置Y坐标--//
  101.                                                    LcdSt7565_WriteCmd(y + 1);
  102.                                                 //--设置X坐标--//
  103.                                                 LcdSt7565_WriteCmd(0x10 + x1);   //高4位
  104.                                                 LcdSt7565_WriteCmd(0x04 + x2);        //低4位
  105.                                         }
  106.                                         LcdSt7565_WriteData(CN8CHAR[wordNum].Msk[j]);
  107.                                 }
  108.                                 x += 8;
  109.                         }//if查到字结束               
  110.                 } //for查字结束        
  111.                 cn += 1;
  112.         }        //while结束
  113.         return 1;

  114. }
复制代码


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

使用道具 举报

沙发
ID:592807 发表于 2020-4-25 19:22 | 只看该作者
LCD驱动有种指令叫双指令,就是两个指令是连着发才能生效。你的LCD驱动里面X坐标定位指令是0x10 +低四位  和 0X04 +高四位


那么你的X定位指令应该是  :
  A B C D E F G H          //代表D7-D0八个数据位
  1 0 0 0  e f g  h           //efgh代表你X坐标的低四位

  A B C D E F G H          //代表D7-D0八个数据位
  0 0 0 0  0 1 g  h           /gh代表你X坐标高四位


至于为什么只有gh两位不是四位呢,因为 4 + 2 = 6.  你的LCD在X方向是64位的,
也就是X坐标是0 - 63  ,而111111h = 63
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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