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

📄 lcd12232.lst

📁 自己单片机板c程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   LCD12232                                                              03/13/2009 19:43:48 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE LCD12232
OBJECT MODULE PLACED IN lcd12232.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcd12232.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*此例子是LCD12232,时钟和温度传感受的集合,有不明白的朋友,可以先看下前面的三个例子,再加已集合*/
   2          
   3          #include <reg51.h>
   4          #include <intrins.h>
   5          
   6          #define  MSB       0x80
   7          #define  LSB       0x01
   8          
   9          sbit LCD_RS=P1^0;//定义引脚
  10          sbit LCD_RW=P1^1;
  11          sbit LCD_E=P1^2;
  12          #define LCD_Data P2
  13          #define Busy    0x80 //用于检测LCD状态字中的Busy标识
  14          
  15          sbit SCL2=P1^3;
  16          sbit SDA2=P1^4;
  17          sbit RST = P1^5;// DS1302片选                   5脚
  18          sbit DS=P3^3;           //定义DS18B20接口
  19          
  20          
  21          void WriteDataLCD(unsigned char WDLCD);
  22          void WriteCommandLCD(unsigned char WCLCD,BuysC);
  23          unsigned char ReadDataLCD(void);
  24          unsigned char ReadStatusLCD(void);
  25          void LCDInit(void);
  26          void LCDClear(void);
  27          void LCDFlash(void);
  28          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  29          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData);
  30          void Delay5Ms(void);
  31          void Delay400Ms(void);
  32          
  33          void Write_Ds1302_byte(unsigned char temp); 
  34          void Write_Ds1302( unsigned char address,unsigned char dat );
  35          unsigned char Read_Ds1302 ( unsigned char address );
  36          void Read_RTC(void);//read RTC 
  37          void Set_RTC(void);//set RTC 
  38          
  39          int tmep(void);
  40          void tmpchange(void);
  41          void tmpwritebyte(unsigned char dat);
  42          unsigned char tmpread(void);
  43          bit tmpreadbit(void);
  44          void dsreset(void);
  45          void delayb(unsigned int count);
  46          
  47          unsigned char l_tmpdate[8]={0x00,0x06,0x03,0x1C,0x08,0x07,0x08,0};
  48          
  49          code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; 
  50          code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
  51          
  52          unsigned char lhj_f[15]={"2008年08月28日"};
  53          unsigned char lhj_s[15]={"12:00 温度28℃"};
  54          
  55          void main(void)
