找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)+無字庫LCD12864顯示漢字 英文 變量程序Proteus仿真圖

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:293363 發(fā)表于 2022-7-11 00:42 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
LCD12864無字庫
論壇有很多相關(guān)的例程
本小白利用空余時間,按照自己的重新寫了一個小白都能看懂的驅(qū)動
大佬勿噴,僅供學(xué)習(xí)交流
下列是部分驅(qū)動程序靚照,請查閱
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include "12864.h"
  2. #include "ziku.h"

  3. void Delay_ms(unsigned int xms)  //@11.0592MHz
  4. {
  5.   unsigned int i,j;
  6.           for(i=xms;i>0;i--)   
  7.                 for(j=112;j>0;j--);  
  8. }

  9. static void LCD12864_Write(bit COM_Data,unsigned char  dat)  //12864操作函數(shù)
  10. {
  11.   LCD12864_RS=COM_Data;   //指令 0 數(shù)據(jù) 1
  12.         LCDData_Pro=dat;        //數(shù)據(jù)傳輸至P0扣
  13.         LCD12864_EN=1;          //置1
  14.         _nop_();
  15.         LCD12864_EN=0;          //置0   產(chǎn)生下降沿
  16. }

  17. void LCD12864_Init(void)   //12864初始化
  18. {
  19.         Delay_ms(300);   //等待系統(tǒng)上電穩(wěn)定
  20. /******************************************************************************/
  21.   LCD12864_EN=1;                       
  22.   LCD12864_RS=1;                       
  23.         LCD12864_CS1=1;  //仿真 0 實(shí)物 1   
  24.         LCD12864_CS2=1;  //仿真 0 實(shí)物 1   
  25.         Delay_ms(10);
  26. /******************************************************************************/
  27.         LCD12864_Write(LCD12864_COM,0x3f);   //開顯示
  28.         /*
  29.         LCD12864_Write(LCD12864_COM,0xc0);   //這段不寫也可以正常顯示
  30.         LCD12864_Write(LCD12864_COM,0xb8);
  31.         LCD12864_Write(LCD12864_COM,0x40);
  32.         */
  33.         LCD12864_Write(LCD12864_COM,0x30);   //打開基本指令
  34.         LCD_Clear();                         //清屏
  35. }
  36. /*****************************************************************************
  37. 函數(shù)功能:清平函數(shù)
  38. 入口參數(shù):空
  39. 說    明:清空整個屏幕數(shù)據(jù)
  40. 版    本:V1.0
  41. 時    間:2020年5月9日
  42. *****************************************************************************/
  43. void LCD_Clear(void)
  44. {
  45.         unsigned char  i,j;
  46. #if LCD_Mode
  47.   LCD12864_CS1=1;   //選中左半屏
  48.         LCD12864_CS2=1;   //選中右半屏
  49. #else
  50.   LCD12864_CS1=0;   //選中左半屏
  51.         LCD12864_CS2=0;   //選中右半屏
  52. #endif
  53.         LCD12864_Write(LCD12864_COM,0xc0);  //行
  54.   for(i=0;i<8;i++)
  55.         {
  56.           LCD12864_Write(LCD12864_COM,0xb8+i); //頁
  57.                 for(j=0;j<64;j++)
  58.                 {
  59.                   LCD12864_Write(LCD12864_COM,0x40+j); //列
  60.                         LCD12864_Write(LCD12864_DATA,0x00);
  61.                         Delay_ms(5);    //方便看清屏效果
  62.                 }
  63.         }
  64. }
  65. /*****************************************************************************
  66. 函數(shù)功能:地址寫入函數(shù)
  67. 入口參數(shù):X,Y
  68. 說    明:根據(jù)地址自動切換左、右屏
  69. 版    本:V1.0
  70. 時    間:2020年5月9日
  71. *****************************************************************************/
  72. void LCD12864_X_Y(unsigned char X,unsigned char Y)
  73. {
  74.   Y=Y&0x7f;   //限定范圍,列不能超過127     
  75.         X=X&0x07;          //限定范圍,行不能超過7
  76.         if(Y<64)
  77.         {
  78. #if LCD_Mode
  79.                  LCD12864_CS1=1;   //選中左半屏
  80.                  LCD12864_CS2=0;         //關(guān)閉右半屏
  81. #else
  82.                  LCD12864_CS1=0;   //選中左半屏
  83.                  LCD12864_CS2=1;         //關(guān)閉右半屏
  84. #endif
  85.                  LCD12864_Write(LCD12864_COM,0x40+Y);  //選擇列基地址+Y 一共64行
  86.                  if(Y==63) Y=64;
  87.         }
  88.         else
  89.         {
  90. #if LCD_Mode
  91.           LCD12864_CS1=0;   //關(guān)閉左半屏
  92.                 LCD12864_CS2=1;          //選中右半屏
  93. #else
  94.     LCD12864_CS1=1;   //關(guān)閉左半屏
  95.                 LCD12864_CS2=0;          //選中右半屏
  96. #endif
  97.                 Y&=0x3f;
  98.           LCD12864_Write(LCD12864_COM,0x40+Y);  //選擇列基地址+Y   一共64列
  99.         }
  100.           LCD12864_Write(LCD12864_COM,0xb8+X);  //選擇頁基地址+X   一共7頁  
  101. }
  102. /*****************************************************************************
  103. 函數(shù)功能:6*16數(shù)值寫入函數(shù)
  104. 入口參數(shù):X,Y,num,*dat
  105. 說    明:X_橫坐標(biāo) Y_縱坐標(biāo) num_數(shù)組的第num個數(shù) *day_需要顯示的數(shù)組
  106. 版    本:V1.5
  107. 修改時間:2022年7月10日
  108. 新    增:可實(shí)現(xiàn)跨左右屏
  109. *****************************************************************************/
  110. void LCD12864_Write_Number(unsigned char X,unsigned char Y,unsigned char num,unsigned char *dat)
  111. {
  112.         unsigned char  i;
  113.   for(i=0;i<6;i++)               
  114.         {
  115.           LCD12864_X_Y(X,Y+i);                          //每寫一個字節(jié) 更新一次Y 防止不能出現(xiàn)跨屏
  116.                 LCD12864_Write(LCD12864_DATA,dat[num*12+i]);  //寫上半字 共寫6個字節(jié)
  117.         }
  118.   for(i=0;i<6;i++)
  119.         {
  120.           LCD12864_X_Y(X+1,Y+i);                         //同上
  121.                 LCD12864_Write(LCD12864_DATA,dat[num*12+6+i]); //寫下半字 共寫6個字節(jié)
  122.         }
  123. }
  124. /*****************************************************************************
  125. 函數(shù)功能:變量顯示函數(shù)
  126. 入口參數(shù):X,Y,num,len
  127. 說    明:在第X行的第Y個位置顯示len個num數(shù)值
  128. 版    本:V1.2
  129. 修改時間:2022年7月10日
  130. 新    增:自動計算變量長度 最大計數(shù)99999
  131. *****************************************************************************/
  132. void LCD12864_Num(unsigned char X,unsigned char Y,unsigned int num)
  133. {
  134.         unsigned char i;
  135.   unsigned char Len;        
  136.   unsigned char Dis[5];
  137.         unsigned char Buf[5];
  138.         
  139.         sprintf(Buf,"%d",num);   //將數(shù)值轉(zhuǎn)換成字符串
  140.         Len=strlen(Buf);         //計算字符串長度
  141.         
  142.   if(Len>4)Dis[Len-5]=num/10000     ;    //若數(shù)據(jù)更大 按照規(guī)律寫即可
  143.   if(Len>3)Dis[Len-4]=num%10000/1000;
  144.   if(Len>2)Dis[Len-3]=num%1000/100  ;
  145.   if(Len>1)Dis[Len-2]=num%100/10    ;
  146.   if(Len>0)Dis[Len-1]=num%10        ;
  147.         
  148.   for(i=0;i<Len;i++) LCD12864_Write_Number(X,Y+(i*6),Dis[i],Num);
  149. }

  150. /*****************************************************************************
  151. 函數(shù)功能:12*16漢字寫入函數(shù)
  152. 入口參數(shù):X,Y,num,*dat
  153. 說    明:X_橫坐標(biāo) Y_縱坐標(biāo) num_數(shù)組的第num個數(shù) *day_需要顯示的數(shù)組
  154. 版    本:V1.5
  155. 修改時間:2022年7月10日
  156. 新    增:左右跨屏
  157. *****************************************************************************/
  158. void LCD12864_Write_Chinese(unsigned char X,unsigned char Y,unsigned char num,unsigned char *dat)
  159. {
  160.         unsigned char  i;
  161.   for(i=0;i<12;i++)
  162.         {
  163.                 LCD12864_X_Y(X,Y+i);                         //跨屏重要函數(shù)  勿刪除
  164.                 LCD12864_Write(LCD12864_DATA,dat[num*24+i]); //寫上半字 共寫12個字節(jié)
  165.         }
  166.   for(i=0;i<12;i++)
  167.         {
  168.           LCD12864_X_Y(X+1,Y+i);                          //同上
  169.                 LCD12864_Write(LCD12864_DATA,dat[num*24+12+i]); //寫下半字 共寫12個字節(jié)
  170.         }
  171. }
  172. /*****************************************************************************
  173. 函數(shù)功能:英文字母顯示函數(shù)
  174. 入口參數(shù):X,Y,*dat
  175. 說    明:X_橫坐標(biāo) Y_縱坐標(biāo) *dat_需要顯示的英文字母
  176. 版    本:V1.0
  177. 修改時間:2022年7月10日
  178. 注    明:帶字庫索引功能
  179. *****************************************************************************/
  180. void LCD12864_Write_English(unsigned char X,unsigned char Y,unsigned char *dat)
  181. {
  182.         unsigned char i,j;
  183.         unsigned char Len;
  184.         
  185.         Len=strlen(dat);        //獲取數(shù)據(jù)長度
  186.                
  187.   for(j=0;j<Len;j++)      
  188.         {
  189.           for(i=0; ;i++)  if(English_Buf[i]==*dat) {dat++; break;}  //查找字庫索引列表
  190.           LCD12864_Write_Number(X,Y+(j*6),i,English);               //寫數(shù)據(jù)
  191. ……………………

  192. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

Keil代碼與Proteus8.8仿真下載:
12864驅(qū)動.7z (51.32 KB, 下載次數(shù): 233)

評分

參與人數(shù) 2黑幣 +60 收起 理由
snygah + 10 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

來自 2#
ID:293363 發(fā)表于 2023-3-20 11:51 | 只看該作者
/*****************************************************************************
函數(shù)功能:獲取數(shù)值長度
入口參數(shù):num
說    明:獲取數(shù)值數(shù)據(jù)的長度
版    本:V1.0
修改時間:2023年3月20日
新    增:無
*****************************************************************************/
unsigned char Get_Num_Len(unsigned long num)
{
        unsigned int len = 0; //初始長度為0
        for(; num > 0; ++len) //判斷num是否大于0,否則長度+1
        num /= 10;            //使用除法進(jìn)行運(yùn)算,直到num小于1
        return len;           //返回長度的值
}
/*****************************************************************************
函數(shù)功能:變量顯示函數(shù)
入口參數(shù):X,Y,num,len
說    明:在第X行的第Y個位置顯示len個num數(shù)值
版    本:V1.2
修改時間:2022年7月10日
新    增:自動計算變量長度 最大計數(shù)99999
*****************************************************************************/
void LCD12864_Num(unsigned char X,unsigned char Y,unsigned long num)
{
        unsigned char i;
  unsigned char Len;       
  unsigned char Dis[5];
       
        Len=Get_Num_Len(num);
       
  if(Len>4)Dis[Len-5]=num/10000     ;    //若數(shù)據(jù)更大 按照規(guī)律寫即可
  if(Len>3)Dis[Len-4]=num%10000/1000;
  if(Len>2)Dis[Len-3]=num%1000/100  ;
  if(Len>1)Dis[Len-2]=num%100/10    ;
  if(Len>0)Dis[Len-1]=num%10        ;
       
  for(i=0;i<Len;i++) LCD12864_Write_Number(X,Y+(i*6),Dis[i],Num);
}
回復(fù)

使用道具 舉報

板凳
ID:582255 發(fā)表于 2022-7-11 12:52 | 只看該作者
為什么沒有reg。h頭文件
回復(fù)

使用道具 舉報

地板
ID:293363 發(fā)表于 2022-7-11 13:35 | 只看該作者
aktuan007 發(fā)表于 2022-7-11 12:52
為什么沒有reg。h頭文件

因為 部分頭文件在 12864.h 中引用
回復(fù)

使用道具 舉報

5#
ID:293363 發(fā)表于 2022-7-11 14:12 | 只看該作者
本帖最后由 陳潤源home 于 2022-7-11 14:16 編輯

發(fā)現(xiàn)一個Bug
/*************************************
函數(shù)功能:變量顯示函數(shù)
入口參數(shù):X,Y,num
*************************************/
這個函數(shù)最大只能顯示32767
我暫時沒找到是什么問題  望各路大佬指導(dǎo)一下

先謝謝各位大佬了
回復(fù)

使用道具 舉報

6#
ID:582255 發(fā)表于 2022-7-12 22:22 | 只看該作者
陳潤源home 發(fā)表于 2022-7-11 13:35
因為 部分頭文件在 12864.h 中引用

謝謝
請教一下為啥我的編譯有錯誤啊
回復(fù)

使用道具 舉報

7#
ID:293363 發(fā)表于 2022-7-14 18:35 | 只看該作者
aktuan007 發(fā)表于 2022-7-12 22:22
謝謝
請教一下為啥我的編譯有錯誤啊

你下載附件
回復(fù)

使用道具 舉報

8#
ID:278457 發(fā)表于 2023-3-21 03:16 | 只看該作者
模塊化編程,少了很多代碼!是故意還是忘記了?
大家都懂的.
回復(fù)

使用道具 舉報

9#
ID:293363 發(fā)表于 2023-5-12 11:54 | 只看該作者
shenqiwei 發(fā)表于 2023-3-21 03:16
模塊化編程,少了很多代碼!是故意還是忘記了?
大家都懂的.

我求求你下載附件后再來評論吧
回復(fù)

使用道具 舉報

10#
ID:641483 發(fā)表于 2023-5-13 11:04 | 只看該作者
謝謝樓主 我先收藏 慢慢來學(xué)習(xí)
回復(fù)

使用道具 舉報

11#
ID:1118046 發(fā)表于 2024-4-24 09:39 | 只看該作者
謝謝樓主 我先收藏 慢慢來學(xué)習(xí)
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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