?? ds1302old.c
字號:
/************************************/
/*杭州電子&計算機工作室 */
/*http://www.hificat.com */
/*DS1302測試程序 */
/*目標器件:AT89S51 */
/*晶振:11.0592MHZ */
/*編譯環境:Keil 7.50A */
/************************************/
/*********************************包含頭文件********************************/
#include "reg51.h"
#include <intrins.h>
/*********************************端口定義**********************************/
sbit DS1302_CLK = P1^0;
sbit DS1302_IO = P1^1;
sbit DS1302_RST = P1^2;
/*******************************共陽LED段碼表*******************************/
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/******************************定義全局變量*********************************/
unsigned char second,minute,hour,week,day,month,year; //秒、分、時、星期、日、月、年
unsigned char minute1,hour1;
unsigned char t1,t2,i;
unsigned char time[]={0x08,0x06,0x19,0x04,0x09,0x30,0x00}; //初始時間數組
unsigned char secondchar,minutechar,hourchar,weekchar,daychar,monthchar,yearchar;
unsigned char keysum ;
sbit K1 = P3^2;
sbit K2 = P3^3;
unsigned char key_s, key_v, tmp;
unsigned char key_s1, key_v1;
//int kk;
/****************************************************************************
函數功能:數碼管掃描延時子程序
入口參數:
出口參數:
****************************************************************************/
void delay1(void)
{
int k;
for(k=0;k<400;k++);
}
void delayms(unsigned char ms)
// 延時子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
void delayms1(unsigned char ms)
// 延時子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
void displayhour(void)
{
P2=0xfe;
P0=tab[hour/16];
delayms1(1);
P2=0xfd;
P0=tab[hour%16];
delayms1(1);
}
void displayminuite(void)
{
P2=0xf7;
P0=tab[minute/16];
delayms1(1);
P2=0xef;
P0=tab[minute%16];
delayms1(1);
}
void displaysecond(void)
{
P2=0xbf;
P0=tab[second/16];
delayms1();
P2=0x7f;
P0=tab[second%16];
delayms1();
}
/****************************************************************************
函數功能:數碼管顯示子程序
入口參數:k
出口參數:
****************************************************************************/
void display(void)
{
P2=0xfe;
P0=tab[hour/16];
delay1();
P2=0xfd;
P0=tab[hour%16];
delay1();
P2=0xfb;
P0=0xbf; //顯示"-"
delay1();
P2=0xf7;
P0=tab[minute/16];
delay1();
P2=0xef;
P0=tab[minute%16];
delay1();
P2=0xdf;
P0=0xbf; //顯示"-"
delay1();
P2=0xbf;
P0=tab[second/16];
delay1();
P2=0x7f;
P0=tab[second%16];
delay1();
}
/*****************************************************************************
函數功能:向DS1302送一字節數據子程序
入口參數:
出口參數:
*****************************************************************************/
void InputByte(unsigned char byte1)
{
char i;
for(i=8;i>0;i--)
{
DS1302_IO=(bit)(byte1&0x01);
DS1302_CLK=1;
_nop_();
DS1302_CLK=0;
byte1>>=1;
}
return;
}
/*****************************************************************************
函數功能:讀DS1302一個字節子程序
入口參數:
出口參數:
*****************************************************************************/
unsigned char outputbyte(void)
{
unsigned char i;
unsigned ucdat=0;
for(i=8;i>0;i--)
{
DS1302_IO=1;
ucdat>>=1;
if(DS1302_IO)ucdat|=0x80;
DS1302_CLK=1;
_nop_();
DS1302_CLK=0;
}
return(ucdat);
}
/*****************************************************************************
函數功能:向DS1302某地址寫一字節數據子程序
入口參數:addr,TDat
出口參數:
*****************************************************************************/
void write_ds1302(unsigned char addr,unsigned char TDat)
{
DS1302_RST=0;
_nop_();
DS1302_CLK=0;
_nop_();
DS1302_RST=1;
InputByte(addr);
_nop_();
InputByte(TDat);
DS1302_CLK=1;
_nop_();
DS1302_RST=0;
}
/*****************************************************************************
函數功能:讀DS1302地址子程序
入口參數:add
出口參數:timedata
*****************************************************************************/
unsigned char read_ds1302(unsigned char addr)
{
unsigned char timedata;
DS1302_RST=0;
_nop_();
DS1302_CLK=0;
_nop_();
DS1302_RST=1;
InputByte(addr);
timedata=OutputByte();
DS1302_CLK=1;
_nop_();
DS1302_RST=0;
return(timedata);
}
/*****************************************************************************
函數功能:初始化DS1302子程序
入口參數:time[](全局變量)
出口參數:
*****************************************************************************/
void initial_ds1302()
{
write_ds1302(0x8e,0x00); //寫保護寄存器,在對時鐘或RAM寫前WP一定要為0
write_ds1302(0x8c,time[0]); //年
write_ds1302(0x88,time[1]); //月
write_ds1302(0x86,time[2]); //日
write_ds1302(0x8A,time[3]); //星期
write_ds1302(0x84,time[4]); //時
write_ds1302(0x82,time[5]); //分
write_ds1302(0x80,time[6]); //秒
write_ds1302(0x8e,0x80); //寫保護寄存器
}
void initial_ds13021()
{
write_ds1302(0x8e,0x00); //寫保護寄存器,在對時鐘或RAM寫前WP一定要為0
write_ds1302(0x8c,year); //年
write_ds1302(0x88,month); //月
write_ds1302(0x86,day); //日
write_ds1302(0x8A,week); //星期
write_ds1302(0x84,hour); //時
write_ds1302(0x82,minute); //分
write_ds1302(0x80,second); //秒
write_ds1302(0x8e,0x80); //寫保護寄存器
}
/*****************************************************************************
函數功能:讀DS1302時間子程序
入口參數:
出口參數:全局變量(second,minute,hour,week,day,month,year)
*****************************************************************************/
void read_time()
{
second=read_ds1302(0x81); //秒寄存器
minute=read_ds1302(0x83); //分
hour=read_ds1302(0x85); //時
week=read_ds1302(0x8B); //星期
day=read_ds1302(0x87); //日
month=read_ds1302(0x89); //月
year=read_ds1302(0x8d); //年
}
/*****************************************************************************
函數功能:主程序
入口參數:
出口參數:
*****************************************************************************/
bit scan_key1()
// 掃描按鍵
{
key_s1 = 0x00;
key_s1 |= K2; /////////////////////////////////////////////////
return(key_s1 ^ key_v1);
}
void proc_key1()
// 鍵處理
{ // hour=12;
// displayhour();
if((key_v1 & 0x01) == 0 )
{ // K2按下
if (keysum==1) hour=hour+1;
//if(hour==0x10) hour=hour+6;
//if(hour==0x20) hour=32;
if (keysum==2) minute=minute+1;
if (minute>0x59) minute=0;
if (hour>0x23) hour=0;
}
}
bit scan_key()
// 掃描按鍵
{
key_s = 0x00;
key_s |= K1; /////////////////////////////////////////////////
return(key_s ^ key_v);
}
void proc_key()
// 鍵處理
{
if((key_v & 0x01) == 0)
{ // K1按下
// send_str();
keysum++;
/*
if (keysum==1)
{
hour1=hour
}
if (keysum==2)
{
minute1=minute;
}
*/
if (keysum>2)
{
keysum=0;
initial_ds13021();
}
}
}
void main(void)
{
/*secondchar=0;
minutechar=0;
hourchar=0;
weekchar=0;
daychar=0;
monthchar=0;
yearchar=0;
*/
keysum=0;
initial_ds1302(); //初始化DS1302
while(1)
{
if(scan_key()) // 掃描按鍵
{
delayms(10); // 延時去抖動
if(scan_key()) // 再次掃描
{
key_v = key_s; // 保存鍵值
proc_key(); // 鍵處理
}
}
if(scan_key1()) // 掃描按鍵
{
delayms(10); // 延時去抖動
// kk=kk+1;
if(scan_key1()) // 再次掃描
{
key_v1 = key_s1; // 保存鍵值
proc_key1(); // 鍵處理
// kk=0;
}
}
if (keysum==1)displayhour();
if (keysum==2) displayminuite();
if (keysum==0 )
{
read_time(); //讀取時間
display(); //顯示時間
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -