我写的stm32F103的驱动LCD1602的程序为什么没有显示呀

m0_45689866 2019-09-26 08:34:47
这个是我写的程序,没有显示,刚刚开始学的LCD和stm32,不知道缺少和写错了哪部分,有大佬帮忙看一下嘛 头文件: #ifndef _LCD_H_ #define _LCD_H_ #include "stm32f10x.h" ///通过定义位带操作控制RS RW EN #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x40010C0C #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010C08 #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出 #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入 //------------------------ #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08 #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出 #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入 #define RS PBout(3) #define RW PBout(4) #define EN PBout(5) void LCD_Init(void); void LCD_Write_cmd(u8 cmd); void LCD_Write_dat(u8 dat); void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); #endif /*_LCD_H_*/ LCD1602.c文件 ------------------------------------------------- #include "LCD.h" #include "stm32f10x.h" #include "delay.h" //发送命令 void LCD_Write_cmd(u8 cmd)//写入命令 { RS = 0; RW = 0; EN = 0; EN = 1; // GPIO_Write(GPIOA,(GPIO_ReadOutputData(GPIOA) & 0xff00) | cmd);//该函数一般用来往一次性一个GPIO的多个端口设置 GPIO_Write(GPIOA, 0X00FF&cmd);//GPIOA的第八位用来作为8位数据口 delay_ms(5); EN = 0; } //发送数据 void LCD_Write_dat(u8 dat)//写入数据 { RS = 1; RW = 0; EN = 0; EN = 1; // GPIO_Write(GPIOA,(GPIO_ReadOutputData(GPIOA) & 0xff00) | dat);//该函数一般用来往一次性一个GPIO的多个端口设置 GPIO_Write(GPIOA, 0X00FF&dat);//GPIOA的第八位用来作为8位数据口 delay_ms(5); EN = 0; } void LCD_Init() { GPIO_InitTypeDef GPIO_Initlcd; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_Initlcd.GPIO_Mode=GPIO_Mode_Out_PP; //设置工作模式 GPIO_Initlcd.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ; //选定引脚 GPIO_Initlcd.GPIO_Speed=GPIO_Speed_50MHz; //选择工作频率 GPIO_Init(GPIOA,&GPIO_Initlcd); //控制寄存器写入 GPIO_Initlcd.GPIO_Mode=GPIO_Mode_Out_PP; //设置工作模式 GPIO_Initlcd.GPIO_Pin=GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; //选定引脚 rs rw en GPIO_Initlcd.GPIO_Speed=GPIO_Speed_50MHz; //选择工作频率 GPIO_Init(GPIOB,&GPIO_Initlcd); delay_ms(5); LCD_Write_cmd(0x01); //清屏 delay_ms(5); LCD_Write_cmd(0x02); //光标归位 delay_ms(5); LCD_Write_cmd(0x06); //设置输入模式 delay_ms(5); LCD_Write_cmd(0x0C); //显示设置 delay_ms(5); LCD_Write_cmd(0x38); //功能设置 delay_ms(5); } -------------------------- main.c文件 #include "stm32f10x.h" #include "delay.h" #include "stdio.h" #include "LCD.h" int main(void) { char h[]={"LCD1602 test"}; uint8_t i; LCD_Init();//LCD1602初始化函数 while(1) { LCD_Write_cmd(0x80+0X01);//第一行的地址 for(i=0;i<12;i++) { LCD_Write_dat(h[i]); delay_ms(5); } } }
...全文
405 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgs2018 2020-03-12
  • 打赏
  • 举报
回复
1、在void LCD_Write_cmd(u8 cmd)//写入命令那里,将GPIO_Write(GPIOA, 0X00FF&cmd);//GPIOA的第八位用来作为8位数据口 去掉,改为GPIO_Write(GPIOA, (cmd&0x00ff)|(GPIO_ReadOutputData(GPIOA)&0xff00));//屏蔽高8位
2、在void LCD_Write_dat(u8 dat)//写入数据那里,将GPIO_Write(GPIOA, 0X00FF&dat);//GPIOA的第八位用来作为8位数据口 去掉,
改为GPIO_Write(GPIOA, (dat&0x00ff)|(GPIO_ReadOutputData(GPIOA)&0xff00));
一句话说完:GPIO的低8位定义不对
m0_45689866 2019-09-26
  • 打赏
  • 举报
回复
我自己找了一下午都不知道问题出在哪,希望有人帮帮忙

27,372

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