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

📄 1602lcm.lst

📁 麦迪工作室51开发板温度显示的驱动代码
💻 LST
字号:
C51 COMPILER V7.00  1602LCM                                                                12/02/2008 21:44:23 PAGE 1   


C51 COMPILER V7.00, COMPILATION OF MODULE 1602LCM
OBJECT MODULE PLACED IN 1602LCM.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 1602LCM.C DEBUG OBJECTEXTEND

stmt level    source

   1          /**********************************************************************************
   2          名称:    DS18B20+1602LCD温度计
   3          显示器件:1602LCD
   4          分辨率:  0.125摄氏度
   5          测温范围:0~125摄氏度
   6          
   7          知识重点:1。1-wire的驱动(18B20的读写)
   8                     2。16进制数到10进制数的转换
   9                    3。1602LCD显示 自定义字符
  10          
  11           >>>>>>>>>这是个简单的程序,没有设计零下温度的转换和显示,等日后再完善
  12          *******************************************************************************/
  13          #include <at89x51.h>
  14          //#include <reg51.h>
  15          #include <string.h>
  16          #define LCM_RW P3_3 //定义引脚
  17          #define LCM_RS P3_2
  18          #define LCM_E P3_5
  19          #define LCM_Data P0
  20          #define Busy 0x80 //用于检测LCM状态字中的Busy标识
  21          //#define DQ P2_7;
  22          //sbit DQ =P3^5; //18B20数据线连接到 P35口
  23          sbit DQ =P1^4;
  24          typedef int byte;
  25          typedef unsigned int  word;
  26          void Read_Temp(void);
  27          void mychar(char,char);
  28          
  29          void WriteDataLCM(unsigned char WDLCM);
  30          void WriteCommandLCM(unsigned char WCLCM,BuysC);
  31          unsigned char ReadDataLCM(void);
  32          unsigned char ReadStatusLCM(void);
  33          void LCMInit(void);
  34          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  35          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  36          void Delay5Ms(void);
  37          void Delay400Ms(void);
  38          byte read_byte(void);
  39          void write_byte(char val);
  40          unsigned char code mcudsp_com[] = {" www.mcudsp.com"};
  41          
  42          
  43          void main(void)
  44          { 
  45   1       Delay400Ms(); //启动等待,等LCM讲入工作状态
  46   1       LCMInit(); //LCM初始化
  47   1       Delay5Ms(); //延时片刻(可不要)
  48   1       DisplayListChar(0, 0, mcudsp_com);
  49   1       mychar(10,1); //显示 自定义字符
  50   1       while(1) Read_Temp();
  51   1      }
  52          
  53          
  54          //***************** 18B20驱动程序 ******************
  55          //延时
