搜索
bottom↓
回复: 5

LPC1788驱动LCD1602的程序,写得不好,还请大家指点

[复制链接]

出0入0汤圆

发表于 2013-6-9 21:56:44 | 显示全部楼层 |阅读模式
前段时间练手留下的程序,整理好了放上来,当作备份吧。大家发现有什么缺点还请指点一二。


LCD1602.H
  1. #ifndef __LCD1602_H
  2. #define __LCD1602_H

  3. #include "stdint.h"   

  4. /****************************************************************************/
  5. /*  Display On/Off Control                                                  */
  6. /****************************************************************************/

  7. /*  Turn on display  */
  8. #define DISPLAYON           0X0C

  9. /*  Turn off display */
  10. #define DISPLAYOFF          0X08

  11. /*  Turn on cursor   */
  12. #define DISPCURSORON        0X0A

  13. /*  Turn off cursor  */
  14. #define DISPCURSOROFF       0X08

  15. /*  Cursor blinking  */
  16. #define CURSORBLINKYON      0X09

  17. /*  Cursor not blinking  */
  18. #define CURSORBLINKYOFF     0X08

  19. /****************************************************************************/
  20. /*  Entry Mode Set                                                          */
  21. /****************************************************************************/

  22. /*  Cursor move direction : Increment  */
  23. #define CURSORADD           0X06

  24. /*  Cursor move direction : Decrement  */
  25. #define CURSORCUT           0X04

  26. /*  Display shift when write or read   */
  27. #define SCREENSCROLLMOVE    0X05

  28. /*  Display hold when write or read    */
  29. #define SCREENSCROLLHOLD    0X04

  30. /****************************************************************************/
  31. /*  Cursor or Display Shift                                                 */
  32. /*  Moves cursor and shifts display without changing DDRAM contents.        */
  33. /****************************************************************************/

  34. /*  Cursor shift        */
  35. #define CURSORSHIFT         0X10

  36. /*  Display shift       */
  37. #define SCREENSHIFT         0X18

  38. /*  Shift to the left   */
  39. #define SHIFTLEFT           0X10

  40. /*  Shift to the right  */
  41. #define SHIFTRIGHT          0X14


  42. /*  The LCD1602 API  */
  43. void LCD1602_GPIO_Init(void);
  44. void LCD1602_Init(void);

  45. void LCD1602_SetCousor(uint8_t x, uint8_t y);
  46. void LCD1602_DisplayString(const uint8_t *str);
  47. void LCD1602_DisplayNum(uint32_t n);
  48. void LCD1602_DisplayClear(void);
  49. void LCD1602_DisplayHome(void);

  50. void LCD1602_DisplayOn(void);
  51. void LCD1602_DisplayOff(void);
  52. void LCD1602_CursorOn(uint8_t blink);
  53. void LCD1602_CursorOff(void);

  54. void LCD1602_CursorMoveLeft(uint8_t n);
  55. void LCD1602_CursorMoveRight(uint8_t n);
  56. void LCD1602_DisplayShiftLeft(uint8_t n);
  57. void LCD1602_DisplayShiftRight(uint8_t n);


  58. /*  If the LCD API can not meet your need, you can use the API below operated  */
  59. /*  on the lowlayer.                                                           */
  60. uint8_t LCD1602_ReadState(void);
  61. uint8_t LCD1602_CheckBusy(void);
  62. uint8_t LCD1602_ReadData(void);
  63. void LCD1602_WriteData(uint8_t Data);
  64. void LCD1602_WriteCommand(uint8_t Command);


  65. #endif
复制代码
LCD1602.C
  1. #include "lpc177x_8x_gpio.h"
  2. #include "lcd1602.h"


  3. /*     LCD1602 pin preset       */
  4. #define BRD_LCD1602_RS_PORT     (4)
  5. #define BRD_LCD1602_RS_PIN      (0)
  6. #define BRD_LCD1602_RS_MASK     (1 << BRD_LCD1602_RS_PIN)

  7. #define BRD_LCD1602_RW_PORT     (4)
  8. #define BRD_LCD1602_RW_PIN      (1)
  9. #define BRD_LCD1602_RW_MASK     (1 << BRD_LCD1602_RW_PIN)

  10. #define BRD_LCD1602_E_PORT      (4)
  11. #define BRD_LCD1602_E_PIN       (2)
  12. #define BRD_LCD1602_E_MASK      (1 << BRD_LCD1602_E_PIN)

  13. #define BRD_LCD1602_DATA_PORT   (4)
  14. #define BRD_LCD1602_DATA_BYTE   (1)


  15. /*********************************************************************//**
  16. * @brief                Initialize the pins that LCD1602 use
  17. * @param[in]        None
  18. * @return                 None
  19. **********************************************************************/
  20. void LCD1602_GPIO_Init(void)
  21. {
  22.     FIO_SetDir(BRD_LCD1602_RS_PORT, BRD_LCD1602_RS_MASK, GPIO_DIRECTION_OUTPUT);
  23.     FIO_SetDir(BRD_LCD1602_RW_PORT, BRD_LCD1602_RW_MASK, GPIO_DIRECTION_OUTPUT);
  24.     FIO_SetDir(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK, GPIO_DIRECTION_OUTPUT);   
  25.     FIO_ByteSetDir(BRD_LCD1602_DATA_PORT, BRD_LCD1602_DATA_BYTE, 0xFF, GPIO_DIRECTION_OUTPUT);
  26.    
  27.     FIO_SetMask(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK, 0);
  28.     FIO_ClearValue(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK);
  29. }


  30. /*********************************************************************//**
  31. * @brief                Delay function
  32. * @param[in]        tick - number milisecond of delay time
  33. * @return                 None
  34. **********************************************************************/
  35. static void LCD1602_DelayMs(uint8_t tick)
  36. {
  37.      uint8_t i;
  38.      uint16_t j;
  39.      for (i=tick; i>0; i--)
  40.         for (j=0; j<10000; j++);
  41. }


  42. /*********************************************************************//**
  43. * @brief                Read the state from LCD1602
  44. * @param[in]        None
  45. * @return                 the current state of LCD1602
  46. **********************************************************************/
  47. uint8_t LCD1602_ReadState(void)
  48. {
  49.     uint8_t state = 0;

  50.     FIO_ByteSetDir(BRD_LCD1602_DATA_PORT, BRD_LCD1602_DATA_BYTE, 0xFF, GPIO_DIRECTION_INPUT);
  51.    
  52.     FIO_SetMask(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK, 0);
  53.     FIO_ClearValue(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK);
  54.    
  55.     /*  RS: L,  RW: H,  E: H*/
  56.     FIO_SetMask(BRD_LCD1602_RS_PORT, BRD_LCD1602_RS_MASK, 0);
  57.     FIO_ClearValue(BRD_LCD1602_RS_PORT, BRD_LCD1602_RS_MASK);
  58.     FIO_SetMask(BRD_LCD1602_RW_PORT, BRD_LCD1602_RW_MASK, 0);
  59.     FIO_SetValue(BRD_LCD1602_RW_PORT, BRD_LCD1602_RW_MASK);
  60.     FIO_SetMask(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK, 0);
  61.     FIO_SetValue(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK);   
  62.    
  63.     FIO_ByteSetMask(BRD_LCD1602_DATA_PORT, BRD_LCD1602_DATA_BYTE, 0xFF, 0);
  64.     state = FIO_ByteReadValue(BRD_LCD1602_DATA_PORT, BRD_LCD1602_DATA_BYTE);
  65.    
  66.     FIO_SetMask(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK, 0);
  67.     FIO_ClearValue(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK);

  68.     FIO_ByteSetDir(BRD_LCD1602_DATA_PORT, BRD_LCD1602_DATA_BYTE, 0xFF, GPIO_DIRECTION_OUTPUT);

  69.     return (state);
  70. }


  71. /*********************************************************************//**
  72. * @brief                Read data from LCD1602
  73. * @param[in]        None
  74. * @return                 the data of LCD1602
  75. **********************************************************************/
  76. uint8_t LCD1602_ReadData(void)
  77. {
  78.     uint8_t data = 0;

  79.     FIO_ByteSetDir(BRD_LCD1602_DATA_PORT, BRD_LCD1602_DATA_BYTE, 0xFF, GPIO_DIRECTION_INPUT);
  80.    
  81.     /*   RS: H,  RW: H,  E: H   */
  82.     FIO_SetMask(BRD_LCD1602_RS_PORT, BRD_LCD1602_RS_MASK, 0);
  83.     FIO_SetValue(BRD_LCD1602_RS_PORT, BRD_LCD1602_RS_MASK);
  84.     FIO_SetMask(BRD_LCD1602_RW_PORT, BRD_LCD1602_RW_MASK, 0);
  85.     FIO_SetValue(BRD_LCD1602_RW_PORT, BRD_LCD1602_RW_MASK);
  86.     FIO_SetMask(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK, 0);
  87.     FIO_SetValue(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK);
  88.    
  89.     FIO_ByteSetMask(BRD_LCD1602_DATA_PORT, BRD_LCD1602_DATA_BYTE, 0xFF, 0);
  90.     data = FIO_ByteReadValue(BRD_LCD1602_DATA_PORT, BRD_LCD1602_DATA_BYTE);   

  91.     FIO_SetMask(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK, 0);
  92.     FIO_ClearValue(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK);

  93.     FIO_ByteSetDir(BRD_LCD1602_DATA_PORT, BRD_LCD1602_DATA_BYTE, 0xFF, GPIO_DIRECTION_OUTPUT);

  94.     return (data);
  95. }


  96. /*********************************************************************//**
  97. * @brief                Determine LCD1602 is busy or not
  98. * @param[in]        None
  99. * @return                 the busy flag of LCD1602
  100. **********************************************************************/
  101. uint8_t LCD1602_CheckBusy(void)
  102. {
  103.     return (LCD1602_ReadState() & 0x80);
  104. }


  105. /*********************************************************************//**
  106. * @brief                Write data into LCD1602
  107. * @param[in]        Data which will write into LCD1602
  108. * @return                 None
  109. **********************************************************************/
  110. void LCD1602_WriteData(uint8_t Data)
  111. {
  112.     /*   RS: H,  RW: L,  E: hight pluse*/
  113.     FIO_SetMask(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK, 0);
  114.     FIO_ClearValue(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK);
  115.     FIO_SetMask(BRD_LCD1602_RS_PORT, BRD_LCD1602_RS_MASK, 0);
  116.     FIO_SetValue(BRD_LCD1602_RS_PORT, BRD_LCD1602_RS_MASK);
  117.     FIO_SetMask(BRD_LCD1602_RW_PORT, BRD_LCD1602_RW_MASK, 0);
  118.     FIO_ClearValue(BRD_LCD1602_RW_PORT, BRD_LCD1602_RW_MASK);
  119.    
  120.     FIO_ByteSetMask(BRD_LCD1602_DATA_PORT, BRD_LCD1602_DATA_BYTE, 0xFF, 0);
  121.     FIO_ByteClearValue(BRD_LCD1602_DATA_PORT, BRD_LCD1602_DATA_BYTE, 0xFF);
  122.     FIO_ByteSetMask(BRD_LCD1602_DATA_PORT, BRD_LCD1602_DATA_BYTE, 0xFF, 0);
  123.     FIO_ByteSetValue(BRD_LCD1602_DATA_PORT, BRD_LCD1602_DATA_BYTE, Data);
  124.    
  125.     FIO_SetMask(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK, 0);
  126.     FIO_SetValue(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK);
  127.    
  128.     FIO_SetMask(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK, 0);
  129.     FIO_ClearValue(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK);   
  130. }


  131. /*********************************************************************//**
  132. * @brief                Write command into LCD1602
  133. * @param[in]        Command which will write into LCD1602
  134. * @return                 None
  135. **********************************************************************/
  136. void LCD1602_WriteCommand(uint8_t Command)
  137. {   
  138.     /*   RS: L,  RW: L,  E: hight pluse*/
  139.     FIO_SetMask(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK, 0);
  140.     FIO_ClearValue(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK);
  141.     FIO_SetMask(BRD_LCD1602_RS_PORT, BRD_LCD1602_RS_MASK, 0);
  142.     FIO_ClearValue(BRD_LCD1602_RS_PORT, BRD_LCD1602_RS_MASK);
  143.     FIO_SetMask(BRD_LCD1602_RW_PORT, BRD_LCD1602_RW_MASK, 0);
  144.     FIO_ClearValue(BRD_LCD1602_RW_PORT, BRD_LCD1602_RW_MASK);

  145.     FIO_ByteSetMask(BRD_LCD1602_DATA_PORT, BRD_LCD1602_DATA_BYTE, 0xFF, 0);
  146.     FIO_ByteClearValue(BRD_LCD1602_DATA_PORT, BRD_LCD1602_DATA_BYTE, 0xFF);
  147.     FIO_ByteSetMask(BRD_LCD1602_DATA_PORT, BRD_LCD1602_DATA_BYTE, 0xFF, 0);
  148.     FIO_ByteSetValue(BRD_LCD1602_DATA_PORT, BRD_LCD1602_DATA_BYTE, Command);
  149.    
  150.     FIO_SetMask(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK, 0);
  151.     FIO_SetValue(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK);
  152.    
  153.     FIO_SetMask(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK, 0);
  154.     FIO_ClearValue(BRD_LCD1602_E_PORT, BRD_LCD1602_E_MASK);   
  155. }


  156. /*********************************************************************//**
  157. * @brief                Reset LCD1602
  158. * @param[in]        None
  159. * @return                 None
  160. **********************************************************************/
  161. void LCD1602_Init(void)
  162. {
  163.     LCD1602_DelayMs(15);
  164.     LCD1602_WriteCommand(0X38);
  165.     LCD1602_DelayMs(5);
  166.     LCD1602_WriteCommand(0X38);
  167.     LCD1602_DelayMs(5);
  168.     LCD1602_WriteCommand(0X38);
  169.     while (LCD1602_CheckBusy());
  170.     LCD1602_WriteCommand(0X38);
  171.     while (LCD1602_CheckBusy());
  172.     LCD1602_WriteCommand(0X08);
  173.     while (LCD1602_CheckBusy());
  174.     LCD1602_WriteCommand(0X01);
  175.     while (LCD1602_CheckBusy());
  176.     LCD1602_WriteCommand(0X06);
  177.     while (LCD1602_CheckBusy());
  178.     LCD1602_WriteCommand(0X0C);
  179. }


  180. /*********************************************************************//**
  181. * @brief                Set coordinate of cursor
  182. * @param[in]        x - x-axis,  y - y-axis
  183. * @return                 None
  184. **********************************************************************/
  185. void LCD1602_SetCousor(uint8_t x, uint8_t y)
  186. {
  187.     if ((0 == y) && (x < 40))
  188.     {
  189.         while (LCD1602_CheckBusy());
  190.         LCD1602_WriteCommand(0x80 | x);
  191.     }
  192.     else if ((1 == y) && (x < 40))
  193.     {
  194.         while (LCD1602_CheckBusy());
  195.         LCD1602_WriteCommand(0xC0 | x);
  196.     }
  197. }


  198. /*********************************************************************//**
  199. * @brief                Print one string on LCD1602
  200. * @param[in]        *str  piont to which will print
  201. * @return                 None
  202. **********************************************************************/
  203. void LCD1602_DisplayString(const uint8_t *str)
  204. {
  205.     uint8_t i = 0;
  206.     if (0 == str) return;
  207.     while ((i < 40) && (str[i] != 0))
  208.     {
  209.         while (LCD1602_CheckBusy());
  210.         LCD1602_WriteData(str[i]);
  211.         i++;
  212.     }
  213. }


  214. /*********************************************************************//**
  215. * @brief                Print a number on LCD1602
  216. * @param[in]        n  the number which will print
  217. * @return                 None
  218. **********************************************************************/
  219. void LCD1602_DisplayNum(uint32_t n)
  220. {
  221.     uint8_t pcBuf[16], *p;
  222.    
  223.     if (0 == n)
  224.     {
  225.         while (LCD1602_CheckBusy());
  226.         LCD1602_WriteData('0');   
  227.     }
  228.     else
  229.     {
  230.         p = pcBuf;
  231.         while (n != 0)
  232.         {
  233.             *p++ = (n % 10) + '0';
  234.             n /= 10;
  235.         }
  236.     }
  237.    
  238.     while (p > pcBuf)
  239.     {
  240.         while (LCD1602_CheckBusy());
  241.         LCD1602_WriteData(*--p);
  242.     }
  243. }


  244. /*********************************************************************//**
  245. * @brief                Clear the screen
  246. * @param[in]        None
  247. * @return                 None
  248. **********************************************************************/
  249. void LCD1602_DisplayClear(void)
  250. {
  251.     while (LCD1602_CheckBusy());
  252.     LCD1602_WriteCommand(0x01);
  253. }


  254. /*********************************************************************//**
  255. * @brief                Set cursor return (0,0)
  256. * @param[in]        None
  257. * @return                 None
  258. **********************************************************************/
  259. void LCD1602_DisplayHome(void)
  260. {
  261.     while (LCD1602_CheckBusy());
  262.     LCD1602_WriteCommand(0x02);
  263. }


  264. /*********************************************************************//**
  265. * @brief                Turn on LCD1602
  266. * @param[in]        None
  267. * @return                 None
  268. **********************************************************************/
  269. void LCD1602_DisplayOn(void)
  270. {
  271.     while (LCD1602_CheckBusy());
  272.     LCD1602_WriteCommand(DISPLAYON);
  273. }


  274. /*********************************************************************//**
  275. * @brief                Turn off LCD1602
  276. * @param[in]        None
  277. * @return                 None
  278. **********************************************************************/
  279. void LCD1602_DisplayOff(void)
  280. {
  281.     while (LCD1602_CheckBusy());
  282.     LCD1602_WriteCommand(DISPLAYOFF);
  283. }


  284. /*********************************************************************//**
  285. * @brief                Move the cursor n unit to the left.
  286. * @param[in]        n is the unit number to move.
  287. * @return                 None
  288. **********************************************************************/
  289. void LCD1602_CursorMoveLeft(uint8_t n)
  290. {
  291.     while (n--)
  292.     {
  293.         while (LCD1602_CheckBusy());
  294.         LCD1602_WriteCommand(CURSORSHIFT | SHIFTLEFT);
  295.     }
  296. }


  297. /*********************************************************************//**
  298. * @brief                Move the cursor n unit to the right.
  299. * @param[in]        n is the unit number to move.
  300. * @return                 None
  301. **********************************************************************/
  302. void LCD1602_CursorMoveRight(uint8_t n)
  303. {
  304.     while (n--)
  305.     {
  306.         while (LCD1602_CheckBusy());
  307.         LCD1602_WriteCommand(CURSORSHIFT | SHIFTRIGHT);
  308.     }
  309. }


  310. /*********************************************************************//**
  311. * @brief                Shift the entire display  n unit to the left.
  312. * @param[in]        n is the unit number to shift.
  313. * @return                 None
  314. **********************************************************************/
  315. void LCD1602_DisplayShiftLeft(uint8_t n)
  316. {
  317.     while (n--)
  318.     {
  319.         while (LCD1602_CheckBusy());
  320.         LCD1602_WriteCommand(SCREENSHIFT | SHIFTLEFT);
  321.     }
  322. }


  323. /*********************************************************************//**
  324. * @brief                Shift the entire display  n unit to the right.
  325. * @param[in]        n is the unit number to shift.
  326. * @return                 None
  327. **********************************************************************/
  328. void LCD1602_DisplayShiftRight(uint8_t n)
  329. {
  330.     while (n--)
  331.     {
  332.         while (LCD1602_CheckBusy());
  333.         LCD1602_WriteCommand(SCREENSHIFT | SHIFTRIGHT);
  334.     }   
  335. }


  336. /*********************************************************************//**
  337. * @brief                Sets cursor on.
  338. * @param[in]        blink determines the cursor style.
  339.                 - DISPCURSORON:  Turn on cursor
  340.                 - DISPCURSOROFF: Turn off cursor
  341. * @return                 None
  342. **********************************************************************/
  343. void LCD1602_CursorOn(uint8_t blink)
  344. {
  345.     while (LCD1602_CheckBusy());
  346.     LCD1602_WriteCommand(DISPLAYON | DISPCURSORON | blink);
  347. }


  348. /*********************************************************************//**
  349. * @brief                Sets cursor off.
  350. * @param[in]        None
  351. * @return                 None
  352. **********************************************************************/
  353. void LCD1602_CursorOff(void)
  354. {
  355.     while (LCD1602_CheckBusy());
  356.     LCD1602_WriteCommand(DISPLAYON | DISPCURSOROFF);
  357. }
复制代码
工程文件:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2013-6-9 21:59:48 | 显示全部楼层
看起来不错。
为啥不用寄存器操作?GPIO库绕。
大材小用。
上4"以上的大屏。

出0入0汤圆

发表于 2013-6-9 22:06:55 | 显示全部楼层
哈哈,用了1788这么大个片子,用了1602的小液晶。

出0入0汤圆

 楼主| 发表于 2013-6-9 22:19:41 | 显示全部楼层
lcofjp 发表于 2013-6-9 22:06
哈哈,用了1788这么大个片子,用了1602的小液晶。

本来是用TFT屏的,但是主管说练手就不要弄那么复杂了

出0入0汤圆

发表于 2013-8-11 22:50:12 | 显示全部楼层
mark....
顶一个....

出0入0汤圆

发表于 2013-12-9 10:53:39 | 显示全部楼层
亲用的是库函数啊?可以 共享么?我初学,求赐教
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-2 18:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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