您的位置:首页 > 运维架构 > Linux

LCD驱动-linux2.6系统

2012-12-08 21:49 127 查看
转自:/article/1885414.html

我的LCD驱动,列出原码,供探讨改进!

[c-sharp] view
plaincopy

#include "Config.h"

#include "IO.h"

#include "Glob.h"

#include "MyClib.h"

#include "LCD_Define.h"

#include "Logo.h"

#include <string.h>



void LCD_CmdWrite(Uchar cmdReg, Uchar cmdData);

Uchar LCD_CmdRead(Uchar cmdReg);

void LCD_DataWrite(Uchar WrData);

void LCD_ChkBusy(void);

void LCD_Reset(void);

void LCD_Initial(void);

void LcdScreenFill(Uchar SetX);

void GotoXY(Uchar x1,Uchar y1);



void CharOrGrapMode(Uchar CharSet)

{

vWholChipConVal=(CharSet) ? 0xcd : 0xc5;

LCD_CmdWrite(cWholChipConReg,vWholChipConVal);

}

void ReverAndBold(Uchar RevBold)

{//RevBold:bit5bit4:01-R_N_B_Y;10-R_Y_B_N;

LCD_CmdWrite(cWholChipCurConReg,0x48|RevBold);

}

void FontSize(Uchar XSize, Uchar YSize)

{//XSize,YSize:00,*1; 01,*2; 02,*3; 03,*4;

LCD_CmdWrite(cFonSizConReg,(((XSize&0x03)<<6)|((YSize&0x03)<<4))|0x0f);

}

void ASC_ChiAutoSele(Uchar AscSet)

{

vFonConVal=(AscSet) ? 0xa4 : 0xa0;

LCD_CmdWrite(cFonConReg,vFonConVal);

}

void SetActiveWindow(Uchar Left, Uchar Right, Uchar Top, Uchar Bottom)

{

LCD_CmdWrite(cActiWinLeReg, Left);

LCD_CmdWrite(cActiWinRiReg, Right);

LCD_CmdWrite(cActiWinToReg, Top);

LCD_CmdWrite(cActiWinBoReg, Bottom);

}

void PageOperate(Uchar PaMo, Uchar PaOp, Uchar DisPa)

{

//PaMo:01,p1; 02,p2; 03,p1+p2; 07,exp(p1+p2); PaOp:0,|; 1,^; 2,~; 3,&;

//DisPa:0,p0; 1,p1; 2,p2; 3,p1+p2;

vMemAccModVal=0x80+((PaMo&0x07)<<4)+((PaOp&0x03)<<2)+(DisPa&0x03);

LCD_CmdWrite(cMemAccModReg, vMemAccModVal);

}

void LCD_OFF(void)

{

LCD_CmdWrite(cWholChipConReg, vWholChipConVal&0b11111011);

}

void LCD_ON(void)

{

LCD_CmdWrite(cWholChipConReg, vWholChipConVal |0b00000100);

}



#define _dt 1



void LCD_CmdWrite(Uchar cmdReg, Uchar cmdData)

{

LCD_ChkBusy();

LCD_WR = 1;

LCD_RD = 1;

LCD_RS = 0;

LCD_DATA = cmdReg;

LCD_CS1 = 0;

LCD_WR = 0;

Delay4Xus(_dt);

LCD_WR = 1;

LCD_CS1 =1;

LCD_RS = 0;

LCD_DATA = cmdData;

LCD_CS1 =0;

LCD_WR = 0;

Delay4Xus(_dt);

LCD_WR = 1;

LCD_RS = 1;

LCD_CS1 =1;

LCD_DATA=0xff;

}



Uchar LCD_CmdRead(Uchar cmdReg)

{

Uchar REG_Read;

LCD_ChkBusy();

LCD_DATA = cmdReg;

LCD_CS1 =0;

LCD_RD = 1;

LCD_RS = 0;

LCD_WR = 0;

Delay4Xus(_dt);

LCD_WR = 1;

LCD_RS = 1;

LCD_CS1 =1;



LCD_DATA = 0xff;

LcdDataDir = 0XFF;

Delay4Xus(_dt);

LCD_CS1 = 0;

LCD_WR = 1;

LCD_RS = 0;

LCD_RD = 0;

Delay4Xus(_dt);

REG_Read = LCD_DATA;

LCD_RD = 1;

LCD_RS = 1;

LCD_CS1 =1;

LcdDataDir = 0X00;

LcdDataDir = 0XFF;

return REG_Read;

}

void LCD_DataWrite(Uchar WrData)

