⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcddev.lst

📁 基于C8051F020及RA8806控制芯片的液晶驱动程序
💻 LST
字号:
C51 COMPILER V8.02   LCDDEV                                                                04/15/2009 14:22:20 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE LCDDEV
OBJECT MODULE PLACED IN lcddev.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcddev.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "lcddev.h"
   2          #include "ctypedef.h"
   3          
   4          //初始化8051
   5          void Port_IO_Init()
   6          {
   7   1          XBR0    = 0x00;                    
   8   1          XBR1    = 0x00;
   9   1          XBR2    = 0x40;                     //io交叉配置允许
  10   1          P0MDOUT = 0xff;
  11   1              P3MDOUT = 0xff;
  12   1      }
  13          
  14          void Oscillator_Init()  //选用内部振荡器
  15          {
  16   1          OSCICN    = 0x05;
  17   1      }  
  18          
  19          void Reset_Sources_Init()
  20          {
  21   1          WDTCN     = 0xDE;   //关闭看门狗
  22   1          WDTCN     = 0xAD;
  23   1      }
  24          
  25          
  26          void SYSCLK_Init (void)
  27          {
  28   1         int i;                              
  29   1         OSCXCN = 0x67;                      // 外部晶振,大于6.7MHz
  30   1         for (i=0; i < 2000; i++) ;           // 等待起振
  31   1         while (!(OSCXCN & 0x80)) ;          // 检测是否起振
  32   1         OSCICN = 0x88;                      // 设置为系统时钟为外部晶振,且开启时钟丢失检测
  33   1      } 
  34          
  35          // Initialization function for device,
  36          // Call Init_Device() from your main program
  37          void Init_Device(void)
  38          {
  39   1              Reset_Sources_Init();
  40   1              SYSCLK_Init ();
  41   1          //Oscillator_Init();
  42   1              Port_IO_Init();
  43   1      }
  44          
  45          /*
  46            
  47          */
  48          void Delay(uchar t)
  49          {
  50   1        while(t--);
  51   1      }
  52          
  53          
  54          /*--------------------------------
  55           函数名:void LCD_ChkBusy(void);
C51 COMPILER V8.02   LCDDEV                                                                04/15/2009 14:22:20 PAGE 2   

  56          函数功能:检查LCD是否忙
  57          使用说明:
  58          使用说明:
  59                     状态字格式:bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
  60                             状态字说明:
  61                                          bit7:  存储器读写状态        0 准备好    1 忙 
  62                                                          bit6:  扫描状态              0 准备好    1 忙
  63                                                          bit5:  睡眠模式              0 正常      1 睡眠
  64                                                          bit4  bit3:    不用
  65                                                          bit2: 唤醒状态位
  66                                                          bit1: KS状态
  67                                                          bit0: TP状态
  68          
  69          
  70          -----------------------------------*/
  71          
  72          void Lcd_ChkBusy(void)
  73          {
  74   1       uchar temp;
  75   1       do{
  76   2          //LcdDataPort_InPut(); 
  77   2          RS = 0;
  78   2              CS = 1;
  79   2              WR = 1;
  80   2              RD = 1;
  81   2              Delay(2);
  82   2              RS = 1;
  83   2          Delay(2);
  84   2              CS = 0;
  85   2              Delay(5);
  86   2              RD = 0;//开始读状态
  87   2          temp = Lcd_DataPort;
  88   2              Delay(10);
  89   2              RD = 1;
  90   2          Delay(2);
  91   2              CS = 1;
  92   2          RS = 0;
  93   2              }while(temp & 0xC0);
  94   1      }
  95          
  96          
  97          /*void Lcd_writedatatocmd(uchar CmdReg,uchar udata)  ///写数据到到寄存器
  98          { 
  99                  CS = 0;
 100                  RS = 1;
 101                  Delay(2);//
 102                  WR = 0;
 103                  Lcd_DataPort = CmdReg;
 104                  Delay(10);// 最小20ns
 105                  WR = 1;// 完成写寄存器
 106                  Delay(2);
 107                  CS = 1;
 108                  RS = 0;
 109                  Delay(20);
 110                  CS = 0;
 111                  Delay(10);//
 112                  WR = 0;
 113                  Lcd_DataPort = udata;
 114                  Delay(30);//最小50ns
 115                  WR = 1;
 116                  CS = 1;
 117                  RS = 1;
C51 COMPILER V8.02   LCDDEV                                                                04/15/2009 14:22:20 PAGE 3   

 118          }*/
 119          
 120          
 121          void Lcd_writecmd(uchar CmdReg) //写命令
 122          {
 123   1              CS = 0;
 124   1              RS = 1;
 125   1              WR = 0;
 126   1              Lcd_DataPort = CmdReg;
 127   1              Delay(10);// 最小20ns
 128   1              WR = 1;// 完成写寄存器
 129   1              Delay(2);
 130   1              CS = 1;
 131   1              RS = 0;
 132   1      }
 133          void Lcd_writedata(uchar DatValue)//写数据
 134          {
 135   1              CS = 0;
 136   1              RS = 0;
 137   1              Delay(10);//
 138   1              WR = 0;
 139   1              Lcd_DataPort = DatValue;
 140   1              Delay(30);//最小50ns
 141   1              WR = 1;
 142   1              CS = 1;
 143   1              RS = 1;
 144   1      }
 145          void Lcd_writedatatocmd(uchar CmdReg,uchar udata)  ///写数据到到寄存器
 146          {
 147   1              Lcd_writecmd(CmdReg);
 148   1              Lcd_writedata(udata);
 149   1      }
 150          
 151          /*
 152          函数名:
 153          */
 154          /*uchar Lcd_readcmd(void)
 155          {
 156           uchar CmdReg;
 157           LcdDataPort_InPut(); 
 158           CS = 0;
 159           RS = 0;
 160           WR = 1;
 161           RD = 0;
 162           CmdReg = Lcd_DataPort;
 163           Delay(4);
 164           RD = 1;
 165           CS = 1;
 166           return CmdReg;
 167          }
 168          */
 169          
 170          
 171          uchar Lcd_readdatafromcmd(uchar CmdReg)
 172          {
 173   1       uchar udata;
 174   1       Lcd_writecmd(CmdReg);
 175   1       udata = Lcd_readdata();
 176   1       return udata;
 177   1      }
 178          
 179          
