LCD1602_Write_Cmd(0x82);LCD1602_WriteStr_Data("ADC_OUT_Disp"); LCD1602_Write_Cmd(0xc2);LCD1602_WriteStr_Data("VIN: V"); LCD1602_Write_Cmd(0xCB);LCD1602_Write_Data('.'); LCD_Folg = 0; 什么意思
时间: 2023-09-12 19:07:48 浏览: 42
这是一段代码,用于控制LCD1602显示屏显示内容。LCD1602_Write_Cmd(0x82)是发送命令给LCD1602,0x82是命令的参数,代表在第二行第二个字符处开始显示字符。LCD1602_WriteStr_Data("ADC_OUT_Disp")是发送字符串给LCD1602,显示"ADC_OUT_Disp"这个字符。LCD1602_Write_Cmd(0xc2)是发送命令给LCD1602,0xc2是命令的参数,代表在第三行第二个字符处开始显示字符。LCD1602_WriteStr_Data("VIN: V")是发送字符串给LCD1602,显示"VIN: V"这个字符。LCD1602_Write_Cmd(0xCB)是发送命令给LCD1602,0xCB是命令的参数,代表在第三行第八个字符处开始显示字符。LCD1602_Write_Data('.')是发送字符给LCD1602,显示"."这个字符。LCD_Folg = 0;是将LCD_Folg变量赋值为0。
相关问题
52单片机超声波测距并用lcd1602显示
实现52单片机超声波测距并用lcd1602显示的步骤如下:
1. 连接硬件:将超声波模块的 trig 引脚接到P1.0,echo 引脚接到P1.1,将LCD1602模块的 VCC、GND、SCL、SDA接到单片机对应引脚上。
2. 初始化:通过初始化函数设置P1.0为输出引脚,P1.1为输入引脚,并初始化LCD1602模块。
3. 测距:在主函数中循环读取超声波模块返回的脉冲宽度,计算出距离值。
4. 显示:将测得的距离值转换为字符串,并调用LCD1602显示函数,在LCD1602上显示出距离值。
下面是示例代码:
``` c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA = P2^0; // IIC 总线数据线
sbit SCL = P2^1; // IIC 总线时钟线
sbit TRIG = P1^0; // 超声波模块 trig 引脚
sbit ECHO = P1^1; // 超声波模块 echo 引脚
void delay(uint n); // 延时函数
void IIC_start(); // IIC 总线起始信号
void IIC_stop(); // IIC 总线停止信号
void IIC_sendbyte(uchar dat); // IIC 总线发送数据
uchar IIC_readbyte(); // IIC 总线读取数据
void LCD_sendcmd(uchar cmd); // 发送LCD1602命令
void LCD_init(); // 初始化LCD1602
void LCD_senddata(uchar dat); // 发送LCD1602数据
void LCD_writestr(uchar x, uchar y, uchar *str); // 在LCD1602上显示字符串
void LCD_writechar(uchar x, uchar y, uchar dat); // 在LCD1602上显示字符
void LCD_clear(); // 清屏函数
void main()
{
float distance;
uchar buf[16];
TRIG = 0;
ECHO = 0;
LCD_init();
LCD_clear();
while (1)
{
TRIG = 1;
delay(10);
TRIG = 0;
while (!ECHO);
while (ECHO);
distance = (float)TH0 * 256 + TL0;
distance = (distance / 11059200) * 17000;
sprintf(buf, "Distance: %.2fcm", distance);
LCD_writestr(0, 0, buf);
TH0 = 0;
TL0 = 0;
}
}
void delay(uint n)
{
uint i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < 114; j++);
}
}
void IIC_start()
{
SDA = 1;
SCL = 1;
_nop_();
SDA = 0;
_nop_();
SCL = 0;
}
void IIC_stop()
{
SDA = 0;
SCL = 1;
_nop_();
SDA = 1;
_nop_();
}
void IIC_sendbyte(uchar dat)
{
uchar i;
for (i = 0; i < 8; i++)
{
SDA = dat & 0x80;
SCL = 1;
_nop_();
SCL = 0;
dat <<= 1;
}
}
uchar IIC_readbyte()
{
uchar i, dat = 0;
SDA = 1;
for (i = 0; i < 8; i++)
{
SCL = 1;
_nop_();
dat <<= 1;
dat |= SDA;
SCL = 0;
_nop_();
}
return dat;
}
void LCD_sendcmd(uchar cmd)
{
IIC_start();
IIC_sendbyte(0x78);
IIC_sendbyte(0x00);
IIC_sendbyte(cmd);
IIC_stop();
}
void LCD_init()
{
LCD_sendcmd(0x38);
LCD_sendcmd(0x08);
LCD_sendcmd(0x01);
LCD_sendcmd(0x06);
LCD_sendcmd(0x0c);
}
void LCD_senddata(uchar dat)
{
IIC_start();
IIC_sendbyte(0x78);
IIC_sendbyte(0x40);
IIC_sendbyte(dat);
IIC_stop();
}
void LCD_writestr(uchar x, uchar y, uchar *str)
{
uchar i;
if (x < 16)
{
if (y == 0)
{
LCD_sendcmd(0x80 + x);
}
else
{
LCD_sendcmd(0x80 + 0x40 + x);
}
for (i = 0; str[i] != '\0'; i++)
{
LCD_senddata(str[i]);
}
}
}
void LCD_writechar(uchar x, uchar y, uchar dat)
{
if (x < 16)
{
if (y == 0)
{
LCD_sendcmd(0x80 + x);
}
else
{
LCD_sendcmd(0x80 + 0x40 + x);
}
LCD_senddata(dat);
}
}
void LCD_clear()
{
LCD_sendcmd(0x01);
}
```
需要注意的是,实际距离值需要通过公式计算,公式中的常数需要根据超声波模块的参数进行调整。同时,LCD1602的初始化和显示函数也需要根据具体的模块进行调整。
在stm32单片机用寄存器显示LC D1602的代码
以下是在STM32单片机中使用寄存器将数据写入LCD1602的示例代码:
```c
#include "stm32f10x.h"
// 定义两个宏,用于指定连接LCD的GPIO引脚
#define RS_PIN 5 //RS引脚连接到GPIOC5
#define EN_PIN 6 //EN引脚连接到GPIOC6
void delayMs(uint32_t ms) {
for (uint32_t i = 0; i < ms * 1000; i++);
}
void sendData(uint8_t data) {
// 设置RS引脚为数据模式
GPIOC->ODR |= (1 << RS_PIN);
// 先发送高四位
GPIOC->ODR &= ~(0xF << 8); // 先清空掩码位
GPIOC->ODR |= ((data & 0xF0) << 4);
// 上升沿触发EN引脚,使LCD执行指令
GPIOC->ODR |= (1 << EN_PIN);
delayMs(1);
GPIOC->ODR &= ~(1 << EN_PIN);
delayMs(1);
// 再发送低四位
GPIOC->ODR &= ~(0xF << 8);
GPIOC->ODR |= ((data & 0x0F) << 4);
GPIOC->ODR |= (1 << EN_PIN);
delayMs(1);
GPIOC->ODR &= ~(1 << EN_PIN);
delayMs(1);
}
void sendCmd(uint8_t cmd) {
// 设置RS引脚为命令模式
GPIOC->ODR &= ~(1 << RS_PIN);
// 先发送高四位
GPIOC->ODR &= ~(0xF << 8);
GPIOC->ODR |= ((cmd & 0xF0) << 4);
GPIOC->ODR |= (1 << EN_PIN);
delayMs(1);
GPIOC->ODR &= ~(1 << EN_PIN);
delayMs(1);
// 再发送低四位
GPIOC->ODR &= ~(0xF << 8);
GPIOC->ODR |= ((cmd & 0x0F) << 4);
GPIOC->ODR |= (1 << EN_PIN);
delayMs(1);
GPIOC->ODR &= ~(1 << EN_PIN);
delayMs(1);
}
void initLCD() {
// 设置GPIOC的5和6为输出模式
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
GPIOC->CRL &= ~(0xFF << 20);
GPIOC->CRL |= (0x33 << 20);
// 首先要等待LCD启动稳定
delayMs(50);
// 先发送三次初始化指令
sendCmd(0x30);
delayMs(5);
sendCmd(0x30);
delayMs(1);
sendCmd(0x30);
delayMs(1);
// 设置4位数据线、2行显示、5x8点阵字符
sendCmd(0x28);
// 关闭显示、清屏、设置光标移动方向为右移
sendCmd(0x08);
sendCmd(0x01);
sendCmd(0x06);
// 打开显示
sendCmd(0x0C);
}
void writeStr(char *str) {
while (*str) {
sendData(*str++);
}
}
int main(void) {
initLCD();
while (1) {
sendCmd(0x80); //设置光标位置为第一行的第一个字符位置
writeStr("Hello, world!");
delayMs(1000);
sendCmd(0x01); //清屏
delayMs(1000);
}
}
```
代码注释中有对各个步骤的说明,可以根据需求进行调整。
相关推荐
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)