您的位置:首页 > 其它

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);     //设置数据指针起点

}   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息