main.c如下:
#include "iom16v.h"
#include "ds1302.h"
#include "macros.h"
#include "lcd12864.h"
#define xtal 1
uchar disp_time[33]="2008年11月27日 21:49:00 星期日";
uchar week[14] = "一二三四五六天";
/*----------鍵盤相關(guān)聲明-------------------------------------*/
#define key (PINA & BIT(0)) //功能鍵
#define key1 (PINA & BIT(1)) //只有加1鍵
uchar sum,keyflag=0; //調(diào)用時,分,秒,標志,調(diào)用鍵盤處理標志.
/*延時函數(shù)*/
void delay_ms(unsigned char i) {
unsigned char a, b;
for (a = 1; a < i; a++) {
for (b = 1; b; b++) {
;
}
}
}
/*********時間寫屏刷新函數(shù)***********/
void disp_reset(void)
{
// disp_time[0] = time_buf[0]/10+48; //年
// disp_time[1] = time_buf[0]%10+48;
disp_time[2] = time_buf[1] /10+48;//年
disp_time[3] = time_buf[1] %10+48;
disp_time[6] = time_buf[2] /10+48;//月
disp_time[7] = time_buf[2] %10+48;
disp_time[10] = time_buf[3] /10+48;//日
disp_time[11] = time_buf[3] %10+48;
disp_time[16] = time_buf[4] /10+48;//時
disp_time[17] = time_buf[4] %10+48;
disp_time[19] = time_buf[5]/10+48;//分
disp_time[20] = time_buf[5]%10+48;
disp_time[22] = time_buf[6]/10+48;//秒
disp_time[23] = time_buf[6]%10+48;
disp_time[30] = time_buf[7]/10+48;//周
disp_time[31] = time_buf[7]%10+48;
switch (time_buf[7]%16)
{
case 0:
//LCD_PutStr(2,4,"日");
disp_time[30] =week[0];
disp_time[31] =week[1];
break;
case 1:
//LCD_PutStr(2,4,"一");
disp_time[30] =week[2];
disp_time[31] =week[3];
break;
case 2:
//LCD_PutStr(2,4,"二");
disp_time[30] =week[4];
disp_time[31] =week[5];
break;
case 3:
disp_time[30] =week[6];
disp_time[31] =week[7];
break;
case 4:
disp_time[30] =week[8];
disp_time[31] =week[9];
break;
case 5:
disp_time[30] =week[10];
disp_time[31] =week[11];
break;
case 6:
disp_time[30] =week[12];
disp_time[31] =week[13];
break;
default:
break;
}
LCD_PutStr(0,0,"當前日期是:");
LCD_PutStr(1,0,disp_time);
}
/*---------------按鍵處理相關(guān)函數(shù)--------------------------*/
/************************************************************
函數(shù)名稱:void scanner()
功能描述: 按鍵函數(shù)
*************************************************************/
void scanner()
{ uchar i,j;
if(!key) //功能鍵按下
{ delay_ms(500); //延時500MS
if(!key) //還按下,退出時間調(diào)整
{ keyflag=0; //標志位為0
sum=0; //清0
LCD_WriteCmd(0x0C);//清閃爍
LCD_PutStr(3,0," ");
for(i=0;i<7;i++) //十進制轉(zhuǎn)十六進制
{ j=time_buf[ i]/10;
time_buf=time_buf%10;
time_buf=time_buf+16*j;
}
ds1302_init();//DS1302初始化
delay_ms(10);
ds1302_write_time();//寫入1302
while(!key); //等待釋放
delay_ms(10); //延時消抖
}
else //500MS內(nèi)放開
{ keyflag=1; //標志為1,進行時間調(diào)整
sum++; //功能鍵加1
switch (sum)
{
case 1:
LCD_PutStr(3,0,"請調(diào)整年份");
break;
case 2:
LCD_PutStr(3,0,"請調(diào)整月份");
break;
case 3:
LCD_PutStr(3,0,"請調(diào)整日期");
break;
case 4:
LCD_PutStr(3,0,"請調(diào)整時鐘");
break;
case 5:
LCD_PutStr(3,0,"請調(diào)整分鐘");
break;
case 6:
LCD_PutStr(3,0,"請調(diào)整秒鐘");
break;
case 7:
LCD_PutStr(3,0,"請調(diào)整星期");
break;
default:
break;
}
if(sum==8)
sum=0;
switch(sum)
{
case 1: // 年閃爍
LCD_WriteCmd(0x90+1);
LCD_WriteCmd(0x0f);
break;
case 2: //為2,月閃爍
// write_single(3,2,"-?");
LCD_WriteCmd(0x90+3);
break;
case 3: //日閃爍
LCD_WriteCmd(0x90+5);
break;
case 4: //時閃爍
LCD_WriteCmd(0x88+0);
break;
case 5: //分閃爍
//LCD_WriteCmd(0x88+4);
write_single(3,2,"0");
LCD_WriteCmd(0x06); //寫入時,游標右移動
break;
case 6: //秒閃爍
LCD_WriteCmd(0x88+3);
break;
case 7: //星期閃爍
LCD_WriteCmd(0x88+7);
break;
}
}
}
if(sum) //功能鍵按下
{
if(!key1)
{ delay_ms(10);
if(!key1)
{ while(!key1);//等待加1鍵釋放
delay_ms(10);
if(sum==1) //年
{ time_buf[1]++;
if( time_buf[1] ==100)
time_buf[1]=0;
disp_reset();
}
if(sum==2) //月
{
time_buf[2]++;
if( time_buf[2] ==13)
time_buf[2]=1;
disp_reset();
}
if(sum==3)//日
{ time_buf[3]++;
if( time_buf[3] ==32)
time_buf[3]=1;
disp_reset();
}
if(sum==4)//時
{
time_buf[4]++;
if( time_buf[4] ==24)
time_buf[4]=0;
disp_reset();
}
if(sum==5)//分
{ time_buf[5]++;
if( time_buf[5] ==60)
time_buf[5]=0;
disp_reset();
}
if(sum==6)//秒
{time_buf[6]++;
if( time_buf[6] ==60)
time_buf[6]=0;
disp_reset();
}
if(sum==7)//星期
{ time_buf[7]++;
if( time_buf[7] ==7)
time_buf[7]=0;
disp_reset();
}
}
}
}
}
void main(void) {
unsigned char temp;
PORTA = 0xFF; /*打開上拉*/
DDRA = 0x00; /*方向輸入*/
PORTB = 0xF0; /*電平設(shè)置*/
DDRB = 0xFF; /*方向輸出*/
PORTC = 0x7F;
DDRC = 0x80;
PORTD = 0xFF;
DDRD = 0x00;
DDRD &= ~BIT(7);
PORTD &= ~BIT(7);
DDRC |=BIT(6); //設(shè)置輸出
PORTC &= ~BIT(6); //L:serial mode 串行
DDRC &= ~BIT(7);
PORTC &= ~BIT(7);
delay_ms(20);
LCD_Init();
ds1302_init();
delay_ms(10);
ds1302_write_time();
while (1) {
scanner();
if(!keyflag)
{
delay_ms(20);
ds1302_read_time();
disp_reset();
}
}
}
DS1302.H包括如下
#include "iom16v.h"
/*復位腳*/
#define RST_CLR PORTC &= ~(1 << PC4)/*電平置低*/
#define RST_SET PORTC |= (1 << PC4)/*電平置高*/
#define RST_IN DDRC &= ~(1 << PC4)/*方向輸入*/
#define RST_OUT DDRC |= (1 << PC4)/*方向輸出*/
/*雙向數(shù)據(jù)*/
#define IO_CLR PORTC &= ~(1 << PC3)/*電平置低*/
#define IO_SET PORTC |= (1 << PC3)/*電平置高*/
#define IO_R PINC & (1 << PC3)/*電平讀取*/
#define IO_IN DDRC &= ~(1 << PC3)/*方向輸入*/
#define IO_OUT DDRC |= (1 << PC3)/*方向輸出*/
/*時鐘信號*/
#define SCK_CLR PORTC &= ~(1 << PC2)/*時鐘信號*/
#define SCK_SET PORTC |= (1 << PC2)/*電平置高*/
#define SCK_IN DDRC &= ~(1 << PC2)/*方向輸入*/
#define SCK_OUT DDRC |= (1 << PC2)/*方向輸出*/
#define ds1302_sec_add 0x80 //秒數(shù)據(jù)地址
#define ds1302_min_add 0x82 //分數(shù)據(jù)地址
#define ds1302_hr_add 0x84 //時數(shù)據(jù)地址
#define ds1302_date_add 0x86 //日數(shù)據(jù)地址
#define ds1302_month_add 0x88 //月數(shù)據(jù)地址
#define ds1302_day_add 0x8a //星期數(shù)據(jù)地址
#define ds1302_year_add 0x8c //年數(shù)據(jù)地址
#define ds1302_control_add 0x8e //控制數(shù)據(jù)地址
上一篇:avr單片機流水燈的程序
下一篇:LCD12864簡單菜單程序,八個按鍵帶proteus仿真和程序
推薦閱讀最新更新時間:2025-06-27 14:32



設(shè)計資源 培訓 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導體STM32MP23x:突破成本限制的工業(yè)AI應用核心
- 意法半導體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- AD9233-80EBZ,用于評估 AD9233 12 位、80 MSPS、1.8V ADC 的評估板
- MCP1603L 500mA 同步降壓穩(wěn)壓器的典型 5V 至 1.0V @ 500mA 應用
- AM2M-0505SH30-NZ 5 Vout、2W 單路輸出 DC-DC 轉(zhuǎn)換器的典型應用
- 具有電源排序功能的 LTC3589IUJ-2 8 輸出降壓穩(wěn)壓器的典型應用電路
- NSI45020AT1G 大電流 LED 燈串的典型應用
- MIKROE-3474,用于 STM32 STM32F429ZI 的 MCU 卡
- AM1D-0515SH30-RZ 15V 1 瓦 DC-DC 轉(zhuǎn)換器的典型應用
- LT3091IDE 負輸出電流監(jiān)視器的典型應用
- 儀表用 ADC 驅(qū)動器
- EVAL-AD7490CB,使用 AD7490 的評估板,16 通道,1 MSPS,12 位模數(shù)轉(zhuǎn)換器,帶定序器