/****************************************************************
【文 件 名 称】lcd12864.h
【功 能 描 述】lcd12864 头文件
【 作 者 】shifu
*****************************************************************/
#ifndef __LCD12864_H
#define __LCD12864_H
//****************************************************************
#include "stm32f10x_gpio.h"
//*****************************************************************
//管脚定义
#define PIN_RS (1<<4)
#define PIN_RW (1<<6)
#define PIN_EN (1<<7)
#define GPIO_LCD GPIOB
#define RCC_APB2Periph_GPIO_LCD RCC_APB2Periph_GPIOB
//寄存器选择
#define LCD_RS(x) GPIO_LCD->ODR = ( GPIO_LCD->ODR & ~PIN_RS ) | (x ? PIN_RS : 0)
//读/写控制
#define LCD_RW(x) GPIO_LCD->ODR = ( GPIO_LCD->ODR & ~PIN_RW ) | (x ? PIN_RW : 0)
//使能
#define LCD_EN(x) GPIO_LCD->ODR = ( GPIO_LCD->ODR & ~PIN_EN ) | (x ? PIN_EN : 0)
//复位 低电平复位
#define LCD_Cmd 0x00
#define LCD_Data 0x01
//DB7 busy信号位控制 //PB15 CRH的最高4bit为控制位,=0x33... out =0x44...in
#define LCD_DB7_IN GPIO_LCD->CRH = (GPIO_LCD->CRH & 0x0fffffff)|0x40000000
#define LCD_DB7_OUT GPIO_LCD->CRH = (GPIO_LCD->CRH & 0x0fffffff)|0x30000000
//********************函数声明************************************
void LCD_Port_Config(void);
void LCD_Init(void);
void LCD_Write(uint8_t ctrl, uint8_t cmddata);
void LCD_Dis_Str(u8 row, u8 col, u8 *str);
void LCD_Dis_Digital(u8 row, u8 col,u32 Dig_Data);
void LCD_Clear(void);
void LCD_Reset(void);
void LCD_Dis_Frame(void);
void LCD_Clear_GDRAM(void);
void LCD_Clear_Graphics(u8 row, u8 col, u8 row_Pixel, u8 col_Pixel);
void LCD_Dis_Graphics(u8 row, u8 col, u8 row_Pixel, u8 col_Pixel, u8 *Dis_Data);
void LCD_Delay(uint8_t );
/*****************************************************************
液晶模块指令集定义
*****************************************************************
0x01 //清显示指令
0x06 //设置输入模式
0x0c //设置开显控制
0x30 //功能设定(基本指令)
0x34 //功能设定(扩充指令)
0x36 //打开绘图(扩充指令)
*****************************************************************/
#endif
/****************************************************************************
【文 件 名 称】lcd12864.c
【功 能 描 述】lcd12864 驱动
【 作 者 】shifu
****************************************************************************/
/**************************************************************************/
#include "lcd12864.h"
#include "stm32f10x.h"
/****************************************************************************
【功能说明】用于延时,72Mhz下,约延时1Ms
****************************************************************************/
void LCD_Delay(uint8_t x)
{
uint32_t i;
while(x>0)
{
for(i=0;i<0x2000;i++);
x--;
};
}
/****************************************************************************
【功能说明】I/O端口功能、方向设定
****************************************************************************/
void LCD_Port_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能端口时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_LCD, ENABLE);
/* 配置所用管脚为推挽输出,端口速度为50MHz*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6 | GPIO_Pin_7 | 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(GPIO_LCD, &GPIO_InitStructure);
}
/****************************************************************************
【功能说明】 LCD并口输出数据
入口参数 输出使用PB8-PB15
****************************************************************************/
void LCD_Parallel_Out(uint8_t value)
{
unsigned char tValue;
tValue=~value;
GPIO_LCD->BSRR=(unsigned int)value<<8; //使用高8位输出
GPIO_LCD->BRR=(unsigned int)tValue<<8; //使用高8位输出
//GPIO_LCD->BSRR=(unsigned int)value; //使用低8位输出
//GPIO_LCD->BRR=(unsigned int)tValue; //使用低8位输出
}
/****************************************************************************
【功能说明】 LCD写字节函数
入口参数 ctrl=cmd/data: 命令/数据标志(data:写显示数据 cmd:写控制指令)
cmddata : 命令/数据字节
写指令 RW=0 RS=0 EN上升沿
写数据 RW=0 RS=1 EN上升沿
****************************************************************************/
void LCD_Write(uint8_t ctrl, uint8_t cmddata)
{
LCD_DB7_IN; //准备读取忙标志
LCD_RS(0);
LCD_RW(1);
LCD_EN(1);
LCD_Delay(1);
while(GPIO_ReadInputDataBit(GPIO_LCD,GPIO_Pin_15)); //获取忙标志
LCD_DB7_OUT; //恢复到输出状态
LCD_EN(0); //拉低,准备产生上升沿
LCD_RW(0); // write RW=0
if (ctrl==LCD_Cmd)
LCD_RS(0); // Cmd RS=0
else
LCD_RS(1); //data RS=1
LCD_Delay(1);
LCD_Parallel_Out(cmddata);
LCD_Delay(1);
LCD_EN(1); //上升沿
LCD_Delay(1);
LCD_EN(0); //归位
}
/****************************************************************************
【功能说明】
LCD字符串显示函数:void LCD_Dis_Str(u8 x, u8 y, u8 *str);
入口参数 row: 字符串起始显示位置的行
col: 字符串起始显示位置的列
str: 指向待显示字符串的字符指针,字符串以'\0'结尾
注:CGRAM 与中文字型的编码只能出现在adress counter 的起始位
DDRAM 8*16 字节的空间
Line1 80H 81H 82H 83H 84H 85H 86H 87H
Line2 90H 91H 92H 93H 94H 95H 96H 97H
Line3 88H 89H 8AH 8BH 8CH 8DH 8EH 8FH
Line4 98H 99H 9AH 9BH 9CH 9DH 9EH 9FH
Line5 A0H A1H A2H A3H A4H A5H A6H A7H
Line6 B0H B1H B2H B3H B4H B5H B6H B7H
Line7 A8H A9H AAH ABH ACH ADH AEH AFH
Line8 B8H B9H BAH BBH BCH BDH BEH BFH
****************************************************************************/
void LCD_Dis_Str(u8 row, u8 col, u8 *str)
{
u8 addr, i = 0;
//防止误操作(调试)
// if(row > 3) row = 3;
// if(col > 7) col = 7;
//根据x,y坐标确定显示缓冲区地址
switch(row)
{
case 0: addr = 0x80 + col; break;
case 1: addr = 0x90 + col; break;
case 2: addr = 0x88 + col; break;
case 3: addr = 0x98 + col; break;
}
//设置DDRAM地址
LCD_Write(LCD_Cmd, addr);
while(*str)
{
//下一行:从设置好的DDRAM地址开始写字符并准备好指向下一个字符的指针
LCD_Write(LCD_Data, *str++);
i++;
if(i==2)
{
i = 0;
//每写俩字节DDRAM地址会自动增量,跟踪DDRAM的地址变化,以便换行调整
addr++;
//当addr=88H,90H,98H,a0H时,说明DRAM地址需要重新指定
if( (addr&0x07) == 0 )
{
switch(addr)
{
case 0x88: addr = 0x90; break;
case 0x98: addr = 0x88; break;
case 0x90: addr = 0x98; break;
case 0xa0: addr = 0x80; break;
}
//设置被重新指定了的DDRAM地址
LCD_Write(LCD_Cmd, addr);
}
}
}
}
/****************************************************************************
【功能说明】 LCD 清屏
****************************************************************************/
void LCD_Clear(void)
{
LCD_Write(LCD_Cmd, 0x01);
LCD_Delay(5);
}
/****************************************************************************
【功能说明】 LCD 重启
****************************************************************************/
/*void LCD_Reset(void)
{
LCD_RET(0);
LCD_Delay(50);
LCD_RET(1);
LCD_Delay(100);
} */
/****************************************************************************
【功能说明】 初始化LCD子程序
****************************************************************************/
void LCD_Init(void)
{
//端口配置
LCD_Port_Config();
//LCD复位
// LCD_Reset();
//基本指令集 8位数据
LCD_Write(LCD_Cmd,0x30);
LCD_Del