基于51单片机的lcd1602.h代码
时间: 2023-10-15 20:02:15 浏览: 286
以下是一个基于51单片机的LCD1602.h头文件的代码示例:
```
#ifndef __LCD1602_H__
#define __LCD1602_H__
#include <reg52.h>
#define LCD_DATA P0
sbit RS = P2^0;
sbit EN = P2^1;
void delay(unsigned int t);
void lcd_init();
void lcd_write_data(unsigned char dat);
void lcd_write_cmd(unsigned char cmd);
void lcd_write_str(unsigned char row, unsigned char col, unsigned char *str);
#endif
```
此头文件中定义了上述代码中使用的函数和端口,包括 delay() 函数、lcd_init() 函数、lcd_write_data() 函数、lcd_write_cmd() 函数和 lcd_write_str() 函数。除此之外,还包括了防止头文件重复包含的 ifndef 和 endif 宏定义。
请注意,以上代码仅作为示例。实际上,LCD的连接方式可能因不同的硬件平台而有所不同。因此,你需要根据自己的硬件平台和LCD的连接方式进行相应的修改。
相关问题
基于51单片机的lcd1602.c代码
以下是一个基于51单片机的LCD1602.c文件的代码示例:
```
#include "lcd1602.h"
void delay(unsigned int t)
{
while(t--);
}
void lcd_init()
{
delay(1000); //等待LCD电源稳定
lcd_write_cmd(0x38); //设置LCD为8位数据总线,双行显示,5*8点阵
lcd_write_cmd(0x0c); //显示开,光标关闭,闪烁关闭
lcd_write_cmd(0x06); //光标移动设置:地址加1,不移动屏幕
lcd_write_cmd(0x01); //显示清屏
}
void lcd_write_data(unsigned char dat)
{
LCD_DATA = dat; //将数据放入端口
RS = 1; //设置RS为1,表示写入数据
EN = 1; //使能EN
delay(10); //等待一段时间
EN = 0; //关闭EN
}
void lcd_write_cmd(unsigned char cmd)
{
LCD_DATA = cmd; //将命令放入端口
RS = 0; //设置RS为0,表示写入命令
EN = 1; //使能EN
delay(10); //等待一段时间
EN = 0; //关闭EN
}
void lcd_write_str(unsigned char row, unsigned char col, unsigned char *str)
{
unsigned char addr;
if(row == 0) //如果是第一行
{
addr = 0x80 + col; //计算地址
lcd_write_cmd(addr); //写入地址
}
else if(row == 1) //如果是第二行
{
addr = 0xc0 + col; //计算地址
lcd_write_cmd(addr); //写入地址
}
while(*str) //依次写入字符串
{
lcd_write_data(*str++);
}
}
```
此代码中,我们定义了上述头文件中声明的函数,并实现了这些函数的具体功能。请注意,在编写该代码时,需要将LCD1602.h头文件包含进来。
基于51单片机lcd1602直接实时显示HX711模块称重代码
以下是基于51单片机和HX711模块的称重代码,实时将重量显示在LCD1602上:
```
#include <reg51.h>
#include <intrins.h>
#define LCD_DB P0
sbit LCD_RS=P3^6;
sbit LCD_RW=P3^5;
sbit LCD_EN=P3^4;
sbit DOUT=P2^7; // HX711模块的数据输出引脚
sbit PD_SCK=P2^6; // HX711模块的时钟引脚
void Delay1ms(unsigned int);
void InitLcd1602();
void WriteCommand(unsigned char);
void WriteData(unsigned char);
void LcdDisplay(unsigned char,unsigned char,unsigned char);
void main()
{
unsigned long weight = 0;
unsigned char i = 0;
unsigned char j = 0;
unsigned char buff[16];
InitLcd1602(); // 初始化LCD1602
while(1)
{
// 读HX711模块的数据
while(DOUT);
for(i=0;i<24;i++)
{
PD_SCK=1;
weight=weight<<1;
PD_SCK=0;
if(DOUT) weight++;
}
for(j=0;j<1;j++)
{
PD_SCK=1;
PD_SCK=0;
}
// 将重量显示在LCD1602上
sprintf(buff,"%lu",weight);
LcdDisplay(2,1,'w');
LcdDisplay(2,2,'e');
LcdDisplay(2,3,'i');
LcdDisplay(2,4,'g');
LcdDisplay(2,5,'h');
LcdDisplay(2,6,'t');
LcdDisplay(2,7,':');
LcdDisplay(2,8,' ');
LcdDisplay(2,9,buff[0]);
LcdDisplay(2,10,buff[1]);
LcdDisplay(2,11,buff[2]);
LcdDisplay(2,12,buff[3]);
LcdDisplay(2,13,buff[4]);
LcdDisplay(2,14,buff[5]);
LcdDisplay(2,15,'g');
LcdDisplay(2,16,0);
weight = 0; // 清空重量
}
}
void Delay1ms(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
{
for(j=110;j>0;j--);
}
}
void InitLcd1602()
{
WriteCommand(0x38); // 初始化LCD1602
WriteCommand(0x0c);
WriteCommand(0x06);
WriteCommand(0x01);
Delay1ms(10);
}
void WriteCommand(unsigned char c)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DB = c;
LCD_EN = 1;
_nop_();
_nop_();
LCD_EN = 0;
}
void WriteData(unsigned char c)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DB = c;
LCD_EN = 1;
_nop_();
_nop_();
LCD_EN = 0;
}
void LcdDisplay(unsigned char y,unsigned char x,unsigned char c)
{
unsigned char address;
if(y!=1)
{
address=0xc0+x-1;
}
else
{
address=0x80+x-1;
}
WriteCommand(address);
WriteData(c);
}
```
注意:以上代码仅供参考,实际应用中需要根据具体硬件配置和需求进行修改。
阅读全文