📄 lcd_driver.c
字号:
/************************************************************************************
* Copyright (c) 2004,西安铭朗电子科技有限责任公司
* All rights reserved.
*
* 文件名称: LCDC_Driver.C
* 文件标识: none
* 适用器件: C8051F020 DMC12864
*
* 摘 要: 本文件是LCD显示子程序;使用外部22.1184MHz晶振
*
* 当前版本:1.1
* 作 者:刘大伟
* 完成日期:2007年2月1日
*
* 历史版本:1.0
* 作 者:卢 阳
* 完成日期:2004年11月14日
*
* 历史版本:0.9
* 原作者 : 李林利
* 完成日期:2004年1月1日
*************************************************************************************/
/*******************************引用外部头文件***************************************/
#include "c8051f020.h"
#include "Lcd_driver.h"
#include <INTRINS.H>
#include <math.h>
/************************************************************************************/
/*********************************全局变量*******************************************/
unsigned int xdata addr;
unsigned char xdata *tp;
/***********************************************************************************
* 函数名称:LCDC_Init;
*
* 函数功能描述:lcd_init;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: 具体Lcd操作请参考DMC12864.PDF;
************************************************************************************/
void LCDC_Init (void)
{
DISABLE_INTERRUPTS; //关中断
addr = Lcd_Cs |
Lcd_CsChip |
Lcd_WrCmd; //写命令 (参考Lcd_Driver.h文件宏定义)
LCDC_WrCmd (Lcd_Dsl); //Display start line
LCDC_WrCmd (St_Addr); //COLOUM ADDRESS
LCDC_WrCmd (St_Page); //ROW ADDRESS
LCDC_WrCmd (Dis_ON ); //Display ON
ENABLE_INTERRUPTS; //开中断
}
/***********************************************************************************
* 函数名称:LCDC_DisFull;
*
* 函数功能描述: 清屏函数(全部写慢或清空);
*
* 输入参数:unsigned char类型数据,0x00是清屏;0xff是写满屏;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void LCDC_DisFull (unsigned char Flag)
{
unsigned char x,y;
if (!Flag) //清屏
{
for (y=0; y<8; y++)
for (x=0; x<128; x++)
LCDC_WrData (x, y, 0X00);
}
else //写满屏
{
for (y=0; y<8; y++)
for (x=0; x<128; x++)
LCDC_WrData (x, y, 0XFF);
}
}
/***********************************************************************************
* 函数名称:LCDC_CheckBusy;
*
* 函数功能描述: 判断LCD忙等待;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void LCDC_CheckBusy (void)
{
addr = Lcd_Cs |
Lcd_CsChip |
Lcd_RdSta; //读状态(参考Lcd_Driver.h文件宏定义)
_nop_();_nop_(); //延时等待
_nop_();_nop_();
do //取Lcd的状态寄存器内的数据
tp = addr;
while ((*tp&Chip_Busy)==Chip_Busy);//等待BUSY位清零 Lcd空闲
}
/***********************************************************************************
* 函数名称:LCDC_WrCmd;
*
* 函数功能描述: 向LCD写命令;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void LCDC_WrCmd (unsigned char dd)
{
DISABLE_INTERRUPTS; //关中断
addr = Lcd_Cs |
Lcd_CsChip |
Lcd_WrCmd; //写命令地址 (参考Lcd_Driver.h文件宏定义)
tp = addr;
*tp = dd; //写命令
addr &= Unto_Lcd; //改变地址变量 地址不指向Lcd
_nop_();_nop_(); //延时等待
_nop_();_nop_();
ENABLE_INTERRUPTS; //开中断
}
/***********************************************************************************
* 函数名称:LCDC_SetXY;
*
* 函数功能描述: LCD读写位置变换;
*
* 输入参数:unsigned char类型坐标x,y;
*
* 返回数据:none;
*
* 注意: 详细请参考DMC12864.PDF;程序中X,Y方向定义与屏定义不同
************************************************************************************/
void LCDC_SetXY (unsigned char x, unsigned char y)
{
DISABLE_INTERRUPTS; //关中断
LCDC_CheckBusy (); //等待Lcd空闲
y &= x_addr; //x赋值 屏蔽掉无用位 加人相关命令
y |= St_Page;
LCDC_WrCmd (y);
x &= y_addr; //Y赋值 屏蔽掉无用位 加人相关命令
x |= St_Addr;
LCDC_WrCmd (x);
ENABLE_INTERRUPTS; //开中断
}
/***********************************************************************************
* 函数名称:LCDC_WrData;
*
* 函数功能描述:向LCD写数据;
*
* 输入参数:unsigned char类型坐标x,y, unsigned char类型写入数据dd;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void LCDC_WrData (unsigned char x, unsigned char y, unsigned char dd)
{
DISABLE_INTERRUPTS; //关中断
LCDC_SetXY (x,y); //设置屏上的写入位置
LCDC_CheckBusy (); //等待Lcd空闲
if (x<64) //块1使用
tp = Lcd_Cs |
Lcd_Cs1 |
Lcd_WrDat; //写入数据命令
else //块2使用
tp = Lcd_Cs |
Lcd_Cs2 |
Lcd_WrDat; //写入数据命令
*tp = dd; //数据写入
ENABLE_INTERRUPTS; //关中断
}
/***********************************************************************************
* 函数名称:LCDC_RdData;
*
* 函数功能描述:从LCD中读数据;
*
* 输入参数:unsigned char类型坐标x,y,
*
* 返回数据:unsigned char类型读出数据;
*
* 注意: none;
************************************************************************************/
unsigned char LCDC_RdData (unsigned char x, unsigned char y)
{
unsigned char xdata readdata;
LCDC_SetXY (x, y); //设置屏上的写入位置
LCDC_CheckBusy (); //等待Lcd空闲
if (x<64) //块1使用
{
addr = Lcd_Cs |
Lcd_Cs1 |
Lcd_RdDat; //读取数据命令
tp = Lcd_Cs |
Lcd_Cs1 |
Lcd_RdDat;
}
else //块2使用
{
addr = Lcd_Cs |
Lcd_Cs2 |
Lcd_RdDat; //读取数据命令
tp = Lcd_Cs |
Lcd_Cs2 |
Lcd_RdDat;
}
readdata = *tp; //数据读出
LCDC_CheckBusy (); //等待Lcd空闲
if (x<64) //块1使用
{
addr = Lcd_Cs |
Lcd_Cs1 |
Lcd_RdDat; //读取数据命令
tp = Lcd_Cs |
Lcd_Cs1 |
Lcd_RdDat;
}
else //块2使用
{
addr = Lcd_Cs |
Lcd_Cs2 |
Lcd_RdDat; //读取数据命令
tp = Lcd_Cs |
Lcd_Cs2 |
Lcd_RdDat;
}
readdata = *tp; //数据读出
return readdata;
}
/***********************************************************************************
* 函数名称:LCDC_DrawByte;
*
* 函数功能描述:向LCD写一个字节数据;
*
* 输入参数:BYTE类型坐标x,y;BYTE类型字节数据value;
*
* 返回数据:none;
*
* 注意: 数据显示在液晶点(x,y)(x,y+1)(x,y+2)(x,y+3)(x,y+4)(x,y+5)(x,y+6)(x,y+7)上,
* 请参考DMC12864.pdf;
***********************************************************************************/
void LCDC_DrawByte (unsigned char x, y, value)
{
unsigned char data temp,bit_x;
bit_x = y%8; //计算数据写入目标地址起点所在显示字节内的位置
y = y/8; //计算数据写入目标地址起点所在显示字节
if (bit_x==0) //如果起点在显示字节的"0"位则数据直接写入
LCDC_WrData (x, y, value);
else //如果起点不在显示字节的"0"位
{
temp = LCDC_RdData (x, y); //读出数据写入目标地址起点所在显示字节内的数据
temp &= (0xff>>(8-bit_x)); //保留新数据写如不占用位的数据
temp |= (value<<bit_x); //新数据与原数据组合
LCDC_WrData (x, y, temp); //更新LCD上此位置的数据显示
temp = LCDC_RdData(x, y+1); //读出数据写入目标地址末点所在显示字节内的数据
temp &= (0xff<<bit_x); //保留新数据写如不占用位的数据
temp |= (value>>(8-bit_x)); //新数据与原数据组合
LCDC_WrData (x, y+1, temp); //更新LCD上此位置的数据显示
}
}
/***********************************************************************************
* 函数名称:LCDC_DispWord;
*
* 函数功能描述:向LCD写一组数据,显示黑字符;
*
* 输入参数:unsiggned char类型写入起始坐标x,y,unsigned char类型写入数据code区指针p;
* unsigned char类型占用空间line*8行,length列,图形颜色取反标志位;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void LCDC_DispWord (unsigned char x, y, unsigned char code *p, unsigned char line, length, Flag)
{
unsigned char data i,j;
y += (4<<line);
if (y>64)
y = 64;
y = 64-y;
if (Flag)
{
for (i=0; i<line; i++)
for (j=0; j<length; j++)
LCDC_DrawByte (x+j, y+i*8, *p++);
}
else
{
for (i=0; i<line; i++)
for (j=0; j<length; j++)
LCDC_DrawByte (x+j, y+i*8, ~*p++);
}
}
/***********************************************************************************
* 函数名称:LCDC_DispFWord;
*
* 函数功能描述:向LCD写一组数据,显示黑字符;
*
* 输入参数:BYTE类型写入起始坐标x,y; BYTE类型写入数据xdata区指针p;
* BYTE类型占用空间line*8行,length列;BYTE类型显示数据取反标志位
* (非零为正常显示,零为取反)
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************
void LCDC_DispFWord (unsigned char x, y, unsigned char xdata *p, unsigned char line, length, Flag)
{
unsigned char data i,j;
y += (4<<line);
if (y>64)
y=64;
y = 64-y;
if (Flag)
{
for (i=0; i<line; i++)
for (j=0; j<length; j++)
LCDC_DrawByte(x+j, y+i*8, *p++);
}
else
{
for (i=0; i<line; i++)
for (j=0; j<length; j++)
LCDC_DrawByte (x+j, y+i*8, ~*p++);
}
}
/************************************************************************************
* 文件结束
************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -