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

📄 main.lst

📁 LCD1602.rar
💻 LST
字号:
C51 COMPILER V6.12  MAIN                                                                   08/31/2007 19:10:34 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: E:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include<reg51.h>
   2          #include<intrins.h>
   3          #define uchar unsigned char
   4          #define uint unsigned int
   5          sbit rs=P3^3;
   6          sbit rw=P3^4;
   7          sbit en=P3^5;
   8          sbit bflag=P2^7;
   9          sbit reset=P3^0;
  10          sbit sclk=P3^1;
  11          sbit io=P3^2;
  12          uchar str1[]="date of today is:";
  13          //uchar str2[]="i will kill you lj";
  14          uchar init[]={0x00,0x00,0x21,0x21,0x10,0x01,0x04};//秒,分,时,日,月,星期,年
  15          //
  16          void delay()
  17          {
  18   1      	uchar j;
  19   1       	for(j=250;j>0;j--);
  20   1      }
  21          
  22          //-------------------液晶模块-----------------//
  23          void en_toggle()
  24          {
  25   1        	en=0;
  26   1        //_nop_();
  27   1       	delay();
  28   1        	en=1;
  29   1       	delay();
  30   1       // _nop_();
  31   1        	en=0;
  32   1      }   
  33                    //注意必须加延时,否则会出问题的
  34          void is_ready()
  35          {
  36   1         P2=0x00;//设置为输入口
  37   1         rs=0;
  38   1         rw=1;
  39   1         en=1;
  40   1         while(bflag);
  41   1         en=0;
  42   1      }
  43          
  44          void write_cmd(uchar cmd)
  45          {
  46   1        	is_ready();
  47   1        	rs=0;
  48   1        	rw=0;
  49   1        	P2=cmd;
  50   1        	en_toggle();
  51   1      }
  52          
  53          void write_data(uchar indata)
  54          {
  55   1        	is_ready();
C51 COMPILER V6.12  MAIN                                                                   08/31/2007 19:10:34 PAGE 2   

  56   1        	rs=1;
  57   1        	rw=0;
  58   1        	P2=indata;
  59   1        	en_toggle();
  60   1        	_nop_();
  61   1      }
  62          
  63          void write_str(uchar addr,uchar *p)
  64          {
  65   1       	uchar i; 
  66   1       	write_cmd(addr);
  67   1       	while(p[i]!='\0')
  68   1       	{
  69   2      		write_data(p[i]);
  70   2        		i++;
  71   2       	}
  72   1      }
  73          
  74          void write_position(uchar row,uchar col)
  75          {
  76   1      	uchar p;
  77   1      	 if(row==1)
  78   1      	 {
  79   2      	 	p=0x80+col-1;
  80   2       		write_cmd(p);
  81   2      	}
  82   1       	else
  83   1       	{
  84   2      		p=0xc0+col-1;
  85   2        		write_cmd(p);
  86   2          }
  87   1      }
  88          void init_lcd()
  89          {
  90   1       	write_cmd(0x38);
  91   1       	write_cmd(0x0c);
  92   1       	write_cmd(0x06);
  93   1       	write_cmd(0x01);//清屏幕
  94   1       	delay();
  95   1      }
  96          //------------液晶模块结束---------------------
  97          
  98          //-----------ds1302模块开始-------------------
  99          //注意点:sclk的上升沿输入数据,sclk的下跳沿输出数据
 100          //读写时都是从第0位开始
 101          void write_byte(uchar inbyte)
 102          {
 103   1       	uchar i;
 104   1       	for(i=8;i>0;i--)
 105   1       	{
 106   2        		sclk=0;
 107   2       		if(inbyte&0x01)
 108   2        			io=1;
 109   2        		else
 110   2        			io=0; 
 111   2        		sclk=1;
 112   2        		_nop_();
 113   2        		inbyte=inbyte>>1;
 114   2       	}
 115   1      }
 116          
 117          uchar read_byte() //sclk的下跳沿读数据