C51 COMPILER V7.00  1602LCM                                                                12/02/2008 21:44:23 PAGE 2   

  56          void delay(word useconds)
  57          {
  58   1        for(;useconds>0;useconds--);
  59   1      }
  60          
  61          //复位
  62          byte ow_reset(void)
  63          {
  64   1        byte presence;
  65   1        DQ = 0; //拉低总线
  66   1        delay(35); // 保持低电平 480us
  67   1        DQ = 1; // 释放总线
  68   1        delay(3); // 等待应答
  69   1        do{
  70   2        presence = DQ; // 读取总线状态
  71   2        }while(presence);
  72   1        delay(25); // 
  73   1        return(presence); // 返回状态标志 0:18B20正常存在 1:不正常
  74   1      }    
  75          //从 1-wire 总线上读取一个字节
  76          byte read_byte(void)
  77          {
  78   1        byte i;
  79   1        byte value = 0;
  80   1        for (i=8;i>0;i--)
  81   1        {
  82   2          value>>=1;
  83   2          DQ = 0; 
  84   2          DQ = 1;
  85   2      //    delay(1);   
  86   2          if(DQ)value|=0x80;
  87   2          delay(6); 
  88   2        }
  89   1        return(value);
  90   1      }
  91          
  92          //向 1-WIRE 总线上写一个字节
  93          void write_byte(char val)
  94          {
  95   1        byte i;
  96   1        for (i=8; i>0; i--) 
  97   1        {
  98   2          DQ = 0; 
  99   2          DQ = val&0x01;
 100   2          delay(5); 
 101   2          DQ = 1;
 102   2          val=val/2;
 103   2        }
 104   1        delay(5);
 105   1      }
 106          
 107          //读取温度
 108          void Read_Temp(void)
 109          {
 110   1        unsigned char i;
 111   1        unsigned int x;
 112   1        unsigned char ct[8];
 113   1        union{byte c[8]; int x;} temp;
 114   1      
 115   1        //以下这段程序可以改变18B20的分辨率 
 116   1        ow_reset();        //复位
 117   1        write_byte(0xcc);  //跳过Rom
C51 COMPILER V7.00  1602LCM                                                                12/02/2008 21:44:23 PAGE 3   

 118   1        write_byte(0x4e);  //写暂存器
 119   1        write_byte(0x02);  //写TH 
 120   1        write_byte(0x01);  //写TL
 121   1        write_byte(0x1f);  //写结构寄存器
 122   1        ow_reset();       //复位
 123   1        write_byte(0xcc); //跳过Rom 
 124   1        write_byte(0x48); //把暂存器内容写到EPRam中
 125   1      
 126   1      
 127   1        ow_reset();
 128   1        write_byte(0xCC); // Skip ROM
 129   1        write_byte(0x44); // 启动18B20开始转换温度,结果存入暂存器中
 130   1        Delay400Ms(); //Delay400Ms();
 131   1        
 132   1        ow_reset();
 133   1        write_byte(0xCC); //Skip ROM
 134   1        write_byte(0xbe); // 读取暂存器的内容
 135   1        temp.c[1]=read_byte(); //低8位
 136   1        temp.c[0]=read_byte(); //高8位
 137   1        x=(temp.c[0]*256+temp.c[1])*62.5; 
 138   1        for(i=0;i<8;i++)
 139   1             {
 140   2               ct[i]=0;
 141   2             }
 142   1        i=0;
 143   1        while(x/10)
 144   1         {
 145   2          ct[i]=x%10;
 146   2          x=x/10;
 147   2          i++;
 148   2         }
 149   1        ct[i]=x;
 150   1        DisplayOneChar(9,1,ct[0]+0x30);
 151   1        DisplayOneChar(8,1,ct[1]+0x30);
 152   1        DisplayOneChar(7,1,ct[2]+0x30);
 153   1        DisplayOneChar(6,1,0x2e);  //显示小数点
 154   1        DisplayOneChar(5,1,ct[3]+0x30);
 155   1        DisplayOneChar(4,1,ct[4]+0x30);
 156   1        if(ct[5]!=0) //百位0消隐
 157   1          DisplayOneChar(3,1,ct[5]+0x30);  
 158   1      }
 159          
 160          void mychar(char xx,char yy)
 161          {
 162   1      ///////////////////////自定义字符
 163   1       WriteCommandLCM(0x48, 0); //第一行
 164   1       WriteDataLCM(0x06);
 165   1       WriteCommandLCM(0x49, 0); //第2行
 166   1       WriteDataLCM(0x09);
 167   1       WriteCommandLCM(0x4a, 0); //第3
 168   1       WriteDataLCM(0x09);
 169   1       WriteCommandLCM(0x4b, 0); //第4
 170   1       WriteDataLCM(0x06);
 171   1       WriteCommandLCM(0x4c, 0); //第5
 172   1       WriteDataLCM(0x00);
 173   1       WriteCommandLCM(0x4d, 0); //第6
 174   1       WriteDataLCM(0x00);
 175   1       WriteCommandLCM(0x4e, 0); //第7
 176   1       WriteDataLCM(0x00);
 177   1       WriteCommandLCM(0x4f, 0); //第8
 178   1       WriteDataLCM(0x00);
 179   1       DisplayOneChar(xx,yy,0x01);
C51 COMPILER V7.00  1602LCM                                                                12/02/2008 21:44:23 PAGE 4   

 180   1       DisplayOneChar(xx+1,yy,0x43);
 181   1      }
 182          //写数据
 183          void WriteDataLCM(unsigned char WDLCM)
 184          {
 185   1      ReadStatusLCM(); //检测忙
 186   1      LCM_Data = WDLCM;
 187   1      LCM_RS = 1;
 188   1      LCM_RW = 0;
 189   1      LCM_E = 0; //若晶振速度太高可以在这后加小的延时
 190   1      LCM_E = 0; //延时
 191   1      LCM_E = 1;
 192   1      }
 193          
 194          //写指令
 195          void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
 196          {
 197   1      if (BuysC) ReadStatusLCM(); //根据需要检测忙
 198   1      LCM_Data = WCLCM;
 199   1      LCM_RS = 0;
 200   1      LCM_RW = 0; 
 201   1      LCM_E = 0;
 202   1      LCM_E = 0;
 203   1      LCM_E = 1; 
 204   1      }
 205          
 206          //读状态
 207          unsigned char ReadStatusLCM(void)
 208          {
 209   1      LCM_Data = 0xFF; 
 210   1      LCM_RS = 0;
 211   1      LCM_RW = 1;
 212   1      LCM_E = 0;
 213   1      LCM_E = 0;
 214   1      LCM_E = 1;
 215   1      while (LCM_Data & Busy); //检测忙信号
 216   1      return(LCM_Data);
 217   1      }
 218          
 219          void LCMInit(void) //LCM初始化
 220          {
 221   1      LCM_Data = 0;
 222   1      WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 223   1      Delay5Ms(); 
 224   1      WriteCommandLCM(0x38,0);
 225   1      Delay5Ms(); 
 226   1      WriteCommandLCM(0x38,0);
 227   1      Delay5Ms(); 
 228   1      
 229   1      WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
 230   1      WriteCommandLCM(0x08,1); //关闭显示
 231   1      WriteCommandLCM(0x01,1); //显示清屏
 232   1      WriteCommandLCM(0x06,1); // 显示光标移动设置
 233   1      WriteCommandLCM(0x0C,1); // 显示开及光标设置
 234   1      }
 235          
 236          //按指定位置显示一个字符
 237          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
 238          {
 239   1      Y &= 0x1;
 240   1      X &= 0xF; //限制X不能大于15,Y不能大于1
 241   1      if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
C51 COMPILER V7.00  1602LCM                                                                12/02/2008 21:44:23 PAGE 5   

 242   1      X |= 0x80; //算出指令码
 243   1      WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
 244   1      WriteDataLCM(DData);
 245   1      }
 246          
 247          //按指定位置显示一串字符  ***原来的遇到空格0x20就不显示***
 248          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
 249          {
 250   1        unsigned char ListLength,j;
 251   1        ListLength = strlen(DData);
 252   1        Y &= 0x1;
 253   1        X &= 0xF; //限制X不能大于15,Y不能大于1
 254   1            if (X <= 0xF) //X坐标应小于0xF
 255   1              { 
 256   2                          for(j=0;j<ListLength;j++)
 257   2                            {
 258   3                   DisplayOneChar(X, Y, DData[j]); //显示单个字符
 259   3                   X++;
 260   3                  }
 261   2              }
 262   1      }
 263          
 264          
 265          //5ms延时
 266          void Delay5Ms(void)
 267          {
 268   1       unsigned int TempCyc = 5552;
 269   1       while(TempCyc--);
 270   1      }
 271          
 272          //400ms延时
 273          void Delay400Ms(void)
 274          {
 275   1       unsigned char TempCycA = 5;
 276   1       unsigned int TempCycB;
 277   1       while(TempCycA--)
 278   1      {
 279   2      TempCycB=7269;
 280   2      while(TempCycB--);
 281   2      };
 282   1      }
 283          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    816    ----
   CONSTANT SIZE    =     16    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      37
   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 + -