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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機LCD128x64顯示如何用C語言結構體封裝起來?

[復制鏈接]
跳轉到指定樓層
樓主
ID:425084 發表于 2018-12-7 09:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
顯示的程序如何用結構體封裝起來呢?


  1. //==========================================================================
  2. //程序功能: 1Lcd初始化
  3. //           2Lcd清屏
  4. //           3Lcd滿屏
  5. //           4Lcd顯示一行
  6. //           5Lcd畫一個點
  7. //           6lcd指定位置顯示一個字
  8. //           7Lcd指定位置顯示一串漢字
  9. //           8Lcd指定位置寫一串英文字符串,每行最多可寫21個字符
  10. //           9lcd指定位置顯示特定大小的圖片
  11. //           10lcd整屏顯示128x64點陣圖片,要求圖片長128、寬64個像素點
  12. //           11lcd指定位置寫一串英文字符串,每行最多可寫21個字符


  13. //void Disp_Img(unsigned char code *img)


  14. // 程序接口:void Lcd_Init(void);
  15. //           void Lcd_Clr(void);
  16. //           void Lcd_Full(void);
  17. //           void Lcd_DispOneRow(unsigned char x, unsigned char y, unsigned char *buf, unsigned char len);
  18. //           void DrawDot_12864(unsigned char y,unsigned char x,unsigned char type);
  19. //           void Lcd_WriteChinese(unsigned char x, unsigned char y, unsigned char *img)      
  20. //           void Lcd_WriteChineseString(unsigned char x, unsigned char y, unsigned char *img, unsigned char len);
  21. //           void Lcd_WriteEnglishString(unsigned char x,unsigned char y,unsigned char *s)
  22. //           void Lcd_DispImg(unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char code *img)
  23. //           void Disp_Img(unsigned char code *img)/void Lcd_DispFullImg(unsigned char *img)      
  24. //           void Lcd_WriteEnglishString(unsigned char x,unsigned char y,unsigned char *s)
  25. // 編寫時間: 2015-07-26
  26. //==========================================================================
  27. /**************************************************************************

  28.                                                                         1. void Lcd_DispFullImg(unsigned char *img);//顯示一幅全屏圖像,圖像像素點滿足128x64,單位:像素點
  29.                                                                                         2. void Lcd_DispImg(unsigned char x, unsigned char y, unsigned char lon, unsigned char wid, unsigned char *img);        //指定位置顯示特定大小的圖片
  30.                                          (2)屏蔽了未使用到的接口函數。
  31. ****************************************************************************/
  32. #include "Global.h"
  33. //#include "lcd595.h"
  34. #include "LCD12864.h"
  35. #include "english_8x16_ASCII.h"
  36. #include "intrins.h"








  37. //==========================================================================
  38. // 函數功能: Lcd的接02口信號(邏輯管腳與物理管腳的對應表)
  39. //==========================================================================
  40. sbit LCD_BL  = P0^0;
  41. sbit LCD_RST = P0^1;
  42. sbit LCD_CS2 = P0^2;
  43. sbit LCD_CS1 = P0^3;
  44. sbit LCD_E   = P0^4;
  45. sbit LCD_RW  = P0^5;
  46. sbit LCD_RS  = P0^6;


  47. #define LCD_DATA    P2


  48. //==========================================================================
  49. // 函數功能: 本地變量及常量的定義
  50. //==========================================================================
  51. #ifdef FREQ_24M
  52.         #define NOP         Delay_uS(4)
  53. #else
  54.         #define NOP         Delay_uS(1)
  55. #endif
  56.       
  57. /*100us延時*/
  58. void delay100us(void) //誤差 -0.234375us
  59. {
  60.         unsigned char i;


  61.         _nop_();
  62.         i = 43;
  63.         while (--i);
  64. }
  65. //==========================================================================
  66. // 函數功能: 1微秒延時函數
  67. //==========================================================================
  68. //void Delay_uS(unsigned char us_value)
  69. //{
  70. //    unsigned char i;
  71. //   
  72. //    while(us_value--)
  73. //    {
  74. //        for(i=0; i<16; i++);
  75. //    }
  76. //}


  77. //==========================================================================
  78. // 函數功能: 1毫秒延時函數
  79. //==========================================================================
  80. extern void Delay_mS(unsigned int ms_value)
  81. {
  82.     unsigned int k;
  83.    
  84.           #ifdef FREQ_24M
  85.     for(k=0; k<(4*ms_value); k++)
  86.                 #else
  87.     for(k=0; k<(ms_value); k++)      
  88.                 #endif
  89.     {
  90.                                 Delay_uS(200);
  91.     }
  92. }


  93. //==========================================================================
  94. // 函數功能: 檢測是否空閑
  95. //==========================================================================
  96. void BusycChk_12864(void)
  97. {
  98.     unsigned int timeout = 0;
  99.    
  100.     LCD_E = 0;
  101.     LCD_RS = 0;
  102.     LCD_RW = 1;
  103.     LCD_E = 1;
  104.     while((LCD_DATA & 0x80) && ++timeout != 0); //忙狀態檢測, 等待超時時間為60ms
  105.     LCD_E = 0;
  106. }


  107. //==========================================================================
  108. // 函數功能: 往12864讀數據
  109. //==========================================================================
  110. unsigned char LCD_RdData(void)
  111. {
  112.     unsigned char temp;
  113.    
  114.     BusycChk_12864();
  115.     LCD_E = 0;
  116.     LCD_DATA = 0xFF;                            //IO口置高電平, 以便讀引腳
  117.     LCD_RS = 1;
  118.     LCD_RW = 1;
  119.     LCD_E  = 1;
  120.     NOP;                                        //使能延時, 如果是較快的CPU應該延時久一些
  121.     NOP;
  122.     NOP;
  123.     temp = LCD_DATA                                                                                                                                                                                                                                                                          ;
  124.    
  125.     return temp;
  126. }


  127. //==========================================================================
  128. // 函數功能: 往12864寫命令
  129. //==========================================================================
  130. void Lcd_WrCmd(unsigned char cmd)
  131. {
  132.     LCD_RS = 0;
  133.     LCD_RW = 0;
  134.           //lcdhc595(cmd);
  135.     LCD_DATA =cmd;
  136.     LCD_E = 1;
  137.     NOP;
  138.     LCD_E = 0;
  139. }


  140. //==========================================================================
  141. // 函數功能: 往12864寫數據
  142. //==========================================================================
  143. void Lcd_WrData(unsigned char wdata)
  144. {
  145.     LCD_RS = 1;
  146.     LCD_RW = 0;
  147.           //lcdhc595(wata);
  148.     LCD_DATA=wdata;
  149.     LCD_E = 1;
  150.     NOP;
  151.     LCD_E = 0;
  152. }


  153. //==========================================================================
  154. // 函數功能: 地址轉換
  155. //==========================================================================
  156. void Lcd_Select(unsigned char x, unsigned char y)
  157. {
  158.     if( y>=64 )
  159.     {
  160.         LCD_CS2 = 1;                            //選中左屏
  161.         LCD_CS1 = 0;
  162.     }
  163.     else
  164.     {
  165.         LCD_CS1 = 1;                            //選中右屏
  166.         LCD_CS2 = 0;
  167.     }
  168.    
  169.     Lcd_WrCmd(0xC0);
  170.     Lcd_WrCmd(0x40 + (y&0x3F));                 //列地址
  171.     Lcd_WrCmd(0xB8 + (x&7));                    //行
  172. }


  173. //==========================================================================
  174. // 函數功能: Lcd清屏
  175. // 函數接口: void Lcd_Clr(void);
  176. //==========================================================================
  177. void Lcd_Clr(void)
  178. {
  179.     unsigned char i, x=0;
  180.    
  181.     for(x=0; x<8; x++)
  182.     {
  183.         Lcd_Select(x, 0);                       //選中左屏
  184.         for(i=0; i<64; i++)
  185.         {
  186.             Lcd_WrData(0);
  187.         }
  188.         
  189.         Lcd_Select(x, 64);                      //選中右屏
  190.         for(i=0; i<64; i++)
  191.         {
  192.             Lcd_WrData(0);
  193.         }
  194.     }
  195. }
  196. //==========================================================================
  197. // 函數功能: Lcd初始化
  198. // 函數接口: void Lcd_Init(void);
  199. //==========================================================================
  200. void Lcd_Init (void)
  201. {
  202.     LCD_BL  = 0;                                //打開背光
  203.     LCD_RST = 0;
  204.     Delay_mS(100);
  205.     LCD_RST = 1;
  206.     Delay_mS(1);
  207.    
  208.     LCD_CS1 = 1;
  209.     LCD_CS2 = 1;
  210.     Lcd_WrCmd(0xC0);                            //設置顯示起始行
  211.     Lcd_WrCmd(0x3F);                            //顯示打開
  212.                 Lcd_Clr();                                                                                                                                        //清屏
  213. }


  214. //==========================================================================
  215. // 函數功能: Lcd滿屏
  216. // 函數接口: void Lcd_Full(void);
  217. //==========================================================================
  218. //void Lcd_Full(void)
  219. //{
  220. //    unsigned char i, x=0;
  221. //   
  222. //    for(x=0; x<8; x++)
  223. //    {
  224. //        Lcd_Select(x, 0);                       //選中左屏
  225. //        for(i=0; i<64; i++)
  226. //        {
  227. //            Lcd_WrData(0xFF);
  228. //        }
  229. //        
  230. //        Lcd_Select(x, 64);                      //選中右屏
  231. //        for(i=0; i<64; i++)
  232. //        {
  233. //            Lcd_WrData(0xFF);
  234. //        }
  235. //    }
  236. //}


  237. //==========================================================================
  238. // 函數功能: Lcd顯示一行
  239. // 函數接口: void Lcd_DispOneRow(unsigned char x, unsigned char y, unsigned char *buf, unsigned char len);
  240. // 入口參數: unsigned char x, unsigned char y, unsigned char *buf, unsigned char len
  241. //           x-顯示行, 0~7(一行寬度為8個點)
  242. //           y-顯示起始列, 0~127, 超過列顯示無效
  243. //                                         buf-指向要顯示的數組
  244. //                                         len-要顯示的數據長度
  245. //==========================================================================
  246. /*void Lcd_DispOneRow(unsigned char x, unsigned char y, unsigned char *buf, unsigned char len)
  247. {
  248.     x = x&7;
  249.    
  250.     Lcd_Select(x, y);
  251.     while(len--)
  252.     {
  253.         Lcd_WrData(*buf);
  254.         buf++;
  255.         y++;
  256.         if( y == 64 )
  257.         {
  258.             Lcd_Select(x, y);                   //選中右屏
  259.         }
  260.     }
  261. }*/
  262. /*****************************************************************************
  263. * 函數功能: 整屏顯示128x64點陣圖片,要求圖片長128、寬64個像素點
  264. * 函數接口: void Disp_Img(unsigned char code *img)
  265. * 入口參數: unsigned char code *img
  266. *           img-指向待顯示的圖片
  267. *****************************************************************************/
  268. void Lcd_DispFullImg(unsigned char *img)                           //顯示圖片
  269. {
  270.         unsigned char i=0,j=0;
  271.         for(i=0;i<8;i++)
  272.         {
  273.           Lcd_Select(i, 0);                                                                                                      
  274.                 for(j=0;j<128;j++)
  275.                 {
  276.                         if( j == 64 )
  277.                         {
  278.                                         Lcd_Select(i, j);                   //選中右屏
  279.                         }
  280.                         Lcd_WrData(*img);
  281.                         img++;
  282.                 }
  283.         }
  284. }
  285. /*****************************************************************************
  286. * 函數功能:指定位置顯示特定大小的圖片
  287. * 函數接口: void Lcd_DispImg(unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char code *img)      
  288. * 入口參數: unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char code *img
  289. *           x-顯示起始行, 0~7(一行寬度為8個點)
  290. *           y-顯示起始列, 0~127, 超過列顯示無效
  291. *                                                wid-圖片寬度,單位:像素點,最大值64
  292. *                                                lon-圖片長度,單位:像素點,最大值128
  293. *           img-指針,指向待顯示的圖片
  294. *****************************************************************************/
  295. void Lcd_DispImg(unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char *img)                           //指定位置顯示特定大小的圖片
  296. {
  297.         unsigned char i=0,j=0,k;
  298.         k=wid/8;//16/8=2
  299.         for(i=x;i<(k+x);i++)
  300.         {
  301.                 Lcd_Select(i, y);
  302.                 for(j=y;j<(lon+y);j++)
  303.                 {
  304.                         if( j == 64 )
  305.                         {
  306.                                         Lcd_Select(i, j);                   //選中右屏
  307.                         }
  308.                         Lcd_WrData(*img);
  309.                         img++;
  310.                 }
  311.         }
  312. }


  313. /*****************************************************************************
  314. * 函數功能:在x行寫一個字符,輸入列計數初值,返回最終列計數的最后值,
  315. *                                         該列計數用于確定選中左OR右半屏幕
  316. * 函數接口: unsigned char Lcd_WriteCharData(unsigned char c,unsigned char x, unsigned char lineCount)
  317. * 入口參數: unsigned char c,unsigned char x, unsigned char lineCount
  318. *                                                unsigned char c,要寫入的字符
  319. *                                                unsigned char x,要寫入的行
  320. *                                                unsigned char lineCount,列計數,用于確定選中左或右半屏幕
  321. *****************************************************************************/
  322. void Lcd_WriteEnglish(unsigned char x,unsigned char y, unsigned char c)
  323. {
  324.         unsigned char i,line,temp;
  325.         c -= 32;
  326.         for(i=0;i<2;i++)
  327.         {
  328.                 Lcd_Select(x+i,y);
  329.                 temp=i<<3;
  330.                 for(line=0; line<8; line++)
  331.                 {
  332.                         if((y+line)==64)
  333.                         {Lcd_Select(x+i,y+line);}//選中右半屏幕
  334.                         Lcd_WrData(font8x16[c][line+temp]);//此處的temp用于存放i*8的結果,
  335.                 }
  336.         }
  337. }
  338. /*****************************************************************************
  339. * 函數功能:指定位置寫一串英文字符串,每行最多可寫21個字符
  340. * 函數接口: void Lcd_WriteEnglishString(unsigned char x,unsigned char y,unsigned char *s)
  341. * 入口參數: unsigned char x,unsigned char y,unsigned char *s
  342. *                                                unsigned char x,行值,取值范圍0~7
  343. *                                                unsigned char y,列值,取值范圍0~127
  344. *                                                unsigned char *s,s指向待寫入的字符串
  345. *****************************************************************************/
  346. void Lcd_WriteEnglishString(unsigned char x,unsigned char y,unsigned char *s)
  347. {               
  348.         unsigned char lineCount=0;
  349.         while(*s)
  350.         {
  351.                
  352.                 Lcd_WriteEnglish( x, y+lineCount, *s);
  353.                 lineCount+=8;//每個英文字符占用8列
  354.                 s++;
  355.         }
  356. }
  357. /*****************************************************************************
  358. * 函數功能:指定位置顯示一串漢字
  359. * 函數接口: void Lcd_DispImg(unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char code *img)      
  360. * 入口參數: unsigned char x, unsigned char y, unsigned char wid, unsigned char lon, unsigned char code *img
  361. *           x-顯示起始行, 0~7(一行寬度為8個點)
  362. *           y-顯示起始列, 0~127, 超過列顯示無效
  363. *                                                wid-圖片寬度,單位:像素點,最大值64
  364. *                                                lon-圖片長度,單位:像素點,最大值128
  365. *           img-指針,指向待顯示的圖片
  366. *****************************************************************************/
  367. void Lcd_WriteChinese(unsigned char x, unsigned char y, unsigned char *img)        //顯示1個漢字
  368. {
  369.         Lcd_DispImg( x, y, 16, 16, (unsigned char *)img);
  370. }
  371. void Lcd_WriteChineseString(unsigned char x, unsigned char y, unsigned char *img, unsigned char len)        //顯示一串漢字
  372. {
  373.         unsigned char i;
  374.       
  375.         for(i=0;i<len;i++)
  376.         {
  377.                 Lcd_WriteChinese(x, y, (unsigned char *)img);
  378.                 y += 16;
  379.                 img += 32;
  380.                
  381.         }
  382. }
  383. //==========================================================================
  384. // 函數功能: Lcd畫點
  385. // 函數接口: void DrawDot_12864(unsigned char x, unsigned char y, unsigned char type);
  386. // 出口參數: unsigned char x, unsigned char y, unsigned char type
  387. //           x-顯示行, 0~63
  388. //           y-顯示起始列, 0~127, 超過列顯示無效
  389. //==========================================================================
  390. /*void DrawDot_12864(unsigned char x, unsigned char y, unsigned char type)
  391. {
  392.     unsigned char X, Y;                         //X存儲行地址, Y存儲列地址
  393.     unsigned char dat, temp;
  394.    
  395.     if( x >= 0 && x < 64 )
  396.     {
  397.         X = x/8;
  398.         Y = y;
  399.     }
  400.     Lcd_Select(X, Y);                           //地址轉換
  401.    
  402.     dat = LCD_RdData();                         //假讀
  403.     dat = LCD_RdData();
  404.    
  405.     temp = x % 8;                               //余數為點在字中的位置
  406.    
  407.     switch(type)                                //畫點類型, 0白, 1黑, 2取反
  408.     {
  409.     case 0:
  410.         dat &= ~(0x01 << temp);;                //修改該點同時保持其他位不變
  411.         break;
  412.     case 1:
  413.         dat |=  (0x01 << temp);                 //修改該點同時保持其他位不變
  414.         break;
  415.     case 2:
  416.         dat ^=  (0x01 << temp);;                //修改該點同時保持其他位不變
  417.         break;
  418.     default:
  419.         break;  
  420.     }
  421.     Lcd_Select(X, Y);
  422.     Lcd_WrData(dat);                            //將字節數據寫回
  423. }*/


復制代碼


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人精品久久 | 日韩午夜网站 | 国产成人福利 | 欧美一级片 | 久久成人免费观看 | 日韩欧美在线观看 | 中日字幕大片在线播放 | 成人在线免费观看 | h视频在线免费看 | 国产精品一区一区 | 午夜电影网站 | 婷婷桃色网 | 成人一区二区三区 | 亚洲区视频| 国产亚洲一区二区三区 | 国产aⅴ爽av久久久久久久 | 一区二区三区精品视频 | 国产精品三级 | 日韩欧美在线不卡 | 日本午夜视频 | 日日摸天天添天天添破 | 久草热播| 欧美精品一区二区三区在线 | 国产美女一区二区 | 永久免费av | 久久综合久久综合久久综合 | 精品国产一区二区三区久久久久久 | 国产综合精品一区二区三区 | 亚洲成人综合在线 | 国产99视频精品免费播放照片 | 在线播放国产一区二区三区 | 国产精品免费在线 | 国产情侣啪啪 | av一区二区三区四区 | 久久高清国产视频 | 午夜男人免费视频 | 国产日韩一区 | 日韩av第一页 | 国产精品一区二区久久 | 亚洲444kkkk在线观看最新 | 欧美成人a∨高清免费观看 老司机午夜性大片 |