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

📄 1602lcd-2.lst

📁 一个使用adc0809进行数据采集,采用1602液晶显示模拟电压的源程序,已经调试通过.
💻 LST
📖 第 1 页 / 共 2 页
字号:
 233          float VoltageSurvey(unsigned char AD_ChannelNumber)
 234          {
 235   1              float  SurveyVoltage;                                                                           //测量到的电压值
 236   1              float  plus_ch;                                                                                         //通道增益
 237   1              
 238   1              switch(AD_ChannelNumber)
 239   1              {
C51 COMPILER V7.10   1602LCD_2                                                             03/26/2006 15:26:39 PAGE 5   

 240   2                      case 0: plus_ch = PLUS_CH0;break;
 241   2                      case 1: plus_ch = PLUS_CH1;break;
 242   2                      case 2: plus_ch = PLUS_CH2;break;
 243   2                      case 3: plus_ch = PLUS_CH3;break;
 244   2                      case 4: plus_ch = PLUS_CH4;break;
 245   2                      case 5: plus_ch = PLUS_CH5;break;
 246   2                      case 6: plus_ch = PLUS_CH6;break;
 247   2                      case 7: plus_ch = PLUS_CH7;break;
 248   2                      default:break;
 249   2              }
 250   1      
 251   1              SurveyVoltage = ADC0809test(AD_ChannelNumber);
 252   1              SurveyVoltage = (SurveyVoltage / 256) * REF_Voltage * plus_ch;
 253   1              return(SurveyVoltage);
 254   1      }   
 255             
 256          
 257          
 258          
 259          
 260          
 261          
 262          
 263          /*
 264          //########################################################################################################
             -###############################
 265          //########################################################################################################
             -###############################
 266                                                                                                                  LCD驱动部分
 267          */
 268          
 269          
 270          
 271          //写数据
 272          void WriteDataLCM(unsigned char WDLCM)
 273          {
 274   1              ReadStatusLCM(); //检测忙
 275   1              LCM_Data = WDLCM;
 276   1              LCM_RS = 1;
 277   1              LCM_RW = 0;
 278   1              LCM_E = 0; //若晶振速度太高可以在这后加小的延时
 279   1              LCM_E = 0; //延时
 280   1              LCM_E = 1;
 281   1      }
 282          
 283          //写指令
 284          void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
 285          {
 286   1              if (BuysC) ReadStatusLCM(); //根据需要检测忙
 287   1              LCM_Data = WCLCM;
 288   1              LCM_RS = 0;
 289   1              LCM_RW = 0;
 290   1              LCM_E = 0;
 291   1              LCM_E = 0;
 292   1              LCM_E = 1;
 293   1      }
 294          
 295          //读数据
 296          unsigned char ReadDataLCM(void)
 297          {
 298   1              LCM_RS = 1;
 299   1              LCM_RW = 1;
C51 COMPILER V7.10   1602LCD_2                                                             03/26/2006 15:26:39 PAGE 6   

 300   1              LCM_E = 0;
 301   1              LCM_E = 0;
 302   1              LCM_E = 1;
 303   1              return(LCM_Data);
 304   1      }
 305          
 306          //读状态
 307          unsigned char ReadStatusLCM(void)
 308          {
 309   1              LCM_Data = 0xFF;
 310   1              LCM_RS = 0;
 311   1              LCM_RW = 1;
 312   1              LCM_E = 0;
 313   1              LCM_E = 0;
 314   1              LCM_E = 1;
 315   1              while (LCM_Data & Busy); //检测忙信号
 316   1              return(LCM_Data);
 317   1      }
 318          
 319          void LCMInit(void) //LCM初始化
 320          {
 321   1              LCM_Data = 0;
 322   1              WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 323   1              Delay5Ms();
 324   1              WriteCommandLCM(0x38,0);
 325   1              Delay5Ms();
 326   1              WriteCommandLCM(0x38,0);
 327   1              Delay5Ms();
 328   1              
 329   1              WriteCommandLCM(0x38,1);                //显示模式设置,8位数据,2行显示,5*7点阵,开始要求每次检测忙信号
 330   1              WriteCommandLCM(0x08,1);                //关闭显示,关屏幕,关光标,关闪烁
 331   1              WriteCommandLCM(0x01,1);                //显示清屏,光标归位,地址归位
 332   1              WriteCommandLCM(0x06,1);                // 显示光标移动设置,每显示一个地址加1,不整体移位.
 333   1              WriteCommandLCM(0x0c,1);                // 显示开及光标设置,开屏幕,关光标,关闪烁.
 334   1      }
 335          
 336          //按指定位置显示一个字符
 337          //送入该字符所对应的ASCII码
 338          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
 339          {
 340   1              Y &= 0x1;
 341   1              X &= 0xF;                                               //限制X不能大于15,Y不能大于1
 342   1              if (Y) X |= 0x40;                               //当要显示第二行时地址码+0x40;
 343   1              X |= 0x80;                                              //算出指令码
 344   1              WriteCommandLCM(X, 1);                  //发命令字
 345   1              WriteDataLCM(DData);                    //发数据
 346   1      }
 347          
 348          //按指定位置显示一串字符
 349          //由于*DData是字符型指针变量,所以在提取该指针变量所指向的字符时得到的就是该字符的ASCII码.
 350          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
 351          {
 352   1              unsigned char ListLength;
 353   1              
 354   1              ListLength = 0;
 355   1              Y &= 0x1;
 356   1              X &= 0xF; //限制X不能大于15,Y不能大于1
 357   1              while (DData[ListLength]>0x19) //若到达字串尾则退出
 358   1              {
 359   2                      if (X <= 0xF) //X坐标应小于0xF
 360   2                      {
 361   3                              DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
C51 COMPILER V7.10   1602LCD_2                                                             03/26/2006 15:26:39 PAGE 7   

 362   3                              ListLength++;
 363   3                              X++;
 364   3                      }
 365   2              }
 366   1      }
 367          
 368          /**********************************************************
 369          在送入地址上显示一个浮点数.
 370          输入:地址,浮点数,小数点位数.
 371          函数设计允许最大不超过100的浮点数,小数位数选择:0,1,2
 372          **********************************************************/
 373          void DisplayNumberFloat(unsigned char X, unsigned char Y,float Number,unsigned char point_number)
 374          {
 375   1              unsigned char number_10bit;                              //用于暂存10位数据的变量
 376   1              unsigned char number_1bit;                               //用于暂存个位数据的变量
 377   1              unsigned char number_point_1;                    //用于保存第一位小数
 378   1              unsigned char number_point_2;                    //用于保存第二位小数
 379   1              unsigned int  int_number;                                //用于将输入的浮点型数字转换为整形
 380   1              
 381   1      
 382   1              if((Number < 100) && (point_number <= 2))
 383   1              {
 384   2                      Y &= 0x1;
 385   2                      X &= 0xF;                                                       //限制X不能大于15,Y不能大于1
 386   2                      if (Y) X |= 0x40;                                       //当要显示第二行时地址码+0x40;
 387   2                      X |= 0x80;                                                      //算出指令码
 388   2                      WriteCommandLCM(X, 1);                          //写入地址
 389   2      
 390   2                      switch(point_number)
 391   2                      {
 392   3                              case 0:
 393   3                              {
 394   4                                      int_number = (unsigned int)Number;                      //取整
 395   4                                      number_10bit = (int_number / 10);                       //取商,取出第一位数字
 396   4                                      number_1bit  = (int_number % 10);                       //取出第二位数字
 397   4                                      break;
 398   4                              }
 399   3                              case 1:
 400   3                              {
 401   4                                      int_number = (unsigned int)(Number * 10);       //取整,化掉小数后一位小数
 402   4                                      number_10bit = (int_number / 100);                      //取商,取出第一位数字
 403   4                                      number_1bit  = (int_number % 100 / 10);         //取出第二位数字
 404   4                                      number_point_1 = (int_number % 10);                     //取出第三位数字
 405   4                                      break;
 406   4                              }
 407   3                              case 2:
 408   3                              {
 409   4                                      int_number = (unsigned int)(Number * 100);      //取整,化掉小数后两位小数
 410   4                                      number_10bit = (int_number / 1000);                     //取商,取出第一位数字
 411   4                                      number_1bit  = (int_number % 1000 / 100);       //取出第二位数字
 412   4                                      number_point_1  = (int_number % 100 / 10);  //取出第二位数字
 413   4                                      number_point_2 = (int_number % 10);                     //取出第三位数字
 414   4                                      break;
 415   4                              }
 416   3                              default:break;
 417   3                      }
 418   2      
 419   2                      if(number_10bit != 0)
 420   2                      {
 421   3                              WriteDataLCM(number_10bit + 0x30);                              //写入第一个字符
 422   3                      }
 423   2                      WriteDataLCM(number_1bit + 0x30);                                       //写入第二个字符
C51 COMPILER V7.10   1602LCD_2                                                             03/26/2006 15:26:39 PAGE 8   

 424   2                      if(point_number > 0)
 425   2                      {
 426   3                              WriteDataLCM(0x2E);                                                             //写入小数点
 427   3                              WriteDataLCM(number_point_1 + 0x30);                    //写入第一位小数
 428   3                      }
 429   2                      if(point_number > 1)
 430   2                      {
 431   3                              WriteDataLCM(number_point_2 + 0x30);                    //写入第二位小数
 432   3                      }
 433   2      
 434   2              } 
 435   1      }
 436          
 437          
 438          
 439          //5ms延时
 440          void Delay5Ms(void)
 441          {
 442   1              unsigned int TempCyc = 5552;
 443   1              while(TempCyc--);
 444   1      }
 445          
 446          //400ms延时
 447          void Delay400Ms(void)
 448          {
 449   1              unsigned char TempCycA = 5;
 450   1              unsigned int TempCycB;
 451   1              while(TempCycA--)
 452   1              {
 453   2                      TempCycB=7269;
 454   2                      while(TempCycB--);
 455   2              };
 456   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1281    ----
   CONSTANT SIZE    =     78    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      33
   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 + -