C51 COMPILER V8.02   LCD12232                                                              03/13/2009 19:43:48 PAGE 2   

  56          {
  57   1       unsigned char oldtimer=0,i=0;
  58   1       int l_tmp=0;
  59   1       Set_RTC();
  60   1       Delay400Ms(); //启动等待,等LCD讲入工作状态
  61   1       LCDInit(); //LCM初始化
  62   1       Delay5Ms(); //延时片刻(可不要)
  63   1       while(1){
  64   2              Read_RTC();
  65   2                      if(oldtimer!=l_tmpdate[0]){//每一秒钟刷新显示
  66   3                              oldtimer=l_tmpdate[0];
  67   3                              lhj_f[2]=(l_tmpdate[6]/16)+0X30;                        //这里加上0X30是在ASCII字符编码中的地址,你们可以查下ASCII码
  68   3                                                                                              //这里除以16怎么不是除以10呢,是的,这是因为DS1302里面是按10进制存放的
  69   3                              lhj_f[3]=(l_tmpdate[6]&0x0f)+0X30;
  70   3                              lhj_f[6]=(l_tmpdate[4]/16)+0X30;
  71   3                              lhj_f[7]=(l_tmpdate[4]&0x0f)+0X30;
  72   3                              lhj_f[10]=(l_tmpdate[3]/16)+0X30;
  73   3                              lhj_f[11]=(l_tmpdate[3]&0x0f)+0X30;                             
  74   3      
  75   3                              lhj_s[0]=(l_tmpdate[2]/16)+0X30;
  76   3                              lhj_s[1]=(l_tmpdate[2]&0x0f)+0X30;
  77   3                              if(i==0){                               //每一秒钟转换显示(空-两点)
  78   4                                      lhj_s[2]=0X3A;
  79   4                                      i=1;
  80   4                                      }
  81   3                              else{
  82   4                                      lhj_s[2]=0x20;
  83   4                                      i=0;
  84   4                                 }
  85   3                              lhj_s[3]=(l_tmpdate[1]/16)+0X30;
  86   3                              lhj_s[4]=(l_tmpdate[1]&0x0f)+0X30;
  87   3      
  88   3                              tmpchange();      //温度转换
  89   3                              l_tmp=tmep();
  90   3                              lhj_s[10]=l_tmp/100+0X30;
  91   3                              l_tmp=l_tmp%100;
  92   3                              lhj_s[11]=l_tmp/10+0X30;//温度显示我们去掉了小数位,有兴趣的朋友可以加入
  93   3                      DisplayListChar(0, 0, lhj_f);
  94   3                      DisplayListChar(0, 5, lhj_s);
  95   3                      }
  96   2                      //}
  97   2              }
  98   1      }
  99          
 100          /*********************LCD12232显示处理函数****************************/
 101          //写数据
 102          void WriteDataLCD(unsigned char WDLCD)
 103          {
 104   1       ReadStatusLCD(); //检测忙 
 105   1       LCD_RS = 1;
 106   1       LCD_RW = 0;
 107   1       LCD_Data = WDLCD;
 108   1       LCD_E = 1;
 109   1       LCD_E = 1;
 110   1       LCD_E = 1;
 111   1       LCD_E = 0;
 112   1      }
 113          
 114          //写指令
 115          void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
 116          {
 117   1       if (BuysC) ReadStatusLCD(); //根据需要检测忙 
C51 COMPILER V8.02   LCD12232                                                              03/13/2009 19:43:48 PAGE 3   

 118   1       LCD_RS = 0;
 119   1       LCD_RW = 0; 
 120   1       LCD_Data = WCLCD;
 121   1       LCD_E = 1; 
 122   1       LCD_E = 1;
 123   1       LCD_E = 1;
 124   1       LCD_E = 0;  
 125   1      }
 126          
 127          //读数据
 128          unsigned char ReadDataLCD(void)
 129          {
 130   1       LCD_RS = 1; 
 131   1       LCD_RW = 1;
 132   1       LCD_E = 0;
 133   1       LCD_E = 0;
 134   1       LCD_E = 1;
 135   1       return(LCD_Data);
 136   1      }
 137          
 138          //读状态
 139          unsigned char ReadStatusLCD(void)
 140          {
 141   1       LCD_Data = 0xFF; 
 142   1       LCD_RS = 0;
 143   1       LCD_RW = 1; 
 144   1       LCD_E = 1;
 145   1       while (LCD_Data & Busy); //检测忙信号
 146   1       LCD_E = 0;
 147   1       return(LCD_Data);
 148   1      }
 149          
 150          void LCDInit(void) //LCM初始化
 151          {
 152   1       WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号
 153   1       WriteCommandLCD(0x01,1); //显示清屏
 154   1       WriteCommandLCD(0x06,1); // 显示光标移动设置
 155   1       WriteCommandLCD(0x0C,1); // 显示开及光标设置
 156   1      }
 157          void LCDClear(void) //清屏
 158          {
 159   1       WriteCommandLCD(0x01,1); //显示清屏
 160   1       WriteCommandLCD(0x34,1); // 显示光标移动设置
 161   1       WriteCommandLCD(0x30,1); // 显示开及光标设置
 162   1      }
 163          void LCDFlash(void)     //闪烁效果
 164          {
 165   1       WriteCommandLCD(0x08,1); //显示清屏
 166   1       Delay400Ms();
 167   1       WriteCommandLCD(0x0c,1); // 显示开及光标设置
 168   1       Delay400Ms();
 169   1       WriteCommandLCD(0x08,1); //显示清屏
 170   1       Delay400Ms();
 171   1       WriteCommandLCD(0x0c,1); // 显示开及光标设置
 172   1       Delay400Ms();
 173   1       WriteCommandLCD(0x08,1); //显示清屏
 174   1       Delay400Ms();
 175   1      }
 176          //按指定位置显示一个字符
 177          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
 178          {
 179   1       Y &= 0x1;
C51 COMPILER V8.02   LCD12232                                                              03/13/2009 19:43:48 PAGE 4   

 180   1       X &= 0xF; //限制X不能大于15,Y不能大于1
 181   1       if (Y) X |= 0x10; //当要显示第二行时地址码+0x10;
 182   1       X |= 0x80; // 算出指令码
 183   1       WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
 184   1       WriteDataLCD(DData);
 185   1      }
 186          
 187          //按指定位置显示一串字符
 188          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData)
 189          {
 190   1       unsigned char ListLength,X2;
 191   1        ListLength = 0;
 192   1        X2=X;
 193   1       Y &= 0x01;
 194   1       X &= 0x0F; //限制X不能大于15,Y不能大于1
 195   1       if (Y) X2 |= 0x10; //当要显示第二行时地址码+0x10;
 196   1       X2 |= 0x80; // 算出指令码
 197   1       WriteCommandLCD(X2, 1); //这里不检测忙信号,发送地址码
 198   1       while (DData[ListLength]>=0x20) //若到达字串尾则退出
 199   1        {
 200   2         if (X <= 0x0F) //X坐标应小于0xF
 201   2          {
 202   3           WriteDataLCD(DData[ListLength]); //
 203   3           ListLength++;
 204   3               X++;
 205   3          }
 206   2        }
 207   1      }
 208          
 209          //5ms延时
 210          void Delay5Ms(void)
 211          {
 212   1       unsigned int TempCyc = 5552;
 213   1       while(TempCyc--);
 214   1      }
 215          
 216          //400ms延时
 217          void Delay400Ms(void)
 218          {
 219   1       unsigned char TempCycA = 5;
 220   1       unsigned int TempCycB;
 221   1       while(TempCycA--)
 222   1       {
 223   2        TempCycB=7269;

⌨️ 快捷键说明

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