?? lcd.c
字號:
// 240128液晶顯示模塊
//***************************************************************************
//* Create by :LAUKING 2007/11/06 KeilC V7.0 *
//***************************************************************************
//連線表: CPU=89s52 *
//C/D=P1.3 /CE=P2.7 2.6 /WR=/WR /RD=/R *
//FOSC=22.1184MHz D0-D7=P0.0-P0.7 *
//***************************************************************************
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#include <KEY.h>
#include <IAP.h>
#define uint unsigned int
#define uchar unsigned char
#define Graphic 1
#define TXT 0
#define LcmLengthDots 240
#define LcmWidthDots 128
#define para 1 //parameter參數
#define coor 0 //coordinate坐標
char xdata LcmPort _at_ 0x8000;
sbit CD= P1^3; //High is code, low is data
uchar code hz[];
uchar code hz_t[];
////////////////////////////////////////////////////////////////////////////////////
//函數聲明
extern void CheckRWCD(void);
extern void CheckAutoWrite(void);
extern void CheckScreen(void);
extern void LcmWriteData(uchar uData);
extern uchar LcmReadData( void );
extern void LcmWriteCommand(uchar Command);
extern void LcmWriteCommandWith1Par(uchar Parameter,uchar Command);
extern void LcmWriteCommandWith2Par(uchar Parameter1,uchar Parameter2,uchar Command);
extern void LcmInit( bit Mode_Choose ); //文本法初始化函數
//extern void LcmInit_t( void ); //圖形法初始化函數
extern void LcmClear( uchar FillByte );
extern void LocateXY(uchar x,uchar y,uchar mode);
extern void PutChar(uchar x,uchar y,uchar CharByte);
extern void write_hz(unsigned char x_hz,unsigned char y_hz,unsigned char code_hz);
extern void CGRAM (unsigned char q);
extern void write_cghz(unsigned char x_cghz,unsigned char y_cghz,unsigned char num_cghz);
extern void write_cgzf(unsigned char x_cgzf,unsigned char y_cgzf,unsigned char num_cgzf);
extern void cghz_char(unsigned char x_char,unsigned char y_char,unsigned char hz_char);
extern void cgzf_char(unsigned char x_char,unsigned char y_char,unsigned char zf_char);
extern void Init_Display(void);
extern void Chief_Display(void);
extern void Delay(uint MS);
/////////////////////////////////////////////////
//指令&數據讀寫狀態
void CheckRWCD(void)
{
CD=1; //code
while((LcmPort & 0x03) != 0x03); //低電平忙
}
//數據自動寫狀態
void CheckAutoWrite(void)
{
CD=1; //code
while((LcmPort & 0x08) == 0); //低電平忙
}
//屏讀/屏考貝出錯狀態
void CheckScreen(void)
{
CD=1; //code
while(LcmPort & 0x40); //1出錯,0正確
}
//一個數據子寫入函數
void LcmWriteData(uchar uData)
{
CD=0; //data
LcmPort = uData;
}
//一個數據讀出函數
uchar LcmReadData( void )
{
uchar uData;
CD=0; //data
uData = LcmPort;
return uData;
}
//無參數指令寫入函數
void LcmWriteCommand(uchar Command)
{
CheckRWCD(); //檢測指令讀寫狀態
LcmPort = Command;
}
//單參數指令寫入函數
void LcmWriteCommandWith1Par(uchar Parameter,uchar Command)
{
CheckRWCD(); //檢測指令讀寫狀態
CD=0; //data
LcmPort = Parameter;
CheckRWCD();
LcmPort = Command;
}
//雙參數指令寫入函數
void LcmWriteCommandWith2Par(uchar Parameter1,uchar Parameter2,uchar Command)
{
CheckRWCD(); //檢測指令讀寫狀態
CD=0;
LcmPort = Parameter1;
CheckRWCD();
CD=0;
LcmPort = Parameter2;
CheckRWCD();
LcmPort = Command;
}
//LCM顯示初始化函數
void LcmInit( bit Mode_Choose )
{
LcmWriteCommandWith2Par(0x00,0x00,0x40); //設置文本顯示區首地址
LcmWriteCommandWith2Par(LcmLengthDots/8,0x00,0x41); //設置文本顯示區寬度
LcmWriteCommandWith2Par(0x00,0x10,0x42); //設置圖形顯示區首地址0x1000
LcmWriteCommandWith2Par(LcmLengthDots/8,0x00,0x43); //設置圖形顯示區寬度
LcmWriteCommand(0xA7); //設置光標形狀 8x8方塊
LcmWriteCommand(0x81); //顯示方式設置 文本xor圖形(異或)
LcmWriteCommand(0x9D); //顯示開關設置 文本開,圖形開,光標閃爍開
if(Mode_Choose==0) //如果是文本方式
{
LcmWriteCommand(0x84); //顯示方式:文本特征
LcmWriteCommandWith2Par(0x03,0x00,0x22); //設置CGRAM偏址
}
}
//延時函數
void Delay(uint MS)
{
uchar us,usn;
while(MS!=0) //22.1184M Crystal
{
usn = 4;
while(usn!=0)
{
us=0xf2;
while (us!=0){us--;};
usn--;
}
MS--;
}
}
//清顯示存儲器函數
void LcmClear( uchar FillByte )
{
uint i = 8192; //此處僅清8K RAM,如果您32K RAM都使用,請修改i=32768(后面也要改)
if(FillByte) //注意如果填充ff時,如果RAM僅使用了8K,那么8192次會寫入到文本區
{ //會形成亂碼.(24064出廠時候默認將R7斷開,即默認使用8KRAM)
i -= 2*1024;//所以如果填入ff時候要扣除2K的文本區
LcmWriteCommandWith2Par(0x00,0x08,0x24); //填充0xff時候要在圖形區
}
else
LcmWriteCommandWith2Par(0x00,0x00,0x24);
LcmWriteCommand(0xB0); //進入自動寫
while(i--)
{
CheckAutoWrite();
LcmWriteData( FillByte );
}
LcmWriteCommand(0xB2); //退出自動寫
}
//設定顯示地址函數
void LocateXY(uchar x,uchar y,uchar mode)
{
uint temp;
temp= LcmLengthDots/8*y + x;
if(mode) //mode=1為Graphic
{ //如果圖形模式要加上圖形區首地址0x0800
temp+=0x1000;
}
LcmWriteCommandWith2Par(temp&0xff,temp/256,0x24);
}
//顯示一個ASCII碼函數
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
//0 ! " # $ % & ' ( ) * + , - . /
//1 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
//2 A B C D E F G H I J K L M N O
//3 P Q R S T U V W X Y Z [ \ ] ^ _
//4 ' a b c d e f g h i j k l m n o
//5 p q r s t u v w x y z { | } ~
void PutChar(uchar x,uchar y,uchar CharByte)
{
LocateXY(x,y,TXT);
LcmWriteCommandWith1Par(CharByte,0xC4);// 0xc4 數據一次寫,地址不變
}
//漢字寫入函數
//x_hz:0~29; y_hz:0~127
//address為顯示緩沖區的地址,在圖形顯示方式下直接對應點陣狀態
//addr_hz即為在單片機FLASH中所建的字模的地址
void write_hz(unsigned char x_hz,unsigned char y_hz,unsigned char code_hz)
{
unsigned char i_hz;
unsigned int addr_hz;
//address=y_hz*30u+x_hz+0x1000; //計算顯示存儲器地址
addr_hz=code_hz*32u; //計算漢字字模地址(cctab的下標)
for(i_hz=0;i_hz<16;i_hz++) //計數值16
{
LocateXY(x_hz,y_hz,1); //設置顯示存儲器地址
LcmWriteCommandWith1Par(hz_t[addr_hz],0xC0); //寫入漢字字模左部
LcmWriteCommandWith1Par((hz_t[addr_hz+1]),0xC0); //寫入漢字字模右部
addr_hz+=2;
//address+=30; //修改顯示存儲器地址,顯示下一列(共16列)
y_hz+=1;
}
}
//CGRAM字模寫入函數
//注意,只是用了CGRAM的后1K,前1K留給映射CGROM了
//在連續的32個存儲單元里是一個漢字的字模,排列順序是前16個單元是漢字的左半部(左上、左下),后
//16個存儲單元是漢字的右半部
//根據所要寫入漢字的個數,只要修改q的取值即可
void CGRAM (unsigned char q)
{
unsigned char m,n,p;
LcmWriteCommandWith2Par(0x00,0x1C,0x24); //設置CGRAM的高1K地址
for(p=0;p<q;p++)
{ for(m=0;m<16;m++)
{
LcmWriteCommandWith1Par(hz[m*2u+p*32u], 0xC0 );
}
for(n=0;n<16;n++)
{
LcmWriteCommandWith1Par(hz[(n*2u+1)+p*32u], 0xC0 );
}
}
}
//CGRAM漢字顯示函數
//x_cghz為0~29,y_cghz為0~15
void write_cghz(unsigned char x_cghz,unsigned char y_cghz,unsigned char num_cghz)
{
unsigned int address; //int為16位
unsigned char code_cghz;
code_cghz=4*num_cghz+0x80;
//寫入左上部
address=y_cghz*30u+x_cghz; //顯示緩沖區存儲單元地址
LcmWriteCommandWith2Par( (unsigned char)(address),(unsigned char)(address>>8),0x24); //設置顯示存儲器地址
LcmWriteCommandWith1Par( code_cghz, 0xC4 ); //裝入字符代碼,寫入數據,地址不變
//寫入右上部
LcmWriteCommandWith2Par( (unsigned char)(address+1),(unsigned char)((address+1)>>8),0x24);
LcmWriteCommandWith1Par( code_cghz+2, 0xC4 );
//寫入左下部
LcmWriteCommandWith2Par( (unsigned char)(address+30u),(unsigned char)((address+30u)>>8),0x24);
LcmWriteCommandWith1Par( code_cghz+1, 0xC4 );
//寫入右下部
LcmWriteCommandWith2Par( (unsigned char)(address+31u),(unsigned char)((address+31u)>>8),0x24);
LcmWriteCommandWith1Par( code_cghz+3, 0xC4 );
}
//CGRAM字符寫入函數
//x_cgzf為0~29,y_cgzf為0~15
void write_cgzf(unsigned char x_cgzf,unsigned char y_cgzf,unsigned char num_cgzf)
{
unsigned int address; //int為16位
unsigned char code_cgzf;
code_cgzf=4*num_cgzf+0x80;
//寫入
address=y_cgzf*30u+x_cgzf; //顯示緩沖區存儲單元地址
LcmWriteCommandWith2Par( (unsigned char)(address),(unsigned char)(address>>8),0x24); //設置顯示存儲器地址
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -