LCD驱动-linux2.6系统

转自:http://blog.csdn.net/zhengmeifu/article/details/5176778

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

[c-sharp]  view plain copy
  1. #include "Config.h"  
  2. #include "IO.h"  
  3. #include "Glob.h"   
  4. #include "MyClib.h"  
  5. #include "LCD_Define.h"  
  6. #include "Logo.h"  
  7. #include <string.h>  
  8.   
  9.  void LCD_CmdWrite(Uchar cmdReg, Uchar cmdData);  
  10.  Uchar LCD_CmdRead(Uchar cmdReg);  
  11.  void LCD_DataWrite(Uchar WrData);  
  12.  void LCD_ChkBusy(void);  
  13.  void LCD_Reset(void);  
  14.  void LCD_Initial(void);  
  15.  void LcdScreenFill(Uchar SetX);  
  16.  void GotoXY(Uchar x1,Uchar y1);  
  17.   
  18. void CharOrGrapMode(Uchar CharSet)  
  19. {  
  20.     vWholChipConVal=(CharSet) ? 0xcd : 0xc5;  
  21.     LCD_CmdWrite(cWholChipConReg,vWholChipConVal);  
  22. }  
  23. void ReverAndBold(Uchar RevBold)  
  24. {//RevBold:bit5bit4:01-R_N_B_Y;10-R_Y_B_N;  
  25.     LCD_CmdWrite(cWholChipCurConReg,0x48|RevBold);  
  26. }  
  27. void FontSize(Uchar XSize, Uchar YSize)  
  28. {//XSize,YSize:00,*1; 01,*2; 02,*3; 03,*4;  
  29.     LCD_CmdWrite(cFonSizConReg,(((XSize&0x03)<<6)|((YSize&0x03)<<4))|0x0f);  
  30. }  
  31. void    ASC_ChiAutoSele(Uchar AscSet)  
  32. {  
  33.     vFonConVal=(AscSet) ? 0xa4 : 0xa0;  
  34.     LCD_CmdWrite(cFonConReg,vFonConVal);  
  35. }  
  36. void    SetActiveWindow(Uchar Left, Uchar Right, Uchar Top, Uchar Bottom)  
  37. {  
  38.     LCD_CmdWrite(cActiWinLeReg, Left);  
  39.     LCD_CmdWrite(cActiWinRiReg, Right);   
  40.     LCD_CmdWrite(cActiWinToReg, Top);   
  41.     LCD_CmdWrite(cActiWinBoReg, Bottom);  
  42. }  
  43. void    PageOperate(Uchar PaMo, Uchar PaOp, Uchar DisPa)  
  44. {  
  45.     //PaMo:01,p1; 02,p2; 03,p1+p2; 07,exp(p1+p2);  PaOp:0,|; 1,^; 2,~; 3,&;  
  46.     //DisPa:0,p0; 1,p1; 2,p2; 3,p1+p2;  
  47.     vMemAccModVal=0x80+((PaMo&0x07)<<4)+((PaOp&0x03)<<2)+(DisPa&0x03);  
  48.     LCD_CmdWrite(cMemAccModReg, vMemAccModVal);  
  49. }  
  50. void LCD_OFF(void)  
  51. {  
  52.     LCD_CmdWrite(cWholChipConReg, vWholChipConVal&0b11111011);  
  53. }  
  54. void LCD_ON(void)  
  55. {  
  56.     LCD_CmdWrite(cWholChipConReg, vWholChipConVal |0b00000100);  
  57. }  
  58.  
  59. #define _dt 1  
  60.   
  61. void LCD_CmdWrite(Uchar cmdReg, Uchar cmdData)  
  62. {  
  63.     LCD_ChkBusy();  
  64.      LCD_WR = 1;   
  65.     LCD_RD = 1;   
  66.     LCD_RS = 0;   
  67.     LCD_DATA = cmdReg;  
  68.     LCD_CS1 = 0;  
  69.     LCD_WR = 0;  
  70.     Delay4Xus(_dt);  
  71.     LCD_WR = 1;  
  72.     LCD_CS1 =1;  
  73.     LCD_RS = 0;   
  74.      LCD_DATA = cmdData;  
  75.     LCD_CS1 =0;   
  76.     LCD_WR = 0;   
  77.     Delay4Xus(_dt);  
  78.     LCD_WR = 1;  
  79.     LCD_RS = 1;  
  80.     LCD_CS1 =1;   
  81.     LCD_DATA=0xff;  
  82. }  
  83.   
  84. Uchar LCD_CmdRead(Uchar cmdReg)  
  85. {  
  86.     Uchar REG_Read;  
  87.     LCD_ChkBusy();  
  88.      LCD_DATA = cmdReg;  
  89.     LCD_CS1 =0;  
  90.     LCD_RD = 1;   
  91.     LCD_RS = 0;   
  92.     LCD_WR = 0;  
  93.     Delay4Xus(_dt);  
  94.     LCD_WR = 1;  
  95.     LCD_RS = 1;  
  96.     LCD_CS1 =1;  
  97.       
  98.     LCD_DATA = 0xff;  
  99.     LcdDataDir = 0XFF;  
  100.     Delay4Xus(_dt);  
  101.     LCD_CS1 = 0;   
  102.     LCD_WR = 1;   
  103.     LCD_RS = 0;   
  104.     LCD_RD = 0;   
  105.     Delay4Xus(_dt);  
  106.     REG_Read = LCD_DATA;  
  107.     LCD_RD = 1;   
  108.     LCD_RS = 1;  
  109.     LCD_CS1 =1;  
  110.     LcdDataDir = 0X00;  
  111.     LcdDataDir = 0XFF;  
  112.     return REG_Read;   
  113. }  
  114. void LCD_DataWrite(Uchar WrData)  
  115. {  
  116.     LCD_ChkBusy();   
  117.      LCD_WR = 1;   
  118.     LCD_RD = 1;   
  119.     LCD_RS = 1;   
  120.     LCD_DATA = WrData;   
  121.     LCD_CS1 =0;  
  122.     LCD_WR = 0;  
  123.     Delay4Xus(_dt);  
  124.     LCD_WR = 1;  
  125.     LCD_CS1 =1;  
  126.     LCD_RS = 1;   
  127.     LCD_DATA=0xff;  
  128. }  
  129. void LCD_ChkBusy(void)  
  130. {  
  131.     #if 0  
  132.     do  
  133.     {  
  134.         TrisBusy=1;  
  135.         Delay4Xus(20);  
  136.     }  
  137.     while(LCD_BUSY==1);  
  138.     #else  
  139.     Delay4Xus(5);  
  140.     #endif  
  141. }  
  142. void LCD_Reset(void)  
  143. {  
  144.     LCD_DATA = 0XFF;  
  145.     LCD_RST = 1;  
  146.     LCD_CS1 =1;   
  147.     LCD_RD = 1;   
  148.     LCD_RS = 1;   
  149.     LCD_WR = 1;  
  150.     Delay4Xus(_dt);  
  151.     LCD_RST = 0;  
  152.     DelayMs(20);  
  153.     LCD_RST = 1;  
  154.     DelayMs(100);  
  155. }  
  156. void LcdScreenFill(Uchar SetX)  
  157. {  
  158.     Uchar READ_REG;  
  159.     Uchar i,j;  
  160.     LCD_CmdWrite(cPattDatReg,SetX);   
  161. //  READ_REG = LCD_CmdRead(0xF0);  
  162. //  READ_REG &= 0xF7;  
  163. //  READ_REG |= 0x08;  
  164.     READ_REG=0xA8;  
  165.     LCD_CmdWrite(cFonConReg,READ_REG);   
  166.     DelayMs(1);  
  167.     LCD_DataWrite(SetX);  
  168. }  
  169.   
  170. void GotoXY(Uchar x1,Uchar y1)  
  171. {  
  172.     LCD_CmdWrite(cCursorPosXReg,x1); // 设定水平坐标地址  
  173.     LCD_CmdWrite(cCursorPosYReg,y1); // 设定垂直坐标地址  
  174. }  
  175. void LCD_Initial(void)  
  176. {  
  177.     LCD_CmdWrite(cWholChipConReg,0x20); // LCD 基本显示功能设定-1  
  178.     DelayMs(5);  
  179.     LCD_CmdWrite(cWholChipConReg,0xcd);  
  180.     LCD_CmdWrite(cWholChipCurConReg,0x6b); // LCD 基本显示功能设定-2  
  181.     LCD_CmdWrite(cDistOfWordOrLineReg,0x10); // 设定光标高度与行距  
  182.     LCD_CmdWrite(cShifClkConReg,0x04);  
  183.     LCD_CmdWrite(cFonConReg,0xa0); // 设定中文字型为”BIG5”  
  184.     LCD_CmdWrite(cClkBusyFreqReg,0xf2); // 系统工作频率与中断准位设定  
  185.     SetActiveWindow(0, 39, 0, 239);  
  186.     LCD_CmdWrite(cDisWinBoReg,0xEF); // 设定LCD 模块水平起始地址(Y1)  
  187.     LCD_CmdWrite(cDisWinLeReg,0x00); // 设定LCD 模块垂直结束地址(X2)  
  188.     LCD_CmdWrite(cDisWinToReg,0x00); // 设定LCD 模块水平结束地址(Y2)  
  189.     LCD_CmdWrite(cFraRatComAReg,0x40); // 变换FRM 极性的起始地址(Common)  
  190.     LCD_CmdWrite(cContraConReg,0x20); // 设定DAC 电流输出,可调整LCD 亮度  
  191.     LCD_CmdWrite(cAdvPowSetReg,0x30); // LCD 内存读写速度与功能设定  
  192.     LCD_CmdWrite(cAdvDisSetReg,0x80); // LCD 特殊显示功能  
  193.     LCD_CmdWrite(cMemAccModReg,0x91); // LCD 显示图层设定  
  194.     vMemAccModVal=0x91;  
  195.     GotoXY(0, 0);  
  196.     LCD_CmdWrite(cBegSegmPosReg,0x00); // 设定垂直开始显示地址(Segment)  
  197.     LCD_CmdWrite(cBegCommReg,0x00); // 设定于水平区块移动模式下,起始地址  
  198.     LCD_CmdWrite(cEndCommReg,0xEF); // 设定于水平区块移动模式下,结束地址  
  199.     LCD_CmdWrite(cBlinkTimReg,0x33); // 光标闪烁时间设定  
  200.     LCD_CmdWrite(cFraRatComBReg,0x00); // 变换FRM 极性的结束地址(Common)  
  201.     LCD_BLK = 1;  
  202. }  
  203. void    PrintGraphicLogo(stWinAndCur *WinCur, const rom Uchar *Logo, Uint LogoLen)  
  204. {  
  205.     Uint Li;  
  206.     CharOrGrapMode(0);  
  207.     SetActiveWindow(WinCur->WinLef, WinCur->WinRig, WinCur->WinTop, WinCur->WinBot);  
  208.     GotoXY(WinCur->CurX, WinCur->CurY);  
  209.     for(Li=0; Li<LogoLen; Li++)  
  210.     {  
  211.         LCD_DataWrite(*Logo++);  
  212.     }  
  213. }  
  214. void PrintLargeLogo(const rom Uchar *Logo,Uint LogoLen)  
  215. {  
  216.     Uint Li;  
  217.     Uchar TempDl=40;  
  218.     CharOrGrapMode(0);  
  219.     SetActiveWindow(5, 34, 0, 239);  
  220.     GotoXY(5, 53);  
  221.     for(Li=0; Li<LogoLen; Li++)  
  222.     {  
  223.         LCD_DataWrite(*Logo++);  
  224.         if(--TempDl==0x00)  
  225.         {  
  226.             DelayMs(8);  
  227.             TempDl = 40;  
  228.         }  
  229.     }  
  230. }  
  231. void PrintTextOrGraph( far rom DispMenu * PtMenu,Uchar MenuNum)  
  232. {  
  233.     Uchar TempBit1,TempBit2;  
  234.     Uchar TB1,TB2=0;  
  235.     far rom Uchar * TemPr=NULL;  
  236.     Uint       TB3;  
  237.     for(TB1=0; TB1<MenuNum; TB1++,PtMenu++)  
  238.     {  
  239.         TempBit1=PtMenu->VisionOrNo;  
  240.         TempBit2=PtMenu->DispCondition;  
  241.         if(!(TempBit1&0x01))  
  242.             break;  
  243.         if(TempBit2&0x20)  
  244.         {  
  245.             if(PtMenu->StrLen==0x00)  
  246.             {  
  247.                 PageOperate(2, 0, 2);  
  248.                 break;  
  249.             }  
  250.             else if(PtMenu->StrLen==0xff)  
  251.             {  
  252.                 PageOperate(3, 1, 1);  
  253.                 break;  
  254.             }  
  255.         }  
  256.         CharOrGrapMode((TempBit1&0x02) ? 0xff : 0x00);  
  257.         ReverAndBold((TempBit1&0x0c)<<2);  
  258.         FontSize((TempBit1&0xc0)>>6, (TempBit1&0x30)>>4);  
  259.         ASC_ChiAutoSele((TempBit2&0x02) ? 0xff : 0x00);  
  260.         SetActiveWindow(PtMenu->AcWinLef,  
  261.             PtMenu->AcWinRig, PtMenu->AcWinTop, PtMenu->AcWinBot);  
  262. //      GotoXY(PtMenu->StCurX, PtMenu->StCurY);  
  263.         if(TempBit1&0x02)  
  264.         {  
  265.             GotoXY(PtMenu->StCurX, PtMenu->StCurY);  
  266.             for (TB2=0,TB3=PtMenu->StrLen,   
  267.                 TemPr=(far rom Uchar *)((*PtMenu).StrPt); TB2<=PtMenu->StrRow; TB2++)  
  268.             {  
  269.                 for (; ((*TemPr != '/0')&&(TB3>0)); TemPr++,TB3--)  
  270.                 {  
  271.                     LCD_DataWrite(*TemPr);  
  272.                 }  
  273.                 TB3=PtMenu->StrLen;  
  274.             /*  if(TempBit2&0x04) 
  275.                     GotoXY(PtMenu->StCurX, PtMenu->StCurY+TB2*26); 
  276.                 else */  
  277.                     GotoXY(PtMenu->StCurX, PtMenu->StCurY+TB2*29);  
  278.                 TemPr=(far rom Uchar *)((*PtMenu).StrPt+TB3*TB2);  
  279.             }  
  280.         }else if (!(TempBit2&0x08)&& (TempBit2&0x10))  
  281.         {  
  282.             GotoXY(PtMenu->StCurX, PtMenu->StCurY);  
  283.             TB2=PtMenu->StrRow;   
  284.             LcdScreenFill(TB2);  
  285.         }else if (TempBit2&0x08)  
  286.         {  
  287.             GotoXY(PtMenu->StCurX, PtMenu->StCurY+TB2*29);  
  288.             TB2++;  
  289.             for (TB3=PtMenu->StrLen, TemPr=(far rom Uchar *)((*PtMenu).StrPt);  
  290.                 TB3>0; TemPr++,TB3--)  
  291.             {  
  292.                 LCD_DataWrite(*TemPr);  
  293.             }  
  294.         }  
  295.     }  
  296. }  

 

