QQ网名大全

求一份单片机万年历程序,带原理图 ,里面功能越多越好 参考用的。

#include<reg51.h>
#include"lcd.h"
#include"ds1302.h"

**it k1=p3^1;
**it k2=p3^0;
**it k3=p3^2;
**it k4=p3^3;  //管脚接线
unsigned char character0[32] = {
0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,  //"年"代码 0x01
0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,0x00,  //"月"代码 0x02
0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00,  //日
0x1e,0x15,0x1f,0x15,0x1f,0x1b,0x15,0x13,  //周
}; 
void int0configuration();
void lcdd**play();
unsigned char setstate,setplace;
void delay10ms(void);   //误差 0us
/*******************************************************************************
* 函数名         : main
* 函数功能    : 主函数
* 输入           : 无
* 输出           : 无
*******************************************************************************/

void main()
{
unsigned char i,h;
int0configuration();
lcdinit();
lcdwritecom(0x40);
for (h=0;h<32;h++)
{
lcdwritedata(character0[h]);
}
lcdwritecom(0x80);

// ds1302init();
while(1)
{
if(setstate==0)
{
ds1302readtime();
}
else
{
if(k1==0) //检测按键k1是否按下
{   
delay10ms(); //消除抖动
if(k1==0)
{   
setplace++;
if(setplace>=7)
setplace=0;
}

while((i<50)&&(k1==0))  //检测按键是否松开
{
delay10ms();
i++;
}
i=0;
}
if(k2==0) //检测按键k2是否按下
{
delay10ms(); //消除抖动
if(k2==0)
{
time[setplace]++;
if((time[setplace]&0x0f)>9)  //换成bcd码。
{
time[setplace]=time[setplace]+6;
}
if((time[setplace]>=0x60)&&(setplace<2)) //分秒只能到59
{
time[setplace]=0;
}
if((time[setplace]>=0x24)&&(setplace==2)) //小时只能到23
{
time[setplace]=0;
}
if((time[setplace]>=0x32)&&(setplace==3)) //日只能到31
{
time[setplace]=0;
}
if((time[setplace]>=0x13)&&(setplace==4)) //月只能到12
{
time[setplace]=0;
}
if((time[setplace]>=0x7)&&(setplace==5)) //周只能到7
{
time[setplace]=1;
}
// if(setplace==5) //月只能到12
// {
// time[setplace]=;
// }
}

while((i<50)&&(k2==0))  //检测按键是否松开
{
delay10ms();
i++;
}
i=0;

}
}
switch(setplace)
{
case 1:lcdwritecom(0xc9);lcdwritecom(0x0f);break;
case 2:lcdwritecom(0xc6);lcdwritecom(0x0f);break;
case 3:lcdwritecom(0xc3);lcdwritecom(0x0f);break;
case 4:lcdwritecom(0x89);lcdwritecom(0x0f);break;
case 5:lcdwritecom(0x86);lcdwritecom(0x0f);break;
case 6:lcdwritecom(0x83);lcdwritecom(0x0f);break;
default:lcdwritecom(0x0c);break;
}
delay10ms();
lcdwritecom(0x0c);
lcdd**play();
}

}
/*******************************************************************************
* 函数名         : lcdd**play()
* 函数功能    : 显示函数
* 输入           : 无
* 输出           : 无
*******************************************************************************/

void lcdd**play()
{
lcdwritecom(0xc2);
delay10ms();
lcdwritedata('0'+time[2]/16); //时
lcdwritedata('0'+(time[2]&0x0f));  
lcdwritedata(':');
lcdwritedata('0'+time[1]/16); //分
lcdwritedata('0'+(time[1]&0x0f));
lcdwritedata(':');
lcdwritedata('0'+time[0]/16); //秒
lcdwritedata('0'+(time[0]&0x0f));

lcdwritecom(0x80);
lcdwritedata('2');
lcdwritedata('0');
lcdwritedata('0'+time[6]/16); //年
lcdwritedata('0'+(time[6]&0x0f));
lcdwritedata(0x00);
lcdwritedata('0'+time[4]/16); //月
lcdwritedata('0'+(time[4]&0x0f));
lcdwritedata(0x01);
lcdwritedata('0'+time[3]/16); //日
lcdwritedata('0'+(time[3]&0x0f));
lcdwritedata(0x02);
lcdwritedata(' ');
lcdwritedata(0x03);
lcdwritedata('0'+(time[5]&0x07)-1); //星期
}
/*******************************************************************************
* 函数名         : int0configuration()
* 函数功能    : 配置外部中断0
* 输入           : 无
* 输出           : 无
*******************************************************************************/

void int0configuration()
{
//设置int0
it0=1;//跳变沿出发方式(下降沿)
ex0=1;//打开int0的中断允许。
ea=1;//打开总中断
}
/*******************************************************************************
* 函数名         : int0() 
* 函数功能    : 外部中断0 中断函数
* 输入           : 无
* 输出           : 无
*******************************************************************************/

void int0() interrupt 0  
{
delay10ms();
if(k3==0)
{  
setstate=~setstate;
setplace=0;
ds1302init();
}
}
/*******************************************************************************
* 函数名         : delay10ms
* 函数功能    : 延时函数,延时10ms
* 输入           : 无
* 输出           : 无
*******************************************************************************/
void delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}
佚名
2024-05-03 15:48:14
最佳回答
类似问题(10)