這個是我寫的程式,沒有顯示,剛剛開始學的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);
}
}
}
uj5u.com熱心網友回復:
我自己找了一下午都不知道問題出在哪,希望有人幫幫忙uj5u.com熱心網友回復:
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位定義不對
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/50488.html
標籤:單片機/工控
