📄 use_12864_driver.c
字号:
/*****************************************************************
* 函数库名称:12864液晶驱动函数库 *
* 版本: v0.01 *
* 作者: I ROBOT *
* 创建日期: Copyright (C) 2008年10月14日 *
*----------------------------------------------------------------*
* [支持库] *
* 支持库名称:USE_12864.h(12864液晶驱动配置库) *
* 支持库版本:v0.01 *
* 支持库说明:配置AVR端口与12864的数据和控制端口相匹配 *
*----------------------------------------------------------------*
* [版本更新] *
* 更新: I ROBOT *
* 更新日期: *
* 版本: *
*----------------------------------------------------------------*
* [版本历史] *
* v0.01 创建版本,12864基本驱动函数 *
*----------------------------------------------------------------*
* [使用说明] *
* 1.直接调用库中的驱动函数 *
*****************************************************************/
/********************
* 头 文 件 配 置 区 *
********************/
# include "USE_12864_Driver.h"
/********************
* 系 统 宏 定 义 *
********************/
/*------------------*
* 常 数 宏 定 义 *
*------------------*/
/*------------------*
* 动 作 宏 定 义 *
*------------------*/
/********************
* 模块结构体定义区 *
********************/
/********************
* 函 数 声 明 区 *
********************/
void _12864_Hardware_Configure(void);
static void MCU_Register_Configure(void);
static void MCU_Port_Configure(void);
static void Is_Busy_12864(void);
static void Write_CMD_12864(UINT8 chCommand);
static void Write_Data_12864(UINT8 chData);
BOOL Dot_Is_Exist_12864(UINT8 chx,UINT8 chy);
void LCD_Init_12864(void);
void Clear_LCD_12864(void);
void Draw_Dot_12864(UINT8 chx,UINT8 chy);
void Clear_Dot_12864(UINT8 chx,UINT8 chy);
/********************
* 模块函数声明区 *
********************/
/********************
* 模块变量声明区 *
********************/
/********************
* 全局变量声明区 *
********************/
static UINT8 LCD_Buffer[8][128] = {0};
/******************************************************************
* 函 数 定 义 区 *
******************************************************************/
/****************************************
* 函数说明: 12864硬件配置函数 *
* 输入 :无 *
* 输出 :无 *
* 调用函数: 无 *
****************************************/
void _12864_Hardware_Configure(void)
{
//TODO:在这里添加12864硬件配置代码
MCU_Register_Configure();
MCU_Port_Configure();
LCD_Init_12864();
Delay_nMS(1);
Clear_LCD_12864();
Delay_nMS(1);
}
/****************************************
* 函数说明: MCU寄存器配置函数 *
* 输入 :无 *
* 输出 :无 *
* 调用函数: 无 *
****************************************/
static void MCU_Register_Configure(void)
{
//TODO:在这里添加MCU寄存器配置代码
}
/****************************************
* 函数说明: MCU端口配置函数 *
* 输入 :无 *
* 输出 :无 *
* 调用函数: 无 *
****************************************/
static void MCU_Port_Configure(void)
{
//TODO:在这里添加MCU端口配置代码
P3DIR |= BIT0| BIT1| BIT2; //CS1,CS2,RET
P3OUT |= BIT0| BIT1| BIT2;
P1DIR |= BIT5| BIT6| BIT7; //RS,RW,E
P1OUT |= BIT5| BIT6;
P1OUT &= ~BIT7;
P2DIR &= 0x00; //DB0-DB7
P2OUT |= 0xff;
}
/****************************************
* 函数说明: 12864忙状态检测函数 *
* 输入 :无 *
* 输出 :无 *
* 调用函数: 无 *
****************************************/
static void Is_Busy_12864(void)
{
WRITE_12864_E_LOW;
//E = LOW,释放总线,防止误操作
WRITE_12864_RS_LOW;
WRITE_12864_RW_HIGH;
//设置地址为读状态
WRITE_12864_E_HIGH;
//使能总线,高电平读取状态
DATA_FROM_12864;
//设置AVR端口为读
NOP_DELAY;
//延时等待AVR端口稳定
while (READ_12864_DATA_ & _12864_BUSY);
//忙状态
WRITE_12864_E_LOW;
//释放总线
}
/****************************************
* 函数说明: 12864写指令函数 *
* 输入 :12864指令码 *
* 输出 :无 *
* 调用函数: Is_Busy_12864() *
****************************************/
static void Write_CMD_12864(UINT8 chCommand)
{
Is_Busy_12864();
//检测忙状态
WRITE_12864_E_LOW;
//释放总线
WRITE_12864_RS_LOW;
WRITE_12864_RW_LOW;
//设置地址为写指令
_12864_DATA_FROM_MCU;
//设置AVR端口为写
NOP_DELAY;
//延时等待AVR端口稳定
WRITE_12864_DATA_ = chCommand;
//填写指令
WRITE_12864_E_HIGH;
WRITE_12864_E_LOW;
//下降沿写指令,释放总线
}
/****************************************
* 函数说明: 12864写数据函数 *
* 输入 :12864显示数据 *
* 输出 :无 *
* 调用函数: Is_Busy_12864() *
****************************************/
static void Write_Data_12864(UINT8 chData)
{
Is_Busy_12864();
//检测忙状态
WRITE_12864_E_LOW;
//释放总线
WRITE_12864_RS_HIGH;
WRITE_12864_RW_LOW;
//设置地址为写数据
_12864_DATA_FROM_MCU;
//设置AVR端口为写
NOP_DELAY;
//延时等待AVR端口稳定,一个指令周期的延时
WRITE_12864_DATA_ = chData;
//填写数据
WRITE_12864_E_HIGH;
WRITE_12864_E_LOW;
//下降沿写数据*/
}
/****************************************
* 函数说明: 点存在检测函数 *
* 输入 :(chx,chy)(点XY) *
* 输出 :TRUE/FALSE *
* 调用函数: *
****************************************/
BOOL Dot_Is_Exist_12864(UINT8 chx,UINT8 chy)
{
UINT8 chPage_index = 0;
//页面偏移
UINT8 chDot_Bit = 0;
//点所在位
chDot_Bit = BIT(7-(chy&(BIT(3)-1)));
//计算数据点所在字节的位
chPage_index = 7-(chy>>3);
return (LCD_Buffer[chPage_index][chx]&chDot_Bit);
}
/****************************************
* 函数说明: 液晶初始化函数 *
* 输入 :无 *
* 输出 :无 *
* 调用函数: Write_CMD_12864() *
* Self_Delay_Adjust_12864() *
****************************************/
void LCD_Init_12864(void)
{
UINT8 chx = 0,chy = 0;
for (chy = 0;chy < 8;chy++)
{
for(chx = 0;chx < 128;chx++)
{
LCD_Buffer[chy][chx] = 0;
}
}
WRITE_12864_RESET_LOW;
//复位LCD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -