LCD1602 STM32 四根數據線控制 除去電源線就是用6根數據線

#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);     //表示第一行
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);     //設置數據指針起點
}   






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章