LCD1602 STM32 四根数据线控制 除去电源线就是用6根数据线
2016-01-09 19:30
309 查看
#ifndef _LCD1602_H
#define _LCD1602_H
#include"stm32f10x.h"
#define RS_H GPIO_SetBits(GPIOC,GPIO_Pin_4)
#define RS_L GPIO_ResetBits(GPIOC,GPIO_Pin_4)
#define EN_H GPIO_SetBits(GPIOC,GPIO_Pin_5)
#define EN_L GPIO_ResetBits(GPIOC,GPIO_Pin_5)
/*************************************************/
/*LCD1602指令集*/
/*************************************************/
#define CMD_clear
0x01 //清除屏幕
#define CMD_back
0x02 //光标归位
#define CMD_lift
0x04 //读数据后光标左移
#define CMD_right
0x06 //读数据后光标右移
#define CMD_dis_gb_ss
0x0f //开显示、开光标、开闪烁
#define CMD_dis_gb
0x0e //开显示、开光标
#define CMD_dis
0x0c //开显示
#define CMD_off
0x08 //关显示、关光标、关闪烁
#define CMD_set82
0x38 //8位总线2行显示
#define CMD_set81
0x30 //8位总线1行显示
(上边行)
#define CMD_set42
0x28 //4位总线2行显示
#define CMD_set41
0x20 //4位总线1行显示
(上边行)
#define lin_1
0x80 //4位总线1行显示
(上边行)
#define lin_2
0xc0 //4位总线1行显示
(上边行)
void LCD_GPIO_Config(void);
void LCD1602_WriteCMD(u8 cmd);
void LCD1602_WriteData(u8 data);
void LCD1602_Clear(void);
void LCD1602_WriteString(u8 L,u8 H,u8 *s);
void LCD1602_WriteChar(u8 L,u8 H,u8 Data);
void LCD1602_WriteNum(u8 L,u8 H,u8 Data);
void LCD1602_init(void) ;
#endif
/*显示部分为LCD1602液晶,为了节约I\O线,使用四根数据线通信,外加RS数据命令选择和EN是能信号
将数据线控制为六根线,大大节约了I\O口。
*/
#include "stm32f10x.h"
#include "lcd1602.h"
#include "systick.h" //延时函数头文件
u8 tab[10]={'0','1','2','3','4','5','6','7','8','9'};
/*******************************
LCD1602引脚初始化
**********************************/
void LCD_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
/*************************************************
写入命令函数
*************************************************/
void LCD1602_WriteCMD(u8 cmd)
{
u8 i;
delay_ms(2);
RS_L;
for(i=0;i<2;i++)
{
EN_H;
GPIO_ResetBits(GPIOC,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11);
if(cmd&0x80) GPIO_SetBits(GPIOC,GPIO_Pin_11);
if(cmd&0x40) GPIO_SetBits(GPIOC,GPIO_Pin_10);
if(cmd&0x20) GPIO_SetBits(GPIOC,GPIO_Pin_9);
if(cmd&0x10) GPIO_SetBits(GPIOC,GPIO_Pin_8);
delay_ms(5);
EN_L;
cmd=cmd<<4;
}
}
/*************************************************
写入数据函数
*************************************************/
void LCD1602_WriteData(u8 data)
{
u8 i;
delay_ms(2);
RS_H;
for(i=0;i<2;i++)
{
EN_H;
GPIO_ResetBits(GPIOC,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11);
if(data&0x80) GPIO_SetBits(GPIOC,GPIO_Pin_11);
if(data&0x40) GPIO_SetBits(GPIOC,GPIO_Pin_10);
if(data&0x20) GPIO_SetBits(GPIOC,GPIO_Pin_9);
if(data&0x10) GPIO_SetBits(GPIOC,GPIO_Pin_8);
delay_ms(5);
EN_L;
data=data<<4;
}
}
/*************************************************
清屏函数
*************************************************/
void LCD1602_Clear(void)
{
LCD1602_WriteCMD(0x01);
delay_ms(5);
}
/*************************************************
写入字符串函数
*************************************************/
void LCD1602_WriteString(u8 L,u8 H,u8 *s)
{
if (H==0)
LCD1602_WriteCMD(lin_1 + L); //表示第一
4000
行
else
LCD1602_WriteCMD(lin_2 + L); //表示第二行
while (*s)
{
LCD1602_WriteData( *s);
s ++;
}
}
/*************************************************
写入字符函数
*************************************************/
void LCD1602_WriteChar(u8 L,u8 H,u8 Data)
{
if (H==0)
LCD1602_WriteCMD(lin_1+L);
else
LCD1602_WriteCMD(lin_2+L);
LCD1602_WriteData( Data);
}
/*************************************************
写入字符函数
*************************************************/
void LCD1602_WriteNum(u8 L,u8 H,u8 Data)
{
u8 bai,shi,ge;
bai=Data%1000/100;
shi=Data%100/10;
ge=Data%10;
if (H==0)
LCD1602_WriteCMD(lin_1+L);
else
LCD1602_WriteCMD(lin_2+L);
LCD1602_WriteData(tab[bai]);
LCD1602_WriteData(tab[shi]);
LCD1602_WriteData(tab[ge]);
}
/*************************************************
初始化函数
*************************************************/
void LCD1602_init(void)
{
LCD_GPIO_Config();
LCD1602_WriteCMD(0X32); //将8位总线转为4位总线
LCD1602_WriteCMD(CMD_set42); //在四位线下的初始化
LCD1602_WriteCMD(CMD_dis); //开显示不显示光标
LCD1602_WriteCMD(CMD_right); //写一个指针加1
LCD1602_WriteCMD(CMD_clear); //清屏
LCD1602_WriteCMD(lin_1); //设置数据指针起点
}
#define _LCD1602_H
#include"stm32f10x.h"
#define RS_H GPIO_SetBits(GPIOC,GPIO_Pin_4)
#define RS_L GPIO_ResetBits(GPIOC,GPIO_Pin_4)
#define EN_H GPIO_SetBits(GPIOC,GPIO_Pin_5)
#define EN_L GPIO_ResetBits(GPIOC,GPIO_Pin_5)
/*************************************************/
/*LCD1602指令集*/
/*************************************************/
#define CMD_clear
0x01 //清除屏幕
#define CMD_back
0x02 //光标归位
#define CMD_lift
0x04 //读数据后光标左移
#define CMD_right
0x06 //读数据后光标右移
#define CMD_dis_gb_ss
0x0f //开显示、开光标、开闪烁
#define CMD_dis_gb
0x0e //开显示、开光标
#define CMD_dis
0x0c //开显示
#define CMD_off
0x08 //关显示、关光标、关闪烁
#define CMD_set82
0x38 //8位总线2行显示
#define CMD_set81
0x30 //8位总线1行显示
(上边行)
#define CMD_set42
0x28 //4位总线2行显示
#define CMD_set41
0x20 //4位总线1行显示
(上边行)
#define lin_1
0x80 //4位总线1行显示
(上边行)
#define lin_2
0xc0 //4位总线1行显示
(上边行)
void LCD_GPIO_Config(void);
void LCD1602_WriteCMD(u8 cmd);
void LCD1602_WriteData(u8 data);
void LCD1602_Clear(void);
void LCD1602_WriteString(u8 L,u8 H,u8 *s);
void LCD1602_WriteChar(u8 L,u8 H,u8 Data);
void LCD1602_WriteNum(u8 L,u8 H,u8 Data);
void LCD1602_init(void) ;
#endif
/*显示部分为LCD1602液晶,为了节约I\O线,使用四根数据线通信,外加RS数据命令选择和EN是能信号
将数据线控制为六根线,大大节约了I\O口。
*/
#include "stm32f10x.h"
#include "lcd1602.h"
#include "systick.h" //延时函数头文件
u8 tab[10]={'0','1','2','3','4','5','6','7','8','9'};
/*******************************
LCD1602引脚初始化
**********************************/
void LCD_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
/*************************************************
写入命令函数
*************************************************/
void LCD1602_WriteCMD(u8 cmd)
{
u8 i;
delay_ms(2);
RS_L;
for(i=0;i<2;i++)
{
EN_H;
GPIO_ResetBits(GPIOC,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11);
if(cmd&0x80) GPIO_SetBits(GPIOC,GPIO_Pin_11);
if(cmd&0x40) GPIO_SetBits(GPIOC,GPIO_Pin_10);
if(cmd&0x20) GPIO_SetBits(GPIOC,GPIO_Pin_9);
if(cmd&0x10) GPIO_SetBits(GPIOC,GPIO_Pin_8);
delay_ms(5);
EN_L;
cmd=cmd<<4;
}
}
/*************************************************
写入数据函数
*************************************************/
void LCD1602_WriteData(u8 data)
{
u8 i;
delay_ms(2);
RS_H;
for(i=0;i<2;i++)
{
EN_H;
GPIO_ResetBits(GPIOC,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11);
if(data&0x80) GPIO_SetBits(GPIOC,GPIO_Pin_11);
if(data&0x40) GPIO_SetBits(GPIOC,GPIO_Pin_10);
if(data&0x20) GPIO_SetBits(GPIOC,GPIO_Pin_9);
if(data&0x10) GPIO_SetBits(GPIOC,GPIO_Pin_8);
delay_ms(5);
EN_L;
data=data<<4;
}
}
/*************************************************
清屏函数
*************************************************/
void LCD1602_Clear(void)
{
LCD1602_WriteCMD(0x01);
delay_ms(5);
}
/*************************************************
写入字符串函数
*************************************************/
void LCD1602_WriteString(u8 L,u8 H,u8 *s)
{
if (H==0)
LCD1602_WriteCMD(lin_1 + L); //表示第一
4000
行
else
LCD1602_WriteCMD(lin_2 + L); //表示第二行
while (*s)
{
LCD1602_WriteData( *s);
s ++;
}
}
/*************************************************
写入字符函数
*************************************************/
void LCD1602_WriteChar(u8 L,u8 H,u8 Data)
{
if (H==0)
LCD1602_WriteCMD(lin_1+L);
else
LCD1602_WriteCMD(lin_2+L);
LCD1602_WriteData( Data);
}
/*************************************************
写入字符函数
*************************************************/
void LCD1602_WriteNum(u8 L,u8 H,u8 Data)
{
u8 bai,shi,ge;
bai=Data%1000/100;
shi=Data%100/10;
ge=Data%10;
if (H==0)
LCD1602_WriteCMD(lin_1+L);
else
LCD1602_WriteCMD(lin_2+L);
LCD1602_WriteData(tab[bai]);
LCD1602_WriteData(tab[shi]);
LCD1602_WriteData(tab[ge]);
}
/*************************************************
初始化函数
*************************************************/
void LCD1602_init(void)
{
LCD_GPIO_Config();
LCD1602_WriteCMD(0X32); //将8位总线转为4位总线
LCD1602_WriteCMD(CMD_set42); //在四位线下的初始化
LCD1602_WriteCMD(CMD_dis); //开显示不显示光标
LCD1602_WriteCMD(CMD_right); //写一个指针加1
LCD1602_WriteCMD(CMD_clear); //清屏
LCD1602_WriteCMD(lin_1); //设置数据指针起点
}
相关文章推荐
- STM32 IO口双向问题
- 使用CMake来构建STM32工程
- Keil STM32工程环境搭建
- stm32之RTC
- STM32串口操作相关事项
- 【eBox生态圈】连载一:简化STM32的编程之eBox生态圈
- STM32 SPI工作在主模式时用DMA方式接收数据
- STM32 配置定时器让引脚输出PWM波形
- [嵌入式裸机课程]Cortex-M3开发实训班
- 开源硬件:最好编程的STM32开发板
- stm32的1602操作显示
- STM32 UART DMA实现未知数据长度接收(转自amoBBs)
- STM32F429 LTDC学习笔记1
- stm32学习笔记---入门环境搭建及开发板的选用
- stm32f407使用OV7725使用迭代阈值法进行图像二值化,图像分割
- stm32中断服务函数的机制
- pc寄存器与可寻址空间
- 关于STM32 库函数3.5版的各种坑
- STM32 Printf函数实现方法 (转载)
- STM32 IAP