C51 COMPILER V6.12  MAIN                                                                   08/31/2007 19:10:34 PAGE 3   

 118          {
 119   1       	uchar i,temp=0; 
 120   1       	io=1;          //设置为输入口
 121   1       	for(i=7;i>0;i--)
 122   1       	{
 123   2      		sclk=0;
 124   2      		if(io==1)
 125   2         			temp=temp|0x80;
 126   2         		else
 127   2         			temp=temp&0x7f;
 128   2         		sclk=1;
 129   2         		temp=temp>>1;
 130   2       	}
 131   1      	 //sclk=0;
 132   1      	 return (temp);
 133   1      }
 134          
 135          //----------往ds1302的某个地址写入数据-------------
 136          void write_ds1302(uchar cmd,uchar indata)
 137          {
 138   1        	reset=1;
 139   1        	write_byte(cmd);
 140   1        	write_byte(indata);
 141   1        	reset=0;
 142   1        	sclk=0;
 143   1      }
 144          
 145          //----------读ds1302某地址的的数据-----------------
 146          uchar read_ds1302(uchar addr)
 147          {
 148   1       	uchar backdata;
 149   1       	reset=1;
 150   1       	write_byte(addr);
 151   1       	backdata=read_byte();//先写地址,然后读数据
 152   1       	reset=0;
 153   1       	//sclk=0;
 154   1       	return (backdata);
 155   1      }
 156          
 157          //------------设置初始时间-------------------
 158          void set_ds1302(uchar addr,uchar *p,uchar n)//写入n个数据
 159          {
 160   1        	write_ds1302(0x8e,0x00);//写控制字,允许写操作
 161   1        	for(;n>0;n--)
 162   1        	{
 163   2      		write_ds1302(addr,*p);
 164   2         		p++;
 165   2         		addr=addr+2;
 166   2        	}
 167   1        	write_ds1302(0x8e,0x80);//写保护,不允许写
 168   1      }
 169          
 170          //----------- 读取当前时间-------------------
 171          void read_nowtime(uchar addr,uchar *p,uchar n)
 172          {
 173   1      	for(;n>0;n--)
 174   1      	{
 175   2         		*p=read_ds1302(addr);
 176   2         		p++;
 177   2         		addr=addr+2;
 178   2       	} 		   
 179   1      }
C51 COMPILER V6.12  MAIN                                                                   08/31/2007 19:10:34 PAGE 4   

 180          void init_ds1302()
 181          {
 182   1      	reset=0;
 183   1        	sclk=0;
 184   1        	write_ds1302(0x80,0x00);//写控制字,允许写
 185   1        	write_ds1302(0x90,0x00);//禁止涡流充电 
 186   1      }
 187          
 188          //-----------ds1302模块结束-------------------
 189          void main()
 190          {
 191   1       	init_lcd();             //初始化LCD
 192   1      	write_str(0x80,str1);	  //液晶显示提示信息
 193   1       	init_ds1302();          //初始化ds1302
 194   1       	set_ds1302(0x80,init,7);//设置初始时间,日期,年月
 195   1        	while(1)
 196   1        	{
 197   2      		read_nowtime(0x81,init,7); //读出当前时间
 198   2      	    write_position(2,1);
 199   2         		write_data('0'+((init[2]&0xf0)>>4));
 200   2      		write_position(2,2);
 201   2         		write_data('0'+(init[2]&0x0f));	//读小时
 202   2      
 203   2         		write_position(2,3);
 204   2         		write_data(':');
 205   2      
 206   2         		write_position(2,4);
 207   2         		write_data('0'+((init[1]&0xf0)>>4));
 208   2        
 209   2         		write_position(2,5);
 210   2         		write_data('0'+(init[1]&0x0f));    //读分钟
 211   2        
 212   2         		write_position(2,6);
 213   2         		write_data(':');
 214   2      
 215   2         		write_position(2,7);
 216   2         		write_data('0'+((init[0]&0xf0)>>4));
 217   2        
 218   2         		write_position(2,8);
 219   2         		write_data('0'+(init[0]&0x0f));	//读秒
 220   2      	}
 221   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    456    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     25      14
   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 + -