[c-sharp]  view plain copy
  1. /*-------------------------------------------------------------------------- 
  2. Dplay.H 
  3.  
  4. C Display  functions. 
  5. Copyright (c) 2008.03.20  for ??  Ltd. 
  6. Author   :        ZMF 2008.03.20 
  7. VOL       :        V0.1 
  8. --------------------------------------------------------------------------*/  
  9.  
  10. #ifndef          _LM2068R_DRIVER_H  
  11. #define     _LM2068R_DRIVER_H  
  12. #include "LCD_Define.h"  
  13. extern void     LCD_CmdWrite(Uchar cmdReg, Uchar cmdData);  
  14. extern Uchar    LCD_CmdRead(Uchar cmdReg);  
  15. extern void     LCD_DataWrite(Uchar WrData);  
  16. extern void     LCD_ChkBusy(void);  
  17. extern void     LCD_Reset(void);  
  18. extern void     LCD_Initial(void);  
  19. extern void     LcdScreenFill(Uchar SetX);  
  20. extern void     GotoXY(Uchar x1,Uchar y1);  
  21. extern void     CharOrGrapMode(Uchar CharSet);        
  22. extern void     ReverAndBold(Uchar RevBold);//RevBold:bit5bit4:01-R_N_B_Y;10-R_Y_B_N;  
  23. extern void     FontSize(Uchar XSize, Uchar YSize);       
  24. extern void ASC_ChiAutoSele(Uchar AscSet);  
  25. extern void SetActiveWindow(Uchar Left, Uchar Right, Uchar Top, Uchar Bottom);  
  26. extern void PageOperate(Uchar PaMo, Uchar PaOp, Uchar DisPa);  
  27. extern void PrintGraphicLogo(stWinAndCur *WinCur, const rom Uchar *Logo, Uint LogoLen);  
  28. extern void     PrintLargeLogo( const rom Uchar *Logo,Uint LogoLen);  
  29. extern void     PrintTextOrGraph( far rom DispMenu * PtMenu,Uchar MenuNum);  
  30. #endif  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值