本帖最后由 zhangjw258 于 2018-10-29 19:52 编辑
先贴电路图:
再贴头文件1602.h:
#ifndef __1602_H
#define __1602_H
#include "stm32f10x.h"
// 端口A
#define E GPIO_Pin_11 //GPIOA
#define RS GPIO_Pin_12
#define RW GPIO_Pin_15
/* 常量定义 */
#define SETMODE 0x38 //16*2显示,5*7点阵,8位数据接口
#define DISOPEN 0x0C //显示开,不显示光标,光标不闪烁
#define DISMODE 0x06 //读写字符后地址加1,屏显不移动
#define SETADDR 0x80 //设置数据地址指针初始值
#define CLEAR 0x01 //清屏,数据指针清零
#define RET 0x02 //回车,数据指针清零
void test_1602_GPIO_Config(void);
void Init1602(void);
void Write1602_One_Dat(uint16_t x, uint16_t y, uint16_t dat);
void Write1602_Str(uint8_t addr, uint8_t length, uint8_t *pbuf); //写一个数据串
#endif /* __1602_H */
然后贴上源文件1602.c:
#include "1602.h"
#include "systick.h"
void test_1602_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启1602相关的GPIO外设时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //开AFIO时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_15;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/************************************************
功能:写命令
参数:写入命令
返回:无
************************************************/
void Write1602_Com(uint16_t com)
{
GPIO_ResetBits(GPIOA, E);
SysTick_Delay_ms(1);
GPIO_ResetBits(GPIOA, RS);
SysTick_Delay_ms(1);
GPIO_Write(GPIOB, (com << 8)); //端口赋值
SysTick_Delay_ms(1);
GPIO_SetBits(GPIOA, E); //高脉冲
SysTick_Delay_ms(1);
GPIO_ResetBits(GPIOA, E);
}
/************************************************
功能:写数据
参数:写入数据
返回:无
************************************************/
void Write1602_Dat(uint16_t dat)
{
GPIO_ResetBits(GPIOA, E);
SysTick_Delay_ms(1);
GPIO_SetBits(GPIOA, RS);
SysTick_Delay_ms(1);
GPIO_Write(GPIOB, (dat << 8)); //端口赋值
SysTick_Delay_ms(1);
GPIO_SetBits(GPIOA, E); //高脉冲
SysTick_Delay_ms(1);
GPIO_ResetBits(GPIOA, E);
}
/************************************************
功能:初始化1602
参数:无
返回:无
************************************************/
void Init1602(void)
{
Write1602_Com(SETMODE); //模式设置
SysTick_Delay_ms(1);
Write1602_Com(DISOPEN); //显示设置
SysTick_Delay_ms(1);
Write1602_Com(DISMODE); //显示模式
SysTick_Delay_ms(1);
Write1602_Com(CLEAR); //清屏
}
/************************************************
功能:写一个数据
参数:x = 列,y = 行,dat = 值
返回:无
注意:x取值0 -- 15,y取值0 -- 1
************************************************/
void Write1602_One_Dat(uint16_t x, uint16_t y, uint16_t dat)
{
x &= 0x0f;
y &= 0x01;
if(y)
x |= 0x40;
x |= 0x80;
Write1602_Com(x);
SysTick_Delay_ms(1);
Write1602_Dat(dat);
}
/************************************************
功能:写一个数据串
参数:addr=起始地址(如0x80),length=串长度,
pbuf=串指针
返回:无
************************************************/
void Write1602_Str(uint8_t addr, uint8_t length, uint8_t *pbuf)
{
uint8_t i;
Write1602_Com(addr);
for(i = 0; i < length; i++)
{
Write1602_Dat(pbuf);
}
}
还有两个文件systick.h和systick.c:
#ifndef __SYSTICK_H
#define __SYSTICK_H
#include "stm32f10x.h"
#include "core_cm3.h"
void SysTick_Delay_us(uint32_t us);
void SysTick_Delay_ms(uint32_t ms);
#endif /* _SYSTICK_H */
#include "systick.h"
void SysTick_Delay_us(uint32_t us)
{
uint32_t i;
SysTick_Config(72);
for(i = 0; i < us; i++)
{
while(!((SysTick -> CTRL) & (1 << 16)));
}
SysTick -> CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
void SysTick_Delay_ms(uint32_t ms)
{
uint32_t i;
SysTick_Config(72000);
for(i = 0; i < ms; i++)
{
while(!((SysTick -> CTRL) & (1 << 16)));
}
SysTick -> CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
最后是测试用的main.c文件:
#include "1602.h"
int main()
{
test_1602_GPIO_Config();
GPIO_ResetBits(GPIOA, RW);
Init1602();
Write1602_Str(0x80, 16, "Welcome to zhang");
while(1);
}
说明一下:
端口A的pin11,pin12,pin15分别接E,RS,RW
端口B的pin8~pin15接D0~D7
VDD接+5V
本以为有了51的经验,这个应该很容易,却不料也发现了这样或那样的问题.最主要的就是端口A的Pin15脚.
不过这也使我学习到了很多东西.试验结果当然是成功的.图懒得贴了.内容慢慢体会吧!
|
这个不难的,跟51一样,写时序和读时序出来就好啦