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

📄 lcd_fun.lst

📁 使用51单片机作为控制器
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   LCD_FUN                                                               05/14/2007 22:03:38 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE LCD_FUN
OBJECT MODULE PLACED IN LCD_FUN.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE LCD_FUN.C LARGE BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include "at89x52.h"
   2          #include "stdio.h"
   3          #define uchar unsigned char
   4          #define uint  unsigned int
   5          
   6          sbit sclk=P1^0;//时钟 
   7          sbit sdin=P1^1; //数据 
   8          sbit dc=P1^2;//1写数据,0写指令 
   9          sbit sce=P1^3;//片选 
  10          sbit res=P1^7;//复位,0复位 
  11          
  12          extern uchar code gFontLib[][24];
  13          extern uchar code font6x8[][6];
  14          
  15          //-------------------------------延时----------------------------------
  16          void delayus(uchar m)
  17          {
  18   1              while(m--);
  19   1      }
  20          void delay_1ms(void)                 //1ms延时函数
  21          {
  22   1         uint i;
  23   1         for (i=0;i<1140;i++);
  24   1      }
  25          void delay_nms(uint n)       //N ms延时函数
  26          {
  27   1         uint i=0;
  28   1         for (i=0;i<n;i++)
  29   1         delay_1ms();
  30   1      }
  31          //----------------------------写一字节--------------------------------------------
  32          void LCD_write_byte(uchar datatemp,bit mod)
  33          { 
  34   1              uchar data i=8; 
  35   1              sce=0; 
  36   1              dc=mod; //mod=0,命令模式。mod=1,数据模式。
  37   1              while (i--)
  38   1              { 
  39   2                      if (datatemp&0x80)
  40   2                              sdin=1;
  41   2                      else 
  42   2                              sdin=0;
  43   2                      sclk=0; 
  44   2                      sclk=1; 
  45   2                      datatemp<<=1; 
  46   2              } 
  47   1              dc=1; 
  48   1              sce=1; 
  49   1              sdin=1; 
  50   1      } 
  51          //-----------------------LCD初始化--------------------------------------------
  52          void LCD_init(void)
  53          { 
  54   1              res=0; 
  55   1              delayus(100); 
C51 COMPILER V7.06   LCD_FUN                                                               05/14/2007 22:03:38 PAGE 2   

  56   1              res=1; 
  57   1              sce=1; 
  58   1              sdin=1; 
  59   1              sclk=1; 
  60   1              LCD_write_byte(0x21,0);//初始化Lcd,功能设定使用扩充指令 
  61   1              LCD_write_byte(0xd5,0);//设定液晶偏置电压(高--低) 
  62   1              LCD_write_byte(0x20,0);//使用基本指令 
  63   1              LCD_write_byte(0x0C,0);//设定显示模式,正常显示 
  64   1      }
  65          //----------------------设定地址 y=0~5,x=0~83----------------------------------------
  66          void LCD_set_XY(uchar X, uchar Y)
  67            {
  68   1          LCD_write_byte(Y|0x40, 0);          // column
  69   1          LCD_write_byte(X|0x80 , 0);         // row
  70   1        }
  71          //----------------------清全屏 ------------------------------------------------------
  72          extern bit r0,r1,r2,r3;//对应某一行反显标志位;
  73          extern uchar gLCDScr[4][7];
  74          void LCD_clr(void)
  75          { 
  76   1              uchar data m,n; 
  77   1              LCD_set_XY(0,0); 
  78   1              for (m=0;m<6;m++)
  79   1              { 
  80   2                      for (n=0;n<84;n++)
  81   2                              LCD_write_byte(0,1); 
  82   2              }
  83   1          r0=r1=r2=r3=0;//对应某一行反显标志位同时清零
  84   1              for(m=0;m<4;m++)//字符点阵跟踪表同时清零
  85   1                      for(n=0;n<7;n++)
  86   1                      gLCDScr[m][n]=0;
  87   1      }
  88          //----------------------正/反显示英文字符------------------------------------------------- 
  89          void LCD_write_char(uchar c,bit reverse)
  90            {
  91   1          uchar data line;
  92   1              if(c>127)
  93   1                      c='?';
  94   1          if(reverse)
  95   1                      for (line=0; line<6; line++)
  96   1                              LCD_write_byte(~font6x8[c][line], 1);
  97   1          else
  98   1                      for (line=0; line<6; line++)
  99   1                              LCD_write_byte(font6x8[c][line], 1);
 100   1        }
 101          
 102          
 103          //-------------------正/反显示英文字符串显示函数-----------------------------------------------
 104          //reverse为1则反显示。
 105          void LCD_write_english_string(uchar X,uchar Y,char *s,bit reverse)
 106            {
 107   1          LCD_set_XY(X,Y);
 108   1          while (*s) 
 109   1            {
 110   2                      LCD_write_char(*s,reverse);
 111   2                      s++;
 112   2            }
 113   1        }
 114           
 115          /*--------------------在LCD上显示汉字------------------------------------------------------
 116          
 117          输入参数:X、Y    :显示汉字的起始X、Y坐标;
C51 COMPILER V7.06   LCD_FUN                                                               05/14/2007 22:03:38 PAGE 3   

 118                    ch_wide :汉字点阵的宽度
 119                    num     :显示汉字的个数;  
 120                    line    :汉字点阵数组中的起始行数
 121                    row     :汉字显示的行间距
 122          编写日期          :2004-8-11 
 123          最后修改日期      :2004-8-12 
 124          测试:
 125                  LCD_write_chi(0,0,12,7,0,0);
 126                  LCD_write_chi(0,2,12,7,0,0);
 127                  LCD_write_chi(0,4,12,7,0,0);    
 128                                 
 129          void LCD_write_chinese_string(uchar X, uchar Y, 
 130                             uchar ch_wide,uchar num,
 131                             uchar line,uchar row)
 132            {
 133              uchar data i,n;
 134              
 135              LCD_set_XY(X,Y);                             //设置初始位置
 136              
 137              for (i=0;i<num;)
 138                {
 139                  for (n=0; n<ch_wide*2; n++)              //写一个汉字
 140                    { 
 141                      if (n==ch_wide)                      //写汉字的下半部分
 142                        {
 143                          if (i==0) LCD_set_XY(X,Y+1);
 144                          else
 145                             LCD_set_XY((X+(ch_wide+row)*i),Y+1);
 146                        }
 147                      LCD_write_byte(gFontLib[line+i][n],1);
 148                    }
 149                  i++;
 150                  LCD_set_XY((X+(ch_wide+row)*i),Y);
 151                }
 152            }
 153          */   
 154          /*-----------------位图绘制函数------------------------------------------------------
 155          
 156          输入参数:X、Y    :位图绘制的起始X、Y坐标;
 157                    *map    :位图点阵数据;
 158                    Pix_x   :位图像素(长)
 159                    Pix_y   :位图像素(宽)
 160          
 161          编写日期          :2004-8-13
 162          最后修改日期      :2004-8-13 */
 163          void LCD_DrawPic(uchar X,uchar Y,uchar *map,
 164                            uchar Pix_x,uchar Pix_y)
 165            {
 166   1          uint data i,n;
 167   1          uchar row;
 168   1          
 169   1          if (Pix_y%8==0) row=Pix_y/8;      //计算位图所占行数
 170   1          else
 171   1              row=Pix_y/8+1;
 172   1          
 173   1          for (n=0;n<row;n++)
 174   1            {
 175   2              LCD_set_XY(X,Y);
 176   2              for(i=0; i<Pix_x; i++)
 177   2                {
 178   3                  LCD_write_byte(map[i+n*Pix_x], 1);
 179   3                }
C51 COMPILER V7.06   LCD_FUN                                                               05/14/2007 22:03:38 PAGE 4   

 180   2              Y++;                         //换行
 181   2            }      
 182   1        }
 183          //----------------------写一屏图 -----------------------------------------------
 184          /*void LCD_write_pic(uchar *map)
 185          { 
 186                  uchar  e; 
 187                  uchar  t; 
 188                  uchar  k; 
 189                  uint   d=0; 
 190                  for (t=0;t<6;t++)
 191                  { 
 192                          for (k=0;k<84;k++)
 193                          { 
 194                                  e=*(map+d);
 195                                  d++; 
 196                                  LCD_write_byte(e,1); 
 197                          } 
 198                  } 
 199          }*/ 
 200          //---------------------------正/反显示 12*12点阵字符------------------------------- 
 201          /* 屏幕划分为4*7=28个区,用X,Y表示
 202             0<=X<4, 0<=Y<7
 203             字符点阵数据以小字库形式置于FLASH中
 204             3310LCD以水平寻址模式时,每次接收8位,以列形式显示到屏幕中
 205             因此,显示12*12点阵相当于用3字节显示2行字符
 206             则第一行字符会履盖第二行的头4位
 207             解决:设置一个显示字符点阵跟踪表
 208            满屏显示4*7=28,需保存28个字符的点阵链接
 209            表元素由1字节组成,可寻址256个字符     */
 210             
 211          unsigned char idata     gLCDx,gLCDy;//输出8位数据的最低位为点阵字的最高位
 212          unsigned char gLCDScr[4][7]; // 字符点阵跟踪表
 213          void LCD_set_RC(unsigned char x, unsigned char y)  //R(row),C(column);
 214          {  
 215   1              gLCDx = x;
 216   1              gLCDy = y;
 217   1              if(y>6) {         //如果某行字数大于6
 218   2                      gLCDy = 0;    
 219   2                      gLCDx ++;     //跳向另一行开始位置
 220   2                      }
 221   1              if(x>3)
 222   1                      gLCDx = 0;
 223   1              if(x<2)
 224   1                      LCD_set_XY(y*12,x);
 225   1              else
 226   1                      LCD_set_XY(y*12,x+1);
 227   1      } 
 228          bit r0,r1,r2,r3;//对应某一行反显标志位;
 229          void LCD_putc(unsigned char iIndex,bit reverse)
 230          {
 231   1              unsigned char data i,iTmp,dat;
 232   1              gLCDScr[gLCDx][gLCDy] = iIndex;
 233   1              LCD_set_RC(gLCDx,gLCDy);
 234   1              switch(gLCDx) {
 235   2                      case    0:
 236   2                              if(reverse)
 237   2                              {       for(i=0;i<12;i++){                                              // 显示高8位
 238   4                                              LCD_write_byte(~gFontLib[iIndex][i],1);
 239   4                                      }
 240   3                                      r0=1;
 241   3                              }
C51 COMPILER V7.06   LCD_FUN                                                               05/14/2007 22:03:38 PAGE 5   

 242   2                              else
 243   2                              {       for(i=0;i<12;i++){                                              // 显示高8位
 244   4                                              LCD_write_byte(gFontLib[iIndex][i],1);
 245   4                                      }
 246   3                                      r0=0;
 247   3                              }
 248   2                              LCD_set_XY(gLCDy*12,1);
 249   2                              for(i=0;i<12;i++) {                                             // 显示低4位
 250   3                                      iTmp = gLCDScr[1][gLCDy];                       
 251   3                                      iTmp = gFontLib[iTmp][i]<<4;
 252   3                                      //iTmp <<= 4;
 253   3                                      dat = gFontLib[iIndex][i+12];           
 254   3                                      if(r0)

⌨️ 快捷键说明

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