找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2123|回复: 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. }*/


复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表