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

📄 ht1380_time1.c

📁 自己的平时一些制作 现在整理一下 与大家一起分享
💻 C
字号:
#include <reg51.h>

/*****定义ht1380芯片接口********/
// ht1380 ht1380_sclk --->P1.0
// ht1380 I/O  --->P1.1
// ht1380 ht1380_rest --->P1.2
sbit ht1380_sclk=P1^0;
sbit ht1380_data=P1^1;
sbit ht1380_rest=P1^2;
/**********定义两个全局变量*********/
//定义数组变量用于存放四个数码管的显示数据
//定义number存放动态显示是第几个数码管
unsigned char d[4],number;

/*********定义时间变量年月日时分秒***********/
unsigned char year,month,day,hour,minute,second;
/**********定义冒号变量 distime=1 是数码管冒号显示出来************/
bit distime;

/*******与数码管相关的两个表*********/
//一个显示译码表
//一个使能译码表
unsigned char code tab[10]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f};
unsigned char code digit[4]={0xf8,0xf4,0xf2,0xf1};

/******延时程序***********/
void delay(unsigned char dy)
{
   while(--dy);
}
/*******  ht1380 子程序*****************/
//------------- sent_char to ht1380----------
//上升沿写入
void sent_char(unsigned char sentchar)
{
 unsigned char ii;  

 for(ii=0;ii<8;ii++)
    {
      ht1380_sclk=0;
      if ((sentchar & 1)!=0) ht1380_data=1;
      else ht1380_data=0;
      ht1380_sclk=1;
      sentchar=sentchar>>1;
    }
}
//------------- get_char from ht1380---------
unsigned char get_char()
{
 unsigned char getchar,ii,temp;
    getchar=0;temp=1;
    for(ii=0;ii<8;ii++)
      {
       ht1380_sclk=0;
       ht1380_data=1;
       if(ht1380_data==1) getchar=getchar |temp;
       ht1380_sclk=1;
       temp=temp<<1;
      }
    return(getchar);
}
 
//-------------set_wp_off------------------
void set_wp_off()
{
    ht1380_rest=1;
    sent_char(0x8e);     //10001110b
    sent_char(0);        //00000000b
    ht1380_sclk=0;
    ht1380_rest=0;
}
//-----------set_wp_on--------------------
void set_wp_on()
{
  ht1380_rest=1;
  sent_char(0x8e);       //10001110b
  sent_char(0x80);       //10000000b
  ht1380_sclk=0;
  ht1380_rest=0;
}
//----------read_time --------------------
void read_time()
 {
  unsigned char temp;
    ht1380_rest=1;
    sent_char(0xbf);      //10111111b
    second=get_char();
    minute=get_char();
    hour=  get_char();
    day=   get_char();
    month= get_char();
    temp=  get_char();   /* week day */
    year=  get_char();
    temp=  get_char();            
    ht1380_sclk=0;
    ht1380_rest=0;
   
 }
//--------------set time-----------------
void set_time()
 {
   set_wp_off();
   ht1380_rest=1;
   sent_char(0xbe);      //10111110b
   sent_char(second);
   sent_char(minute);
   sent_char(hour);
   sent_char(day);
   sent_char(month);
   sent_char(1);         /* week  day */
   sent_char(year);
   sent_char(0);
   ht1380_sclk=0;
   ht1380_rest=0;
   set_wp_on();
 }

/*****定时器初始化程序*******/
void Init_Timer (void)
{
    TMOD=0x21;
	TH0=(65536-1000)/256;
    TL0=(65536-1000)%256;
    TR0=1;
    ET0=1;
    EA=1;
} 

/*****定时器0中断服务程序******/
//显示处理,具体可以参考前面的实验
void timer0() interrupt 1 using 1
{
    TH0=(65536-1000)/256;
    TL0=(65536-1000)%256;
    number=number++;
    if(number>3) number=0;
    P2=digit[number];
    P0=tab[d[number]]; 
	//在第二个数码管显示时,将最高位的小数点显示出来,这里为冒号
    if(distime==1 && number==1)  
       P0=tab[d[number]]+0x80;  
 }
/*******主函数***********/
//效果:显示 分:秒
void main (void)
{
 year=07;month=03;day=0x04;hour=0x19;minute=0x16;second=0x13; //软件预设时间参数
 ht1380_rest=0;ht1380_sclk=0;   //选中时钟芯片
 set_time();                    //设置时间
 Init_Timer();                  //初始化定时器及全局变量
 number=0;                      
 distime=1;                     
while(1)
     {
      read_time();
//      d[0]=hour/16;
//      d[1]=hour %16;
//      d[2]=minute/16;
//      d[3]=minute %16;
      d[0]=minute/16;
	  d[1]=minute%16;
	  d[2]=second/16;
	  d[3]=second%16;
      delay(250);
     }
}

⌨️ 快捷键说明

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