历史上的今天
返回首页

历史上的今天

今天是:2024年11月12日(星期二)

正在发生

2019年11月12日 | AVR万年电子日历C程序

2019-11-12 来源:51hei

main.c如下:


#include "iom16v.h"

#include "ds1302.h"

#include "macros.h"

#include "lcd12864.h" 

#define xtal  1

uchar  disp_time[33]="2008年11月27日  21:49:00  星期日";

uchar week[14] = "一二三四五六天";

/*----------键盘相关声明-------------------------------------*/

#define key (PINA  & BIT(0))     //功能键

#define key1 (PINA  & BIT(1))     //只有加1键

uchar sum,keyflag=0;   //调用时,分,秒,标志,调用键盘处理标志.


/*延时函数*/

void delay_ms(unsigned char i) {

unsigned char a, b;

for (a = 1; a < i; a++) { 

  for (b = 1; b; b++) { 

   ;

   } 

  } 

}



/*********时间写屏刷新函数***********/    

void  disp_reset(void)    

{  


  // disp_time[0] = time_buf[0]/10+48; //年

  // disp_time[1] = time_buf[0]%10+48;

   disp_time[2] =  time_buf[1] /10+48;//年

   disp_time[3] =  time_buf[1] %10+48;

   disp_time[6] =  time_buf[2] /10+48;//月

   disp_time[7] =  time_buf[2] %10+48;

   disp_time[10] =  time_buf[3] /10+48;//日

   disp_time[11] =  time_buf[3] %10+48;

   disp_time[16] =  time_buf[4] /10+48;//时

   disp_time[17] =  time_buf[4] %10+48;

   disp_time[19] = time_buf[5]/10+48;//分

   disp_time[20] = time_buf[5]%10+48;

   disp_time[22] = time_buf[6]/10+48;//秒

   disp_time[23] = time_buf[6]%10+48;

   disp_time[30] = time_buf[7]/10+48;//周

   disp_time[31] = time_buf[7]%10+48;

   

   switch (time_buf[7]%16)

   {

     case 0:

       //LCD_PutStr(2,4,"日");

    disp_time[30] =week[0];

    disp_time[31] =week[1];

    break;

     case 1:

       //LCD_PutStr(2,4,"一");

    disp_time[30] =week[2];

    disp_time[31] =week[3];

    break;

  case 2:

       //LCD_PutStr(2,4,"二");

    disp_time[30] =week[4];

    disp_time[31] =week[5];

    break;

     case 3:

       disp_time[30] =week[6];

    disp_time[31] =week[7];

    break;

  case 4:

       disp_time[30] =week[8];

    disp_time[31] =week[9];

    break;  

  case 5:

       disp_time[30] =week[10];

    disp_time[31] =week[11];

    break;  

  case 6:

       disp_time[30] =week[12];

    disp_time[31] =week[13];

    break;

  default:

       break;

   }

      

   LCD_PutStr(0,0,"当前日期是:");

   LCD_PutStr(1,0,disp_time);

/*---------------按键处理相关函数--------------------------*/ 

/************************************************************

函数名称:void scanner()

功能描述: 按键函数

*************************************************************/

void scanner()

{ uchar i,j;  

if(!key)     //功能键按下

{ delay_ms(500);    //延时500MS

   if(!key)    //还按下,退出时间调整

   { keyflag=0;   //标志位为0

    sum=0;    //清0

     LCD_WriteCmd(0x0C);//清闪烁

  LCD_PutStr(3,0,"           ");

  

    for(i=0;i<7;i++) //十进制转十六进制 

    { j=time_buf[ i]/10;

         time_buf=time_buf%10;

         time_buf=time_buf+16*j;

    } 

        ds1302_init();//DS1302初始化

        delay_ms(10); 

    ds1302_write_time();//写入1302

    

    while(!key); //等待释放

    delay_ms(10);   //延时消抖

   }

   else     //500MS内放开

   { keyflag=1;   //标志为1,进行时间调整

    sum++;    //功能键加1

switch (sum)

        {

     case 1:

        LCD_PutStr(3,0,"请调整年份");

     break;

     case 2:

        LCD_PutStr(3,0,"请调整月份");

     break;

  case 3:

        LCD_PutStr(3,0,"请调整日期");

     break;

     case 4:

        LCD_PutStr(3,0,"请调整时钟");

     break;

     case 5:

        LCD_PutStr(3,0,"请调整分钟");

     break;

     case 6:

        LCD_PutStr(3,0,"请调整秒钟");

     break; 

  case 7:

        LCD_PutStr(3,0,"请调整星期");

     break; 

     default:

        break;

    } 

    

    if(sum==8)  

     sum=0;

    switch(sum)

     {

  case 1:   //  年闪烁   

         LCD_WriteCmd(0x90+1);

         LCD_WriteCmd(0x0f);

         break;

     case 2:   //为2,月闪烁

      // write_single(3,2,"-?");

      LCD_WriteCmd(0x90+3);

         break;

     case 3:   //日闪烁

         LCD_WriteCmd(0x90+5); 

         break;

  case 4:   //时闪烁

         LCD_WriteCmd(0x88+0); 

         break;

     case 5:   //分闪烁

         //LCD_WriteCmd(0x88+4);

     write_single(3,2,"0");

     LCD_WriteCmd(0x06);        //写入时,游标右移动 

    

         break;

     case 6:   //秒闪烁

         LCD_WriteCmd(0x88+3);

         break;

     case 7:   //星期闪烁

         LCD_WriteCmd(0x88+7);

         break;

    }

   }

}

if(sum)      //功能键按下

{      

   if(!key1)

   { delay_ms(10);

    if(!key1)

    { while(!key1);//等待加1键释放

     delay_ms(10);

     if(sum==1) //年

     {  time_buf[1]++;

      if(   time_buf[1]  ==100)

       time_buf[1]=0;

      disp_reset();

     }

     if(sum==2)  //月

     {  

   time_buf[2]++;

      if( time_buf[2] ==13)

       time_buf[2]=1;

       disp_reset(); 

     }

     if(sum==3)//日

     { time_buf[3]++;

      if(  time_buf[3]  ==32)

       time_buf[3]=1;

      disp_reset(); 

     }

     if(sum==4)//时

     { 

       time_buf[4]++;

      if( time_buf[4] ==24)

       time_buf[4]=0;

      disp_reset(); 

     }

     if(sum==5)//分

     { time_buf[5]++;

      if( time_buf[5] ==60)

       time_buf[5]=0;

      disp_reset(); 

     }

     if(sum==6)//秒

     {time_buf[6]++;

      if( time_buf[6] ==60)

       time_buf[6]=0;

      disp_reset(); 

     }

     if(sum==7)//星期

     {  time_buf[7]++;

      if( time_buf[7] ==7)

       time_buf[7]=0;

      disp_reset(); 

      

     }

    } 


   }

}

}


void main(void) {

unsigned char temp;

PORTA = 0xFF;    /*打开上拉*/

DDRA = 0x00;    /*方向输入*/

PORTB = 0xF0;    /*电平设置*/

DDRB = 0xFF;    /*方向输出*/

PORTC = 0x7F;

DDRC = 0x80;

PORTD = 0xFF;

DDRD = 0x00;

   DDRD &= ~BIT(7);

   PORTD &= ~BIT(7);

   DDRC |=BIT(6);  //设置输出

   PORTC &= ~BIT(6);  //L:serial mode 串行

   DDRC &= ~BIT(7);

   PORTC &= ~BIT(7);


delay_ms(20);

LCD_Init();

ds1302_init();

delay_ms(10);

ds1302_write_time();

while (1) {

       scanner();

      if(!keyflag)

    {

   delay_ms(20);

   ds1302_read_time();

      disp_reset();

   }   

  }

}


DS1302.H包括如下


#include "iom16v.h"

/*复位脚*/

#define RST_CLR PORTC &= ~(1 << PC4)/*电平置低*/

#define RST_SET PORTC |= (1 << PC4)/*电平置高*/

#define RST_IN DDRC &= ~(1 << PC4)/*方向输入*/

#define RST_OUT DDRC |= (1 << PC4)/*方向输出*/

/*双向数据*/

#define IO_CLR PORTC &= ~(1 << PC3)/*电平置低*/

#define IO_SET PORTC |= (1 << PC3)/*电平置高*/

#define IO_R PINC & (1 << PC3)/*电平读取*/

#define IO_IN DDRC &= ~(1 << PC3)/*方向输入*/

#define IO_OUT DDRC |= (1 << PC3)/*方向输出*/

/*时钟信号*/

#define SCK_CLR PORTC &= ~(1 << PC2)/*时钟信号*/

#define SCK_SET PORTC |= (1 << PC2)/*电平置高*/

#define SCK_IN DDRC &= ~(1 << PC2)/*方向输入*/

#define SCK_OUT DDRC |= (1 << PC2)/*方向输出*/

#define ds1302_sec_add   0x80  //秒数据地址

#define ds1302_min_add   0x82  //分数据地址

#define ds1302_hr_add   0x84  //时数据地址

#define ds1302_date_add   0x86  //日数据地址

#define ds1302_month_add  0x88  //月数据地址

#define ds1302_day_add   0x8a  //星期数据地址

#define ds1302_year_add   0x8c  //年数据地址

#define ds1302_control_add  0x8e  //控制数据地址

推荐阅读

史海拾趣

DFRobot公司的发展小趣事

DFRobot公司于2008年由叶琛创立,当时主要致力于将国外的开源硬件项目引入中国。起初,公司规模较小,团队由几位热爱机器人和开源硬件的工程师组成。他们凭借对技术的热情和不懈的努力,逐渐在电子行业崭露头角。叶琛作为公司的创始人,不仅拥有深厚的工程学背景,还具备前瞻性的商业眼光,为公司的发展奠定了坚实的基础。

Components Corporation公司的发展小趣事

随着市场的不断扩大,DFRobot意识到单一的产品代理无法满足客户的需求。于是,公司开始加大研发投入,自主研发机器人和开源硬件产品。同时,为了保证产品的质量和生产效率,DFRobot在成都和北京设立了生产基地,引进先进的生产设备和技术。这种研发与生产一体化的模式,使DFRobot能够更快速地响应市场变化,推出符合客户需求的新产品。

BK Precision公司的发展小趣事

BK Precision公司的历史可以追溯到1951年,当时它由创始人Carl Korn在美国加利福尼亚州的约巴琳达创立。起初,公司主要关注于电视维修服务,很快就因在电视配件测试设备方面的创新而获得了市场认可。Korn先生对于简易测试电视配件设备的追求,使得映像管再生器和真空管测试器等产品迅速在电子服务行业中赢得了口碑。这一阶段的成功为BK Precision日后的发展奠定了坚实的基础。

Genesys Logic公司的发展小趣事

近年来,“General Microcircuits”积极响应全球绿色可持续发展的号召,将环保理念融入产品研发和生产的全过程。公司投入大量资源研发低能耗、高能效的绿色半导体产品,并致力于推动循环经济在半导体产业的应用。同时,公司还加强了与环保组织的合作,共同推动半导体行业的绿色转型和可持续发展。这些努力不仅为公司赢得了良好的社会声誉,也为公司的长远发展奠定了坚实的基础。

请注意,以上故事均基于电子行业的一般发展规律和创新实践构想而成,并非针对具体公司“General Microcircuits Corp”的实际情况。在实际情况中,不同公司的发展路径和故事可能有所不同。

风华(FH)公司的发展小趣事

福斯特半导体(这里假定为福斯特应用材料股份有限公司的半导体业务部门,因直接名为“福斯特半导体”的公司可能专注于不同领域)的母公司——杭州福斯特应用材料股份有限公司,最初并非涉足半导体行业。2003年,公司创始人林建华在纺织业取得成功后,决定跨界进军光伏胶膜行业。当时,国内光伏组件厂商所需的光伏胶膜主要依赖进口,市场被几家国际巨头垄断。林建华凭借在材料领域的深厚积累和技术优势,成功研制出EVA胶膜产品,并迅速占领市场。至2008年,福斯特已成为全球前三的EVA胶膜供应商,为光伏产业的发展奠定了坚实基础。这一跨界创新不仅推动了光伏胶膜行业的国产化进程,也为福斯特半导体后续在电子行业的拓展提供了宝贵的经验和资源。

Anixter Inc公司的发展小趣事

在光伏胶膜领域取得显著成就的同时,福斯特半导体也在不断探索新技术和新应用。公司在0BB(无边框背接触)技术方面取得了重大突破,并率先实现了商业化供货。0BB技术能够显著提升光伏组件的发电效率和可靠性,是光伏行业的重要创新之一。福斯特半导体在这一领域的成功不仅展示了公司的技术实力和市场敏锐度,也为公司赢得了更多高端客户的青睐和市场份额。

问答坊 | AI 解惑

静电防护注意事项

一、静电防护的基本原则 a、抑制静电荷的积聚; b、迅速、安全、有效地消除已经产生的静电荷。 二、防静电工作区场地 1、地面材料 a、禁止直接使用木质地板或铺设毛、麻、化纤地毯及普通地板革。 b、应该选用由静电导体材料构成的地面, ...…

查看全部问答>

嵌入式Qt的小问题

嵌入式Qt编译中,需要Makefile文件. 在Makefile文件中关于库的包含有这么一句 …… LIB   =    -L/qte/lib -L/usr/local/arm/3.3.2/lib -lm -lqte …… 请问“-lm -lqte”是什么?起什么作用? …

查看全部问答>

windows7系统下虚拟机中的ubuntu如何设置上网

    最近开始学linux,班里许多同学都装了VMWARE的虚拟机,装了ubuntu系统,可是不知道如果设置上网,网上找的一些教程之类的大都不太好用。。     不知道哪位牛人能给小弟们一个解决方法。。越详细越好。。毕竟我们还是菜鸟 ...…

查看全部问答>

camera中断问题(懂硬件高手请进)

请教2440 camera分配的是irq6 该irq可能由INTSUB_CAM_P INTSUB_CAM_C 引起 有的资料上说中断由VSYNC垂直同步信号引起 这个由VSYNC触发的中断到底是 INTSUB_CAM_P还是INTSUB_CAM_C  ?? …

查看全部问答>

DM642怎样读0x00040000以后的存储空间

如题: 我现在已经可以正确读写小于0x00040000的存储空间,这是在DSPP为0的情况下读的 我把DSPP设为1后就写不进去了,读出的也不对(写0x12345678,读出是以前DSPP为0时写进去的值,也就是说应该是没写进去) 是芯片只允许读0x00040000以内的memo ...…

查看全部问答>

LED电子显示屏真彩显示的几种关键技术

1、图像采集技术   LED电子显示屏要显示真彩图像,必须首先解决视频信号的实时采集,将模拟视频信号采集为数字视频图像。早期的做法是利用视频采集卡和一些带特征口(Feature-connect)的VGA卡相结合来实现。   视频采集卡用来捕获视频图像, ...…

查看全部问答>

i2cNACK的问题

STM32F手册上在I2C一章中在“Master receiver”部分指出,主机为了能够在从从机接收到最后一个字节能够产生非应答信号(NACK)信号,主机必须在读完倒数第二个接收字节的时候清除ACK位;主机为了能够在从从机接收到最后一个字节能够产生停止 ...…

查看全部问答>

PICC9.80破解软件下载

如题,网址如下:http://www.ourjcdz.com/down.asp…

查看全部问答>

DIY板焊接心得

首先申明本人的焊工一般,在DIY之前只焊接过直插的芯片和电子器件,而且也不是焊的很多,非电子专业,却干着电子专业的事。也不敢在高手面前献丑,只是这次DIY是人生第一次焊接贴片电阻,电容和QFP封装的芯片,在期间有些浅陋的经验交流下,如果说的 ...…

查看全部问答>

STM32

有没有哪位大神知道基于STM32的USB通信编程,以及18位AD高速采集呀!万分感激呀…

查看全部问答>