欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 單片機(jī)+無(wú)字庫(kù)LCD12864顯示漢字 英文 變量程序Proteus仿真圖 [打印本頁(yè)]

作者: 陳潤(rùn)源home    時(shí)間: 2022-7-11 00:42
標(biāo)題: 單片機(jī)+無(wú)字庫(kù)LCD12864顯示漢字 英文 變量程序Proteus仿真圖
LCD12864無(wú)字庫(kù)
論壇有很多相關(guān)的例程
本小白利用空余時(shí)間,按照自己的重新寫了一個(gè)小白都能看懂的驅(qū)動(dòng)
大佬勿噴,僅供學(xué)習(xí)交流
下列是部分驅(qū)動(dòng)程序靚照,請(qǐng)查閱
仿真原理圖如下(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. 說(shuō)    明:清空整個(gè)屏幕數(shù)據(jù)
  40. 版    本:V1.0
  41. 時(shí)    間: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); //頁(yè)
  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. 說(shuō)    明:根據(jù)地址自動(dòng)切換左、右屏
  69. 版    本:V1.0
  70. 時(shí)    間:2020年5月9日
  71. *****************************************************************************/
  72. void LCD12864_X_Y(unsigned char X,unsigned char Y)
  73. {
  74.   Y=Y&0x7f;   //限定范圍,列不能超過(guò)127     
  75.         X=X&0x07;          //限定范圍,行不能超過(guò)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);  //選擇頁(yè)基地址+X   一共7頁(yè)  
  101. }
  102. /*****************************************************************************
  103. 函數(shù)功能:6*16數(shù)值寫入函數(shù)
  104. 入口參數(shù):X,Y,num,*dat
  105. 說(shuō)    明:X_橫坐標(biāo) Y_縱坐標(biāo) num_數(shù)組的第num個(gè)數(shù) *day_需要顯示的數(shù)組
  106. 版    本:V1.5
  107. 修改時(shí)間: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);                          //每寫一個(gè)字節(jié) 更新一次Y 防止不能出現(xiàn)跨屏
  116.                 LCD12864_Write(LCD12864_DATA,dat[num*12+i]);  //寫上半字 共寫6個(gè)字節(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個(gè)字節(jié)
  122.         }
  123. }
  124. /*****************************************************************************
  125. 函數(shù)功能:變量顯示函數(shù)
  126. 入口參數(shù):X,Y,num,len
  127. 說(shuō)    明:在第X行的第Y個(gè)位置顯示len個(gè)num數(shù)值
  128. 版    本:V1.2
  129. 修改時(shí)間:2022年7月10日
  130. 新    增:自動(dòng)計(jì)算變量長(zhǎng)度 最大計(jì)數(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);         //計(jì)算字符串長(zhǎng)度
  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. 說(shuō)    明:X_橫坐標(biāo) Y_縱坐標(biāo) num_數(shù)組的第num個(gè)數(shù) *day_需要顯示的數(shù)組
  154. 版    本:V1.5
  155. 修改時(shí)間: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個(gè)字節(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個(gè)字節(jié)
  170.         }
  171. }
  172. /*****************************************************************************
  173. 函數(shù)功能:英文字母顯示函數(shù)
  174. 入口參數(shù):X,Y,*dat
  175. 說(shuō)    明:X_橫坐標(biāo) Y_縱坐標(biāo) *dat_需要顯示的英文字母
  176. 版    本:V1.0
  177. 修改時(shí)間:2022年7月10日
  178. 注    明:帶字庫(kù)索引功能
  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ù)長(zhǎng)度
  186.                
  187.   for(j=0;j<Len;j++)      
  188.         {
  189.           for(i=0; ;i++)  if(English_Buf[i]==*dat) {dat++; break;}  //查找字庫(kù)索引列表
  190.           LCD12864_Write_Number(X,Y+(j*6),i,English);               //寫數(shù)據(jù)
  191. ……………………

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

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


作者: aktuan007    時(shí)間: 2022-7-11 12:52
為什么沒(méi)有reg。h頭文件

作者: 陳潤(rùn)源home    時(shí)間: 2022-7-11 13:35
aktuan007 發(fā)表于 2022-7-11 12:52
為什么沒(méi)有reg。h頭文件

因?yàn)?部分頭文件在 12864.h 中引用
作者: 陳潤(rùn)源home    時(shí)間: 2022-7-11 14:12
本帖最后由 陳潤(rùn)源home 于 2022-7-11 14:16 編輯

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

先謝謝各位大佬了
作者: aktuan007    時(shí)間: 2022-7-12 22:22
陳潤(rùn)源home 發(fā)表于 2022-7-11 13:35
因?yàn)?部分頭文件在 12864.h 中引用

謝謝
請(qǐng)教一下為啥我的編譯有錯(cuò)誤啊
作者: 陳潤(rùn)源home    時(shí)間: 2022-7-14 18:35
aktuan007 發(fā)表于 2022-7-12 22:22
謝謝
請(qǐng)教一下為啥我的編譯有錯(cuò)誤啊

你下載附件
作者: 陳潤(rùn)源home    時(shí)間: 2023-3-20 11:51
/*****************************************************************************
函數(shù)功能:獲取數(shù)值長(zhǎng)度
入口參數(shù):num
說(shuō)    明:獲取數(shù)值數(shù)據(jù)的長(zhǎng)度
版    本:V1.0
修改時(shí)間:2023年3月20日
新    增:無(wú)
*****************************************************************************/
unsigned char Get_Num_Len(unsigned long num)
{
        unsigned int len = 0; //初始長(zhǎng)度為0
        for(; num > 0; ++len) //判斷num是否大于0,否則長(zhǎng)度+1
        num /= 10;            //使用除法進(jìn)行運(yùn)算,直到num小于1
        return len;           //返回長(zhǎng)度的值
}
/*****************************************************************************
函數(shù)功能:變量顯示函數(shù)
入口參數(shù):X,Y,num,len
說(shuō)    明:在第X行的第Y個(gè)位置顯示len個(gè)num數(shù)值
版    本:V1.2
修改時(shí)間:2022年7月10日
新    增:自動(dòng)計(jì)算變量長(zhǎng)度 最大計(jì)數(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);
}

作者: shenqiwei    時(shí)間: 2023-3-21 03:16
模塊化編程,少了很多代碼!是故意還是忘記了?
大家都懂的.
作者: 陳潤(rùn)源home    時(shí)間: 2023-5-12 11:54
shenqiwei 發(fā)表于 2023-3-21 03:16
模塊化編程,少了很多代碼!是故意還是忘記了?
大家都懂的.

我求求你下載附件后再來(lái)評(píng)論吧
作者: Q__Q    時(shí)間: 2023-5-13 11:04
謝謝樓主 我先收藏 慢慢來(lái)學(xué)習(xí)
作者: 1ZAQ    時(shí)間: 2024-4-24 09:39
謝謝樓主 我先收藏 慢慢來(lái)學(xué)習(xí)




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1