解释:函数说明:写数据到液晶 void LCD_write_data(unsigned char w_data) { SET_RS(); LCD_Write_half_byte(w_data >> 4); LCD_Write_half_byte(w_data); delay (10000); }函数说明:写4bit到液晶 void LCD_Write_half_byte(unsigned char half_byte) { // u16 temp_io = 0x0000; // temp_io = GPIO_ReadOutputData(GPIOE); //读端口E输出口的数据 // temp_io &= 0xfff0; //屏蔽低四位 // temp_io |= (u16)(half_byte&0x0f); //得到新数据 // GPIO_Write(GPIOE,temp_io); //写入新数据 if (half_byte&0x01) GPIO_SetBits(GPIOB,GPIO_Pin_8); else GPIO_ResetBits(GPIOB,GPIO_Pin_8); if (half_byte&0x02) GPIO_SetBits(GPIOB,GPIO_Pin_5); else GPIO_ResetBits(GPIOB,GPIO_Pin_5); if (half_byte&0x04) GPIO_SetBits(GPIOB,GPIO_Pin_6); else GPIO_ResetBits(GPIOB,GPIO_Pin_6); if (half_byte&0x08) GPIO_SetBits(GPIOB,GPIO_Pin_7); else GPIO_ResetBits(GPIOB,GPIO_Pin_7); }
时间: 2023-09-01 14:10:38 浏览: 164
这是一段液晶显示屏相关的嵌入式系统代码,其中包含了两个函数。第一个函数 `LCD_write_data` 用于向液晶屏写入数据,其输入参数是一个无符号字符。函数内部先设置液晶屏的 RS 引脚,然后分别调用第二个函数 `LCD_Write_half_byte` 向液晶屏写入高4位和低4位数据。最后通过 `delay` 函数延时一段时间以确保写入完成。
第二个函数 `LCD_Write_half_byte` 则是专门用来向液晶屏写入4位二进制数据的函数。函数内部通过控制 GPIOB 引脚的状态来实现数据写入。具体来说,函数内部分别对应控制 GPIOB 的引脚 5、6、7、8 来写入数据的四位二进制值。其中通过 `GPIO_SetBits` 和 `GPIO_ResetBits` 函数来分别设置和清除引脚的状态。
相关问题
#include <reg52.h> #include <stdio.h> #define LCD1602_RS P2_0 // LCD1602?RS?? #define LCD1602_RW P2_1 // LCD1602?RW?? #define LCD1602_EN P2_2 // LCD1602?EN?? #define LCD1602_DATAPINS P0 // LCD1602????? sbit UART_RXD = P3^0; // ?????? sbit UART_TXD = P3^1; // ?????? void init_uart() // ????? { TMOD |= 0x20; // ?????1???2 TH1 = 0xfd; // ??????9600 TL1 = 0xfd; TR1 = 1; // ?????1 SCON = 0x50; // ???????1 ES = 1; // ?????? EA = 1; // ????? } void init_lcd() // ???LCD { LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_EN = 0; delay_ms(15); lcd_write_cmd(0x38); // ??LCD?16x2????? delay_ms(5); lcd_write_cmd(0x0c); // ??LCD?? delay_ms(5); lcd_clear(); // ?? lcd_write_cmd(0x06); // ???????? } void lcd_write_cmd(unsigned char cmd) // ????LCD { LCD1602_RS = 0; LCD1602_DATAPINS = cmd; LCD1602_EN = 1; delay_us(2); LCD1602_EN = 0; delay_ms(1); } void lcd_write_data(unsigned char dat) // ????LCD { LCD1602_RS = 1; LCD1602_DATAPINS = dat; LCD1602_EN = 1; delay_us(2); LCD1602_EN = 0; delay_ms(1); } void lcd_clear() // ?? { lcd_write_cmd(0x01); } void lcd_set_cursor(unsigned char x, unsigned char y) // ?????? { unsigned char addr; if (y == 0) addr = 0x80 + x; else addr = 0xc0 + x; lcd_write_cmd(addr); } void lcd_puts(unsigned char x, unsigned char y, unsigned char *str) // ?????????? { lcd_set_cursor(x, y); while (*str != '\0') { lcd_write_data(*str); str++; } } void uart_isr() interrupt 4 // ???????? { if (RI) { RI = 0; lcd_write_data(SBUF); // ?????????LCD? } } void main() { init_uart(); init_lcd(); while (1); }
这段代码实现了一个基于单片机的串口通信并将接收到的数据显示在LCD1602液晶屏上。其中,P2_1和P2_2是定义了LCD1602的控制引脚,P0是定义了LCD1602数据引脚。同时,还定义了一个uart_isr()函数,用于处理串口接收中断。在main()函数中,通过调用init_uart()和init_lcd()函数初始化串口和LCD1602,然后进入一个死循环中。
需要注意的是,如果你在编译这段代码时出现了P2_1和P2_2未定义的错误提示,可能是因为你没有正确定义这些引脚或没有包含相应的头文件。你需要检查一下你的代码,确定是否有定义这些引脚,或者添加对应的头文件。
stm32怎样设置lcd_command函数用于向LCD控制器发送命令,参考代码
下面是一个使用STM32的GPIO控制LCD的例子,其中包含了设置LCD命令的函数:
```c
#include "stm32f10x.h"
#define LCD_RS_Pin GPIO_Pin_0
#define LCD_RS_Port GPIOB
#define LCD_RW_Pin GPIO_Pin_1
#define LCD_RW_Port GPIOB
#define LCD_E_Pin GPIO_Pin_2
#define LCD_E_Port GPIOB
#define LCD_D4_Pin GPIO_Pin_4
#define LCD_D4_Port GPIOB
#define LCD_D5_Pin GPIO_Pin_5
#define LCD_D5_Port GPIOB
#define LCD_D6_Pin GPIO_Pin_6
#define LCD_D6_Port GPIOB
#define LCD_D7_Pin GPIO_Pin_7
#define LCD_D7_Port GPIOB
void LCD_Init(void);
void LCD_Command(unsigned char command);
void LCD_Data(unsigned char data);
int main(void)
{
LCD_Init();
// 发送清屏命令
LCD_Command(0x01);
while(1)
{
// 循环发送数据
}
}
void LCD_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 配置GPIO为推挽输出
GPIO_InitStructure.GPIO_Pin = LCD_RS_Pin | LCD_RW_Pin | LCD_E_Pin | LCD_D4_Pin | LCD_D5_Pin | LCD_D6_Pin | LCD_D7_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 初始化LCD
LCD_Command(0x28); // 4位总线,2行显示,5x8点阵
LCD_Command(0x0C); // 开启显示,不显示光标,不闪烁
LCD_Command(0x06); // 光标右移,字符不移动
LCD_Command(0x01); // 清屏
}
void LCD_Command(unsigned char command)
{
GPIO_ResetBits(LCD_RS_Port, LCD_RS_Pin); // RS=0,选择命令
GPIO_ResetBits(LCD_RW_Port, LCD_RW_Pin); // RW=0,写入数据
GPIO_SetBits(LCD_E_Port, LCD_E_Pin); // E=1,使能LCD
GPIO_WriteBit(LCD_D4_Port, LCD_D4_Pin, (command & 0x10) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D5_Port, LCD_D5_Pin, (command & 0x20) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D6_Port, LCD_D6_Pin, (command & 0x40) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D7_Port, LCD_D7_Pin, (command & 0x80) ? Bit_SET : Bit_RESET);
GPIO_ResetBits(LCD_E_Port, LCD_E_Pin); // E=0,禁用LCD
GPIO_SetBits(LCD_E_Port, LCD_E_Pin); // E=1,使能LCD
GPIO_WriteBit(LCD_D4_Port, LCD_D4_Pin, (command & 0x01) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D5_Port, LCD_D5_Pin, (command & 0x02) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D6_Port, LCD_D6_Pin, (command & 0x04) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D7_Port, LCD_D7_Pin, (command & 0x08) ? Bit_SET : Bit_RESET);
GPIO_ResetBits(LCD_E_Port, LCD_E_Pin); // E=0,禁用LCD
}
void LCD_Data(unsigned char data)
{
GPIO_SetBits(LCD_RS_Port, LCD_RS_Pin); // RS=1,选择数据
GPIO_ResetBits(LCD_RW_Port, LCD_RW_Pin); // RW=0,写入数据
GPIO_SetBits(LCD_E_Port, LCD_E_Pin); // E=1,使能LCD
GPIO_WriteBit(LCD_D4_Port, LCD_D4_Pin, (data & 0x10) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D5_Port, LCD_D5_Pin, (data & 0x20) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D6_Port, LCD_D6_Pin, (data & 0x40) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D7_Port, LCD_D7_Pin, (data & 0x80) ? Bit_SET : Bit_RESET);
GPIO_ResetBits(LCD_E_Port, LCD_E_Pin); // E=0,禁用LCD
GPIO_SetBits(LCD_E_Port, LCD_E_Pin); // E=1,使能LCD
GPIO_WriteBit(LCD_D4_Port, LCD_D4_Pin, (data & 0x01) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D5_Port, LCD_D5_Pin, (data & 0x02) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D6_Port, LCD_D6_Pin, (data & 0x04) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(LCD_D7_Port, LCD_D7_Pin, (data & 0x08) ? Bit_SET : Bit_RESET);
GPIO_ResetBits(LCD_E_Port, LCD_E_Pin); // E=0,禁用LCD
}
```
在上面的代码中,`LCD_Command`函数用于向LCD控制器发送命令,`LCD_Data`函数用于向LCD控制器发送数据。其中,`LCD_RS_Pin`、`LCD_RW_Pin`和`LCD_E_Pin`分别是LCD的RS、RW和E引脚,而`LCD_D4_Pin`~`LCD_D7_Pin`则是LCD的数据引脚。在函数中,我们通过设置GPIO的输出电平来模拟LCD的通讯协议,从而向LCD控制器发送命令或数据。
阅读全文