这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» MCU» M051驱动LCD1602液晶屏程序

共17条 1/2 1 2 跳转至

M051驱动LCD1602液晶屏程序

工程师
2020-02-17 22:32:12 打赏

新唐的M051单片机性价比不错,而LCD模块 16x2 在电子应用中特别常用,以下下面给出一个M051驱动LCD1602液晶屏程序,希望对大家有帮助!


#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<#define LCD1602_RW(x) {if((x))P0_DOUT|= 1UL<#define LCD1602_EN(x) {if((x))P0_DOUT|= 1UL<#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);
}




关键词: LCD1602 LCD模组 LCD模块 1602

工程师
2020-02-17 22:47:51 打赏
2楼

很实用的例程,谢谢分享!


工程师
2020-02-17 22:54:29 打赏
3楼

看到程序中有“74LS164”,请问楼主,这个LCD是串行口吗?


院士
2020-02-18 17:33:54 打赏
4楼

新唐的5伏MCU在这方面还是非常实用


工程师
2020-02-18 22:33:53 打赏
5楼
这种小的LCD在工业中用的还多吗?



工程师
2020-02-18 23:11:03 打赏
6楼

收藏!年后正好要用到LCD 16x2


工程师
2020-02-18 23:21:10 打赏
7楼

在main中,为何还用到PROTECT_REG ? 为何要保护?


院士
2020-02-19 22:40:40 打赏
8楼

谢谢楼主的慷慨分享。


高工
2020-02-23 19:21:27 打赏
9楼

这些代码一看就是经过精心雕琢的


工程师
2020-02-23 23:07:40 打赏
10楼

这种LCD,读写时序很重要,不然容易显示不正常或不显示。

我以前刚开始用,说来都是泪



共17条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]