
形式的程序,不便于看,以及修改。
程序太长,也可以放在你的百度空间,大家去看。
---------
程序,重新写了,放在:
>
仿真运行截图:
顶层文件 万年历C
#include<reg51h>
#include "LCD1602h"
#include "DS1302h"
#define uchar unsigned char
#define uint unsigned int
sbit speaker=P2^4;
bit key_flag1=0,key_flag2=0;
SYSTEMTIME adjusted;
uchar sec_add=0,min_add=0,hou_add=0,day_add=0,mon_add=0,yea_add=0;
uchar data_alarm[7]={0};
/键盘控制/
int key_scan() //扫描是否有键按下
{ int i=0;
uint temp;
P1=0xf0;
temp=P1;
if(temp!=0xf0)
i=1;
else
i=0;
return i;
}
uchar key_value() //确定按键的值
{
uint m=0,n=0,temp;
uchar value;
uchar v[4][3]={'2','1','0','5','4','3','8','7','6','b','a','9'} ;
P1=0xfe; temp=P1; if(temp!=0xfe)m=0;
P1=0xfd;temp=P1 ;if(temp!=0xfd)m=1;
P1=0xfb;temp=P1 ;if(temp!=0xfb)m=2;
P1=0xf7;temp=P1 ;if(temp!=0xf7)m=3;
P1=0xef;temp=P1 ;if(temp!=0xef)n=0;
P1=0xdf;temp=P1 ;if(temp!=0xdf)n=1;
P1=0xbf;temp=P1 ;if(temp!=0xbf)n=2;
value=v[m][n];
return value;
}
/设置闹铃函数/
void naoling(void)
{
uchar i=0,l=0,j;
init1602();
while(key_flag2&&i<12)
if(key_scan()){j=key_value();write_data(j);if(i%2==0)data_alarm[l]=(j-'0')10;else {data_alarm[l]+=(j-'0');l++;}i++;delay(600);}
write_com(0x01);
}
uchar according(void)
{ uchar k;
if(data_alarm[0]==adjustedYear&&data_alarm[1]==adjustedMonth&&data_alarm[2]==adjustedDay&&data_alarm[3]==adjustedHour&&data_alarm[4]==adjustedMinute&&data_alarm[5]==adjustedSecond)
k=1;
else k=0;
return k;
}
void speak(void)
{uint i=50;
while(i)
{speaker=0;
delay(1);
speaker=1;
delay(1);
i--;
}
}
void alarm(void)
{uint i=10;
while(i)
{
speak();
delay(10);
i--;
}
}
/修改时间 *** 作/
void reset(void)
{
sec_add=0;
min_add=0;
hou_add=0;
day_add=0;
mon_add=0;
yea_add=0 ;
}
void adjust(void)
{
if(key_scan()&&key_flag1)
switch(key_value())
{case '0':sec_add++;break;
case '1':min_add++;break;
case '2':hou_add++;break;
case '3':day_add++;break;
case '4':mon_add++;break;
case '5':yea_add++;break;
case 'b':reset();break;
default: break;
}
adjustedSecond+=sec_add;
adjustedMinute+=min_add;
adjustedHour+=hou_add;
adjustedDay+=day_add;
adjustedMonth+=mon_add;
adjustedYear+=yea_add;
if(adjustedSecond>59) adjustedSecond=adjustedSecond%60;
if(adjustedMinute>59) adjustedMinute=adjustedMinute%60;
if(adjustedHour>23) adjustedHour=adjustedHour%24;
if(adjustedDay>31) adjustedDay=adjustedDay%31;
if(adjustedMonth>12) adjustedMonth=adjustedMonth%12;
if(adjustedYear>100) adjustedYear=adjustedYear%100;
}
/中断处理函数/
void changing(void) interrupt 0 using 0 //需要修改时间和日期,或者停止修改
{
if(key_flag1)key_flag1=0;
else key_flag1=1;
}
void alarming(void) interrupt 3 using 0 //需要设置闹铃或者停止设置
{
if(key_flag2)key_flag2=0;
else key_flag2=1;
}
/主函数/
main()
{uint i;
uchar l;
uchar p1[]="D:",p2[]="T:";
SYSTEMTIME T;
EA=1;
EX0=1;
IT0=1;
EA=1;
EX1=1;
IT1=1;
init1602();
Initial_DS1302() ;
while(1)
{ write_com(0x80);
write_string(p1,2);
write_com(0xc0);
write_string(p2,2);
DS1302_GetTime(&T) ;
adjustedSecond=TSecond;
adjustedMinute=TMinute;
adjustedHour=THour;
adjustedWeek=TWeek;
adjustedDay=TDay;
adjustedMonth=TMonth;
adjustedYear=TYear;
for(i=0;i<9;i++)
{
adjustedDateString[i]=TDateString[i];
adjustedTimeString[i]=TTimeString[i];
}
adjust();
if(key_flag2)naoling();
if(according())alarm();
DateToStr(&adjusted);
TimeToStr(&adjusted);
write_com(0x82);
write_string(adjustedDateString,8);
write_com(0xc2);
write_string(adjustedTimeString,8);
delay(10);
}
(二)头文件1 显示模块 LCD1602H
#ifndef LCD_CHAR_1602_2009_5_9
#define LCD_CHAR_1602_2009_5_9
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs = P2^0;
sbit lcdrw = P2^1;
sbit lcden = P2^2;
void delay(uint z) // 延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) // 写入指令数据到 lcd
{
lcdrw=0;
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date) // 写入字符显示数据到 lcd
{
lcdrw=0;
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init1602() // 初始化设定
{
lcdrw=0;
lcden=0;
write_com(0x3C);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
void write_string(uchar pp,uint n)
{
int i;
for(i=0;i<n;i++)
write_data(pp[i]);
}
#endif
(三)头文件2 时钟模块 DS1302H
#ifndef _REAL_TIMER_DS1302_2009_5_20_
#define _REAL_TIMER_DS1302_2003_5_20_
sbit DS1302_CLK = P2^6; //实时时钟时钟线引脚
sbit DS1302_IO = P2^7; //实时时钟数据线引脚
sbit DS1302_RST = P2^5; //实时时钟复位线引脚
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
typedef struct SYSTEM_TIME
{
unsigned char Second;
unsigned char Minute;
unsigned char Hour;
unsigned char Week;
unsigned char Day;
unsigned char Month;
unsigned char Year;
unsigned char DateString[9]; //用这两个字符串来放置读取的时间
unsigned char TimeString[9];
}SYSTEMTIME; //定义的时间类型
#define AM(X) X
#define PM(X) (X+12) // 转成24小时制
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_WEEK 0x8A
#define DS1302_DAY 0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR 0x8C
#define DS1302_RAM(X) (0xC0+(X)2) //用于计算 DS1302_RAM 地址的宏
/内部指令/
void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)
{
unsigned char i;
ACC = d;
for(i=8; i>0; i--)
{
DS1302_IO = ACC0;
DS1302_CLK = 1;
DS1302_CLK = 0;
ACC = ACC >> 1; //因为在前面已经定义了ACC0 = ACC^0;以便再次利用DS1302_IO = ACC0;
}
}
unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
return(ACC);
}
//
void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令
DS1302InputByte(ucDa); // 写1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
}
unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
{
unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); // 地址,命令
ucData = DS1302OutputByte(); // 读1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
return(ucData);
}
void DS1302_SetProtect(bit flag) //是否写保护
{
if(flag)
Write1302(0x8E,0x10);
else
Write1302(0x8E,0x00);
}
void DS1302_SetTime(unsigned char Address, unsigned char Value) // 设置时间函数
{
DS1302_SetProtect(0);
Write1302(Address, ((Value/10)<<4 | (Value%10))); //将十进制数转换为BCD码
} //在DS1302中的与日历、时钟相关的寄存器存放的数据必须为BCD码形式
void DS1302_GetTime(SYSTEMTIME Time)
{
unsigned char ReadValue;
ReadValue = Read1302(DS1302_SECOND);
Time->Second = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F); //将BCD码转换为十进制数
ReadValue = Read1302(DS1302_MINUTE);
Time->Minute = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_HOUR);
Time->Hour = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_DAY);
Time->Day = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_WEEK);
Time->Week = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MONTH);
Time->Month = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_YEAR);
Time->Year = ((ReadValue&0x70)>>4)10 + (ReadValue&0x0F);
}
unsigned char DataToBCD(SYSTEMTIME Time)
{
unsigned char D[8];
D[0]=Time->Second/10<<4+Time->Second%10;
D[1]=Time->Minute/10<<4+Time->Minute%10;
D[2]=Time->Hour/10<<4+Time->Hour%10;
D[3]=Time->Day/10<<4+Time->Day%10;
D[4]=Time->Month/10<<4+Time->Month%10;
D[5]=Time->Week/10<<4+Time->Week%10;
D[6]=Time->Year/10<<4+Time->Year%10;
return D;
}
void DateToStr(SYSTEMTIME Time)
{
//将十进制数转换为液晶显示的ASCII值
Time->DateString[0] = Time->Year/10 + '0';
Time->DateString[1] = Time->Year%10 + '0';
Time->DateString[2] = '-';
Time->DateString[3] = Time->Month/10 + '0';
Time->DateString[4] = Time->Month%10 + '0';
Time->DateString[5] = '-';
Time->DateString[6] = Time->Day/10 + '0';
Time->DateString[7] = Time->Day%10 + '0';
Time->DateString[8] = '\0';
}
void TimeToStr(SYSTEMTIME Time)
{
//将十进制数转换为液晶显示的ASCII值
Time->TimeString[0] = Time->Hour/10 + '0';
Time->TimeString[1] = Time->Hour%10 + '0';
Time->TimeString[2] = ':';
Time->TimeString[3] = Time->Minute/10 + '0';
Time->TimeString[4] = Time->Minute%10 + '0';
Time->TimeString[5] = ':';
Time->TimeString[6] = Time->Second/10 + '0';
Time->TimeString[7] = Time->Second%10 + '0';
Time->DateString[8] = '\0';
}
void Initial_DS1302(void)
{
unsigned char Second;
Second=Read1302(DS1302_SECOND);
if(Second&0x80) //初始化时间
DS1302_SetTime(DS1302_SECOND,0);
}
void DS1302_TimeStop(bit flag) // 是否将时钟停止
{
unsigned char Data;
Data=Read1302(DS1302_SECOND);
DS1302_SetProtect(0);
if(flag)
Write1302(DS1302_SECOND, Data|0x80);
else
Write1302(DS1302_SECOND, Data&0x7F);
}
#endif
实时的话肯定要用DS1302了,给你发个吧,用STC89c52写的:
#include<reg52h>
#include<intrinsh>
#define uchar unsigned char
//引脚定义
sbit TIMERCLK=P3^2; //DS1302同步串行时钟引脚
sbit TIMERIO=P3^3; //DS1302数据输入输出引脚
sbit TIMERRST=P3^4; //DS1302RST引脚
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
//sbit SEC_7=SEC^7;
//sbit WDT=P1^3; //看门狗"喂狗"引脚
uchar code TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//#define DIGPORT
//全局变量声明
uchar bdata DS1302dat; //DS1302读写过程中的命令或数据
sbit ds1302datHbit=DS1302dat^7; //位定义,用于数据写入
sbit ds1302datBit=DS1302dat^0; //位定义,用于数据读出
uchar bdata DS1302adr; //DS1302读写过程中所访问的单元地址
sbit ds1302adrBit=DS1302adr^0; //
uchar idata SEC;
uchar MIN;
uchar HR;
uchar DATE;
uchar MONTH;
uchar DAY;
uchar YEAR;
uchar disp1;
uchar disp2;
uchar disp3;
uchar disp4;
uchar disp5;
uchar disp6;
uchar disp7;
uchar disp8;
uchar tiao;
uchar tt;
uchar flag;
// sbit SEC_7=SEC^7;
void delay(uchar time)
{
uchar i,j;
for(i=0;i<time;i++)
{
for(j=0;j<time;j++)
{
// WDT=~WDT;
}
}
}
void writeDS1302(uchar dsRamAdr,uchar ds1302data)
{
uchar i;
TIMERCLK=0;
delay(2);
TIMERRST=1;
delay(2);
DS1302adr=dsRamAdr;
DS1302dat=ds1302data;
for(i=0;i<8;i++)
{
CY=0;
TIMERCLK=0;
CY=ds1302adrBit;
TIMERIO=CY;
delay(2);
TIMERCLK=1;
DS1302adr=DS1302adr>>1;
}
for(i=0;i<8;i++)
{
CY=0;
TIMERCLK=0;
CY=ds1302datBit;
TIMERIO=CY;
delay(2);
TIMERCLK=1;
DS1302dat=DS1302dat>>1;
}
TIMERRST=0;
delay(2);
TIMERRST=0;
}
uchar readDS1302(uchar DS1302Adr)
{
uchar i;
TIMERCLK=0;
delay(2);
TIMERRST=1;
delay(2);
DS1302adr=DS1302Adr;
for(i=0;i<8;i++)
{
TIMERCLK=0;
TIMERIO=ds1302adrBit;
delay(2);
TIMERCLK=1;
DS1302adr=DS1302adr>>1;
}
TIMERIO=1;
for(i=0;i<7;i++)
{
TIMERCLK=0;
ds1302datHbit=TIMERIO;
delay(2);
TIMERCLK=1;
DS1302dat=DS1302dat>>1;
TIMERCLK=0;
ds1302datHbit=TIMERIO;
}
TIMERRST=0;
delay(2);
TIMERCLK=0;
return DS1302dat;
}
void DS1302Inital(void)
{
uchar ds1302st;
TIMERCLK=0;
TIMERRST=0;
ds1302st=readDS1302(0x0c1);
if(ds1302st!=0x55)
{
writeDS1302(0x8e,0x00);
//writeDS1302(0x80,0x00);
writeDS1302(0x82,0x00);
writeDS1302(0x84,0x16);
writeDS1302(0x86,0x19);
writeDS1302(0x88,0x09);
writeDS1302(0x8a,0x02);
writeDS1302(0x8c,0x00);
writeDS1302(0x90,0xa6);
writeDS1302(0x0c0,0x55);
writeDS1302(0x80,0x00);
}
}
void readRTC(void)
{
MONTH=readDS1302(0x89);
DATE=readDS1302(0x87);
HR=readDS1302(0x85);
MIN=readDS1302(0x83);
SEC=readDS1302(0x81);
}
void disp(void)
{
if(MIN==10)writeDS1302(0x82,0x10);
if(MIN==26)writeDS1302(0x82,0x20);
if(MIN==42)writeDS1302(0x82,0x30);
if(MIN==58)writeDS1302(0x82,0x40);
if(MIN==74)writeDS1302(0x82,0x50);
if(MIN==90)writeDS1302(0x82,0x00);
if(HR==10)writeDS1302(0x84,0x10);
if(HR==26)writeDS1302(0x84,0x20);
if(HR==36)writeDS1302(0x84,0x00);
//if(HR==58)writeDS1302(0x82,0x40);
//if(HR==74)writeDS1302(0x82,0x50);
//if(HR==90)writeDS1302(0x82,0x00);
if(DATE==10)writeDS1302(0x86,0x10);
if(DATE==26)writeDS1302(0x86,0x20);
if(DATE==42)writeDS1302(0x86,0x30);
if(DATE==50)writeDS1302(0x86,0x01);
//if(DATE==74)writeDS1302(0x82,0x50);
//if(DATE==90)writeDS1302(0x82,0x00);
disp2=SEC/16;
disp1=SEC%16;
//if(flag1==0)
//if(MIN==10||MIN==26||MIN==42||MIN==58||MIN==74){MIN=MIN+6;}
disp4=MIN/16;
disp3=MIN%16;//flag1=0;
disp6=HR/16;
disp5=HR%16;
disp8=DATE/16;
disp7=DATE%16;
P2_0=0;
P0=TABLE[disp1];
delay(12);
P2_0=1;
P2_1=0;
P0=TABLE[disp2];
delay(12);
P2_1=1;
P2_2=0;
P0=TABLE[disp3];
delay(12);
P2_2=1;
P2_3=0;
P0=TABLE[disp4];
delay(12);
P2_3=1;
P2_4=0;
P0=TABLE[disp5];
delay(12);
P2_4=1;
P2_5=0;
P0=TABLE[disp6];
delay(12);
P2_5=1;
P2_6=0;
P0=TABLE[disp7];
delay(12);
P2_6=1;
P2_7=0;
P0=TABLE[disp8];
delay(12);
P2_7=1;
}
void dispA(void)
{
if(SEC==10||SEC==26||SEC==42||SEC==58||SEC==74){SEC=SEC+6;}
//if(SEC==74||SEC==58||SEC==42||SEC==26||SEC==10){SEC=SEC+6;}
disp2=SEC/16;
disp1=SEC%16;
//disp4=MIN/16;
//disp3=MIN%16;
//disp6=HR/16;
//disp5=HR%16;
//disp8=DATE/16;
//disp7=DATE%16;
if(SEC==90)SEC=0;
P2_0=0;
P0=TABLE[disp1];
delay(12);
P2_0=1;
P2_1=0;
P0=TABLE[disp2];
delay(12);
P2_1=1;
P2_2=0;
P0=TABLE[disp3];
delay(5);
P2_2=1;
P2_3=0;
P0=TABLE[disp4];
delay(5);
P2_3=1;
P2_4=0;
P0=TABLE[disp5];
delay(5);
P2_4=1;
P2_5=0;
P0=TABLE[disp6];
delay(5);
P2_5=1;
P2_6=0;
P0=TABLE[disp7];
delay(5);
P2_6=1;
P2_7=0;
P0=TABLE[disp8];
delay(5);
P2_7=1;
}
void dispB(void)
{
if(MIN==10||MIN==26||MIN==42||MIN==58||MIN==74){MIN=MIN+6;}
//if(MIN==74||MIN==58||MIN==42||MIN==26||MIN==10){MIN=MIN+6;}
//disp2=SEC/16;
//disp1=SEC%16;
disp4=MIN/16;
disp3=MIN%16;
//disp6=HR/16;
//disp5=HR%16;
//disp8=DATE/16;
//disp7=DATE%16;
if(MIN==90)MIN=0;
P2_0=0;
P0=TABLE[disp1];
delay(5);
P2_0=1;
P2_1=0;
P0=TABLE[disp2];
delay(5);
P2_1=1;
P2_2=0;
P0=TABLE[disp3];
delay(12);
P2_2=1;
P2_3=0;
P0=TABLE[disp4];
delay(12);
P2_3=1;
P2_4=0;
P0=TABLE[disp5];
delay(5);
P2_4=1;
P2_5=0;
P0=TABLE[disp6];
delay(5);
P2_5=1;
P2_6=0;
P0=TABLE[disp7];
delay(5);
P2_6=1;
P2_7=0;
P0=TABLE[disp8];
delay(5);
P2_7=1;
}
void dispC(void)
{
if(HR==10||HR==26||HR==42||HR==58||HR==74){HR=HR+6;}
//if(HR==74||HR==58||HR==42||HR==26||HR==10){HR=HR+6;}
//disp2=SEC/16;
//disp1=SEC%16;
//disp4=MIN/16;
//disp3=MIN%16;
disp6=HR/16;
disp5=HR%16;
if(HR==36)HR=0;
//disp8=DATE/16;
//disp7=DATE%16;
P2_0=0;
P0=TABLE[disp1];
delay(5);
P2_0=1;
P2_1=0;
P0=TABLE[disp2];
delay(5);
P2_1=1;
P2_2=0;
P0=TABLE[disp3];
delay(5);
P2_2=1;
P2_3=0;
P0=TABLE[disp4];
delay(5);
P2_3=1;
P2_4=0;
P0=TABLE[disp5];
delay(12);
P2_4=1;
P2_5=0;
P0=TABLE[disp6];
delay(12);
P2_5=1;
P2_6=0;
P0=TABLE[disp7];
delay(5);
P2_6=1;
P2_7=0;
P0=TABLE[disp8];
delay(5);
P2_7=1;
}
void dispD(void)
{
if(DATE==10||DATE==26||DATE==42||DATE==58||DATE==74){DATE=DATE+6;}
//if(DATE==74||DATE==58||DATE==42||DATE==26||DATE==10){DATE=DATE+6;}
//disp2=SEC/16;
//disp1=SEC%16;
//disp4=MIN/16;
//disp3=MIN%16;
//disp6=HR/16;
//disp5=HR%16;
disp8=DATE/16;
disp7=DATE%16;
if(DATE==50)DATE=1;
P2_0=0;
P0=TABLE[disp1];
delay(5);
P2_0=1;
P2_1=0;
P0=TABLE[disp2];
delay(5);
P2_1=1;
P2_2=0;
P0=TABLE[disp3];
delay(5);
P2_2=1;
P2_3=0;
P0=TABLE[disp4];
delay(5);
P2_3=1;
P2_4=0;
P0=TABLE[disp5];
delay(5);
P2_4=1;
P2_5=0;
P0=TABLE[disp6];
delay(5);
P2_5=1;
P2_6=0;
P0=TABLE[disp7];
delay(12);
P2_6=1;
P2_7=0;
P0=TABLE[disp8];
delay(12);
P2_7=1;
}
void main(void)
{
DS1302Inital();
while(1)
{
readRTC();
disp();
tt=0;
flag=0;
tiao=0;
while(P3_7==0||tt==1)
{
tt=1;
if(flag==0)
{
tiao++;
flag=1;
}
if(tiao==1)
{
while(P3_7==0);
dispA();
if(P3_6==0)
{
while(P3_6==0);
writeDS1302(0x80,++SEC);
}
if(P3_5==0)
{
while(P3_5==0);
writeDS1302(0x80,--SEC);
}
if(P3_7==0)
flag=0;
}
if(tiao==2)
{
while(P3_7==0);
dispB();
if(P3_6==0)
{
while(P3_6==0);
writeDS1302(0x82,++MIN);
}
if(P3_5==0)
{
while(P3_5==0);
writeDS1302(0x82,--MIN);
}
if(P3_7==0)
flag=0;
}
if(tiao==3)
{
while(P3_7==0);
dispC();
if(P3_6==0)
{
while(P3_6==0);
writeDS1302(0x84,++HR);
}
if(P3_5==0)
{
while(P3_5==0);
writeDS1302(0x84,--HR);
}
if(P3_7==0)
flag=0;
}
if(tiao==4)
{
while(P3_7==0);
dispD();
if(P3_6==0)
{
while(P3_6==0);
writeDS1302(0x86,++DATE);
}
if(P3_5==0)
{
while(P3_5==0);
writeDS1302(0x86,--DATE);
}
if(P3_7==0)
flag=0;
}
if(tiao==5)
tt=0;
}
}
}
你自己用keil软件调就行了!
无论是对DS1302写还是读 *** 作, *** 作时RST必须置"1";CLK和DAT的时序非常类似于I2C总线 *** 作,CLK是串行通讯的时钟信号,由单片机提供,DAT为双向数据信号,具体时序需参考DS1302编写。
以上就是关于单片机汇编语言实现实时时钟,不知道我的哪里出错了,请大家帮忙看看全部的内容,包括:单片机汇编语言实现实时时钟,不知道我的哪里出错了,请大家帮忙看看、跪求 51单片机+12864液晶+1302时钟制成的万年历c程序、求单片机 实时时钟 电路 图和配套代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)