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

📄 1286lcd+clock.c

📁 液晶时钟
💻 C
字号:
#include<reg52.h>
#include<absacc.h>
#define  uchar unsigned char
#define  uint  unsigned int
uchar  m=0;
uchar n=0;
unsigned char a,b,c,d,e,f,g,h,i,de,da,ia,ib;
uchar  code  shuzi[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
uchar  hanzi[]={ "年月日星期时分秒 "}; 
uchar code ii[]={               "只争        朝夕"	  };
uchar  code  weizhi[]=
{
  0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,      /*第一行汉字位置*/
  0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,      /*第二行汉字位置*/
  0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,      /*第三行汉字位置*/
  0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,      /*第四行汉字位置*/
};


/***********引脚定义****************/
//sbit  WP=P2^1;
sbit  RS=P2^4;
sbit  RST=P1^4;
sbit  E=P2^6;
sbit  RW=P2^5;
//sbit  WR=0;



///////////////////////1302引脚
   sbit  RST_=P1^2;   
   sbit   IO=P1^1;  
   sbit SCLK=P1^0;  
   uchar bdata AB;
   uchar bdata AD;	 
   sbit AB0=AB^0;
   sbit AB7=AB^7;
   sbit AD0=AD^0;
   sbit AD7=AD^7;

uchar data time[7]={0x00,0x41,0x18,0x28,0x06,0x04,0x07}; //秒,分,时,日,月,周,年
turnbcd(unsigned char bcd)      
{ 
      unsigned char n_n;
      n_n=(bcd&0xf0)/16*10+(bcd&0x0f);
      return(n_n); 
} 

/*********延时函数**************/
void  delay(uint b)
{
   while(b--);
}


/*---------------------------------------------液晶部分-------------------------------
------------------*/
/***********写命令***********/
void write_com(uchar com)
{
   delay(150);
   RST=1;
   E=1;
   RS=0;
   RW=0;
   P0=com;
   E=0;  
}
/****************写数据*****************/
void  write_dat(uchar dat)
{
   delay(15);
   RST=1;
   E=1;
   RS=1;
   RW=0;
   P0=dat;
   E=0;  
}

/***************写汉字功能****************/
void  write_chinese(uchar *str,uchar a,uchar b,uchar c)
{
   write_com(0x30);
   delay(100);
   while(c!=0)
   {
     write_com(weizhi[a]);
     write_dat(str[b]);
	 b++;
	 write_dat(str[b]);
	 b++;
	 a++;
	 c--;
   }
}

/************写数据功能*****************/

void write_digital(uchar a,uchar b,uchar c)
{
  write_com(weizhi[a]);
  write_dat(shuzi[b]);
  write_dat(shuzi[c]);
}

/**************初始化液晶**************/

void lcd_ready(void)
{



TMOD=0X20; 
 SCON=0X50;
 TL1=0XFD;
 TH1=0XFD;
 ES=1;
 TR1=1;
 EA=1;
  delay(100);
  write_com(0x30);
  write_com(0x03);
  write_com(0x0c);
  write_com(0x06);
  write_com(0x01);
}



void end_xianshi(void)
{
   //write_chinese(hanzi,0,0,32);
   write_digital(0,m,n);
   write_digital(4,7,7);
}



 

void chuakou(void) interrupt 4 using 1
{
RI=0;
EA=0;
n=SBUF;
EA=1;
}

/*----------------------------------------------------1302程序------------------------------------------------*/
/*********************
    写数据   低位开始 
**********************/
 void inputbyte(unsigned char a_a)    
 {   
    unsigned char  b_b;
      AB=a_a;
	  for(b_b=8; b_b>0; b_b--)
     {
      IO = AB0;
      SCLK = 1;
      SCLK = 0;
      AB = AB >> 1; 
     } 
 }
/********************
  读取字节有返回值
*********************/
outputbyte()  
{  
	unsigned char  b_b;
    for(b_b=7; b_b>0; b_b--)
    {   
        AD7=IO;
        SCLK = 1; 
        SCLK = 0;
       	AD = AD>>1; 
    } 
    return(AD); 
}
/*********************
往1302里写数据参数分别为
     地址 和 数据
**********************/
void w1302(unsigned char add,unsigned char dat)
{	
    RST_=0; 
    SCLK=0; 
    RST_=1; 
    inputbyte(add); 
    inputbyte(dat);   
    SCLK = 1; 
    RST_ = 0;
} 
/**********************
读取1302某地址的数据   
返回值为该地址的数据
**********************/	
unsigned char r1302(unsigned char add)     
{
    unsigned char ucdata;
    RST_=0; 
    SCLK=0; 
    RST_=1; 
    inputbyte(add);  
    ucdata = outputbyte();  
    SCLK = 1; 
    RST_ = 0;
    return(ucdata);
}
/********************
设置初始时间 秒 分 时
     日 月 星期 年
**********************/
void set1302(void)   
{   
    unsigned char  q_q_=0;
    unsigned char  b_b_;
    unsigned char add_ = 0x80;
	uchar ds1302st;  
	SCLK=0;
	RST_=0;                               //ds1302的状态,0x55时不能进行初始化
 	 ds1302st=r1302(0x0c1);                     //读取DS1302的RAM1单元中的标志数据
    if(ds1302st!=0x55)                              //判断标志数据是否为0x55
   {w1302(0x8e,0x00); w1302(0x0c1,0x55);
    for(b_b_ =7; b_b_>0; b_b_--)
    { 	
	w1302(add_,time[q_q_]);  
        add_ +=2;              
	q_q_++;
    } w1302(0x80,0x00);   }                  
}
/********************
保存当前时间格式为: 
秒 分 时 日 月 星期 年 
********************/
void get1302(void)  
{	
  unsigned char  b_b;
  unsigned char ducaddr = 0x81;//读数据 连续读数  放到数组里
  for (b_b=0; b_b<7; b_b++)
  {
        time[b_b]=turnbcd(r1302(ducaddr)); //格式为: 秒 分 时 日 月 星期 年 
        ducaddr += 2;
  }
}

 void main(void)
{ 
//uchar a,b,c,d,e,f=0;
lcd_ready();
//write_com(0x0F);write_dat(0x00);	  
set1302();
 write_chinese(hanzi,1,0,1);
 write_chinese(hanzi,3,2,1);
 write_chinese(hanzi,5,4,1);
 write_chinese(hanzi,14,14,1);
 write_chinese(hanzi,9,10,1);
 write_chinese(hanzi,11,12,1);

 write_chinese(hanzi,20,6,2);
 write_chinese(ii,24,0,8);
while(1)
{
 get1302();
 de=time[0]/10;
 da=time[0]%10;
 a=time[2]/10;
 b=time[2]%10;
 c=time[1]/10;
 d=time[1]%10;
 e=time[4]/10;
 f=time[4]%10;
 g=time[3]/10;
 h=time[3]%10;
 i=time[5]%10;
 ia=time[6]/10;
 ib=time[6]%10;
 write_digital(0,ia,ib);
 write_digital(2,e,f);
 write_digital(4,g,h);
 write_digital(8,a,b);
 write_digital(10,c,d);
 write_digital(13,de,da);
 write_digital(22,0,5);


 }
}

⌨️ 快捷键说明

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