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] = "一二三四五六天";
/*----------鍵盤相關聲明-------------------------------------*/
#define key (PINA & BIT(0)) //功能鍵
#define key1 (PINA & BIT(1)) //只有加1鍵
uchar sum,keyflag=0; //調用時,分,秒,標志,調用鍵盤處理標志.
/*延時函數*/
void delay_ms(unsigned char i) {
unsigned char a, b;
for (a = 1; a < i; a++) {
for (b = 1; b; b++) {
;
}
}
}
/*********時間寫屏刷新函數***********/
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);
}
/*---------------按鍵處理相關函數--------------------------*/
/************************************************************
函數名稱:void scanner()
功能描述: 按鍵函數
*************************************************************/
void scanner()
{ uchar i,j;
if(!key) //功能鍵按下
{ delay_ms(500); //延時500MS
if(!key) //還按下,退出時間調整
{ keyflag=0; //標志位為0
sum=0; //清0
LCD_WriteCmd(0x0C);//清閃爍
LCD_PutStr(3,0," ");
for(i=0;i<7;i++) //十進制轉十六進制
{ 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內放開
{ keyflag=1; //標志為1,進行時間調整
sum++; //功能鍵加1
switch (sum)
{
case 1:
LCD_PutStr(3,0,"請調整年份");
break;
case 2:
LCD_PutStr(3,0,"請調整月份");
break;
case 3:
LCD_PutStr(3,0,"請調整日期");
break;
case 4:
LCD_PutStr(3,0,"請調整時鐘");
break;
case 5:
LCD_PutStr(3,0,"請調整分鐘");
break;
case 6:
LCD_PutStr(3,0,"請調整秒鐘");
break;
case 7:
LCD_PutStr(3,0,"請調整星期");
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; /*電平設置*/
DDRB = 0xFF; /*方向輸出*/
PORTC = 0x7F;
DDRC = 0x80;
PORTD = 0xFF;
DDRD = 0x00;
DDRD &= ~BIT(7);
PORTD &= ~BIT(7);
DDRC |=BIT(6); //設置輸出
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)/*方向輸出*/
/*雙向數據*/
#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 //秒數據地址
#define ds1302_min_add 0x82 //分數據地址
#define ds1302_hr_add 0x84 //時數據地址
#define ds1302_date_add 0x86 //日數據地址
#define ds1302_month_add 0x88 //月數據地址
#define ds1302_day_add 0x8a //星期數據地址
#define ds1302_year_add 0x8c //年數據地址
#define ds1302_control_add 0x8e //控制數據地址
上一篇:avr單片機流水燈的程序
下一篇:LCD12864簡單菜單程序,八個按鍵帶proteus仿真和程序
推薦閱讀
史海拾趣
隨著技術實力的不斷增強,Chipcera開始將目光投向更廣闊的市場。公司通過參加國際電子展會、與知名廠商合作等方式,積極推廣自家產品。同時,公司還加大了對品牌建設的投入,通過提升產品質量、優化售后服務等措施,樹立了良好的品牌形象。這些努力使得Chipcera的產品逐漸打入國際市場,成為行業內的佼佼者。
隨著電子行業的競爭加劇,Comair Rotron意識到單打獨斗已難以滿足市場需求。因此,公司開始積極尋求與行業內其他企業的合作機會。通過與多家知名電子企業建立戰略合作關系,Comair Rotron不僅獲得了更多的業務機會,還通過與合作伙伴的技術交流和資源共享,不斷提升自身的技術水平和產品質量。
在市場競爭日益激烈的背景下,ADPOW公司深知品質是生存和發展的關鍵。因此,公司建立了嚴格的質量管理體系,從原材料采購到產品出廠的每一個環節都進行嚴格把控。同時,公司注重品牌建設,通過廣告宣傳、參加展會等方式提升品牌知名度和美譽度。這些舉措有效提升了公司的市場競爭力。
隨著技術的不斷成熟和市場的擴大,Excelitas公司開始尋求全球擴張。公司先后在北美、歐洲和亞洲設立了研發中心和生產基地,以更好地服務全球客戶。在全球擴張的過程中,Excelitas注重本土化戰略,積極與當地企業合作,共同開拓市場。這一策略不僅幫助公司快速融入當地市場,還促進了公司業務的持續增長。
Excelitas公司自成立以來,一直致力于光電技術的研發與創新。在某次關鍵的技術突破中,公司成功研發出一種新型高效能LED燈,這種燈在紫外光固化領域具有顯著優勢。這一技術突破不僅為公司贏得了市場份額,還確立了Excelitas在光電領域的領先地位。公司隨后圍繞這一技術,推出了一系列相關產品,進一步鞏固了市場地位。
本帖最后由 dontium 于 2015-1-23 13:26 編輯 誰知道EWB中默認的ADC是哪個型號的芯片啊?能告訴我嗎?謝謝,我做設計用那個仿真結果很好,可是不知道那具體是哪個芯片啊 … 查看全部問答∨ |
PXA270+WinCE6.0 通過總線擴展串口 芯片 ST16c554 擴出了4個串口 對串口了解不夠,請問一下,寫擴展串口的驅動需要注意哪些? 對比芯片資料發現里面寄存器的配置與16550差別不大,是不是可以繼承16550的pdd層? mdd層需要修改嗎,還 ...… 查看全部問答∨ |
請教各位大蝦,wince如何掛載FAT32文件系統? 我用ARM平臺,有一片512M的NANDFLASH,前30M用做OS,格式化成BINFS,后面的部分格式化成FAT32,可是掛載不上。大家知道怎么掛載嗎?請指教一下。 謝謝 :) … 查看全部問答∨ |
|
http://energia.nu/ 使用很簡單,從上面網站下載相應版本的軟件,解壓出來后,記得修改一下目錄名,把后面一長串的數字字母去掉。 運行安裝目錄“energia.exe”, 打開軟件后,把LAUCHPAD連接到USB接口,裝好相應驅動,從\"Tools->Board\"菜單 ...… 查看全部問答∨ |
TQ_AM335X開發板是廣州天嵌計算機科技有限公司專門針對有一定開發經驗或企業用戶提供的一整套的學習和解決方案。TQ_AM335X提供了一個性能穩定及成本低廉的Cortex-A8開發平臺,以便您快速熟悉TI AM335X處理器特性和設計方法,并加快您的產品開發進度 ...… 查看全部問答∨ |
這一節學習守護進程的創建 參考文獻 blog.sina.com.cn/s/blog_643d3d780100lbsg.html blog.csdn.net/mybelief321/article/details/9069659 守護進程是脫離于終端并且在后臺運行的進程。守護進程脫離于終端是為了避免進程在執行過程中的信息 ...… 查看全部問答∨ |
本帖最后由 freebsder 于 2014-8-15 21:59 編輯 1, CONFIG寄存器中的UNIFY位設置timer作為1個32位還是2個16位計時器。在訪問其他寄存器之前設置這個位。 UNIFY = 1: Only one register is ...… 查看全部問答∨ |
我做的是一個鋰電池供電的系統,需要進入sleep的powerdown模式進行節電。 The only interrupts that can wake up the MCU are the Two Wire Interface address match interrupts, and asynchronous port interrupts, e.g pin change. 手冊上 ...… 查看全部問答∨ |
求交流電壓信號轉換為交流電流信號的具體電路? 謝謝大家 就是把一個1kHz交流電壓信號轉換為1kHz 50mA的交流電流信號 如果用運放如何設計呢? … 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 將低功耗設計進行到底——評論、轉發贏大禮!
- 芯幣競拍:感恩教師節專場
- Keysight示波器主題月有獎系列活動之 注冊大獎天天抽 搶樓踩中亦有獎
- Microchip有獎直播:VectorBlox™ SDK 報名中
- 有獎直播|ADI 慣性MEMS應用那些事
- 借助 Microchip 生態系統中的 PIC® 和 AVR® 單片機開啟嵌入式到云端之旅 系列在線研討會
- 帶你零起點入門STM32(專為嵌入式應用而開發的內核)
- 福祿克首款熱成像萬用表Fluke-279FC 即將上市!填寫問卷贏好禮嘍!
- EEWorld Datasheet 伴你同行!快來領取200芯積分福利啦~
- 泰克福袋:示伴功倍,萬能福袋派送中