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

📄 ds1302.c

📁 使用ds1302和LCM1602的时钟程序
💻 C
字号:
/*********************************************************************
	
		                                                            
目    的:   DS1302+12864液晶(ST7920A)显示设定程序

目标系统:   基于任何AVR单片机
		                                                                
应用软件:   GCCAVR+WINAVR IDE
		                                                                
版    本:   Version 2.0
		                                                                
圆版时间:   2006-10-06
	
开发人员:   yeson

说	 明:   若用于商业用途,请保留此段文字或注明代码来源
	
*********************************************************************/

/*01010101010101010101010101010101010101010101010101010101010101010101
----------------------------------------------------------------------
版本更新记录:

----------------------------------------------------------------------
实验内容:
DS1302初始化,更改+12864液晶(ST7920A)显示+键盘操作
----------------------------------------------------------------------
硬件连接:
将SPILCD12864插入主板的“DotLcd”插槽;
12864液晶(ST7920A): K0----K7
                         |
SMK1632:              PA0--PA7
----------------------------------------------------------------------
注意事项: 
详见SMK1632说明书
----------------------------------------------------------------------
10101010101010101010101010101010101010101010101010101010101010101010*/

#include "avr/io.h"
#include "DS1302.H"
#define OUT_LCD_CS	sbi(DDRB,3)
#define SET_LCD_CS	sbi(PORTB,3)
#include "SPILCD.H"
#include "key.H"

#define OUT_SCK sbi(DDRC,7)
#define OUT_SIO sbi(DDRC,6)
#define OUT_RST sbi(DDRC,5)

#define IN_SIO  cbi(DDRC,6)

#define SET_SCK sbi(PORTC,7)
#define SET_SIO sbi(PORTC,6)
#define SET_RST sbi(PORTC,5)

#define CLR_SCK cbi(PORTC,7)
#define CLR_SIO cbi(PORTC,6)
#define CLR_RST cbi(PORTC,5)

#define GET_SIO gbi(PINC,6)

/*--------------------------------------------------------------------
函数名称:程序设定时间函数
函数功能:进入界面改变DS1302的时间
注意事项:
提示说明:DS1302_getDate(data); 获取日期
          DS1302_getTime(time); 获取时间
          DS1302_setTime(set[0],set[1],set[2]); 通过数组设定时间
          DS1302_setDate(set[3],set[4],set[5],set[6]);通过数组设定日期
输    入:无
返    回:无
--------------------------------------------------------------------*/

void timeset(void)
{
    uint8 set[7];
    uint8 time[3];
    uint8 data[4];
    uint8 i;
    lcd_clear();
    lcd_puts(1,1,"DS1302时间设定");
    lcd_puts(2,1,"按LOCK确定并退出");
    lcd_puts(3,2,"时");
    lcd_puts(3,4,"分");
    lcd_puts(3,6,"秒");
    lcd_puts(4,2,"年");
    lcd_puts(4,4,"月");
    lcd_puts(4,6,"日");
    lcd_puts(4,7,"周");
    DS1302_init();
    DS1302_getDate(data);
    DS1302_getTime(time);
    set[0]=time[2];
    set[1]=time[1];
    set[2]=time[0];
    set[3]=data[0];
    set[4]=data[1];
    set[5]=data[2];
    set[6]=data[3];
    for(i=0;i<7;)
    {
       
        switch(i)
        {
          case 0:
            lcd_putd(3,1,set[i],2);
            lcd_white(3,1);
            break;
          case 1:
            lcd_putd(3,3,set[i],2);
            lcd_white(3,3);
            break;
          case 2:
            lcd_putd(3,5,set[i],2);
            lcd_white(3,5);
            break;
          case 3:
            lcd_putd(4,1,set[i],2);
            lcd_white(4,1);
            break;
          case 4:
            lcd_putd(4,3,set[i],2);
            lcd_white(4,3);
            break;
          case 5:
            lcd_putd(4,5,set[i],2);
            lcd_white(4,5);
            break;
          case 6:
            switch(set[i])
	    {
             case 1:
             lcd_puts(4,8,"一");
             break;
             case 2:
             lcd_puts(4,8,"二");
             break;
             case 3:
             lcd_puts(4,8,"三");
             break;
             case 4:
             lcd_puts(4,8,"四");
             break;
             case 5:
             lcd_puts(4,8,"五");
             break;
             case 6:
             lcd_puts(4,8,"六");
             break;
             case 7:
             lcd_puts(4,8,"日");
             break;
            }
            lcd_white(4,8);
            break;
            default:break;
            
        }

        key=0;
       scankey();
       delay50ms(4);

        switch(key)
        {
          case 2:
          if(set[i]<99)
            {set[i]=set[i]+1;}
          break;
          case 10:
          if(set[i]>1)
            {set[i]=set[i]-1;}
          break;
          case 5:
          if(i>0)
            {i--;}
          break;
          case 7:
          if(i<6)
            {i++;}
          break;
          case 6:
            i=7;
            break;
          default:
          break;
        }
             delay50ms(4);
    }
DS1302_setTime(set[0],set[1],set[2]);
DS1302_setDate(set[3],set[4],set[5],set[6]);
}

void main(void)
{             
    uint8 time[3];
    uint8 data[4];
    uint8 int1con;
    int1con=0;
    OUT_SCK;
    OUT_SIO;
    OUT_RST;
    SEI();
    lcd_init();
    lcd_puts_(1,1,"DS1302范例程序");
    lcd_puts(2,1,"初始化");
    lcd_puts(3,2,"年");
    lcd_puts(3,4,"月");
    lcd_puts(3,6,"日");
    lcd_puts(3,7,"周");
    lcd_puts(4,2,"时");
    lcd_puts(4,4,"分");
    lcd_puts(4,6,"秒");
    DS1302_init();                      //DS1302初始化
    lcd_puts(2,4,"完成!");
    while(1)
    {
	scankey();
	int1con=key;
        if(int1con==1)
        {
           int1con=0;
           timeset();
           key=0;
               lcd_clear();
               lcd_puts_(1,1,"DS1302范例程序");
               lcd_puts(2,1,"初始化");
               lcd_puts(3,2,"年");
               lcd_puts(3,4,"月");
               lcd_puts(3,6,"日");
               lcd_puts(3,7,"周");
               lcd_puts(4,2,"时");
               lcd_puts(4,4,"分");
               lcd_puts(4,6,"秒");
               DS1302_init();
               lcd_puts(2,4,"完成!");
        }
        DS1302_getDate(data);
	lcd_putd(3,1,data[0],2);
	if(data[0]<10)
           lcd_puts(3,1,"0");
	lcd_putd(3,3,data[1],2);
	if(data[1]<10)
	   lcd_puts(3,3,"0");
	lcd_putd(3,5,data[2],2);
	if(data[2]<10)
	   lcd_puts(3,5,"0");
	//lcd_putd(3,8,data[3],1);
	switch(data[3])
	{
           case 1:
             lcd_puts(3,8,"一");
             break;
           case 2:
             lcd_puts(3,8,"二");
             break;
           case 3:
             lcd_puts(3,8,"三");
             break;
           case 4:
             lcd_puts(3,8,"四");
             break;
           case 5:
             lcd_puts(3,8,"五");
             break;
           case 6:
             lcd_puts(3,8,"六");
             break;
           case 7:
             lcd_puts(3,8,"日");
             break;
        }
        DS1302_getTime(time);
        lcd_putd(4,1,time[2],2);
        lcd_putd(4,3,time[1],2);
        lcd_putd(4,5,time[0],2);
        lcd_putd(4,8,key,2);
        delay50ms(5);
        //icd_white(2);
	//delay50ms(20);
    }	

}

⌨️ 快捷键说明

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