{

LCD_ChkBusy();

LCD_WR = 1;

LCD_RD = 1;

LCD_RS = 1;

LCD_DATA = WrData;

LCD_CS1 =0;

LCD_WR = 0;

Delay4Xus(_dt);

LCD_WR = 1;

LCD_CS1 =1;

LCD_RS = 1;

LCD_DATA=0xff;

}

void LCD_ChkBusy(void)

{

#if 0

do

{

TrisBusy=1;

Delay4Xus(20);

}

while(LCD_BUSY==1);

#else

Delay4Xus(5);

#endif

}

void LCD_Reset(void)

{

LCD_DATA = 0XFF;

LCD_RST = 1;

LCD_CS1 =1;

LCD_RD = 1;

LCD_RS = 1;

LCD_WR = 1;

Delay4Xus(_dt);

LCD_RST = 0;

DelayMs(20);

LCD_RST = 1;

DelayMs(100);

}

void LcdScreenFill(Uchar SetX)

{

Uchar READ_REG;

Uchar i,j;

LCD_CmdWrite(cPattDatReg,SetX);

// READ_REG = LCD_CmdRead(0xF0);

// READ_REG &= 0xF7;

// READ_REG |= 0x08;

READ_REG=0xA8;

LCD_CmdWrite(cFonConReg,READ_REG);

DelayMs(1);

LCD_DataWrite(SetX);

}



void GotoXY(Uchar x1,Uchar y1)

{

LCD_CmdWrite(cCursorPosXReg,x1); // 设定水平坐标地址

LCD_CmdWrite(cCursorPosYReg,y1); // 设定垂直坐标地址

}

void LCD_Initial(void)

{

LCD_CmdWrite(cWholChipConReg,0x20); // LCD 基本显示功能设定-1

DelayMs(5);

LCD_CmdWrite(cWholChipConReg,0xcd);

LCD_CmdWrite(cWholChipCurConReg,0x6b); // LCD 基本显示功能设定-2

LCD_CmdWrite(cDistOfWordOrLineReg,0x10); // 设定光标高度与行距

LCD_CmdWrite(cShifClkConReg,0x04);

LCD_CmdWrite(cFonConReg,0xa0); // 设定中文字型为”BIG5”

LCD_CmdWrite(cClkBusyFreqReg,0xf2); // 系统工作频率与中断准位设定

SetActiveWindow(0, 39, 0, 239);

LCD_CmdWrite(cDisWinBoReg,0xEF); // 设定LCD 模块水平起始地址(Y1)

LCD_CmdWrite(cDisWinLeReg,0x00); // 设定LCD 模块垂直结束地址(X2)

LCD_CmdWrite(cDisWinToReg,0x00); // 设定LCD 模块水平结束地址(Y2)

LCD_CmdWrite(cFraRatComAReg,0x40); // 变换FRM 极性的起始地址(Common)

LCD_CmdWrite(cContraConReg,0x20); // 设定DAC 电流输出,可调整LCD 亮度

LCD_CmdWrite(cAdvPowSetReg,0x30); // LCD 内存读写速度与功能设定

LCD_CmdWrite(cAdvDisSetReg,0x80); // LCD 特殊显示功能

LCD_CmdWrite(cMemAccModReg,0x91); // LCD 显示图层设定

vMemAccModVal=0x91;

GotoXY(0, 0);

LCD_CmdWrite(cBegSegmPosReg,0x00); // 设定垂直开始显示地址(Segment)

LCD_CmdWrite(cBegCommReg,0x00); // 设定于水平区块移动模式下,起始地址

LCD_CmdWrite(cEndCommReg,0xEF); // 设定于水平区块移动模式下,结束地址

LCD_CmdWrite(cBlinkTimReg,0x33); // 光标闪烁时间设定

LCD_CmdWrite(cFraRatComBReg,0x00); // 变换FRM 极性的结束地址(Common)

LCD_BLK = 1;

}

void PrintGraphicLogo(stWinAndCur *WinCur, const rom Uchar *Logo, Uint LogoLen)

{

Uint Li;

CharOrGrapMode(0);

SetActiveWindow(WinCur->WinLef, WinCur->WinRig, WinCur->WinTop, WinCur->WinBot);

GotoXY(WinCur->CurX, WinCur->CurY);

for(Li=0; Li<LogoLen; Li++)

{

LCD_DataWrite(*Logo++);

}

}

void PrintLargeLogo(const rom Uchar *Logo,Uint LogoLen)

