打印
[文档下载]

新唐M051驱动LCD1602液晶屏程序

[复制链接]
1502|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Luis德华|  楼主 | 2015-8-17 21:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "LCD1602.h"
/***************************************************
*          大量宏定义,便于代码移植和阅读
***************************************************/
#define LCD1602_LINE1        0
#define LCD1602_LINE2        1
#define LCD1602_LINE1_HEAD   0x80
#define LCD1602_LINE2_HEAD   0xC0
#define LCD1602_DATA_MODE    0x38
#define LCD1602_OPEN_SCREEN  0x0C
#define LCD1602_DISP_ADDRESS 0x80
#define LCD1602_RS_PIN   0
#define LCD1602_RW_PIN   1
#define LCD1602_EN_PIN   2
#define LCD1602_RS(x)      {if((x))P0_DOUT|=  1UL<<LCD1602_RS_PIN;else   P0_DOUT&=~(1UL<<LCD1602_RS_PIN);}//RS引脚控制
#define LCD1602_RW(x)      {if((x))P0_DOUT|=  1UL<<LCD1602_RW_PIN;else   P0_DOUT&=~(1UL<<LCD1602_RW_PIN);}//RW引脚控制
#define LCD1602_EN(x)      {if((x))P0_DOUT|=  1UL<<LCD1602_EN_PIN;else   P0_DOUT&=~(1UL<<LCD1602_EN_PIN);}//EN引脚控制
#define LCD1602_PORT(x)     LS164Send((x))                       //发送数据
/********************************************
*函数名称:LCD1602WriteByte
*输    入:ucByte 要写入的字节
*输    出:无
*说    明:LCD1602 写字节
********************************************/
VOID LCD1602WriteByte(UINT8 ucByte)
{
     LCD1602_PORT(ucByte);
     LCD1602_RS(HIGH);
     LCD1602_RW(LOW);
     LCD1602_EN(LOW);
     Delayus(5000);
     LCD1602_EN(HIGH);
}
/********************************************
*函数名称:LCD1602WriteCommand
*输    入:ucCmd 要写入的命令
*输    出:无
*说    明:LCD1602 写命令
********************************************/
VOID LCD1602WriteCommand(UINT8 ucCmd)
{
     LCD1602_PORT(ucCmd);
     LCD1602_RS(LOW);
     LCD1602_RW(LOW);
     LCD1602_EN(LOW);
     Delayus(5000);
     LCD1602_EN(HIGH);
}
/********************************************
*函数名称:LCD1602SetXY
*输    入:x 横坐标 y 纵坐标
*输    出:无
*说    明:LCD1602 设置坐标
********************************************/
VOID LCD1602SetXY(UINT8 x,UINT8 y)
{
  UINT8 address;
     if(y == LCD1602_LINE1)
     {
        address=LCD1602_LINE1_HEAD+x;
     }
     else
     {
        address=LCD1602_LINE2_HEAD+x;
     }
  LCD1602WriteCommand(address);
}
/********************************************
*函数名称:LCD1602PrintfString
*输    入:x 横坐标 y 纵坐标 s字符串
*输    出:无
*说    明:LCD1602 打印字符串
********************************************/
VOID LCD1602PrintfString(UINT8 x,
                         UINT8 y,
                         UINT8 *s)
{
  LCD1602SetXY(x,y);       //设置显示坐标

     while(s && *s)
     {
        LCD1602WriteByte(*s);     //显示逐个字符
        s++;
      
     }
}
/********************************************
*函数名称:LCD1602ClearScreen
*输    入:无
*输    出:无
*说    明:LCD1602 清屏
********************************************/
VOID LCD1602ClearScreen(VOID)
{
  LCD1602WriteCommand(0x01);
     Delayus(5000);
}
/********************************************
*函数名称:LCD1602Init
*输    入:无
*输    出:无
*说    明:LCD1602 初始化
********************************************/
VOID LCD1602Init(VOID)
{
     P0_PMD &= ~(3UL<<(LCD1602_RS_PIN<<1));
     P0_PMD &= ~(3UL<<(LCD1602_RW_PIN <<1));
     P0_PMD &= ~(3UL<<(LCD1602_EN_PIN <<1));
  P0_PMD |= 1UL<<(LCD1602_RS_PIN<<1);
  P0_PMD |= 1UL<<(LCD1602_RW_PIN <<1);
  P0_PMD |= 1UL<<(LCD1602_EN_PIN <<1);
  LCD1602ClearScreen();
     LCD1602WriteCommand(LCD1602_DATA_MODE);   //显示模式设置,设置16x2显示,5x7点阵,
                                               //8位数据接口
     LCD1602WriteCommand(LCD1602_OPEN_SCREEN); //开显示
     LCD1602WriteCommand(LCD1602_DISP_ADDRESS);//起始显示地址   
     LCD1602ClearScreen();
}
/****************************************
*函数名称:main
*输    入:无
*输    出:无
*功    能:函数主体
******************************************/
INT32 main(VOID)
{
//     Un_Lock_Reg();        //ISP下载时保护FLASH存储器
PROTECT_REG
(
   PWRCON |= XTL12M_EN;      //默认时钟源为外部晶振
   while((CLKSTATUS & XTL12M_STB) == 0);   //等待12MHz时钟稳定  
   CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //设置外部晶振为系统时钟
   LS164Init();           //74LS164初始化
   LCD1602Init();           //LCD1602初始化
  )
     LCD1602PrintfString(0,LCD1602_LINE1,"Hello World!");  //打印第一行
  LCD1602PrintfString(0,LCD1602_LINE2,"I Love You!");  //打印第二行

  while(1);
}


沙发
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);
这种结构化的封装还是很有必要的,可移了。

使用特权

评论回复
5
稳稳の幸福| | 2015-8-18 08:17 | 只看该作者
VOID LCD1602ClearScreen(VOID)
{
  LCD1602WriteCommand(0x01);
     Delayus(5000);
}
这个为何延时这么久啊,我建议来个判断,是否清屏成功了,就OK了,不用每次都要等。

使用特权

评论回复
6
有妖气| | 2015-8-27 11:11 | 只看该作者
精湛的代码,哈哈哈

使用特权

评论回复
7
捉虫天师| | 2015-8-27 15:37 | 只看该作者
LCD1602PrintfString(0,LCD1602_LINE1,"Hello World!");  //打印第一行

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

370

帖子

4

粉丝