要求在1602lcd的第一行中间显示一位数加法及结果:2十3=5的单片机程序
1个回答
展开全部
FYI
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8; // 重命名类型u8简化代码编写
typedef unsigned int u16;
#define LCD1602_DATA_PORT P0// LCD1602的8位数据端口
sbit gLcd1602_E = P2^7; // LCD1602控制总线的使能信号
sbit gLcd1602_RW = P2^5; // LCD1602控制总线的读写选择信号
sbit gLcd1602_RS = P2^6; // LCD1602控制总线的数据/命令选择信号
void Lcd1602Init(void);
void Lcd1602SetCursor(u8 x,u8 y);
void Lcd1602ShowStr(u8 x, u8 y, u8 *pStr);
static void delay5ms(void);
static void Lcd1602WaitNoBusy(void);
static void Lcd1602WriteCmd(u8 cmd);
static void Lcd1602WriteData(u8 dat);
void main(void)
{
Lcd1602Init();
// 上行17个字符
Lcd1602ShowStr(0, 0, " 2+3=5");
// 下行
Lcd1602ShowStr(0, 1, "Pingfandake_Ant");
while (1);
}
static void Lcd1602WaitNoBusy(void) //忙检测函数
{
u8 sta = 0;
LCD1602_DATA_PORT = 0xff;
gLcd1602_RS = 0;
gLcd1602_RW = 1;
do
{
gLcd1602_E = 1;
sta = LCD1602_DATA_PORT;
gLcd1602_E = 0;
}while(sta & 0x80);
}
//Lcd1602WriteCmd
static void Lcd1602WriteCmd(u8 cmd)
{
Lcd1602WaitNoBusy(); // 先等待LCD1602处于不忙状态
gLcd1602_E = 0; // 禁止LCD
gLcd1602_RS = 0; // 选择发送命令模式
gLcd1602_RW = 0; // 选择写入模式
LCD1602_DATA_PORT = cmd; // 将1字节命令字放入8位并行数据端口
gLcd1602_E = 1; // 使能LED
gLcd1602_E = 0; // 禁止LCD
}
//Lcd1602WriteData写入8位数据
static void Lcd1602WriteData(u8 dat)
{
Lcd1602WaitNoBusy(); // 先等待LCD1602处于不忙状态
gLcd1602_E = 0; // 禁止LCD
gLcd1602_RS = 1; // 选择发送数据模式
gLcd1602_RW = 0; // 选择写入模式
LCD1602_DATA_PORT = dat; // 将1字节命令字放入8位并行数据端口
gLcd1602_E = 1; // 使能LED
gLcd1602_E = 0; // 禁止LCD
}
//Lcd1602Init初始化
void Lcd1602Init(void)
{
Lcd1602WriteCmd(0x38); // 按照数据手册的初始化时序,先发送38H
delay5ms(); // 延时5ms
Lcd1602WriteCmd(0x38); // 按照数据手册的初始化时序,先发送38H
delay5ms(); // 延时5ms
Lcd1602WriteCmd(0x38); // 按照数据手册的初始化时序,先发送38H
delay5ms(); // 延时5ms
Lcd1602WriteCmd(0x38); // 显示模式设置
Lcd1602WriteCmd(0x08); // 关闭显示
Lcd1602WriteCmd(0x01); // 清屏(同时清数据指针)
Lcd1602WriteCmd(0x06); // 读写后指针自动加1,写1个字符后整屏显示不移动
Lcd1602WriteCmd(0x0c); // 开显示,不显示光标
}
void Lcd1602SetCursor(u8 x, u8 y) // 坐标显示
{
u8 addr = 0;
switch (y)
{
case 0: // 上面一行
addr = 0x00 + x; break;
case 1: // 下面一行
addr = 0x40 + x; break;
default:
break;
}
Lcd1602WriteCmd(addr | 0x80);
}
void Lcd1602ShowStr(u8 x, u8 y, u8 *pStr) //显示字符串
{
Lcd1602SetCursor(x, y); //当前字符的坐标
while (*pStr != '\0')
{
Lcd1602WriteData(*pStr++);
}
}
static void delay5ms(void)
{
unsigned char a,b;
for(b=19;b>0;b--)
for(a=130;a>0;a--);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询