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

📄 lcd_main.lst

📁 LCD显示温控器制作成功 参考了明浩的温度控制器V1.5和使用1602液晶显示和PS/2键盘的示例
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.09   LCD_MAIN                                                              08/12/2004 17:38:42 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE LCD_MAIN
OBJECT MODULE PLACED IN lcd_main.OBJ
COMPILER INVOKED BY: e:\Keil\C51\BIN\C51.EXE lcd_main.c BROWSE DEBUG OBJECTEXTEND SRC(.\lcd_main.SRC)

line level    source

   1          /*----------------------------------------------------------------
   2                          
   3                                                  ***LCD显示温控器***  2004-8-12
   4          
   5          参考资料:《温度控制器V1.5》、《使用1602液晶显示和PS/2键盘的示例》
   6          
   7          本软件仅供学习与参考,引用时请注明版权
   8          本程序源码只供学习参考,不得应用于商业用途,如有需要请联系作者。
   9          http://www.cdle.net
  10          明浩 2004/1/2
  11          pnzwzw@cdle.net
  12          ----------------------------------------------------------------*/
  13          
  14          
  15          
  16          #include <REGX51.H>
  17          #include <string.h>
  18          #include <intrins.h>
  19          
  20          #define LCM_RW P2_0 //定义引脚
  21          #define LCM_RS P2_1
  22          #define LCM_E P2_2
  23          #define LCM_Data P1
  24          #define Busy 0x80 //用于检测LCM状态字中的Busy标识
  25          
  26          #define Key_UP            P2_3    //上调温度
  27          #define Key_DOWN          P2_5    //下调温度
  28          #define Key_SET           P2_4    //设定键(温度设定,长按开电源)
  29          #define RelayOutPort      P2_6    //继电器输出
  30          #define TMPort                    P2_7    //DS1820 DataPort
  31          
  32          unsigned char code LCDDis[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x20,0x2d}; //0-9的ASCII码,
             -0x20为空,0x2d为负号
  33          
  34          unsigned char i;
  35          
  36          static unsigned char bdata StateREG;    //可位寻址的状态寄存器
  37          sbit DS1820ON = StateREG^0;               //DS1820是否存在
  38          sbit SetTF = StateREG^1;              //是否是在温度设置状态
  39          sbit KeySETDown = StateREG^2;         //是否已按过SET键标识
  40          sbit PowTF = StateREG^3;              //电源标识
  41          sbit KeyTF = StateREG^4;                    //键盘是否允许
  42          
  43          //sbit KeySETDowning = StateREG^5;                      //SET是否正在按下
  44          static unsigned char bdata TLV _at_ 0x0029;         //温度变量高低位
  45          static unsigned char bdata THV _at_ 0x0028;
  46          static signed char TMV;       //转换后的温度值
  47          static unsigned char KeyV,TempKeyV;      //键值
  48          static signed char TMRomV _at_ 0x0027;    //高温限制
  49          static signed char TMSetV _at_ 0x0026;    //温度设定值
  50          static unsigned char KSDNum;    //SET键连按时的采集次数
  51          static unsigned char IntNum,IntNum2,IntNum3;    //中断发生次数,IntNum用于SET长按检测,IntNum2用于设定状态
             -时LCD闪烁
  52          static signed char LCD_One,LCD_Two,LCD_Three;  //LCD的显示位 LCD_One为十位,LCD_Two为个位
  53          static signed char LCD_One_set,LCD_Two_set,LCD_Three_set;       //设置时的LCD值
