新手求教:最近在学习stm32驱动LCD1602显示的程序,从网上找的例程经过修改了部分接口数据和传输数据,结果1602上可以在相应的位置进行显示,但出来的并不是想要显示的东西
部分源程序:
main.c
1 int main(void) 2 { 3 u8 str[] = "ADC"; 4 5 delay_init(); 6 NVIC_Configuration(); 7 uart_init(9600); 8 GPIO_Configuration(); 9 LED_Init(); 10 LCD1602_Init(); 11 LCD1602_Show_Str(6, 0, str); 12 LCD1602_Show_Str(4, 1, "I am XCC"); 13 }
1602.c
1 /* 等待液晶准备好 */ 2 void LCD1602_Wait_Ready(void) 3 { 4 u16 sta; 5 6 DATAOUT(0xff00); 7 LCD_RS_Clr(); 8 LCD_RW_Set(); 9 do 10 { 11 LCD_EN_Set(); 12 delay_ms(5); //延时5ms 13 sta = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_15);//读取状态字 14 LCD_EN_Clr(); 15 }while(sta & 0x8000); 16 } 17 18 /* 向LCD1602液晶写入一字节命令,cmd-待写入命令值 */ 19 void LCD1602_Write_Cmd(u16 cmd) 20 { 21 LCD1602_Wait_Ready(); 22 LCD_RS_Clr(); 23 LCD_RW_Clr(); 24 DATAOUT(cmd); 25 LCD_EN_Set(); 26 LCD_EN_Clr(); 27 } 28 29 /* 向LCD1602液晶写入一字节数据,dat-待写入数据值 */ 30 void LCD1602_Write_Dat(u16 dat) 31 { 32 LCD1602_Wait_Ready(); 33 LCD_RS_Set(); 34 LCD_RW_Clr(); 35 DATAOUT(dat); 36 LCD_EN_Set(); 37 LCD_EN_Clr(); 38 } 39 40 /* 清屏 */ 41 void LCD1602_ClearScreen(void) 42 { 43 LCD1602_Write_Cmd(0x0100); 44 } 45 46 /* 设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */ 47 void LCD1602_Set_Cursor(u8 x, u8 y) 48 { 49 u16 addr; 50 51 if (y == 0) 52 addr = 0x0000 + (x<<8); 53 else 54 addr = 0x4000 + (x<<8); 55 LCD1602_Write_Cmd(addr | 0x8000); 56 } 57 58 /* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针 */ 59 void LCD1602_Show_Str(u8 x, u8 y, u8 *str) 60 { 61 LCD1602_Set_Cursor(x, y); 62 while(*str != '\0') 63 { 64 LCD1602_Write_Dat(*str++); 65 } 66 } 67 68 /* 初始化1602液晶 */ 69 void LCD1602_Init(void) 70 { 71 LCD1602_Write_Cmd(0x3800); //16*2显示,5*7点阵,8位数据口 72 LCD1602_Write_Cmd(0x0c00); //开显示,光标关闭 73 LCD1602_Write_Cmd(0x0600); //文字不动,地址自动+1 74 LCD1602_Write_Cmd(0x0100); //清屏 75 }
1602.h
1 //1602液晶数据端口 2 #define DATAOUT(x) GPIO_Write(GPIOE, x)
具体管脚的定义我就不往上贴了,因为原例程用的是GPIOB0-7,而我用到的是GPIOE8-1口,所以在输入指令和数据时我进行了补位或者移位,实在是想不通为什么会显示这样。
恳请大家帮我看看,小白万分感谢