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

📄 51lcd1602+=

📁 51简易计算器_lcd1602
💻
字号:
C51 COMPILER V9.00   LCD1602                                                               12/11/2011 23:03:25 PAGE 1   


C51 COMPILER V9.00, COMPILATION OF MODULE LCD1602
OBJECT MODULE PLACED IN lcd1602.OBJ
COMPILER INVOKED BY: D:\Program Files\keil4\C51\BIN\C51.EXE lcd1602.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*********************************************************
   2          LCD1602的驱动程序
   3          **********************************************************/
   4          #include <reg52.h>
   5          #include "work.h"
   6          #include <math.h>
   7          
   8          //===========================================================
   9          //延时约1毫秒
  10          //===========================================================
  11          void delayms(uint z)
  12          {
  13   1              uint x,y;
  14   1              for(x=z;x>0;x--)
  15   1                      for(y=120;y>0;y--);
  16   1      }
  17          //===========================================================
  18          //lcd读忙标志
  19          //===========================================================
  20          uchar lcdbusy()
  21          {
  22   1        bit result;
  23   1        lcd_rs = 0;
  24   1        lcd_rw = 1;
  25   1        lcd_en = 1;
  26   1        delayms(1);
  27   1        result = (bit)(P0 &0x80);
  28   1        lcd_en = 0;
  29   1        return (result);
  30   1      }
  31          
  32          //============================================================
  33          //"写数据函数"
  34          void writedata(uchar wrdata1)   //"写数据函数"
  35          {       
  36   1              while(lcdbusy());
  37   1              lcd_rs=1;               //write data
  38   1              lcd_rw=0;
  39   1              lcd_en=1;
  40   1              DQ=wrdata1;
  41   1              delayms(5);
  42   1              lcd_en=0;               
  43   1      }
  44          //============================================================
  45          //"写命令函数"
  46          //============================================================   
  47          void writecom(uchar comd)               //"写命令函数"
  48          {
  49   1              while(lcdbusy());
  50   1              lcd_rs=0;
  51   1              lcd_rw=0;
  52   1              lcd_en=1;
  53   1              DQ=comd;
  54   1              delayms(5);
  55   1              lcd_en=0;
C51 COMPILER V9.00   LCD1602                                                               12/11/2011 23:03:25 PAGE 2   

  56   1      } 
  57          
  58          /**********************************************************
  59          "写字符串函数"
  60           **********************************************************
  61          void writestr(uchar *p)  //"无地址,写之前要先写一个地址"
  62          {
  63             uchar i;
  64             i=0;
  65            while (p[i] != '\0')
  66            {
  67              writedata(p[i]);
  68              i++;
  69            }
  70          }                       *///---------此函数没有调用过,故注释掉--------------
  71          //*******************"初始化函数"********************************
  72          void lcdinit(void)                                      
  73          {       writecom(0x38);  //"5*8双行显示"
  74   1              delayms(5);
  75   1              writecom(0x06);
  76   1              delayms(5);
  77   1              writecom(0x0c);
  78   1              delayms(5);
  79   1              writecom(0x01); //"清屏"
  80   1              writecom(0x80);
  81   1      }
  82          
  83          //================================================================
  84          //  显示清除
  85          //================================================================
  86          void clearplay(uchar x)
  87          {
  88   1              uchar i;
  89   1              if(x==1)
  90   1              {
  91   2                      for(i=0;i<16;i++)
  92   2                              pbuffer1[i]=0;
  93   2              }
  94   1              else if(x==2)
  95   1              {
  96   2                      for(i=0;i<16;i++)
  97   2                              pbuffer2[i]=0;
  98   2              }
  99   1              else if(x==3)
 100   1              {
 101   2                      for(i=0;i<16;i++)
 102   2                      {
 103   3                              pbuffer1[i]=0;
 104   3                              pbuffer2[i]=0;
 105   3                      }
 106   2              }       
 107   1              pbuffer2[15]=0x30;
 108   1              pflag=1;        
 109   1      }
 110          
 111          //=================================================================
 112          //刷全屏:进行一次全屏的刷写
 113          //=================================================================
 114          void displayall(void)
 115          {
 116   1              uchar i;
 117   1              if(pflag==1)
C51 COMPILER V9.00   LCD1602                                                               12/11/2011 23:03:25 PAGE 3   

 118   1              {
 119   2                      writecom(0x0c);
 120   2                      writecom(0x80+0x40);                 //第二行
 121   2                      for(i=0;i<16;i++)
 122   2                              writedata(pbuffer2[i]);
 123   2      
 124   2      
 125   2                      writecom(0x80);         
 126   2                      for(i=0;i<16;i++)                     //第一行
 127   2                              writedata(pbuffer1[i]);
 128   2                      writecom(0x80+k);
 129   2                      writecom(0x0e);
 130   2                      pflag=0;                                          //清0显示标志位
 131   2              }
 132   1      }
 133          //==========================================================
 134          //flag=1,移第一行;flag=2,移第二行。
 135          //==========================================================
 136          void moveright(uchar flag)
 137          {
 138   1              uchar i;
 139   1              if(flag==1)
 140   1              {
 141   2                      for(i=15;i>0;i--)
 142   2                              pbuffer1[i]=pbuffer1[i-1];
 143   2                      pbuffer1[0]=0;  
 144   2              }
 145   1              else if(flag==2)
 146   1              {
 147   2                      for(i=15;i>0;i--)
 148   2                              pbuffer2[i]=pbuffer2[i-1];
 149   2                      pbuffer2[0]=0;  
 150   2              }
 151   1      }
 152          //=====================================================
 153          //功能:结果显示传换
 154          //说明:显示的结果小数部分是六位的,显示的只是表像结果,
 155          //      当进行连运算时,结果就不对了,显示结果没有更改上一次的计算结果
 156          //=====================================================
 157          void jchangep(void)                //结果显示传换
 158          {
 159   1              uchar i,p,q;               //i循环变量,p整数位数,q小数位数
 160   1              uchar n;
 161   1              long int j,m,xs;           //
 162   1              float xsj,jguo1;
 163   1              if(jguo<0) jguo1=-jguo;
 164   1              else jguo1=jguo;
 165   1              j=jguo1;                    //取整数部分
 166   1              xsj=jguo1-j;            //取小数部分
 167   1              p=0;
 168   1              q=0;
 169   1              if(j==0)//----------无整数---------------------
 170   1              {
 171   2                      p=1;
 172   2                      q=9;
 173   2                      xs=xsj*(long int)pow(10,9);
 174   2                      while(xs%10==0)
 175   2                      {
 176   3                              xs=xs/10;
 177   3                              q--;    
 178   3                      }             //取小数个数
 179   2                      xs=xsj*(long int)pow(10,q);
C51 COMPILER V9.00   LCD1602                                                               12/11/2011 23:03:25 PAGE 4   

 180   2                       for(i=15;i>15-q;i--)
 181   2                      {
 182   3                              pbuffer2[i]=xs%10+0x30;
 183   3                              xs=xs/10;       
 184   3                      }
 185   2                      if(jguo<0) pbuffer2[15-q-1-1]='-';
 186   2                      pbuffer2[15-q-1]=0x30;
 187   2                      pbuffer2[15-q]='.';
 188   2                      if(q>6)
 189   2                      {
 190   3                              n=q-6;
 191   3                              for(i=0;i<n;i++)
 192   3                                      moveright(2);
 193   3                              while(pbuffer2[15]==0x30)           //小数点后的0不显示
 194   3                              {
 195   4                                      moveright(2);
 196   4                              }
 197   3                      }
 198   2              }
 199   1              else if(xsj<0.000000002)//-----------无小数----------------
 200   1              {
 201   2                      q=0;
 202   2                      for(i=0;i<10;i++)
 203   2                      {
 204   3                              m=(long int)pow(10,i);     //p整数个数。q小数个数
 205   3                              if(j/m!=0)
 206   3                               p=i+1;
 207   3                      }
 208   2              
 209   2                      if(jguo<0) {pbuffer2[15-p]='-';}          //显示负号
 210   2                      for(i=15;i>15-p;i--)
 211   2                      {
 212   3                              pbuffer2[i]=j%10+0x30;
 213   3                              j=j/10; 
 214   3                      }
 215   2              }
 216   1              else //---------小数和整数部分都有---------------------------
 217   1              {
 218   2                      p=1;
 219   2                      q=9;
 220   2                      xs=xsj*(long int)pow(10,9);
 221   2                      while(xs%10==0)
 222   2                      {
 223   3                              xs=xs/10;
 224   3                              q--;    
 225   3                      }               //取小数个数
 226   2                      p=0;
 227   2                      for(i=0;i<10;i++)
 228   2                      {
 229   3                              m=(long int)pow(10,i);     //p整数个数。q小数个数
 230   3                              if(j/m!=0)
 231   3                               p=i+1;
 232   3                      }
 233   2                      xs=xsj*(long int)pow(10,q);
 234   2                       for(i=15;i>15-q;i--)
 235   2                      {
 236   3                              pbuffer2[i]=xs%10+0x30;
 237   3                              xs=xs/10;       
 238   3                      }
 239   2                      pbuffer2[15-q]='.';
 240   2                      if(jguo<0) pbuffer2[15-q-p-1]='-';
 241   2                      for(i=15-q-1;i>15-q-p-1;i--)
C51 COMPILER V9.00   LCD1602                                                               12/11/2011 23:03:25 PAGE 5   

 242   2                      {
 243   3                              pbuffer2[i]=j%10+0x30;
 244   3                              j=j/10; 
 245   3                      }
 246   2                      if(q>6)
 247   2                      {
 248   3                              n=q-6;
 249   3                              for(i=0;i<n;i++)
 250   3                                      moveright(2);
 251   3                              while(pbuffer2[15]==0x30)           //小数点后的0不显示
 252   3                              {
 253   4                                      moveright(2);
 254   4                              }
 255   3                      }               
 256   2              }
 257   1              pflag=1;         //刷屏标志置1
 258   1      }
 259          //======================================================
 260          //连运算的上下两行显示转换
 261          //======================================================
 262          void exchangexx(void)
 263          {
 264   1              uchar i,j;
 265   1              j=0;
 266   1              while(pbuffer2[j]==0)
 267   1                      j++;
 268   1              for(i=0;i<16;i++)
 269   1              {
 270   2                      if(j<16)
 271   2                      pbuffer1[i]=pbuffer2[j++];
 272   2                      else pbuffer1[i]=0;     
 273   2              }
 274   1      
 275   1              for(i=0;i<16;i++)
 276   1              {
 277   2                      pbuffer2[i]=0;
 278   2              }
 279   1              pbuffer2[15]=0x30;
 280   1              k=0;
 281   1              while(pbuffer1[k++]!=0);        //取光标位置
 282   1              k--;
 283   1      
 284   1              pflag=1;       //刷屏标志置1
 285   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1544    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      24
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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