[文档下载] 新唐M051驱动LCD1602液晶屏程序

[复制链接]
 楼主| Luis德华 发表于 2015-8-17 21:30 | 显示全部楼层 |阅读模式
  1. #include "LCD1602.h"
  2. /***************************************************
  3. *          大量宏定义,便于代码移植和阅读
  4. ***************************************************/
  5. #define LCD1602_LINE1        0
  6. #define LCD1602_LINE2        1
  7. #define LCD1602_LINE1_HEAD   0x80
  8. #define LCD1602_LINE2_HEAD   0xC0
  9. #define LCD1602_DATA_MODE    0x38
  10. #define LCD1602_OPEN_SCREEN  0x0C
  11. #define LCD1602_DISP_ADDRESS 0x80
  12. #define LCD1602_RS_PIN   0
  13. #define LCD1602_RW_PIN   1
  14. #define LCD1602_EN_PIN   2
  15. #define LCD1602_RS(x)      {if((x))P0_DOUT|=  1UL<<LCD1602_RS_PIN;else   P0_DOUT&=~(1UL<<LCD1602_RS_PIN);}//RS引脚控制
  16. #define LCD1602_RW(x)      {if((x))P0_DOUT|=  1UL<<LCD1602_RW_PIN;else   P0_DOUT&=~(1UL<<LCD1602_RW_PIN);}//RW引脚控制
  17. #define LCD1602_EN(x)      {if((x))P0_DOUT|=  1UL<<LCD1602_EN_PIN;else   P0_DOUT&=~(1UL<<LCD1602_EN_PIN);}//EN引脚控制
  18. #define LCD1602_PORT(x)     LS164Send((x))                       //发送数据
  19. /********************************************
  20. *函数名称:LCD1602WriteByte
  21. *输    入:ucByte 要写入的字节
  22. *输    出:无
  23. *说    明:LCD1602 写字节
  24. ********************************************/
  25. VOID LCD1602WriteByte(UINT8 ucByte)
  26. {
  27.      LCD1602_PORT(ucByte);
  28.      LCD1602_RS(HIGH);
  29.      LCD1602_RW(LOW);
  30.      LCD1602_EN(LOW);
  31.      Delayus(5000);
  32.      LCD1602_EN(HIGH);
  33. }
  34. /********************************************
  35. *函数名称:LCD1602WriteCommand
  36. *输    入:ucCmd 要写入的命令
  37. *输    出:无
  38. *说    明:LCD1602 写命令
  39. ********************************************/
  40. VOID LCD1602WriteCommand(UINT8 ucCmd)
  41. {
  42.      LCD1602_PORT(ucCmd);
  43.      LCD1602_RS(LOW);
  44.      LCD1602_RW(LOW);
  45.      LCD1602_EN(LOW);
  46.      Delayus(5000);
  47.      LCD1602_EN(HIGH);
  48. }
  49. /********************************************
  50. *函数名称:LCD1602SetXY
  51. *输    入:x 横坐标 y 纵坐标
  52. *输    出:无
  53. *说    明:LCD1602 设置坐标
  54. ********************************************/
  55. VOID LCD1602SetXY(UINT8 x,UINT8 y)
  56. {
  57.   UINT8 address;
  58.      if(y == LCD1602_LINE1)
  59.      {
  60.         address=LCD1602_LINE1_HEAD+x;
  61.      }
  62.      else
  63.      {
  64.         address=LCD1602_LINE2_HEAD+x;
  65.      }
  66.   LCD1602WriteCommand(address);
  67. }
  68. /********************************************
  69. *函数名称:LCD1602PrintfString
  70. *输    入:x 横坐标 y 纵坐标 s字符串
  71. *输    出:无
  72. *说    明:LCD1602 打印字符串
  73. ********************************************/
  74. VOID LCD1602PrintfString(UINT8 x,
  75.                          UINT8 y,
  76.                          UINT8 *s)
  77. {
  78.   LCD1602SetXY(x,y);       //设置显示坐标

  79.      while(s && *s)
  80.      {
  81.         LCD1602WriteByte(*s);     //显示逐个字符
  82.         s++;
  83.       
  84.      }
  85. }
  86. /********************************************
  87. *函数名称:LCD1602ClearScreen
  88. *输    入:无
  89. *输    出:无
  90. *说    明:LCD1602 清屏
  91. ********************************************/
  92. VOID LCD1602ClearScreen(VOID)
  93. {
  94.   LCD1602WriteCommand(0x01);
  95.      Delayus(5000);
  96. }
  97. /********************************************
  98. *函数名称:LCD1602Init
  99. *输    入:无
  100. *输    出:无
  101. *说    明:LCD1602 初始化
  102. ********************************************/
  103. VOID LCD1602Init(VOID)
  104. {
  105.      P0_PMD &= ~(3UL<<(LCD1602_RS_PIN<<1));
  106.      P0_PMD &= ~(3UL<<(LCD1602_RW_PIN <<1));
  107.      P0_PMD &= ~(3UL<<(LCD1602_EN_PIN <<1));
  108.   P0_PMD |= 1UL<<(LCD1602_RS_PIN<<1);
  109.   P0_PMD |= 1UL<<(LCD1602_RW_PIN <<1);
  110.   P0_PMD |= 1UL<<(LCD1602_EN_PIN <<1);
  111.   LCD1602ClearScreen();
  112.      LCD1602WriteCommand(LCD1602_DATA_MODE);   //显示模式设置,设置16x2显示,5x7点阵,
  113.                                                //8位数据接口
  114.      LCD1602WriteCommand(LCD1602_OPEN_SCREEN); //开显示
  115.      LCD1602WriteCommand(LCD1602_DISP_ADDRESS);//起始显示地址   
  116.      LCD1602ClearScreen();
  117. }
  118. /****************************************
  119. *函数名称:main
  120. *输    入:无
  121. *输    出:无
  122. *功    能:函数主体
  123. ******************************************/
  124. INT32 main(VOID)
  125. {
  126. //     Un_Lock_Reg();        //ISP下载时保护FLASH存储器
  127. PROTECT_REG
  128. (
  129.    PWRCON |= XTL12M_EN;      //默认时钟源为外部晶振
  130.    while((CLKSTATUS & XTL12M_STB) == 0);   //等待12MHz时钟稳定  
  131.    CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //设置外部晶振为系统时钟
  132.    LS164Init();           //74LS164初始化
  133.    LCD1602Init();           //LCD1602初始化
  134.   )
  135.      LCD1602PrintfString(0,LCD1602_LINE1,"Hello World!");  //打印第一行
  136.   LCD1602PrintfString(0,LCD1602_LINE2,"I Love You!");  //打印第二行

  137.   while(1);
  138. }


598330983 发表于 2015-8-17 21:42 | 显示全部楼层
这个不错,1602用的非常多。
mintspring 发表于 2015-8-17 23:15 来自手机 | 显示全部楼层
代码很老练,楼主应该是高手啊
yiyigirl2014 发表于 2015-8-18 08:06 | 显示全部楼层
VOID LCD1602WriteCommand(UINT8 ucCmd)
{
     LCD1602_PORT(ucCmd);
     LCD1602_RS(LOW);
     LCD1602_RW(LOW);
     LCD1602_EN(LOW);
     Delayus(5000);
     LCD1602_EN(HIGH);
这种结构化的封装还是很有必要的,可移了。
稳稳の幸福 发表于 2015-8-18 08:17 | 显示全部楼层
VOID LCD1602ClearScreen(VOID)
{
  LCD1602WriteCommand(0x01);
     Delayus(5000);
}
这个为何延时这么久啊,我建议来个判断,是否清屏成功了,就OK了,不用每次都要等。
有妖气 发表于 2015-8-27 11:11 | 显示全部楼层
精湛的代码,哈哈哈
捉虫天师 发表于 2015-8-27 15:37 | 显示全部楼层
LCD1602PrintfString(0,LCD1602_LINE1,"Hello World!");  //打印第一行
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

370

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部

40

主题

370

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部