本帖最后由 不吃番茄的菠菜 于 2017-1-16 11:32 编辑
#include "stm32f4xx.h"
#include "delay.h"
#include "12864.h"
#define u16 unsigned short
#define u8 unsigned char
/********** **************/
#define DisIO GPIOD
#define DisIO_C GPIOC
#define DisClk RCC_AHB1Periph_GPIOC
#define Data GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15
#define RS GPIO_Pin_8
#define RW GPIO_Pin_7
#define EN GPIO_Pin_6
/*****************************/
GPIO_InitTypeDef GPIOStru;
/**** 输出端口初始化 *********/
void IOInitOut(void)
{
//RS RW EN
RCC_AHB1PeriphClockCmd(DisClk,ENABLE); //RCC_AHB1Periph_GPIOC
GPIOStru.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式
GPIOStru.GPIO_OType = GPIO_OType_PP; // 推挽输出
GPIOStru.GPIO_PuPd=GPIO_PuPd_UP;
GPIOStru.GPIO_Speed = GPIO_Speed_100MHz;
GPIOStru.GPIO_Pin = RS|RW|EN;
GPIO_Init(DisIO_C,&GPIOStru); //初始化控制端口
// 背光PB15
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //使能时钟
GPIOStru.GPIO_Pin=GPIO_Pin_15;
GPIOStru.GPIO_Mode=GPIO_Mode_OUT; //普通输出模式
GPIOStru.GPIO_OType=GPIO_OType_PP; //推挽模式
GPIOStru.GPIO_PuPd=GPIO_PuPd_UP; //GPIO_PuPd_UP 上拉
GPIOStru.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOB,&GPIOStru); //初始化数据端口
//初始化数据口
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); //使能时钟
GPIOStru.GPIO_Pin=Data;
GPIOStru.GPIO_Mode=GPIO_Mode_OUT; //普通输出模式
GPIOStru.GPIO_OType=GPIO_OType_PP; //推挽模式
GPIOStru.GPIO_PuPd=GPIO_PuPd_UP; //GPIO_PuPd_UP 上拉
GPIOStru.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(DisIO,&GPIOStru); //初始化数据端口
}
/**** 输入端口初始化 *******/
void IOInitIn(void)
{
RCC_AHB1PeriphClockCmd(DisClk,ENABLE);
GPIOStru.GPIO_Mode = GPIO_Mode_IN; //GPIO_Mode_IN; //定义数据引脚为浮空输入的变量初始化
GPIOStru.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
GPIOStru.GPIO_Pin = Data;
GPIO_Init(DisIO,&GPIOStru);
}
/********* 检忙函数 *************/
void WaitBusy(void)
{
// IOInitIn();
GPIO_ResetBits(DisIO_C,RS); //RS = 0.
GPIO_SetBits(DisIO_C,RW); //RW = 1.
GPIO_SetBits(DisIO_C,EN); //EN = 1.
while(GPIO_ReadInputData(DisIO) & 0x0080); //0x0080 0010
GPIO_ResetBits(DisIO_C,EN); //EN = 0;
IOInitOut();
}
/********* 写命令*********************/
void WriteCmd(u8 cmd)
{
WaitBusy();
GPIO_ResetBits(DisIO_C,RS); //RS = 0.
GPIO_ResetBits(DisIO_C,RW); //RW = 0.
GPIO_SetBits(DisIO_C,EN); //EN = 1.
DisIO->ODR=((DisIO->ODR & 0xff00)|cmd);
delay_ms(2);
GPIO_ResetBits(DisIO_C,EN); //EN = 0;
delay_ms(2);
}
/********* 写数据 *********************/
void WriteData(u8 data)
{
WaitBusy();
GPIO_SetBits(DisIO_C,RS); //RS = 1.
GPIO_ResetBits(DisIO_C,RW); //RW = 0.
GPIO_SetBits(DisIO_C,EN); //EN = 1.
DisIO->ODR=((DisIO->ODR & 0xff00)|data); //00ff
delay_ms(10);
GPIO_ResetBits(DisIO_C,EN); //EN = 0;
delay_ms(10);
}
/***** 屏幕初始化 ****/
void InitDis(void)
{
IOInitOut();
delay_init(8);
GPIO_SetBits(GPIOB,GPIO_Pin_15);
delay_ms(20);
WriteCmd(0x30); //基本指令操作 和8位数据模式 30 0c
delay_ms(20);
WriteCmd(0x0c); //开显示 无游标 不反白 0c 30
delay_ms(20);
WriteCmd(0x01); //清除显示,并将DDRAM的地址计数器AC设为00H 01 80
delay_ms(20);
WriteCmd(0x06); //设置,外部读写数据后,地址计数器AC会自动加1 06 60
delay_ms(20);
WriteCmd(0x80); //将DDRAM地址计数器AC设为0 80 01
delay_ms(20);
}
/********* ****************/
void DisStr(u8 *s)
{
while(*s != ' ')
{
WriteData(*s);
s++;
delay_ms(5);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>