要求在1602lcd的第一行中间显示一位数加法及结果:2十3=5的单片机程序

 我来答
平凡大科
2019-04-27 · 超过28用户采纳过TA的回答
知道答主
回答量:73
采纳率:63%
帮助的人:22.6万
展开全部

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--);
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式