?? lcd.c.bak
字號:
/**************************************************
* 液晶顯示模塊
*適用于KS0108系列液晶控制器,點陣數由用戶設定。
*編寫:付愛喜
**************************************************/
/*---------------------------------------------------x---->
|
|
|
y
|
V */
#ifndef LCD_C
#define LCD_C
#endif
#include <reg52.h>
#include "..\include\ASCII.h"
#include "..\include\lcd.h"
/*********液晶命令定義************************/
#define DISP_ON 0x3f //顯示ON
#define DISP_OFF 0x3e //顯示OFF
#define DISP_FIRST 0xc0 //顯示起始行定義,從第零行顯示
#define SETX 0x40 //定位X方向指令(列)
#define SETY 0xb8 //定位Y方向指令(行)
#define LCD_BUSY 0x80 //LCM忙判斷位
/***********內部變量定義****************************/
sbit LCD_RST = P2^5; //復位線占用的引腳
static uchar code Findbit[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/***************************************************
*函數性質:私有
*入口:無 出口:無
*功能:短延時
***************************************************/
static void Delay5nop()
{
//uchar i = 10;
;//while (i--);
}
/**************************************************
*函數性質:私有
*入口:待選擇的端口號 出口;無
*功能:選擇給定的液晶模塊
**************************************************/
static void SelectLcd(uchar cPart)
{
if (cPart == SEL_LEFT)
{
LCD_CS1 = TRUE;
LCD_CS2 = FALSE;
}
else
{
LCD_CS1 = FALSE;
LCD_CS2 = TRUE;
}
}
/***************************************************
*函數性質:私有
*入口:無 出口:忙標志
*功能:判忙
***************************************************/
static bool LcdBusy()
{
LCD_E = FALSE;
LCD_RS = FALSE;
LCD_RW = TRUE;
LCD_DATA = 0XFF;
Delay5nop();
LCD_E = TRUE;
Delay5nop();
// while (LCD_DATA & LCD_BUSY);
return TRUE;
}
/***************************************************
*函數性質:私有
*入口:待送入的命令。出口;無
*功能:發送命令入液晶模塊
***************************************************/
static void WrComToLcd( uchar cCommand)
{
LcdBusy(); //判忙
LCD_E = FALSE;
LCD_RS = FALSE;
LCD_RW = FALSE;
LCD_DATA =cCommand;
Delay5nop();
LCD_E = TRUE;
Delay5nop();
LCD_E =FALSE;
}
/**************************************************
*函數性質:私有
*入口:待寫入的數據。 出口:無
*功能:寫數據進LCD
**************************************************/
static void WrDataLcd(uchar cData)
{
LcdBusy(); //判忙
LCD_E = FALSE;
LCD_RS = TRUE;
LCD_RW = FALSE;
LCD_DATA =cData;
Delay5nop();
LCD_E = TRUE;
Delay5nop();
LCD_E = FALSE;
}
/***************************************************
*函數性質:私有
*入口:待定位的X,Y坐標, 出口:無
*功能:設定光標到指定的位置
***************************************************/
static void SetLcdCur(uchar x, uchar y)
{
uchar x1;
uchar y1;
if (x >= MAX_XSIZE/2)
{
x1= x-MAX_XSIZE/2;
SelectLcd(SEL_RIGHT);
}
else
{
x1= x;
SelectLcd(SEL_LEFT);
}
y1 = y/8;
WrComToLcd(SETX | x1);
WrComToLcd(SETY | y1);
}
/***************************************************
*函數性質:私有
*入口:x,y坐標 出口:讀得的數據
*功能:從LCD里讀出一個字節的數據
***************************************************/
static uchar ReadLcdByte(uchar x, uchar y)
{
uchar cbyte;
SetLcdCur(x,y);
LCD_DATA = 0xff;
LCD_E = FALSE;
LCD_RS = TRUE;
LCD_RW = TRUE;
Delay5nop();
LCD_E = TRUE;
Delay5nop();//延時必須足夠長
cbyte = LCD_DATA;//假讀一次數據。
LCD_E = FALSE;
SetLcdCur(x,y);
LCD_DATA = 0xff;
LCD_E = FALSE;
LCD_RS = TRUE;
LCD_RW = TRUE;
Delay5nop();
LCD_E = TRUE;
Delay5nop();
cbyte = LCD_DATA;//第二次讀的才是真正的數據。
LCD_E = FALSE;
return cbyte;
}
/*************************************************
*函數性質:私有
*入口:指定的X,Y坐標 出口:無
*功能:在指定的X,Y坐處畫一點
*************************************************/
static void LcdDrawPoint(uchar x, uchar y, uchar Color)
{
uchar temp;
uchar cbyte;
cbyte = Findbit[ y%8];
temp=ReadLcdByte(x,y);
if (Color == WHITE)
{
cbyte = ~cbyte;
temp &= cbyte;
}
else
{
temp |=cbyte;
}
SetLcdCur(x,y);
WrDataLcd(temp);
}
/**********************************************
*函數性質:公共
*入口:無 出口:無
*功能:清屏
**********************************************/
void LCD_LcdClr()
{
uchar i;
uchar j;
for (j=0; j < MAX_YSIZE; j+=8)
{
for (i=0; i < MAX_XSIZE; i++)
{
SetLcdCur(i,j);
WrDataLcd(0);
}
}
}
/**********************************************
*函數性質:公共
*入口:無,出口:無
*功能:關閉液晶端口。
**********************************************/
void LCD_DisbLcdSel()
{
LCD_CS1 = TRUE;
LCD_CS2 = TRUE;
}
/******************************************************
*函數性質:公共
*入口:給定的坐標及待顯示的數據樣式。出口:無
*功能:按給定的坐標在屏幕上顯示圖片,同時,圖片
*具有反白及圖片隱藏功能,圖片的寬度及高度在字模的頭兩個字節里。
******************************************************/
void LCD_lcdDisp(uchar *cCode, uchar x, uchar y , uchar color)
{
uchar i;
uchar idata temp_x,bmpwidth,bmphigh;
bmpwidth = *cCode++; //從字模里取出圖片的高度及寬度
bmphigh = (*cCode)/8;
cCode++;
temp_x = x;
while (bmphigh--)
{
x=temp_x;
for (i=0; i < bmpwidth; i++)
{
SetLcdCur(x,y);
if (color == WHITE)
{
WrDataLcd(~(*cCode));//反色顯示
}
else if (color == BLACK)
{
WrDataLcd(*cCode); //正常顯示
}
else if (color == HIDE)
{
WrDataLcd(0); //隱藏當前顯示的圖片。
}
cCode++;
x++;
}
y+=8;
}
LCD_DisbLcdSel(); //在每一次寫入LCD后關閉片選,是為了別的操作不影響液晶顯示。
}
/**********************************************
*函數性質:公共
*入口:起始點的X,Y坐標及長度,方向,出口:無
*功能:從給定的起始點開始,按給定的長度及方向
*劃一直線。不支持斜線,劃線方向以X、Y的增量方向
*為基準。
**********************************************/
void LCD_DrawLine(uchar start_x,uchar start_y,uchar Line_Len,
uchar Flag,uchar Color)
{
while (Line_Len--)
{
LcdDrawPoint(start_x,start_y,Color);
if (Flag == X_FLAG)
{
start_x++;
}
else
{
start_y++;
}
}
LCD_DisbLcdSel();
}
/******************************************************
*函數性質:公共
*入口:對應的ASCII碼字符及坐標、顏色(是否要反色顯示)
*出口:無
*功能:在給定的坐標顯示ASCII字符串。
******************************************************/
void LCD_LcdDispASCII(uchar *Ascii, uchar x,uchar y,uchar color_char)
{
uchar temp;
uchar i=0;
while(*(Ascii+i) != '\0')
{
temp=*(Ascii+i)-32;//將ASCII轉換成實際值"!"的ASCII為33。
if (i == color_char || color_char == ALL_WHITE) //當前的字符需要反色顯示
{
LCD_lcdDisp(cAscii+temp*ASCII_SIZE,x,y,WHITE);
}
else
{
LCD_lcdDisp(cAscii+temp*ASCII_SIZE,x,y,BLACK);
}
x+=ASCII_WIDTH;
i++;
}
}
/*
*函數性質:公共
*入口:無
*出口:無
*功能:初始化液晶
*/
void LCD_LcdIni()
{
SelectLcd(SEL_LEFT);
WrComToLcd(DISP_OFF);
WrComToLcd(DISP_ON);
WrComToLcd(DISP_FIRST);
SelectLcd(SEL_RIGHT);
WrComToLcd(DISP_OFF);
WrComToLcd(DISP_ON);
WrComToLcd(DISP_FIRST);
LCD_LcdClr();
LCD_DisbLcdSel();
}
/**************************************************************
*函數性質:公共
*入口:無, 出口:無
*功能:開啟液晶背光
**************************************************************/
void LCD_OpenLED()
{
LED_CTL = FALSE;
}
/**************************************************************
*函數性質:公共
*入口:無 出口:無
*功能:關閉液晶背光。
**************************************************************/
void LCD_CloseLED()
{
LED_CTL = TRUE;
}
/*
*函數性質:公共
*入口:無
*出口:無
*功能:復位液晶。
*/
void LCD_Rst(void)
{
uint i = 0xffff;
LCD_RST = FALSE;
while (i--);
LCD_RST = TRUE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -