求教:stm32驱动LCD1602显示

2019-07-14 19:08发布

新手求教:最近在学习STM32驱动LCD1602显示的程序,从网上找的例程经过修改了部分接口数据和传输数据,结果1602上可以在相应的位置进行显示,但出来的并不是想要显示的东西
131742642760294356.jpg
部分源程序:
  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部分(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. /* 向LCD1602液晶写入一字节命令,cmd-待写入命令值 */
  18. void LCD1602_Write_Cmd(u16 cmd)
  19. {
  20.         LCD1602_Wait_Ready();
  21.         LCD_RS_Clr();
  22.         LCD_RW_Clr();
  23.         DATAOUT(cmd);
  24.         LCD_EN_Set();
  25.         LCD_EN_Clr();
  26. }

  27. /* 向LCD1602液晶写入一字节数据,dat-待写入数据值 */
  28. void LCD1602_Write_Dat(u16 dat)
  29. {
  30.         LCD1602_Wait_Ready();
  31.         LCD_RS_Set();
  32.         LCD_RW_Clr();
  33.         DATAOUT(dat);
  34.         LCD_EN_Set();
  35.         LCD_EN_Clr();
  36. }

  37. /* 清屏 */
  38. void LCD1602_ClearScreen(void)
  39. {
  40.         LCD1602_Write_Cmd(0x0100);
  41. }

  42. /* 设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */
  43. void LCD1602_Set_Cursor(u8 x, u8 y)
  44. {
  45.         u16 addr;
  46.        
  47.         if (y == 0)
  48.                 addr = 0x0000 + (x<<8);
  49.         else
  50.                 addr = 0x4000 + (x<<8);
  51.         LCD1602_Write_Cmd(addr | 0x8000);
  52. }

  53. /* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针 */
  54. void LCD1602_Show_Str(u8 x, u8 y, u8 *str)
  55. {
  56.         LCD1602_Set_Cursor(x, y);
  57.         while(*str != '')
  58.         {
  59.                 LCD1602_Write_Dat(*str++);
  60.         }
  61. }

  62. /* 初始化1602液晶 */
  63. void LCD1602_Init(void)
  64. {
  65.         LCD1602_Write_Cmd(0x3800);        //16*2显示,5*7点阵,8位数据口
  66.         LCD1602_Write_Cmd(0x0c00);        //开显示,光标关闭
  67.         LCD1602_Write_Cmd(0x0600);        //文字不动,地址自动+1
  68.         LCD1602_Write_Cmd(0x0100);        //清屏
  69. }

复制代码1602.h

  1. #define        LCD_RS_Set()        GPIO_SetBits(GPIOA, GPIO_Pin_8)
  2. #define        LCD_RS_Clr()        GPIO_ResetBits(GPIOA, GPIO_Pin_8)

  3. //1602液晶读写引脚
  4. #define        LCD_RW_Set()        GPIO_SetBits(GPIOA, GPIO_Pin_9)
  5. #define        LCD_RW_Clr()        GPIO_ResetBits(GPIOA, GPIO_Pin_9)

  6. //1602液晶使能引脚
  7. #define        LCD_EN_Set()        GPIO_SetBits(GPIOA, GPIO_Pin_10)
  8. #define        LCD_EN_Clr()        GPIO_ResetBits(GPIOA, GPIO_Pin_10)

  9. //1602液晶数据端口       
  10. #define        DATAOUT(x)        GPIO_Write(GPIOE, x)

  11. void GPIO_Configuration(void);
  12. void LCD1602_Wait_Ready(void);
  13. void LCD1602_Write_Cmd(u16 cmd);
  14. void LCD1602_Write_Dat(u16 dat);
  15. void LCD1602_ClearScreen(void);
  16. void LCD1602_Set_Cursor(u8 x, u8 y);
  17. void LCD1602_Show_Str(u8 x, u8 y, u8 *str);
  18. void LCD1602_Init(void);

  19. #endif
复制代码因为原例程用的是GPIOB0-7,而我用到的是GPIOE8-15口,所以在输入指令和数据时我进行了补位或者移位,实在是想不通为什么会显示这样。
       麻烦大家了,谢谢


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。