现在STM32越来越流行,在学校搞的很火,本人最近也在学习,做了一个LCD19264的程序,先与大家分享,多谢关注!
本程序是有LCD12864该进的,液晶驱动为ST7920。可以稍微改动即可用于12864
一、以下是LCD19264头文件
////////////////////////////////////////////////////////////////////////////////
/*******************************************************************************
* 函数功能:STM32F103VET6 19264-1液晶显示 ,串---并口19264 * 编写时间:2012.07.22 * 作 者:ZhouGanJin * 版 本:V1.1
* 液晶19264-1简介: 并口不多说;串口引脚4根 RW(SID),E1(CLK1),E2(CLK2),PSB=0, RS(CS)=1,
* 通过预编译选择串并口方式
*******************************************************************************/
#ifndef _LCD19264_H #define _LCD19264_H
/* 端口定义 --------------------------- 本程序只用了GPIOA -----------------------------------*/ /* 函数申明 ---------------------
STM32配置和19264函数声明 -------------------------------*/
#define LCD_RS_H
GPIO_SetBits(GPIOA, GPIO_Pin_0) //GPIOA->BSRR=GIOP_pin_0
#define LCD_RS_L GPIO_ResetBits(GPIOA, GPIO_Pin_0) //GPIOA->BRR=GIOP_pin_0 #define LCD_RW_H GPIO_SetBits(GPIOA, GPIO_Pin_1) #define LCD_RW_L GPIO_ResetBits(GPIOA, GPIO_Pin_1) #define LCD_E1_H GPIO_SetBits(GPIOA, GPIO_Pin_2) #define LCD_E1_L GPIO_ResetBits(GPIOA, GPIO_Pin_2) #define LCD_E2_H GPIO_SetBits(GPIOA, GPIO_Pin_3) #define LCD_E2_L GPIO_ResetBits(GPIOA, GPIO_Pin_3) #define LCD_PSB_H GPIO_SetBits(GPIOA, GPIO_Pin_4)
#define LCD_PSB_L GPIO_ResetBits(GPIOA, GPIO_Pin_4)
#define LCD_DATA_PORT GPIOD
#define LCD_DATA GPIOD->BSRR
//BSRR高十六位是复位,低十六位是置位
void Lcm_Wr_Dat(u8 wrdata,u8 enable); //写数据
void Lcm_Wr_Com(u8 wrcommand,u8 enable); //写指令 void Lcm_Rd_Status(u8 enable);//读忙状态
void Lcm_Init(u8 enable); //液晶初始化
void Lcm_GotoXY(u8 pos_X,u8 pos_y); //设定坐标 void Lcm_SETXY(u8 pos_X,u8 pos_y,u8 enable);
void Lcm_Disp_Char(u8 onechar,u8 enable);//显示单个字符
void Lcm_Disp_Char_setxy(u8 x,u8 y,u8 ch,u8 enable); //定坐标显示单个字符 void Lcm_Disp_Str(u8 *string,u8 enable);//显示字符串
void Lcm_Disp_Str_setxy(u8 x,u8 y,u8 *strings,u8 enable);//定坐标显示字符串
void Delay_ms(u32 m);//1ms延时 void Lcm_Delay(void);
/*function all ------函数定义-------------
以下函数包含19264液晶的串并行方式 ----------------------------------------*/
#define PSB_SERIAL 0 #ifdef PSB_SERIAL
// -------以下为串口函数-------- serial transmission------/// //-----------传送8bits 数据----
void Send_byte(u8 bbyte,u8 enable) {
u8 i;
for(i=0;i<8;i++) {
LCD_E1_L; LCD_E2_L;
if(0x80&bbyte) LCD_RW_H;
else LCD_RW_L; if(!enable)
//CLK = 01
; 串行用下降沿
//SID=1;
}
{ } else { }
bbyte<<=1;
//?
LCD_E2_H; Lcm_Delay(); LCD_E2_L;
LCD_E1_H; Lcm_Delay(); LCD_E1_L;
Lcm_Delay(); }
//-----------写指令函数 ----
void Lcm_Wr_Com(u8 wcomd,u8 enable) {
Lcm_Delay(); Send_byte(0xf8,enable); //1111_1,RW(0),RS(0),0 -----------指令 }
Send_byte(0xf0&wcomd,enable); //high 4bits Send_byte(0xf8&(wcomd<<4),enable); //low 4bits
//-----------写数据函数 ----
void Lcm_Wr_Dat(u8 wdata,u8 enable) {
Lcm_Delay(); Send_byte(0xfa,enable); //1111_1,RW(0),RS(1),0 ---------数据 Send_byte(0xf0&wdata,enable); //high 4bits }
Send_byte(0xf8&(wdata<<4),enable); //low 4bits
#else
// -------以下为并口函数-------- parallel Transmission-------///
//---------读忙函数----------------
void Lcm_Rd_Status(u8 enable) {
u16 getd;
while(1) {
Lcm_Delay();
}
LCD_RS_L; //命令
LCD_RW_H; //读取 Lcm_Delay();
//LCD_DATA=0xFFFF0000; //LCD_DATA=0xFF; 高16位为复位,即写入0使其不忙 GPIO_Write(LCD_DATA_PORT, 0XFFFF) ; //准备读取数据 , 写0x0000则与上相同 Lcm_Delay(); }
if(!enable) { }
LCD_E1_L; Lcm_Delay(); LCD_E1_H;
getd=GPIO_ReadInputData(LCD_DATA_PORT); if((getd&0x0080)==0) break;
else { LCD_E2_L; }
Lcm_Delay(); LCD_E2_H;
if((getd&0x0080)==0) break;
//-----写指令----------------
void Lcm_Wr_Com(u8 wcomd,u8 enable) {
Lcm_Rd_Status(enable); Lcm_Delay(); LCD_RS_L; Lcm_Delay(); LCD_RW_L; Lcm_Delay();
LCD_DATA=wcomd|(~wcomd<<16); Lcm_Delay(); if(!enable) {
LCD_E1_H; Lcm_Delay(); LCD_E1_L;
//
}
else { LCD_E2_H; Lcm_Delay(); }
LCD_E2_L;
// Lcm_Delay(); }
//------写数据----------------
void Lcm_Wr_Dat(u8 wdata,u8 enable) { }
Lcm_Rd_Status(enable); Lcm_Delay(); LCD_RS_H; Lcm_Delay(); LCD_RW_L; Lcm_Delay();
LCD_DATA=wdata|(~wdata<<16); Lcm_Delay(); if(!enable) { LCD_E1_H; Lcm_Delay(); }
LCD_E1_L;
else { LCD_E2_H; }
Lcm_Delay(); LCD_E2_L;
#endif
//----选定坐标,全屏选择---------- void Lcm_GotoXY(u8 pos_x,u8 pos_y) {
u8 addr;
if((pos_x>11)||(pos_y>1)) return;