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

📄 lcd1602.lst

📁 基于51单片机的万年历
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V8.02   LCD1602                                                               07/12/2011 20:57:59 PAGE 1   


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

line level    source

   1          #include<reg51.h>
   2          #include"DS18B20_3.H"
   3          #define uint unsigned int
   4          #define uchar unsigned char
   5          uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;
   6          //flag用于读取头文件中的温度值,和显示温度值
   7          
   8          #define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
   9          #define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)
  10          
  11          //液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)
  12          sbit rs=P2^0;
  13          sbit en=P2^2;
  14          sbit rw=P2^1; //如果硬件上rw接地,就不用写这句和后面的rw=0了
  15          sbit led=P2^6; //LCD背光开关
  16          
  17          //DS1302时钟芯片与C51之间的引脚连接定义
  18          sbit IO=P1^1;
  19          sbit SCLK=P1^0;
  20          sbit RST=P1^2;
  21          
  22          sbit ACC0=ACC^0;
  23          sbit ACC7=ACC^7;
  24          /************************************************************
  25          ACC累加器=A
  26          ACC.0=E0H 
  27          
  28          ACC.0就是ACC的第0位。Acc可以位寻址。
  29          
  30          累加器ACC是一个8位的存储单元,是用来放数据的。但是,这个存储单元有其特殊的地位,
  31          是单片机中一个非常关键的单元,很多运算都要通过ACC来进行。以后在学习指令时,
  32          常用A来表示累加器。但有一些地方例外,比如在PUSH指令中,就必须用ACC这样的名字。
  33          一般的说法,A代表了累加器中的内容、而ACC代表的是累加器的地址。 
  34          ***************************************************************/
  35          
  36          //校时按键与C51的引脚连接定义
  37          sbit key1=P1^5;  //设置键
  38          sbit key2=P1^6;  //加键
  39          sbit key3=P1^7;  //减键
  40          
  41          sbit buzzer=P1^3;//蜂鸣器,通过三极管9012驱动,端口低电平响
  42          
  43          /**************************************************************/
  44          
  45          uchar code tab1[]={"20  -  -   "}; //年显示的固定字符
  46          uchar code tab2[]={"  :  :  "};//时间显示的固定字符
  47          
  48          //延时函数,后面经常调用
  49          void delay(uint xms)//延时函数,有参函数
  50          {
  51   1              uint x,y;
  52   1              for(x=xms;x>0;x--)
  53   1               for(y=110;y>0;y--);
  54   1      }
  55          
C51 COMPILER V8.02   LCD1602                                                               07/12/2011 20:57:59 PAGE 2   

  56          /********液晶写入指令函数与写入数据函数,以后可调用**************/
  57          
  58          /*在这个程序中,液晶写入有关函数会在DS1302的函数中调用,所以液晶程序要放在前面*/
  59          
  60          write_1602com(uchar com)//****液晶写入指令函数****
  61          {
  62   1              rs=0;//数据/指令选择置为指令
  63   1              rw=0; //读写选择置为写
  64   1              P0=com;//送入数据
  65   1              delay(1);
  66   1              en=1;//拉高使能端,为制造有效的下降沿做准备
  67   1              delay(1);
  68   1              en=0;//en由高变低,产生下降沿,液晶执行命令
  69   1      }
  70          
  71          
  72          write_1602dat(uchar dat)//***液晶写入数据函数****
  73          {
  74   1              rs=1;//数据/指令选择置为数据
  75   1              rw=0; //读写选择置为写
  76   1              P0=dat;//送入数据
  77   1              delay(1);
  78   1              en=1; //en置高电平,为制造下降沿做准备
  79   1              delay(1);
  80   1              en=0; //en由高变低,产生下降沿,液晶执行命令
  81   1      }
  82          
  83          
  84          lcd_init()//***液晶初始化函数****
  85          {
  86   1              write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
  87   1              write_1602com(0x0c);//开显示不显示光标
  88   1              write_1602com(0x06);//整屏不移动,光标自动右移
  89   1              write_1602com(0x01);//清显示
  90   1      
  91   1              write_1602com(yh+1);//日历显示固定符号从第一行第1个位置之后开始显示
  92   1              for(a=0;a<14;a++)
  93   1              {
  94   2              write_1602dat(tab1[a]);//向液晶屏写日历显示的固定符号部分
  95   2              //delay(3);
  96   2              }
  97   1              write_1602com(er+2);//时间显示固定符号写入位置,从第2个位置后开始显示
  98   1              for(a=0;a<8;a++)
  99   1              {
 100   2              write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号
 101   2              //delay(3);
 102   2              }
 103   1      
 104   1      }
 105          
 106          /*********************over***********************/
 107          
 108          
 109          /***************DS1302有关子函数********************/
 110          
 111          void write_byte(uchar dat)//写一个字节
 112          {
 113   1              ACC=dat;
 114   1              RST=1;
 115   1              for(a=8;a>0;a--)
 116   1              {
 117   2                      IO=ACC0;
C51 COMPILER V8.02   LCD1602                                                               07/12/2011 20:57:59 PAGE 3   

 118   2                      SCLK=0;
 119   2                      SCLK=1;
 120   2                      ACC=ACC>>1;
 121   2              }
 122   1      }
 123          uchar read_byte()//读一个字节
 124          {
 125   1              RST=1;
 126   1              for(a=8;a>0;a--)
 127   1              {
 128   2                      ACC7=IO;
 129   2                      SCLK=1;
 130   2                      SCLK=0;
 131   2                      ACC=ACC>>1;
 132   2      
 133   2              }
 134   1              return (ACC);
 135   1      }
 136          //----------------------------------------
 137          void write_1302(uchar add,uchar dat)//向1302芯片写函数,指定写入地址,数据
 138          {
 139   1      
 140   1              RST=0;
 141   1              SCLK=0;
 142   1              RST=1;
 143   1              write_byte(add);
 144   1              write_byte(dat);
 145   1              SCLK=1;
 146   1              RST=0;
 147   1      }
 148          uchar read_1302(uchar add)//从1302读数据函数,指定读取数据来源地址
 149          {
 150   1              uchar temp;
 151   1              RST=0;
 152   1              SCLK=0;
 153   1              RST=1;
 154   1              write_byte(add);
 155   1              temp=read_byte();
 156   1              SCLK=1;
 157   1              RST=0;
 158   1              return(temp);
 159   1      }
 160          uchar BCD_Decimal(uchar bcd)//BCD码转十进制函数,输入BCD,返回十进制
 161          {
 162   1       uchar Decimal;
 163   1       Decimal=bcd>>4;
 164   1       return(Decimal=Decimal*10+(bcd&=0x0F));
 165   1      }
 166          //--------------------------------------
 167          void ds1302_init() //1302芯片初始化子函数(2010-01-07,12:00:00,week4)
 168          {
 169   1      RST=0;
 170   1      SCLK=0;
 171   1      
 172   1      write_1302(0x8e,0x00); //允许写,禁止写保护 
 173   1      //write_1302(0x80,0x00); //向DS1302内写秒寄存器80H写入初始秒数据00
 174   1      //write_1302(0x82,0x00);//向DS1302内写分寄存器82H写入初始分数据00
 175   1      //write_1302(0x84,0x12);//向DS1302内写小时寄存器84H写入初始小时数据12
 176   1      //write_1302(0x8a,0x04);//向DS1302内写周寄存器8aH写入初始周数据4
 177   1      //write_1302(0x86,0x07);//向DS1302内写日期寄存器86H写入初始日期数据07
 178   1      //write_1302(0x88,0x01);//向DS1302内写月份寄存器88H写入初始月份数据01
 179   1      //write_1302(0x8c,0x10);//向DS1302内写年份寄存器8cH写入初始年份数据10
C51 COMPILER V8.02   LCD1602                                                               07/12/2011 20:57:59 PAGE 4   

 180   1      write_1302(0x8e,0x80); //打开写保护
 181   1      
 182   1      
 183   1      }
 184          
 185          
 186          //------------------------------------
 187          //温度显示子函数
 188          void write_temp(uchar add,uchar dat)//向LCD写温度数据,并指定显示位置
 189          {
 190   1              uchar gw,sw;
 191   1              gw=dat%10;//取得个位数字
 192   1              sw=dat/10;//取得十位数字
 193   1              write_1602com(er+add);//er是头文件规定的值0x80+0x40
 194   1              write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码
 195   1              write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码
 196   1         write_1602dat(0xdf);//显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码
 197   1              write_1602dat(0x43);    //显示"C"符号,0x43是液晶屏字符库里大写C的地址码                
 198   1      }

⌨️ 快捷键说明

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