?? 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 + -