单片机用的是stm32f103c8t6,然后在网上找的LCD1602的程序,我主函数里只写了一个打印数字的命令。我不知道是我单片机接口选择的问题还是我硬件接线的问题。希望有大哥帮我看看,谢谢。
因为用的B0-B7所以这个pB2的接口在接线图上没画。
- #include "lcd1602.h"
- void LCD1602_GPIO_Config(void)
- {
- GPIO_InitTypeDef LCD1602_GPIOStruct;
- RCC_APB2PeriphClockCmd(LCD1602_CLK, ENABLE);
- LCD1602_GPIOStruct.GPIO_Mode = GPIO_Mode_Out_PP;
- LCD1602_GPIOStruct.GPIO_Speed = GPIO_Speed_10MHz;
- LCD1602_GPIOStruct.GPIO_Pin = LCD1602_E | LCD1602_RS | LCD1602_RW ;
- GPIO_Init(LCD1602_GPIO_PORT,&LCD1602_GPIOStruct);
- LCD1602_GPIOStruct.GPIO_Mode = GPIO_Mode_Out_OD;
- LCD1602_GPIOStruct.GPIO_Pin = DB0 | DB1 | DB2 |DB3 | DB4 | DB5| DB6 | DB7 ;
- GPIO_Init(LCD1602_GPIO_PORT,&LCD1602_GPIOStruct);
- }
- void LCD1602_WaitReady(void)
- {
- uint8_t sta;
- GPIOB->ODR =0x00FF;
- RSO(0);
- RWO(1);
- EO(1);
- delay_us(1);
- do{
- sta=GPIO_ReadInputDataBit(LCD1602_GPIO_PORT,GPIO_Pin_7);
- EO(0);
- }while(sta);
- }
- void LCD1602_WriteCmd(uint8_t cmd)
- {
- //LCD1602_WaitReady();
- delay_us(15);
- RSO(0);
- RWO(0);
- EO(0);
- delay_us(1);
- EO(1);
- LCD1602_GPIO_PORT->ODR &= (cmd|0xFF00);
- EO(0);
- delay_us(400);
- }
- void LCD1602_WriteDat(uint8_t dat)
- {
- //LCD1602_WaitReady();
- delay_us(15);
- RSO(1);
- RWO(0);
- delay_us(30);
- EO(1);
- LCD1602_GPIO_PORT->ODR &=(dat|0xFF00);
- EO(0);
- delay_us(400);
- }
- void LCD1602_SetCursor(uint8_t x, uint8_t y)
- {
- uint8_t addr;
-
- if (y == 0)
- addr = 0x00 + x;
- else
- addr = 0x40 + x;
- LCD1602_WriteCmd(addr|0x80);
- }
- void LCD1602_ShowStr(uint8_t x, uint8_t y, uint8_t *str, uint8_t len)
- {
- LCD1602_SetCursor(x, y);
- while (len--)
- {
- LCD1602_WriteDat(*str++);
- }
- }
- //??1???
- //x,y :????
- //num:??(0~99)
- //-----------------------------*/
- void LCD_ShowNum(uint8_t x, uint8_t y,uint8_t num)
- {
- LCD1602_SetCursor(x, y);
- LCD_ShowChar(x,y,num+'0');
-
- }
- void LCD_ShowChar(uint8_t x, uint8_t y,uint8_t dat)
- {
- LCD1602_SetCursor(x, y);
- LCD1602_WriteDat(dat);
- }
- void LCD1602_Init(void)
- {
- LCD1602_GPIO_Config();
- LCD1602_WriteCmd(0X38);
- LCD1602_WriteCmd(0x0C);
- LCD1602_WriteCmd(0x06);
- LCD1602_WriteCmd(0x01);
- }
-
-
复制代码 这是.c文件
- #ifndef _BSP_LCD1602_H
- #define _BSP_LCD1602_H
- #include "stm32f10x.h"
- #include "stm32f10x_gpio.h"
- #include "delay.h"
- #define LCD1602_CLK RCC_APB2Periph_GPIOB
- #define LCD1602_GPIO_PORT GPIOB
- #define LCD1602_E GPIO_Pin_12
- #define LCD1602_RW GPIO_Pin_13
- #define LCD1602_RS GPIO_Pin_14
- #define EO(X) X? (GPIO_SetBits(LCD1602_GPIO_PORT,LCD1602_E)):(GPIO_ResetBits(LCD1602_GPIO_PORT,LCD1602_E))
- #define RWO(X) X? (GPIO_SetBits(LCD1602_GPIO_PORT,LCD1602_RW)):(GPIO_ResetBits(LCD1602_GPIO_PORT,LCD1602_RW))
- #define RSO(X) X? (GPIO_SetBits(LCD1602_GPIO_PORT,LCD1602_RS)):(GPIO_ResetBits(LCD1602_GPIO_PORT,LCD1602_RS))
- #define DB0 GPIO_Pin_0
- #define DB1 GPIO_Pin_1
- #define DB2 GPIO_Pin_2
- #define DB3 GPIO_Pin_3
- #define DB4 GPIO_Pin_4
- #define DB5 GPIO_Pin_5
- #define DB6 GPIO_Pin_6
- #define DB7 GPIO_Pin_7
- void LCD1602_Init(void);
- void LCD1602_ShowStr(uint8_t x, uint8_t y, uint8_t *str,uint8_t len);
- void LCD_ShowNum(uint8_t x, uint8_t y,uint8_t num);
- void LCD_ShowChar(uint8_t x, uint8_t y,uint8_t dat);
- #endif //_BSP_LCD1602_H
复制代码 这是.h文件
主函数里就是正常的初始化和显示命令。
- int main(void)
- {
- u8 smog_ppm ;
- u8 Methane_ppm ;
- u8 CO_ppm ;
-
-
- LCD1602_Init();
- userInit();
- window_fan_init();
- Bee_Init();
- delay_init();
- //TIM1_Int_Init(1999 , 35999);
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- USART1_init();
- Smog_Init();
- //LCD1602_Init();
- KEY_Init(); /
- Gizwits_Init(); /
-
-
- delay_ms(5);
- while(1)
- {
- LCD_ShowNum(0,0,99);
- }
- }
复制代码 我把程序烧进去了以后就只显示第一排的黑块。因为画PCB的时候没有接上K引脚的线,所以用手引了一根线出来。
我不知道我这是哪里的问题了,希望可以帮我指出来,谢谢各位。
|