久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4583|回復: 10
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
LCD12864無字庫
論壇有很多相關的例程
本小白利用空余時間,按照自己的重新寫了一個小白都能看懂的驅動
大佬勿噴,僅供學習交流
下列是部分驅動程序靚照,請查閱
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  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操作函數
  10. {
  11.   LCD12864_RS=COM_Data;   //指令 0 數據 1
  12.         LCDData_Pro=dat;        //數據傳輸至P0扣
  13.         LCD12864_EN=1;          //置1
  14.         _nop_();
  15.         LCD12864_EN=0;          //置0   產生下降沿
  16. }

  17. void LCD12864_Init(void)   //12864初始化
  18. {
  19.         Delay_ms(300);   //等待系統上電穩定
  20. /******************************************************************************/
  21.   LCD12864_EN=1;                       
  22.   LCD12864_RS=1;                       
  23.         LCD12864_CS1=1;  //仿真 0 實物 1   
  24.         LCD12864_CS2=1;  //仿真 0 實物 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. 函數功能:清平函數
  38. 入口參數:空
  39. 說    明:清空整個屏幕數據
  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. 函數功能:地址寫入函數
  67. 入口參數:X,Y
  68. 說    明:根據地址自動切換左、右屏
  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;         //關閉右半屏
  81. #else
  82.                  LCD12864_CS1=0;   //選中左半屏
  83.                  LCD12864_CS2=1;         //關閉右半屏
  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;   //關閉左半屏
  92.                 LCD12864_CS2=1;          //選中右半屏
  93. #else
  94.     LCD12864_CS1=1;   //關閉左半屏
  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. 函數功能:6*16數值寫入函數
  104. 入口參數:X,Y,num,*dat
  105. 說    明:X_橫坐標 Y_縱坐標 num_數組的第num個數 *day_需要顯示的數組
  106. 版    本:V1.5
  107. 修改時間:2022年7月10日
  108. 新    增:可實現跨左右屏
  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);                          //每寫一個字節 更新一次Y 防止不能出現跨屏
  116.                 LCD12864_Write(LCD12864_DATA,dat[num*12+i]);  //寫上半字 共寫6個字節
  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個字節
  122.         }
  123. }
  124. /*****************************************************************************
  125. 函數功能:變量顯示函數
  126. 入口參數:X,Y,num,len
  127. 說    明:在第X行的第Y個位置顯示len個num數值
  128. 版    本:V1.2
  129. 修改時間:2022年7月10日
  130. 新    增:自動計算變量長度 最大計數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);   //將數值轉換成字符串
  140.         Len=strlen(Buf);         //計算字符串長度
  141.         
  142.   if(Len>4)Dis[Len-5]=num/10000     ;    //若數據更大 按照規律寫即可
  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. 函數功能:12*16漢字寫入函數
  152. 入口參數:X,Y,num,*dat
  153. 說    明:X_橫坐標 Y_縱坐標 num_數組的第num個數 *day_需要顯示的數組
  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);                         //跨屏重要函數  勿刪除
  164.                 LCD12864_Write(LCD12864_DATA,dat[num*24+i]); //寫上半字 共寫12個字節
  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個字節
  170.         }
  171. }
  172. /*****************************************************************************
  173. 函數功能:英文字母顯示函數
  174. 入口參數:X,Y,*dat
  175. 說    明:X_橫坐標 Y_縱坐標 *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);        //獲取數據長度
  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);               //寫數據
  191. ……………………

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

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

評分

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

查看全部評分

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

使用道具 舉報

來自 2#
ID:293363 發表于 2023-3-20 11:51 | 只看該作者
/*****************************************************************************
函數功能:獲取數值長度
入口參數:num
說    明:獲取數值數據的長度
版    本: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;            //使用除法進行運算,直到num小于1
        return len;           //返回長度的值
}
/*****************************************************************************
函數功能:變量顯示函數
入口參數:X,Y,num,len
說    明:在第X行的第Y個位置顯示len個num數值
版    本:V1.2
修改時間:2022年7月10日
新    增:自動計算變量長度 最大計數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     ;    //若數據更大 按照規律寫即可
  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);
}
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

發現一個Bug
/*************************************
函數功能:變量顯示函數
入口參數:X,Y,num
*************************************/
這個函數最大只能顯示32767
我暫時沒找到是什么問題  望各路大佬指導一下

先謝謝各位大佬了
回復

使用道具 舉報

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

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

使用道具 舉報

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

你下載附件
回復

使用道具 舉報

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

使用道具 舉報

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

我求求你下載附件后再來評論吧
回復

使用道具 舉報

10#
ID:641483 發表于 2023-5-13 11:04 | 只看該作者
謝謝樓主 我先收藏 慢慢來學習
回復

使用道具 舉報

11#
ID:1118046 發表于 2024-4-24 09:39 | 只看該作者
謝謝樓主 我先收藏 慢慢來學習
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 草久久久| 国产99视频精品免费视频7 | 日韩精品一区二区三区视频播放 | 国产日韩一区二区 | 欧美日韩不卡 | 鸡毛片| 日本手机看片 | 一区二区三区视频 | 国产1区2区3区 | 精品国产视频 | 精品欧美一区二区在线观看视频 | 日韩在线视频一区二区三区 | 日韩亚洲欧美一区 | 天堂在线91 | 毛片黄 | 国产高清视频一区二区 | 日韩精品在线看 | 不卡的av在线 | 国产午夜高清 | 国产丝袜一区二区三区免费视频 | 青青草一区二区三区 | 亚洲成人福利在线观看 | 午夜精品视频在线观看 | 欧美一级毛片久久99精品蜜桃 | 一区二区三区四区免费在线观看 | 亚洲国产精品人人爽夜夜爽 | 福利视频二区 | 国产精品久久久久久久久久久久久 | 久久亚洲一区二区三区四区 | 97色免费视频 | 欧美日韩精品免费观看 | 欧美成人自拍 | 国产性生活一级片 | 狠狠草视频 | 91精品国产一区二区 | a在线观看 | 97伦理最新伦理 | 一级黄色生活视频 | 亚洲一本 | 亚洲精品国产综合区久久久久久久 | 亚洲综合在线视频 |