{

Uint Li;

Uchar TempDl=40;

CharOrGrapMode(0);

SetActiveWindow(5, 34, 0, 239);

GotoXY(5, 53);

for(Li=0; Li<LogoLen; Li++)

{

LCD_DataWrite(*Logo++);

if(--TempDl==0x00)

{

DelayMs(8);

TempDl = 40;

}

}

}

void PrintTextOrGraph( far rom DispMenu * PtMenu,Uchar MenuNum)

{

Uchar TempBit1,TempBit2;

Uchar TB1,TB2=0;

far rom Uchar * TemPr=NULL;

Uint TB3;

for(TB1=0; TB1<MenuNum; TB1++,PtMenu++)

{

TempBit1=PtMenu->VisionOrNo;

TempBit2=PtMenu->DispCondition;

if(!(TempBit1&0x01))

break;

if(TempBit2&0x20)

{

if(PtMenu->StrLen==0x00)

{

PageOperate(2, 0, 2);

break;

}

else if(PtMenu->StrLen==0xff)

{

PageOperate(3, 1, 1);

break;

}

}

CharOrGrapMode((TempBit1&0x02) ? 0xff : 0x00);

ReverAndBold((TempBit1&0x0c)<<2);

FontSize((TempBit1&0xc0)>>6, (TempBit1&0x30)>>4);

ASC_ChiAutoSele((TempBit2&0x02) ? 0xff : 0x00);

SetActiveWindow(PtMenu->AcWinLef,

PtMenu->AcWinRig, PtMenu->AcWinTop, PtMenu->AcWinBot);

// GotoXY(PtMenu->StCurX, PtMenu->StCurY);

if(TempBit1&0x02)

{

GotoXY(PtMenu->StCurX, PtMenu->StCurY);

for (TB2=0,TB3=PtMenu->StrLen,

TemPr=(far rom Uchar *)((*PtMenu).StrPt); TB2<=PtMenu->StrRow; TB2++)

{

for (; ((*TemPr != '/0')&&(TB3>0)); TemPr++,TB3--)

{

LCD_DataWrite(*TemPr);

}

TB3=PtMenu->StrLen;

/* if(TempBit2&0x04)

GotoXY(PtMenu->StCurX, PtMenu->StCurY+TB2*26);

else */

GotoXY(PtMenu->StCurX, PtMenu->StCurY+TB2*29);

TemPr=(far rom Uchar *)((*PtMenu).StrPt+TB3*TB2);

}

}else if (!(TempBit2&0x08)&& (TempBit2&0x10))

{

GotoXY(PtMenu->StCurX, PtMenu->StCurY);

TB2=PtMenu->StrRow;

LcdScreenFill(TB2);

}else if (TempBit2&0x08)

{

GotoXY(PtMenu->StCurX, PtMenu->StCurY+TB2*29);

TB2++;

for (TB3=PtMenu->StrLen, TemPr=(far rom Uchar *)((*PtMenu).StrPt);

TB3>0; TemPr++,TB3--)

{

LCD_DataWrite(*TemPr);

}

}

}

}



[c-sharp] view
plaincopy

/*--------------------------------------------------------------------------

Dplay.H



C Display functions.

Copyright (c) 2008.03.20 for ?? Ltd.

Author : ZMF 2008.03.20

VOL : V0.1

--------------------------------------------------------------------------*/



#ifndef _LM2068R_DRIVER_H

#define _LM2068R_DRIVER_H

#include "LCD_Define.h"

extern void LCD_CmdWrite(Uchar cmdReg, Uchar cmdData);

extern Uchar LCD_CmdRead(Uchar cmdReg);

extern void LCD_DataWrite(Uchar WrData);

extern void LCD_ChkBusy(void);

extern void LCD_Reset(void);

extern void LCD_Initial(void);

extern void LcdScreenFill(Uchar SetX);

extern void GotoXY(Uchar x1,Uchar y1);

extern void CharOrGrapMode(Uchar CharSet);

extern void ReverAndBold(Uchar RevBold);//RevBold:bit5bit4:01-R_N_B_Y;10-R_Y_B_N;

extern void FontSize(Uchar XSize, Uchar YSize);

extern void ASC_ChiAutoSele(Uchar AscSet);

extern void SetActiveWindow(Uchar Left, Uchar Right, Uchar Top, Uchar Bottom);

extern void PageOperate(Uchar PaMo, Uchar PaOp, Uchar DisPa);

extern void PrintGraphicLogo(stWinAndCur *WinCur, const rom Uchar *Logo, Uint LogoLen);

extern void PrintLargeLogo( const rom Uchar *Logo,Uint LogoLen);

extern void PrintTextOrGraph( far rom DispMenu * PtMenu,Uchar MenuNum);

#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: