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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

lcd12864液晶驅動 畫點 畫線 寫入7*5像素數字 漢字

  [復制鏈接]
跳轉到指定樓層
樓主

下載:
12864b-資料.zip (2.75 MB, 下載次數: 76)





主程序:
  1. #include <reg52.h>
  2. #include <math.h>
  3. #include <INTRINS.H>

  4. #define  uchar unsigned char
  5. #define  uint unsigned int

  6. #define          DataPort P0
  7. #define         DELAYMS 80

  8. sbit RS_Port        =        P1^0;
  9. sbit RW_Port        =        P1^1;
  10. sbit E_Port            =   P2^5;
  11. sbit PSB_Port        =        P1^2;
  12. sbit RST_Port        =        P1^4;

  13. xchar CorpInf[]=
  14. {
  15.         "自定義的漢字數組"
  16.         "自定義的漢字數組"
  17.         "自定義的漢字數組"
  18.         "自定義的漢字數組"
  19. };

  20. //用來顯示數字0-9,每個數字7行*5列,將一豎排儲存為一個字節,最高位為0
  21. unsigned char xdata ucxFigure[10][5]=
  22. {
  23.         {0x3E,0x51,0x49,0x45,0x3E},//0
  24.         {0x00,0x42,0x7F,0x40,0x00},//1
  25.         {0x42,0x61,0x51,0x49,0x46},//2
  26.         {0x21,0x41,0x45,0x2B,0x31},//3
  27.         {0x18,0x14,0x12,0x7F,0x10},//4
  28.         {0x27,0x45,0x45,0x45,0x39},//5
  29.         {0x3C,0x4A,0x49,0x49,0x30},//6
  30.         {0x01,0x71,0x09,0x05,0x03},//7
  31.         {0x36,0x49,0x49,0x49,0x36},//8
  32.         {0x06,0x49,0x49,0x29,0x1E},//9
  33. };

  34. /*******************************************************
  35. * 函 數 名:void delay(uchar uc_dly)
  36. * 功能描述:短延時函數
  37. * 函數說明:用于彌補MPU和單片機在執行時序上的差異
  38. * 輸入參數:(1)uchar ui_dly
  39. * 返 回 值:無
  40. *******************************************************/
  41. #pragma disable  //在函數前聲明,只對一個函數有效,該函數在調用過程中將不可被中斷。
  42. void delay(uint ui_dly)
  43. {
  44.         while (ui_dly--);
  45. }

  46. /*******************************************************
  47. * 函 數 名:void delays()
  48. * 功能描述:長延時函數
  49. * 函數說明:測試時兩畫面之間的延時
  50. * 輸入參數:無
  51. * 返 回 值:無
  52. *******************************************************/
  53. #pragma disable
  54. void delays()
  55. {
  56.         uchar uc_dly,uc_dly1,uc_dly2;

  57.         uc_dly =DELAYMS;
  58.        
  59.         while (uc_dly --)
  60.         {
  61.                 for (uc_dly1=0;uc_dly1<50;uc_dly1++)
  62.                         for (uc_dly2=0;uc_dly2<50;uc_dly2++);
  63.         };
  64. }
  65. /*******************************************************
  66. * 函 數 名:void rdbf(void)
  67. * 功能描述:讀忙狀態
  68. * 函數說明:讀忙狀態
  69. * 輸入參數:無
  70. * 返 回 值:無
  71. *******************************************************/
  72. void rdbf(void)        
  73. {
  74.         unsigned int nTimeOut = 0 ;
  75.     RS_Port=0;
  76.     RW_Port=1;
  77.     E_Port=0;
  78.     E_Port=1;
  79.     while( ( DataPort & 0x80 ) && ( ++nTimeOut != 0 ) ) ;
  80.     E_Port=0;
  81.     RS_Port=0;
  82.     RW_Port=1;
  83. }

  84. /*******************************************************
  85. * 函 數 名:void wr_cmd(uchar cmd)
  86. * 功能描述:寫指令
  87. * 函數說明:往12864b寫指令
  88. * 輸入參數:uchar cmd
  89. * 返 回 值:無
  90. *******************************************************/
  91. #pragma disable
  92. void wr_cmd(uchar cmd)
  93. {
  94.         rdbf();
  95.         RS_Port=0;
  96.         RW_Port=0;
  97.         E_Port=1;
  98.         DataPort=cmd;
  99.         E_Port=0;
  100. }

  101. /*******************************************************
  102. * 函 數 名:void wr_dat(uchar dat)
  103. * 功能描述:寫數據
  104. * 函數說明:往12864b寫數據
  105. * 輸入參數:uchar dat
  106. * 返 回 值:無
  107. *******************************************************/
  108. #pragma disable
  109. void wr_dat(uchar dat)
  110. {       
  111.         rdbf();
  112.         RS_Port=1;
  113.         RW_Port=0;
  114.         E_Port=1;
  115.         DataPort=dat;
  116.         E_Port=0;
  117. }

  118. /*******************************************************
  119. * 函 數 名:unsigned char rd_dat( void )
  120. * 功能描述:讀數據
  121. * 函數說明:從12864b讀數據
  122. * 輸入參數:無
  123. * 返 回 值:unsigned char byReturnValue
  124. *******************************************************/
  125. #pragma disable
  126. unsigned char rd_dat( void )  
  127. {
  128.     unsigned char byReturnValue ;
  129.     DataPort = 0xff ;
  130.         rdbf();
  131.         RS_Port=1;
  132.         RW_Port=1;
  133.         E_Port=0;
  134.         E_Port=1;
  135.     byReturnValue = DataPort ;
  136.         E_Port=0;
  137.     return byReturnValue ;   
  138. }

  139. /*******************************************************
  140. * 函 數 名:void DrawPoint( unsigned char X, unsigned char Y, unsigned char Color )
  141. * 功能描述:畫點
  142. * 函數說明:在制定位置畫一個像素的點
  143. * 輸入參數:unsigned char X, unsigned char Y, unsigned char Color
  144. *          X為列,Y為行,COLOR為不顯示、顯示或者翻轉(0、1、2)
  145. * 返 回 值:無
  146. *******************************************************/
  147. void DrawPoint( unsigned char X, unsigned char Y, unsigned char Color )
  148. {
  149.     unsigned char Row , Tier , Tier_bit    ;
  150.     unsigned char ReadOldH, ReadOldL ;
  151.         Tier = X >> 4 ;   
  152.     Tier_bit = X & 0x0f ;
  153.     if( Y < 32 )
  154.     {
  155.         Row = Y ;
  156.     }
  157.     else
  158.     {
  159.         Row = Y - 32 ;
  160.         Tier += 8 ;
  161.     }
  162.         wr_cmd(Row + 0x80);                //寫入行坐標
  163.         wr_cmd(Tier + 0x80);        //寫入列坐標
  164.         rd_dat();
  165.     ReadOldH = rd_dat() ;         //讀出原始數據
  166.     ReadOldL = rd_dat() ;
  167.         wr_cmd(Row + 0x80);
  168.         wr_cmd(Tier + 0x80);
  169.     if( Tier_bit < 8 )
  170.     {
  171.         switch( Color)
  172.         {
  173.             case 0 : ReadOldH &=( ~( 0x01 << ( 7 - Tier_bit ))) ; break ;        //不顯示
  174.             case 1 : ReadOldH |= ( 0x01 << ( 7 - Tier_bit )) ; break ;                //顯示
  175.             case 2 : ReadOldH ^= ( 0x01 << ( 7 - Tier_bit ))    ; break ;   //翻轉
  176.             default : break ;   
  177.         }
  178.                 wr_dat(ReadOldH);  //寫入新數據
  179.                 wr_dat(ReadOldL);
  180.     }
  181.     else
  182.     {
  183.         switch(Color)
  184.         {
  185.             case 0 : ReadOldL &= (~( 0x01 << ( 15 - Tier_bit ))) ; break ;
  186.             case 1 : ReadOldL |= ( 0x01 << ( 15 - Tier_bit ))    ; break ;
  187.             case 2 : ReadOldL ^= ( 0x01 << ( 15 - Tier_bit )) ; break ;
  188.             default : break ;
  189.         }
  190.                 wr_dat(ReadOldH);
  191.                 wr_dat(ReadOldL);
  192.     }
  193. }

  194. /*******************************************************
  195. * 函 數 名:void DrawFigure( unsigned char X, unsigned char Y, unsigned char Figure )
  196. * 功能描述:在制定位置畫數字,7*5個像素點
  197. * 函數說明:在制定位置畫數字
  198. * 輸入參數:unsigned char X, unsigned char Y, unsigned char Color
  199. *          X為列,Y為行,Figure為待顯示的數字
  200. * 返 回 值:無
  201. *******************************************************/
  202. void DrawFigure( unsigned char X, unsigned char Y, unsigned char Figure )
  203. {
  204.         unsigned char i=0,j=0;
  205.         for(j=0;j<5;j++)
  206.         {
  207.                 for(i=0;i<7;i++)
  208.                 {
  209.                         DrawPoint(X+i,Y-j,(ucxFigure[Figure][j]>>i)&0x01);
  210.                 }
  211.         }
  212. }
  213. /*******************************************************
  214. * 函 數 名:void DrawLineX( unsigned char X0, unsigned char X1, unsigned char Y, unsigned char Color )
  215. * 功能描述:畫一條水平線
  216. * 函數說明:在制定位置畫一條水平線
  217. * 輸入參數:unsigned char X0, unsigned char X1, unsigned char Y, unsigned char Color
  218. *          X0列的起始位置,X1列的終止位置,Y行位置,COLOR
  219. * 返 回 值:無
  220. *******************************************************/
  221. void DrawLineX( unsigned char X0, unsigned char X1, unsigned char Y, unsigned char Color )
  222. {    unsigned char Temp ;
  223.     if( X0 > X1 )
  224.     {
  225.         Temp = X1 ;
  226.         X1 = X0 ;
  227.         X0 = Temp ;
  228.     }
  229.     for( ; X0 <= X1 ; X0++ )
  230.     DrawPoint( X0, Y, Color ) ;   
  231. }

  232. /*******************************************************
  233. * 函 數 名:void DrawLineY( unsigned char X, unsigned char Y0, unsigned char Y1, unsigned char Color )
  234. * 功能描述:畫一條垂直線
  235. * 函數說明:在制定位置畫一條垂直線
  236. * 輸入參數:unsigned char X, unsigned char Y0, unsigned char Y1, unsigned char Color
  237. *          X列位置,Y0行的起始位置,Y1行的終止位置,COLOR
  238. * 返 回 值:無
  239. *******************************************************/
  240. void DrawLineY( unsigned char X, unsigned char Y0, unsigned char Y1, unsigned char Color )
  241. {
  242.     unsigned char Temp ;
  243.     if( Y0 > Y1 )
  244.     {
  245.         Temp = Y1 ;
  246.         Y1 = Y0 ;
  247.         Y0 = Temp ;
  248.     }
  249.     for(; Y0 <= Y1 ; Y0++)
  250.     DrawPoint( X, Y0, Color);
  251. }

  252. /*******************************************************
  253. * 函 數 名:void DrawLine( unsigned char StartX, unsigned char StartY, unsigned char EndX, unsigned char EndY, unsigned char Color )
  254. * 功能描述:畫一條任意的線
  255. * 函數說明:在起點,終點之間畫一條直線
  256. * 輸入參數:unsigned char StartX, unsigned char StartY, unsigned char EndX, unsigned char EndY, unsigned char Color
  257. * 返 回 值:無
  258. *******************************************************/
  259. void DrawLine( unsigned char StartX, unsigned char StartY, unsigned char EndX, unsigned char EndY, unsigned char Color )
  260. {
  261.     int t, distance;      /*根據屏幕大小改變變量類型(如改為int型)*/
  262.     int x = 0 , y = 0 , delta_x, delta_y ;
  263.     char incx, incy ;
  264.     delta_x = EndX - StartX ;
  265.     delta_y = EndY - StartY ;
  266.     if( delta_x > 0 )
  267.     {
  268.         incx = 1;
  269.     }
  270.     else if( delta_x == 0 )
  271.     {
  272.         DrawLineY( StartX, StartY, EndY, Color ) ;
  273.         return ;
  274.     }
  275.     else
  276.     {
  277.         incx = -1 ;
  278.     }
  279.     if( delta_y > 0 )
  280.     {
  281.         incy = 1 ;
  282.     }
  283.     else if(delta_y == 0 )
  284.     {
  285.         DrawLineX( StartX, EndX, StartY, Color ) ;   
  286.         return ;
  287.     }
  288.     else
  289.     {
  290.         incy = -1 ;
  291.     }
  292.     delta_x = abs( delta_x );   
  293.     delta_y = abs( delta_y );
  294.     if( delta_x > delta_y )
  295.     {
  296.         distance = delta_x ;
  297.     }
  298.     else
  299.     {
  300.         distance = delta_y ;
  301.     }
  302.     DrawPoint( StartX, StartY, Color ) ;   
  303.     /* Draw Line*/
  304.     for( t = 0 ; t <= distance+1 ; t++ )
  305.     {
  306.         DrawPoint( StartX, StartY, Color ) ;
  307.         x += delta_x ;
  308.         y += delta_y ;
  309.         if( x > distance )
  310.         {
  311.             x -= distance ;
  312.             StartX += incx ;
  313.         }
  314.         if( y > distance )
  315.         {
  316.             y -= distance ;
  317.             StartY += incy ;
  318.         }
  319.     }
  320. }

  321. /*******************************************************
  322. * 函 數 名:void DisGBStr(xchar *CorpInf)
  323. * 功能描述:文本顯示
  324. * 函數說明:寫入漢字
  325. * 輸入參數:xchar *CorpInf
  326. * 返 回 值:無
  327. *******************************************************/
  328. void DisGBStr(unsigned char code *CorpInf)
  329. {
  330.         uchar uc_GBCnt;

  331.         wr_cmd(0x30);         //DL=1:8-BIT interface
  332.         wr_cmd(0x30);         //RE=0:basic instruction
  333.         wr_cmd(0x0C);         //Display ON,Cursor OFF,Cursor position blink OFF 。整體顯示開,光標及其設置關。

  334.         wr_cmd(0x80);

  335.         for (uc_GBCnt=0;uc_GBCnt<16;uc_GBCnt++)
  336.         {
  337.                 wr_dat(CorpInf[2 * uc_GBCnt]);
  338.                 wr_dat(CorpInf[2 * uc_GBCnt + 1]);
  339.         };
  340.         wr_cmd(0x90);
  341.         for (uc_GBCnt=0;uc_GBCnt<16;uc_GBCnt++)
  342.         {
  343.                 wr_dat(CorpInf[2 * uc_GBCnt + 32]);
  344.                 wr_dat(CorpInf[2 * uc_GBCnt + 33]);
  345.         };
  346.         delays();
  347. }

  348. /*******************************************************
  349. * 函 數 名:void Cram_Off()
  350. * 功能描述:清除文本顯示
  351. * 函數說明:清除文本顯示
  352. * 輸入參數:無
  353. * 返 回 值:無
  354. *******************************************************/
  355. void Cram_Off(void)
  356. {
  357.         wr_cmd(0x30);         //DL=1:8-BIT interface
  358.         wr_cmd(0x30);         //RE=0:basic instruction
  359.         wr_cmd(0x08);        //Display OFF,Cursor OFF,Cursor position blink OFF
  360.         wr_cmd(0x01);         //CLEAR
  361.         delay(250);
  362. }

  363. /*******************************************************
  364. * 函 數 名:void Clr_GDRAM(void)
  365. * 功能描述:清除繪圖顯示
  366. * 函數說明:清除繪圖顯示
  367. * 輸入參數:無
  368. * 返 回 值:無
  369. *******************************************************/
  370. void Clr_GDRAM(void)
  371. {
  372.         uchar x,y;
  373.         for(y=0;y<64;y++)
  374.                 for(x=0;x<16;x++)
  375.                 {
  376.                         wr_cmd(0x34);
  377.                         wr_cmd(0x36);//開顯示
  378.                         wr_cmd(y+0x80);
  379.                         wr_cmd(x+0x80);
  380.                         wr_dat(0x00);
  381.                         wr_dat(0x00);
  382.                 }
  383. }

  384. /*******************************************************
  385. * 函 數 名:void Lcd_Init(void)
  386. * 功能描述:12864初始化
  387. * 函數說明:初始化
  388. * 輸入參數:無
  389. * 返 回 值:無
  390. *******************************************************/
  391. void Lcd_Init(void)
  392. {
  393.         PSB_Port =1;//并行接口
  394.         _nop_();
  395.         _nop_();

  396.         RST_Port =0;
  397.         delay(250);
  398.         delay(250);
  399.         delay(250);
  400.         delay(250);
  401.        
  402.         RST_Port =1;
  403.         delay(250);
  404.         delay(250);
  405.         delay(250);
  406.         delay(250);


  407.         wr_cmd(0x30);         //DL=1:8-BIT interface。功能設定,RE=0,基本指令集
  408.         wr_cmd(0x30);         //RE=0:basic instruction
  409.         wr_cmd(0x06);         //Entire display shift right by 1。光標右移

  410.         Cram_Off();                //清空文本顯示
  411.         Clr_GDRAM();        //清空繪圖顯示
  412.        
  413. }


復制代碼

     為大家提供一份12864的程序,是我花了很長時間根據網上程序精簡而成,比網上的版本運行速度快了很多,并增加部分功能及注釋,很穩定好用,希望能幫到大家。       包含了如下功能:   
    ①在任意位置畫一個像素點
    ②畫一條任意長度的水平/垂直線
    ③畫一條任意線
    ④寫入漢字
    ⑤在任意位置寫入7*5個像素點的數字(0-9)

    用12864時,需要了解一點,寫漢字和繪圖是兩個分開的功能!在說明文檔里一個叫文本顯示,一個叫繪圖,它倆使用的RAM也不一樣,一個是DDRAM,一個是GDRAM,使用時的相關命令及地址也都是不同的,包括清屏,也得分開清除。再有一點是,不知道是不是我的12864有些問題,個別漢字顯示錯誤,比如我寫的“過”,它顯示的就是“梗”。

評分

參與人數 1黑幣 +5 收起 理由
zhaok2013 + 5 很給力!

查看全部評分

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

使用道具 舉報

沙發
ID:96326 發表于 2017-3-6 08:04 | 只看該作者
感謝分享!
回復

使用道具 舉報

板凳
ID:168525 發表于 2017-3-6 13:15 | 只看該作者
謝謝分享
回復

使用道具 舉報

地板
ID:68356 發表于 2017-3-6 13:52 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

5#
ID:61876 發表于 2017-3-6 14:49 | 只看該作者
非常感謝!!!!
回復

使用道具 舉報

6#
ID:151348 發表于 2017-3-6 15:38 | 只看該作者
謝謝分享,有值得借鑒的地方,不過DrawLine函數似乎不太好,推薦用Bresenham法來生成直線
回復

使用道具 舉報

7#
ID:64765 發表于 2017-5-17 10:11 | 只看該作者
好資料,下載學習了,謝謝分享。
回復

使用道具 舉報

8#
ID:220385 發表于 2017-7-17 19:59 | 只看該作者
請問樓主,為什么,在高八位寫哪一點,第八位就會寫哪一點,高低是連體的嗎
回復

使用道具 舉報

9#
ID:324286 發表于 2018-5-7 16:09 | 只看該作者
很好,謝謝樓主,最近正在找這個資料呢,希望有幫助
回復

使用道具 舉報

10#
ID:320230 發表于 2018-5-8 14:29 | 只看該作者
感謝樓主
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本久久网 | 日韩欧美在线不卡 | 国产精品av久久久久久久久久 | 免费黄色大片 | 337p日本欧洲亚洲大胆鲁鲁 | 中文字幕一区二区三区精彩视频 | 五月天天色 | 91在线精品一区二区 | 日韩国产中文字幕 | 欧美国产视频 | 亚洲成人三级 | 久久av资源网 | 国产精品久久久久久久久久 | 国产成人一区二区三区 | 午夜精品久久久久久久 | 精品蜜桃一区二区三区 | 亚洲成人久久久 | 成人免费一级 | 欧美午夜在线 | 国产精品一区二区三区四区 | 久久亚洲一区 | 中文字幕专区 | 成人av一区| 国产精品一区二区福利视频 | 亚洲成色777777在线观看影院 | 亚洲一区二区三区视频 | 久久精品超碰 | 欧美一区免费 | 在线色网站 | 麻豆国产一区二区三区四区 | 成人在线播放网站 | 欧美日韩中文在线 | 国产成人网 | 成人免费观看男女羞羞视频 | 日韩国产精品一区二区三区 | 日韩小视频 | 999国产视频 | 日日夜夜草 | 国产偷录叫床高潮录音 | 国产 日韩 欧美 中文 在线播放 | 亚洲黄色视屏 |