C51 COMPILER V8.02   LCDDEV                                                                04/15/2009 14:22:20 PAGE 4   

 180          
 181          uchar Lcd_readdata(void)
 182          {
 183   1       uchar udata;
 184   1              CS = 0;
 185   1              RS = 0;
 186   1              WR = 1;
 187   1              Delay(10);//
 188   1              RD = 0;
 189   1              udata = Lcd_DataPort;
 190   1              Delay(30);//最小50ns
 191   1              RD = 1;
 192   1              CS = 1;
 193   1              RS = 1;
 194   1       return udata;
 195   1      }
 196          
 197          //开显示
 198          void LCD_ON(void)
 199          {
 200   1              uchar temp;
 201   1              temp = Lcd_readdatafromcmd(WLCR);
 202   1              temp |= 0x04;
 203   1              Lcd_writedatatocmd(WLCR,temp);
 204   1      }  
 205          /*
 206          函数名:void LCD_OFF(void)
 207          
 208          */
 209          //关显示
 210          void LCD_OFF(void)
 211          {
 212   1              uchar temp;
 213   1              temp = Lcd_readdatafromcmd(WLCR );
 214   1              temp &= 0xFB;
 215   1          Lcd_writedatatocmd(WLCR     ,temp);
 216   1      } 
 217          
 218          //设置光标位置
 219          void LCD_GotoXY(uchar X1,uchar Y1)  
 220          {
 221   1          Lcd_writedatatocmd(CURX,X1 & 0x3f); 
 222   1          Delay(2);
 223   1          Lcd_writedatatocmd(CURY,Y1 & 0xff);  
 224   1          Delay(2);
 225   1      }
 226            
 227            //文字模式
 228          void LCD_TEXT(void)
 229          {
 230   1       uchar temp;
 231   1       temp = Lcd_readdatafromcmd(WLCR);
 232   1       temp |= 0x08;   //WLCR寄存器第3位
 233   1       Lcd_writedatatocmd(WLCR,temp);
 234   1      }
 235          
 236          
 237          //绘图模式
 238          void LCD_Graphic(void)
 239          {
 240   1       uchar temp;
 241   1       temp = Lcd_readdatafromcmd(WLCR);
C51 COMPILER V8.02   LCDDEV                                                                04/15/2009 14:22:20 PAGE 5   

 242   1       temp &= 0xf7; //改变WLCR第三位
 243   1       Lcd_writedatatocmd(WLCR,temp);
 244   1      }
 245          
 246          //显示
 247          void Access_2Page(void)
 248          {
 249   1       uchar temp;
 250   1       temp = Lcd_readdatafromcmd(MAMR);
 251   1       temp |= 0x03;//置位第 1 2 位,完成选择同时存取DDRAM1和DDRAM2
 252   1       Lcd_writedatatocmd(MAMR,temp);
 253   1      }
 254          
 255          void Onlyshowpage1(void)
 256          {
 257   1       uchar temp;
 258   1       temp = Lcd_readdatafromcmd(MAMR);
 259   1       temp &= 0x9f;//清零第6 ,5位
 260   1       temp |= 0x10;//置位第4位;完成在屏幕上只显示DDRAM1
 261   1       Lcd_writedatatocmd(MAMR,temp);
 262   1      }
 263          
 264          void Lcd_stringwrite(uchar *pstr,uchar strlen,uchar DispMode)
 265          {
 266   1       uint i;
 267   1       Lcd_ChkBusy();
 268   1       //LcdDataPort_OutPut();
 269   1       RS = 1;
 270   1       RD = 1;
 271   1       CS = 0;
 272   1       Lcd_DataPort = MWCR; //从光标处写入内存指令
 273   1       WR = 0;  //写寄存器
 274   1       Delay(5);
 275   1       WR = 1;
 276   1       CS = 1;
 277   1       RS = 0;
 278   1       CS = 0;
 279   1       for(i=0; i<strlen; i++)
 280   1               {      
 281   2               if(DispMode == 1)      
 282   2                  Lcd_DataPort = ((*pstr++));                           // 准备预写入显示内存的数据  
 283   2               else
 284   2                  Lcd_DataPort = (~(*pstr++));                                  // 准备预写入显示内存的数据  
 285   2               WR = 0;                                                          // "写"信号使能 开始写
 286   2               Delay(2);                                                                               
 287   2               WR = 1;                                  // "写"信号禁能 
 288   2               }                                                        
 289   1      
 290   1              CS = 1;
 291   1              RS = 1;
 292   1      }
 293          
 294          
 295          void ClearRam(void)
 296          {
 297   1       uchar temp0,temp1;
 298   1       
 299   1       //LCD_Graphic();
 300   1       //Access_2Page();
 301   1       temp0 = Lcd_readdatafromcmd(FNCR);
 302   1       temp0 |= 0x80; //
 303   1       Lcd_writedatatocmd(FNCR,temp0); //开始清除内存
C51 COMPILER V8.02   LCDDEV                                                                04/15/2009 14:22:20 PAGE 6   

 304   1      
 305   1       do     //检测是否已经清除完
 306   1       {
 307   2        Delay(5);
 308   2        temp1 =Lcd_readdatafromcmd(FNCR);
 309   2        temp1 &= 0x80;
 310   2        } while(temp1 );
 311   1      
 312   1      }
 313          
 314          
 315          void Lcd_clearscreen(void)
 316          {
 317   1       //LCD_TEXT();
 318   1       Onlyshowpage1();
 319   1       Lcd_writedatatocmd(FNCR,0x00);
 320   1       ClearRam();
 321   1      }
 322           
 323            //初始化液晶寄存器
 324          void IniLcd(void)
 325          {
 326   1       Lcd_writedatatocmd(WLCR,0X00);
 327   1       Lcd_writedatatocmd(MISC,0x00);
 328   1       Lcd_writedatatocmd(ADSR,0x00);
 329   1       Lcd_writedatatocmd(INTR,0x00);
 330   1       Lcd_writedatatocmd(WCCR,0x00);
 331   1       Lcd_writedatatocmd(CHWI,0x00);
 332   1       Lcd_writedatatocmd(MAMR,0x11);
 333   1       Lcd_writedatatocmd(AWRR,0x27);
 334   1       Lcd_writedatatocmd(DWWR,0x27);
 335   1       Lcd_writedatatocmd(AWBR,0xEF);
 336   1       Lcd_writedatatocmd(DWHR,0xEF);
 337   1       Lcd_writedatatocmd(AWLR,0x00);
 338   1       Lcd_writedatatocmd(AWTR,0x00);
 339   1       Lcd_writedatatocmd(CURX,0x00);
 340   1       Lcd_writedatatocmd(BGSG,0x00);
 341   1       Lcd_writedatatocmd(EDSG,0x00);
 342   1       Lcd_writedatatocmd(CURY,0x00);
 343   1       Lcd_writedatatocmd(BGCM,0x00);
 344   1       Lcd_writedatatocmd(EDCM,0x00);
 345   1       Lcd_writedatatocmd(BTMR,0x00);
 346   1       Lcd_writedatatocmd(ITCR,0x00);
 347   1       Lcd_writedatatocmd(KSCR1,0x00);
 348   1       Lcd_writedatatocmd(KSCR2,0x00);
 349   1       Lcd_writedatatocmd(KSDR0,0x00);
 350   1       Lcd_writedatatocmd(KSDR1,0x00);
 351   1       Lcd_writedatatocmd(KSDR2,0x00);
 352   1       Lcd_writedatatocmd(TPCR1,0x00);
 353   1       Lcd_writedatatocmd(TPXR,0x00);
 354   1       Lcd_writedatatocmd(TPYR,0x00);
 355   1       Lcd_writedatatocmd(TPZR,0x00);
 356   1       Lcd_writedatatocmd(TPCR2,0x00);
 357   1       Lcd_writedatatocmd(PCR,0x00);
 358   1       Lcd_writedatatocmd(PDCR,0x00);
 359   1       Lcd_writedatatocmd(PNTR,0x00);
 360   1       Lcd_writedatatocmd(FNCR,0X00);
 361   1       Lcd_writedatatocmd(FVHT,0x00);
 362   1      // Lcd_clearscreen();//初始化LCD,选择只显示TXT格式,DDRAM1,自动清除DDRAM
 363   1       //LCD_GotoXY(0x00,0x00);
 364   1      }

C51 COMPILER V8.02   LCDDEV                                                                04/15/2009 14:22:20 PAGE 7   


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    748    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       5
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -