📄 ds1302.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 + -