C51 COMPILER V7.09   LCD_MAIN                                                              08/12/2004 17:38:42 PAGE 2   

  54          static unsigned char Sign, Sign_Set; //负号标识
  55          
  56          void WriteDataLCM(unsigned char WDLCM);
  57          void WriteCommandLCM(unsigned char WCLCM,BuysC);
  58          unsigned char ReadDataLCM(void);
  59          unsigned char ReadStatusLCM(void);
  60          void LCMInit(void);
  61          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  62          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  63          void Delay5Ms(void);
  64          void Delay400Ms(void);
  65          
  66          unsigned char code cdle_net[] = {"    WellCome!   "};
  67          unsigned char code email[] = {" Press Power Key"};
  68          unsigned char cur_temper[]={"Current Temp:   "};
  69          unsigned char cur_temper_set[]={"T_Set:          "};
  70          unsigned char BF = 0;   //定时中断标志,=1时显示当前温度值,=0显示欢迎
  71          
  72          void main(void)
  73          {
  74   1              void InitDS1820(void);   //定义函数
  75   1              void ROMDS1820(void);
  76   1              void TMVDS1820(void);
  77   1              void TMRDS1820(void);
  78   1              void TMWDS1820(void);
  79   1              void TMREDS1820(void);
  80   1              void TMERDS1820(void);
  81   1              void ReadDS1820(void);
  82   1              void WriteDS1820(void);
  83   1              void Delay_510(void);
  84   1              void Delay_110(void);
  85   1              void Delay_10ms(void);
  86   1              void Delay_4s(void);
  87   1              void V2ToV(void);
  88   1      
  89   1              StateREG = 0;   //初始化变量
  90   1              //SetTF = 1;    
  91   1              PowTF = 1;                      //关电源
  92   1              //KeyTF = 1;
  93   1              THV = 0;
  94   1              TLV = 0;
  95   1              TMV = 0;
  96   1              KeyV = 0;
  97   1              TempKeyV = 0;
  98   1              KSDNum = 0;
  99   1              IntNum = 0;
 100   1              IntNum2 = 0;
 101   1              IntNum3 = 0;
 102   1      
 103   1      
 104   1              
 105   1              InitDS1820(); //初始化
 106   1              ROMDS1820();    //跳过ROM
 107   1              TMERDS1820();  //E2PRAM中温度上限值调入RAM
 108   1              InitDS1820(); //初始化
 109   1              ROMDS1820();    //跳过ROM
 110   1              TMRDS1820();    //读出温度指令
 111   1              ReadDS1820(); //读出温度值和上限值
 112   1              TMSetV = TMRomV;  //拷贝保存在DS18B20ROM里的上限值到TMSetV
 113   1      
 114   1              Delay400Ms(); //启动等待,等LCM讲入工作状态
 115   1              LCMInit(); //LCM初始化
C51 COMPILER V7.09   LCD_MAIN                                                              08/12/2004 17:38:42 PAGE 3   

 116   1              Delay5Ms(); //延时片刻(可不要)
 117   1      
 118   1              EA = 1;                                 //允许CPU中断
 119   1              ET0 = 1;                                //定时器0中断打开
 120   1              TMOD = 0x1;                     //设定时器0为模式1,16位模式
 121   1              TH0=0xB1;
 122   1              TL0=0xDF;                               //设定时值为20000us(20ms)
 123   1              TR0 = 1;                                //开始定时
 124   1      
 125   1              do
 126   1                      {
 127   2                              if (BF==0)
 128   2                                      {
 129   3                                              DisplayListChar(0, 0, cdle_net);        //显示欢迎信息
 130   3                                              DisplayListChar(0, 1, email);
 131   3                                              Delay_4s();
 132   3                                              //PowTF = 1;
 133   3                                              EA=1;
 134   3                                      }
 135   2                              if (BF==1)
 136   2                                      {
 137   3                                              for (i=0;i<16;i++)
 138   3                                                      {
 139   4                                                              DisplayOneChar(i,0,cur_temper[i]);//LCD的第1行显示当前温度
 140   4                                                      }
 141   3                                              for (i=0;i<16;i++)
 142   3                                                      {
 143   4                                                              DisplayOneChar(i,1,cur_temper_set[i]);//LCD的第二行显示设置温度和继电器状态
 144   4                                                      }
 145   3                                              //ReadDataLCM();//测试用句无意义        
 146   3                                              EA=1;
 147   3                                      }
 148   2                      }
 149   1              while(1);
 150   1      }
 151          
 152          //定时器0中断外理中键扫描和处理要显示的值
 153          void KeyAndDis_Time0(void) interrupt 1 using 2
 154          {
 155   1              TH0=0xB1;
 156   1              TL0=0xDF;                               //设定时值为20000us(20ms)
 157   1      
 158   1              if (!Key_UP)    KeyV = 1;
 159   1              if (!Key_DOWN)  KeyV = 2;
 160   1              if (!Key_SET)   KeyV = 3;
 161   1              //KeySETDowning = 0;  //清除
 162   1              if (KeyV != 0)      //有键按下
 163   1                      {
 164   2                              Delay_10ms();   //延时防抖  按下10ms再测
 165   2                              if (!Key_UP)    TempKeyV = 1;
 166   2                              if (!Key_DOWN)  TempKeyV = 2;
 167   2                              if (!Key_SET)   TempKeyV = 3;
 168   2      
 169   2                              if (KeyV == TempKeyV)   //两次值相等为确定接下了键
 170   2                                      {
 171   3                                              if (KeyV == 3)      //按下SET键,如在SET状态就退出,否则进入
 172   3                                                      {
 173   4                                                              //KeySETDowning = 1; //表明SET正在按下
 174   4                                                              PowTF = 0;      //电源标识开
 175   4                                                              if (!KeyTF)             //KeyTF=0,键盘允许
 176   4                                                                      if (SetTF)
 177   4                                                                              {
C51 COMPILER V7.09   LCD_MAIN                                                              08/12/2004 17:38:42 PAGE 4   

 178   5                                                                                      SetTF = 0;    //标识位标识退出设定
 179   5                                                                                      InitDS1820(); //初始化
 180   5                                                                                      ROMDS1820();    //跳过ROM
 181   5                                                                                      TMWDS1820();    //写温度上限指令
 182   5                                                                                      WriteDS1820();  //写温度上限到DS18B20ROM
 183   5                                                                                      WriteDS1820();  //写温度上限到DS18B20ROM
 184   5                                                                                      WriteDS1820();  //写温度上限到DS18B20ROM
 185   5                                                                                      InitDS1820(); //初始化
 186   5                                                                                      ROMDS1820();    //跳过ROM
 187   5                                                                                      TMREDS1820();   //温度上限值COPY回E2PRAM
 188   5                                                                                      //      V2ToV();
 189   5                                                                              }
 190   4                                                                      else
 191   4                                                                              SetTF = 1;
 192   4                                                              if (!KeySETDown) //没有第一次按下SET时,KeySETDown标识置1
 193   4                                                                      KeySETDown = 1;
 194   4                                                              else
 195   4                                                                      KSDNum = KSDNum + 1;  //前一秒内有按过SET则开始计数
 196   4                                                      }
 197   3                                              if (SetTF==1)  //在SET状态下
 198   3                                                      {
 199   4                                                              cur_temper_set[9]=0x3d;         //"="   显示set标志
 200   4                                                              cur_temper_set[10]=0x73;        //"s"
 201   4                                                              cur_temper_set[11]=0x65;        //"e"
 202   4                                                              cur_temper_set[12]=0x74;        //"t"
 203   4                                                              if ((KeyV == 1) && (!KeyTF))
 204   4                                                                      TMSetV = TMSetV + 1;    //上调温度
 205   4                                                              if ((KeyV == 2) && (!KeyTF))
 206   4                                                                      TMSetV = TMSetV - 1;    //下调温度
 207   4                                                              if (TMSetV <= -55)          //限制温度上下限
 208   4                                                                      TMSetV = -55;
 209   4                                                              if (TMSetV >= 125)
 210   4                                                                      TMSetV = 125;
 211   4                                                      }
 212   3                                              if ((!KeyTF) && (IntNum3 == 0))
 213   3                                                      {
 214   4                                                              KeyTF = 1; //当键盘处于可用时,锁定
 215   4                                                              cur_temper_set[9]=0x20;         //      显示空白
 216   4                                                              cur_temper_set[10]=0x20;
 217   4                                                              cur_temper_set[11]=0x20;
 218   4                                                              cur_temper_set[12]=0x20;
 219   4                                                      }
 220   3                                      }
 221   2      
 222   2                                      if (KeySETDown)         //在2秒内按下了SET则计中断发生次数用于长按SET时计时用
 223   2                                              IntNum = IntNum + 1;  
 224   2                                      if (IntNum > 55)     //中断发生了55次时(大约1.2秒)75为1.5秒左右
 225   2                                              {
 226   3                                                      IntNum = 0;
 227   3                                                      KeySETDown = 0;
 228   3                                                      if (KSDNum == 55)      //如一直长按了SET1.2秒左右
 229   3                                                              {
 230   4                                                                      RelayOutPort = 1;  //关闭继电器输出
 231   4                                                                      PowTF = 1;         //电源标识关  
 232   4                                                                      //Delay_4s();        //延时
 233   4                                                                      IntNum = 0;
 234   4                                                                      IntNum2 = 0;
 235   4                                                                      IntNum3 = 0;
 236   4                                                                      BF = 0;                 //显示欢迎信息          
 237   4                                                                      EA=0;
 238   4                                                              }
 239   3                                                      KSDNum = 0;
C51 COMPILER V7.09   LCD_MAIN                                                              08/12/2004 17:38:42 PAGE 5   

 240   3                                              }
 241   2                      }
 242   1      
 243   1                      KeyV = 0;
 244   1                      TempKeyV = 0;   //清空变量准备下次键扫描
 245   1      
 246   1                      if (PowTF==0)

⌨️ 快捷键说明

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