找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1419|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

求大俠解惑,單片機+12864顯示問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:57747 發(fā)表于 2020-4-25 01:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
問題:
1、x坐標(biāo)轉(zhuǎn)換時,寫漢字與寫字母分別取x坐標(biāo)的高四位x1和低四位x2,用了不同的算法,但寫字母求x1、x2我弄不明白怎么取得高四位與低四位,我試驗了可以正常運行。
2、這兩種算法得到的x1、x2的值是不一樣的,但為什么能正常運行。

下面是程序:
  1. /*******************************************************************************
  2. * 函 數(shù) 名         : LCD12864_Write16CnCHAR
  3. * 函數(shù)功能                   : 在12864上面書寫16X16的漢字
  4. * 輸    入         : x, y, cn
  5. * 輸    出         : 無
  6. * 說    明                   : 該函數(shù)可以直接書寫字符串,但是書寫是從右到左,所以輸入的時
  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的坐標(biāo)只能從0到7,大于則直接返回--//
  16.         if(y > 7)
  17.         {
  18.                 return 0;
  19.         }

  20.         //--X的坐標(biāo)只能從0到128,大于則直接返回--//
  21.         if(x > 128)
  22.         {
  23.                 return 0;
  24.         }
  25.         y += 0xB0;           //求取Y坐標(biāo)的值
  26.         //--設(shè)置Y坐標(biāo)--//
  27.         LcdSt7565_WriteCmd(y);
  28.         while ( *cn != '\0')         //在C語言中字符串結(jié)束以‘\0’結(jié)尾
  29.         {        
  30.         
  31.                 //--設(shè)置Y坐標(biāo)--//
  32.                 LcdSt7565_WriteCmd(y);

  33.                 x1 = (x >> 4) & 0x0F;   //由于X坐標(biāo)要兩句命令,分高低4位,所以這里先取出高4位
  34.                 x2 = x & 0x0F;          //去低四位
  35.                 //--設(shè)置X坐標(biāo)--//
  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坐標(biāo),當(dāng)大于等于16時,切換坐標(biāo)
  47.                                         {
  48.                                                 //--設(shè)置Y坐標(biāo)--//
  49.                                                    LcdSt7565_WriteCmd(y + 1);
  50.                         
  51.                                                 //--設(shè)置X坐標(biāo)--//
  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查到字結(jié)束               
  59.                 } //for查字結(jié)束        
  60.                 cn += 2;
  61.         }        //while結(jié)束
  62.         return 1;
  63. }


  64. /*這一個是寫字母數(shù)字8*16*/


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

  68.         //--Y的坐標(biāo)只能從0到7,大于則直接返回--//
  69.         if(y > 7)
  70.         {
  71.                 return 0;
  72.         }

  73.         //--X的坐標(biāo)只能從0到128,大于則直接返回--//
  74.         if(x > 128)
  75.         {
  76.                 return 0;
  77.         }
  78.         y += 0xB0;           //求取Y坐標(biāo)的值
  79.         //--設(shè)置Y坐標(biāo)--//
  80.         LcdSt7565_WriteCmd(y);
  81.         while ( *cn != '\0')         //在C語言中字符串結(jié)束以‘\0’結(jié)尾
  82.         {        
  83.         
  84.                 //--設(shè)置Y坐標(biāo)--//
  85.                 LcdSt7565_WriteCmd(y);

  86.                 x1 = x/10;   //由于X坐標(biāo)要兩句命令,分高低4位,所以這里先取出高4位
  87.                 x2 = x%10;          //去低四位
  88.                 //--設(shè)置X坐標(biāo)--//
  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坐標(biāo),當(dāng)大于等于16時,切換坐標(biāo)
  99.                                         {
  100.                                                 //--設(shè)置Y坐標(biāo)--//
  101.                                                    LcdSt7565_WriteCmd(y + 1);
  102.                                                 //--設(shè)置X坐標(biāo)--//
  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查到字結(jié)束               
  110.                 } //for查字結(jié)束        
  111.                 cn += 1;
  112.         }        //while結(jié)束
  113.         return 1;

  114. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:592807 發(fā)表于 2020-4-25 19:22 | 只看該作者
LCD驅(qū)動有種指令叫雙指令,就是兩個指令是連著發(fā)才能生效。你的LCD驅(qū)動里面X坐標(biāo)定位指令是0x10 +低四位  和 0X04 +高四位


那么你的X定位指令應(yīng)該是  :
  A B C D E F G H          //代表D7-D0八個數(shù)據(jù)位
  1 0 0 0  e f g  h           //efgh代表你X坐標(biāo)的低四位

  A B C D E F G H          //代表D7-D0八個數(shù)據(jù)位
  0 0 0 0  0 1 g  h           /gh代表你X坐標(biāo)高四位


至于為什么只有g(shù)h兩位不是四位呢,因為 4 + 2 = 6.  你的LCD在X方向是64位的,
也就是X坐標(biāo)是0 - 63  ,而111111h = 63
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表