萬年歷簡單設計,基于lcd液晶顯示屏和ds18b20,以及時鐘電路和八位鍵盤,實現它的鬧鐘,年月日和溫度功能
單片機源程序如下:
- /*******************************************************
- /*******************************************************
- 程序功能:DS1302時鐘走時
- 開發環境:Keil3
- 硬件環境:CEPARK多功能開發學習板/實驗箱(2013版),STC12C5A60S2,11.0592M晶振
-
- 接線說明:單片機P10~P14口與底板JP51相連,分別為:P10-DIN,P11-SCK,P12-DC,P13-RES,P14-CS.
- 單片機P20~P22口與底板JP45相連 ,分別為:P20-SCLK,P21-IO,P22-RST
- 將OLED屏插到相應接口
- 跳線說明:無
- 實驗現象:OLED第一行顯示:“ -DS1302 TEST- ”
- 第二行顯示:年-月-日
- 第三行顯示:時:分:秒
- 第四行顯示:電子園
- *******************************************************/
- #include "STC12C5A60S2.h"
- //秒、分、時、日、月、星期、年的讀地址
- #define ADDR_SEC_R 0x81
- #define ADDR_MIN_R 0x83
- #define ADDR_HOUR_R 0x85
- #define ADDR_DAY_R 0x87
- #define ADDR_MONTH_R 0x89
- #define ADDR_WEEK_R 0x8B
- #define ADDR_YEAR_R 0x8D
- //秒、分、時、日、月、星期、年的寫地址
- #define ADDR_SEC_W 0x80
- #define ADDR_MIN_W 0x82
- #define ADDR_HOUR_W 0x84
- #define ADDR_DAY_W 0x86
- #define ADDR_MONTH_W 0x88
- #define ADDR_WEEK_W 0x8A
- #define ADDR_YEAR_W 0x8C
- #define uchar unsigned char
- #define uint unsigned int
- sbit DS1302_CLK = P2^0;
- sbit DS1302_IO = P2^1;
- sbit DS1302_RST = P2^2;
- sbit ACC0=ACC^0;
- sbit ACC7=ACC^7;
- sbit SEG_DS = P2^3; //74HC595芯片的數據引腳
- sbit SEG_SHCP = P2^4; //74HC595芯片的控制引腳,上升沿移入數據
- sbit SEG_STCP = P2^5; //74HC595芯片的控制引腳,上升沿更新數據
- //各時間的個位和十位
- char years,yearg,months,monthg,days,dayg,week,hours,hourg,minutes,minuteg,seconds,secondg;
- uchar a[8];// 存放要在數碼管顯示的時間
- uchar resettime[7];//存放要重設的時間
- uchar b[2]={0,0};
- uchar d=1;
- uchar i,key,num,change_key1,change_key2,c;
- char pos=8;//閃爍位標志
- void DisplayOneCharOnAddr(unsigned char Data,unsigned char Addr);//單位顯示函數,那個數碼管Addr顯示那個數Data
- void displayHour();//顯示時分秒
- void displayYear();//顯示年月日
- void displayHour1();//修改時顯示的時分秒(靜止)
- void displayYear1();//修改時顯示的年月日(靜止)
- void SEG_Send595OneByte(unsigned char ucData); //向74HC595寫入一個8位的數據
- void delayms(uint xms);//延時函數
- void matrixkeyscanz();//行列反轉掃描矩陣鍵盤及相關按鍵功能的實現
- void reset();//重設時間函數
- unsigned char code Seg_Data[]={ //共陽數碼管的編碼,并將數據定義在CODE區
- 0xc0,/*0*/
- 0xF9,/*1*/
- 0xA4,/*2*/
- 0xB0,/*3*/
- 0x99,/*4*/
- 0x92,/*5*/
- 0x82,/*6*/
- 0xF8,/*7*/
- 0x80,/*8*/
- 0x90,/*9*/
- 0x88,/*A*/
- 0x83,/*b*/
- 0xC6,/*C*/
- 0xA1,/*d*/
- 0x86,/*E*/
- 0x8E,/*F*/
- 0xff, //數碼管滅
- 0x7f //小數點亮
- };
- unsigned char code Seg_Addr[]={ //數碼管位選編碼,控制顯示8位中的第幾位
- 0x01,
- 0x02,
- 0x04,
- 0x08,
- 0x10,
- 0x20,
- 0x40,
- 0x80,
- 0xFF,//ALL ON
- 0x00 //OFF
- };
- unsigned char code ucInitTime[7]={0x55,0x53,0x11,0x31,0x10,0x01,0x16}; //初始化后設置為:16年10月31日星期1 11點53分55秒
- void DS1302_WriteOneByte(unsigned char d); //向DS1302中寫入一個數據
- unsigned char DS1302_ReadOneByte(void); //從DS1302讀出一個數據
- void DS1302_WriteOneByteAtAddr(unsigned char ucAddr, unsigned char ucDa); //在指定地址寫入一個數據
- unsigned char DS1302_ReadOneByteAtAddr(unsigned char ucAddr); //從指定一個位置讀取一個數據
- void DS1302_SetInit(unsigned char *pClk); //初始化時間
- /******************************************************************************
- 函數名稱:main
- 函數功能:程序主函數
- 入口參數:無
- 返回值:無
- 備注:無
- *******************************************************************************/
- void main(void)
- {
- DS1302_WriteOneByteAtAddr(0x8e,0x00); /* 控制命令,WP=0,寫操作*/
- DS1302_SetInit(ucInitTime);
- P1=0xff;
- TMOD=0x01;
- TH0=(65536-45872)/256;
- TL0=(65536-45872)%256;
- EA=1;
- ET0=1;
- while(1) //程序循環
- {
- matrixkeyscanz();
- switch(change_key2)
- {
- case 0://修改鍵沒有被按下
- switch(change_key1)
- { //change_key1=0表示顯示時分秒,change_key1=1表示顯示年月日
- case 0:displayHour();break;
- case 1:displayYear();break;
- }
- break;
-
- case 1://修改鍵被按下
- switch(change_key1)
- {
- case 0:displayHour1();break;
- case 1:displayYear1();break;
- }
- break;
- }
- }
- }
- //顯示時分秒的函數,從左到右依次為星期、時、分、秒
- void displayHour()
- {
- hours=DS1302_ReadOneByteAtAddr(ADDR_HOUR_R)/16;
- hourg=DS1302_ReadOneByteAtAddr(ADDR_HOUR_R)%16;
- minutes=DS1302_ReadOneByteAtAddr(ADDR_MIN_R)/16;
- minuteg=DS1302_ReadOneByteAtAddr(ADDR_MIN_R)%16;
- seconds=DS1302_ReadOneByteAtAddr(ADDR_SEC_R)/16;
- secondg=DS1302_ReadOneByteAtAddr(ADDR_SEC_R)%16;
- week=DS1302_ReadOneByteAtAddr(ADDR_WEEK_R)%16;
- a[0]=week;
- a[1]=16;//空一格不顯示
- a[2]=hours;
- a[3]=hourg;
- a[4]=minutes;
- a[5]=minuteg;
- a[6]=seconds;
- a[7]=secondg;
- for(i=0;i<8;i++)
- {
- if(i==3||i==5)
- DisplayOneCharOnAddr(17,i);//顯示小數點
- DisplayOneCharOnAddr(a[i],i);
- }
- }
- //顯示按下修改鍵時的時分秒
- void displayHour1()
- {
- a[0]=week;
- a[1]=16;
- a[2]=hours;
- a[3]=hourg;
- a[4]=minutes;
- a[5]=minuteg;
- a[6]=seconds;
- a[7]=secondg;
- for(i=0;i<pos;i++)
- {
- if(i==3||i==5)
- DisplayOneCharOnAddr(17,i);
- DisplayOneCharOnAddr(a[i],i);
- //num的值由定時器1控制,不斷閃爍要修改的兩位數字
- if(num>0)
- {
- if(num<=10)
- {
- DisplayOneCharOnAddr(a[pos],pos);
- DisplayOneCharOnAddr(a[pos+1],pos+1);
- }
- else
- {
- DisplayOneCharOnAddr(16,pos);
- DisplayOneCharOnAddr(16,pos+1);
- }
- }
- }
-
- for(i=pos+2;i<8;i++)
- {
- if(i==3||i==5)
- DisplayOneCharOnAddr(17,i);
- DisplayOneCharOnAddr(a[i],i);
- if(num>0)
- {
- if(num<=10)
- {
- DisplayOneCharOnAddr(a[pos],pos);
- DisplayOneCharOnAddr(a[pos+1],pos+1);
- }
- else
- {
- DisplayOneCharOnAddr(16,pos);
- DisplayOneCharOnAddr(16,pos+1);
- }
- }
- }
- }
- //顯示年月日的函數,從左到右依次為年、月、日
- void displayYear()
- {
- years=DS1302_ReadOneByteAtAddr(ADDR_YEAR_R)/16;
- yearg=DS1302_ReadOneByteAtAddr(ADDR_YEAR_R)%16;
- months=DS1302_ReadOneByteAtAddr(ADDR_MONTH_R)/16;
- monthg=DS1302_ReadOneByteAtAddr(ADDR_MONTH_R)%16;
- days=DS1302_ReadOneByteAtAddr(ADDR_DAY_R)/16;
- dayg=DS1302_ReadOneByteAtAddr(ADDR_DAY_R)%16;
- a[0]=2;
- a[1]=0;
- a[2]=years;
- a[3]=yearg;
- a[4]=months;
- a[5]=monthg;
- a[6]=days;
- a[7]=dayg;
- for(i=0;i<8;i++)
- {
- if(i==3||i==5)
- DisplayOneCharOnAddr(17,i);
- DisplayOneCharOnAddr(a[i],i);
- }
- }
- //顯示按下修改鍵時的年月日
- void displayYear1()
- {
- a[0]=2;
- a[1]=0;
- a[2]=years;
- a[3]=yearg;
- a[4]=months;
- a[5]=monthg;
- a[6]=days;
- a[7]=dayg;
- for(i=0;i<pos;i++)
- {
- if(i==3||i==5)
- DisplayOneCharOnAddr(17,i);
- DisplayOneCharOnAddr(a[i],i);
- if(num>0)
- {
- if(num<=10)
- {
- DisplayOneCharOnAddr(a[pos],pos);
- DisplayOneCharOnAddr(a[pos+1],pos+1);
- }
- else
- {
- DisplayOneCharOnAddr(16,pos);
- DisplayOneCharOnAddr(16,pos+1);
- }
- }
- }
-
- for(i=pos;i<8;i++)
- {
- if(i==3||i==5)
- DisplayOneCharOnAddr(17,i);
- DisplayOneCharOnAddr(a[i],i);
- if(num>0)
- {
- if(num<=10)
- {
- DisplayOneCharOnAddr(a[pos],pos);
- DisplayOneCharOnAddr(a[pos+1],pos+1);
- }
- else
- {
- DisplayOneCharOnAddr(16,pos);
- DisplayOneCharOnAddr(16,pos+1);
- }
- }
- }
- }
- /*******************************************************
- 行列反轉,判斷是哪個按鍵按下,并在相應的鍵中實現相關的功能
- *******************************************************/
- void matrixkeyscanz()
- {
- uchar temp,col,row;
- P0=0xff;
- P0=0xf0;
- temp=P0;
- if(temp!=0xf0)
- {
- delayms(50);
- temp=P0;
- if(temp!=0xf0)
- {
- switch(temp)
- { //判斷列
- case 0xe0:col=0;break;
- case 0xd0:col=1;break;
- case 0xb0:col=2;break;
- case 0x70:col=3;break;
- }
- P0=0xff;
- P0=0x0f;
- temp=P0;
- if(temp!=0x0f)
- {
- switch(temp)
- { //判斷行
- case 0x0e:row=0;break;
- case 0x0d:row=1;break;
- case 0x0b:row=2;break;
- case 0x07:row=3;break;
- }
- }
-
- key=(row<<2)+col+1; //按鍵key的值為1到16
- d=1;
- switch(key)
- {
- case 1://按鍵1:切換時分秒和年月日
- {
- change_key1=change_key1+1; //切換按鈕
- if(change_key1==2)
- change_key1=0;
- if(change_key2==1);
- change_key2=0;
- pos=8;
- }
- break;
-
- case 2://按鍵2:修改或修改確認按鍵
- {
- change_key2++;//修改/確認變量
- if(change_key2==2)
- change_key2=0;
- c=0;
- switch(change_key2)
- {
- case 0://確認
- {
- pos=8;
- TR0=0;
- reset();
- }
- break;
- case 1://修改
- {
- //讀當前的時間
- years=DS1302_ReadOneByteAtAddr(ADDR_YEAR_R)/16;
- yearg=DS1302_ReadOneByteAtAddr(ADDR_YEAR_R)%16;
- months=DS1302_ReadOneByteAtAddr(ADDR_MONTH_R)/16;
- monthg=DS1302_ReadOneByteAtAddr(ADDR_MONTH_R)%16;
- days=DS1302_ReadOneByteAtAddr(ADDR_DAY_R)/16;
- dayg=DS1302_ReadOneByteAtAddr(ADDR_DAY_R)%16;
- hours=DS1302_ReadOneByteAtAddr(ADDR_HOUR_R)/16;
- hourg=DS1302_ReadOneByteAtAddr(ADDR_HOUR_R)%16;
- minutes=DS1302_ReadOneByteAtAddr(ADDR_MIN_R)/16;
- minuteg=DS1302_ReadOneByteAtAddr(ADDR_MIN_R)%16;
- seconds=DS1302_ReadOneByteAtAddr(ADDR_SEC_R)/16;
- secondg=DS1302_ReadOneByteAtAddr(ADDR_SEC_R)%16;
- week=DS1302_ReadOneByteAtAddr(ADDR_WEEK_R)%16;
- pos=6;//閃爍位標志為6、7位
- TR0=1;//啟動定時器1
- }
- break;
- }
- }
- break;
-
- case 3://按鍵3:左移按鍵(改變閃爍位的值)
- {
- c=0;
- pos=pos-2;
- if((pos<2)&&(change_key1==1)) //若當前顯示年月日
- pos=6;
- else if((pos<0)&&(change_key1==0)) //若當前顯示時分秒
- pos=6;
- }
- break;
-
- case 4://按鍵4:右移按鍵(改變閃爍位的值)
- {
- c=0;
- pos=pos+2;
- if((pos>6)&&(change_key1==1))
- pos=2;
- else if((pos>6)&&(change_key1==0))
- pos=0;
- }
- break;
-
- case 5://按鍵5:加
- {
- //若按下了修改鍵且當前顯示時分秒
- if((change_key1==0)&&(change_key2==1)&&(d==1))
- {
- d=2;
- //根據當前閃爍的位置改變對應的時間
- switch(pos)
- {
- case 6://秒位置
- {
- secondg++;
- if(secondg==10)
- {
- secondg=0;
- seconds++;
- if(seconds==6)
- seconds=0;
- }
- }
- break;
- case 4://分位置
- {
- minuteg++;
- if(minuteg==10)
- {
- minuteg=0;
- minutes++;
- if(minutes==6)
- minutes=0;
- }
- }
- break;
- case 2://時位置
- {
- hourg++;
- if(hourg==10)
- {
- hourg=0;
- hours++;
- if(hours==3)
- hours=0;
- }
- }
- break;
- case 0://星期位置
- {
- week++;
- if(week==8)
- week=0;
- }
- break;
- }
- }
- //若按下了修改鍵且當前顯示年月日
- if((change_key1==1)&&(change_key2==1)&&(d==1))
- {
- d=2;
- switch(pos)
- {
- case 6://日位置
- {
- dayg++;
- if(dayg==10)
- {
- dayg=0;
- days++;
- if(days==4)
- days=0;
- }
- }
- break;
- case 4://月位置
- {
- monthg++;
- if(monthg==10)
- {
- monthg=0;
- months++;
- if(months==2)
- months=0;
- }
- }
- break;
- case 2:
- {
- yearg++;
- if(yearg==10)
- {
- yearg=0;
- years++;
- if(years==10)
- years=0;
- }
- }
- break;
- }
- }
- }
- break;
-
- case 6://按鍵6:減
- {
- //若按下了修改鍵且當前顯示時分秒
- if((change_key1==0)&&(change_key2==1)&&(d==1))
- {
- d=2;
- switch(pos)
- {
- case 6://秒位置
- {
- secondg--;
- if(secondg==-1)
- {
- secondg=9;
- seconds--;
- if(seconds==-1)
- seconds=5;
- }
- }
- break;
- case 4://分位置
- {
- minuteg--;
- if(minuteg==-1)
- {
- minuteg=9;
- minutes--;
- if(minutes==-1)
- minutes=5;
- }
- }
- break;
- case 2://時位置
- {
- hourg--;
- if(hourg==-1)
- {
- hourg=9;
- hours--;
- if(hours==-1)
- hours=2;
- }
- }
- break;
- case 0:
- {
- week--;
- if(week==-1)
- week=7;
- }
- break;
- }
- }
- //若按下了修改鍵且當前顯示年月日
- if((change_key1==1)&&(change_key2==1)&&(d==1))
- {
- d=2;
- switch(pos)
- {
- case 6://日的位置
- {
- dayg--;
- if(dayg==-1)
- {
- dayg=9;
- days--;
- if(days==-1)
- days=3;
- }
- }
- break;
- case 4://月的位置
- {
- monthg--;
- if(monthg==-1)
- {
- monthg=9;
- months--;
- if(months==-1)
- months=1;
- }
- }
- break;
- case 2://年的位置
- {
- yearg--;
- if(yearg==-1)
- {
- yearg=9;
- years--;
- if(years==-1)
- years=9;
- }
- }
- break;
- }
- }
- }
- break;
-
- case 7://按鍵7:數字鍵0
- {
- c++;//輸入的數是個位還是十位,c%2==1為個位,c%2==0為十位
- if(c%2==1)
- b[0]=0;
- else if(c%2==0)
- {
- b[1]=b[0];
- b[0]=0;
- }
- }
- break;
-
- case 8://按鍵8:數字鍵1
- {
- c++;
- if(c%2==1)
- b[0]=1;
- else if(c%2==0)
- {
- b[1]=b[0];
- b[0]=1;
- }
- }
- break;
-
- case 9://按鍵9:數字鍵2
- {
- c++;
- if(c%2==1)
- b[0]=2;
- else if(c%2==0)
- {
- b[1]=b[0];
- b[0]=2;
- }
- }
- break;
-
- case 10://按鍵10:數字鍵3
- {
- c++;
- if(c%2==1)
- b[0]=3;
- else if(c%2==0)
- {
- b[1]=b[0];
- b[0]=3;
- }
- }
- break;
-
- case 11://按鍵11:數字鍵4
- {
- c++;
- if(c%2==1)
- b[0]=4;
- else if(c%2==0)
- {
- b[1]=b[0];
- b[0]=4;
- }
- }
- break;
-
- case 12://按鍵12:數字鍵5
- {
- c++;
- if(c%2==1)
- b[0]=5;
- else if(c%2==0)
- {
- b[1]=b[0];
- b[0]=5;
- }
- }
- break;
-
- case 13://按鍵13:數字鍵6
- {
- c++;
- if(c%2==1)
- b[0]=6;
- else if(c%2==0)
- {
- b[1]=b[0];
- b[0]=6;
- }
- }
- break;
-
- case 14://按鍵14:數字鍵7
- {
- c++;
- if(c%2==1)
- b[0]=7;
- else if(c%2==0)
- {
- b[1]=b[0];
- b[0]=7;
- }
- }
- break;
-
- case 15://按鍵15:數字鍵8
- {
- c++;
- if(c%2==1)
- b[0]=8;
- else if(c%2==0)
- {
- b[1]=b[0];
- b[0]=8;
- }
- }
- break;
-
- case 16://按鍵16:數字鍵9
- {
- c++;
- if(c%2==1)
- b[0]=9;
- else if(c%2==0)
- {
- b[1]=b[0];
- b[0]=9;
- }
- }
- break;
- }
-
- //將數組b中的值賦給各時間數
- if((change_key1==0)&&(change_key2==1)&&(key>6))
- {
- switch(pos)
- {
- case 6:
- {
- secondg=b[0];
- seconds=b[1];
- }
- break;
- case 4:
- {
- minuteg=b[0];
- minutes=b[1];
- }
- break;
- case 2:
- {
- hourg=b[0];
- hours=b[1];
- }
- break;
- case 0:
- {
- if(c%2==1)
- week=b[0];
- else if(c%2==1)
- week=b[1];
- }
- break;
- }
- }
-
- if((change_key1==1)&&(change_key2==1)&&(key>6))
- {
- switch(pos)
- {
- case 6:
- {
- dayg=b[0];
- days=b[1];
- }
- break;
- case 4:
- {
- monthg=b[0];
- months=b[1];
- }
- break;
- case 2:
- {
- yearg=b[0];
- years=b[1];
- }
- break;
- }
- }
- P0=0x0f;
- temp=P0;
- temp=temp&0x0f;
- while(temp!=0x0f)
- {
- temp=P0;
- temp=temp&0x0f;
- }
- }
- }
- }
- //重設時間函數,將修改后的時間再次設置
- void reset()
- {
- uchar year,month,day,week1,hour,minute,second;
- //將時間數轉換為16進制
- year=years*16+yearg;
- month=months*16+monthg;
- day=days*16+dayg;
- week1=week;
- hour=hours*16+hourg;
- minute=minutes*16+minuteg;
- second=seconds*16+secondg;
- resettime[0]=second;
- resettime[1]=minute;
- resettime[2]=hour;
- resettime[3]=day;
- resettime[4]=month;
- resettime[5]=week1;
- resettime[6]=year;
- DS1302_SetInit(resettime);
- }
- //延時函數
- void delayms(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void T0_time() interrupt 1
- {
- TH0=(65536-45872)/256;
- TL0=(65536-45872)%256;
- num++;
- if(num==20)
- num=0;
- }
-
- /******************************************************************************
- 函數名稱:DS1302_WriteOneByte
- 函數功能:向DS1302寫入一個字符
- 入口參數:ucData-數據
- 返回值:無
- 備注:無
- *******************************************************************************/
- void DS1302_WriteOneByte(unsigned char ucData)
- {
- unsigned char i;
- ACC = ucData;
- DS1302_RST = 1;
- for(i=8; i>0; i--)
- {
- DS1302_IO = ACC0;
- DS1302_CLK = 0;
- DS1302_CLK = 1; //先寫入最低位,上升沿寫入
- ACC = ACC >> 1;
- }
- }
- /******************************************************************************
- 函數名稱:DS1302_ReadOneByte
- 函數功能:從DS1302讀取一個數據
- 入口參數:無
- 返回值:讀取的數據
- 備注:無
- *******************************************************************************/
- unsigned char DS1302_ReadOneByte(void)
- {
- unsigned char i;
- DS1302_RST = 1;
- for(i=8; i>0; i--)
- {
- ACC = ACC >>1; //相當于匯編中的 RRC
- DS1302_IO = 1;
- DS1302_CLK = 1;
- DS1302_CLK = 0; //下降沿讀取,先讀最低位
- ACC7 = DS1302_IO;
- }
- return(ACC);
- }
- /******************************************************************************
- 函數名稱:DS1302_WriteOneByteAtAddr
- 函數功能:在DS1302的指定位置寫入一個數據
- 入口參數:ucAddr-地址 ; ucData-數據
- 返回值:無
- 備注:無
- *******************************************************************************/
- void DS1302_WriteOneByteAtAddr(unsigned char ucAddr, unsigned char ucData)
- {
- DS1302_RST = 0;
- DS1302_CLK = 0;
- DS1302_RST = 1;
- DS1302_WriteOneByte(ucAddr);
- DS1302_WriteOneByte(ucData);
- DS1302_CLK = 1;
- DS1302_RST = 0;
- DS1302_IO = 0;
- }
- /******************************************************************************
- 函數名稱:DS1302_ReadOneByteAtAddr
- 函數功能:在指定的位置讀取一個數據
- 入口參數:ucAddr-地址
- 返回值:讀取的數據
- 備注:無
- *******************************************************************************/
- unsigned char DS1302_ReadOneByteAtAddr(unsigned char ucAddr)
- {
- unsigned char ucBackValue;
- DS1302_RST = 0;
- DS1302_CLK = 0;
- DS1302_RST = 1;
- DS1302_WriteOneByte(ucAddr);
- ucBackValue = DS1302_ReadOneByte();
- DS1302_CLK = 1;
- DS1302_RST = 0;
- return(ucBackValue);
- }
- /******************************************************************************
- 函數名稱:DS1302_SetInit
- 函數功能:設置初始化
- 入口參數:pClk-初始化數組的指針
- 返回值:無
- 備注:無
- *******************************************************************************/
- void DS1302_SetInit(unsigned char *pClk)
- {
- unsigned char i;
- unsigned char ucAddr = 0x80;
- DS1302_WriteOneByteAtAddr(0x8e,0x00); /* 控制命令,WP=0,寫操作*/
- for(i =7; i>0; i--)
- {
- DS1302_WriteOneByteAtAddr(ucAddr,*pClk); /* 秒 分 時 日 月 星期 年 */
- pClk++;
- ucAddr +=2;
- }
- DS1302_WriteOneByteAtAddr(0x8e,0x80); /* 控制命令,WP=1,寫保護*/
- }
- //向HC595發送一個字節
- void SEG_Send595OneByte(unsigned char ucData)
- {
- unsigned char i;
-
- for(i = 0;i < 8;i++) //8位數據依次寫入,先寫最低位
- {
- SEG_DS = (ucData & 0x80); //先讀入高位 x&0x80;
- SEG_SHCP = 0;
- SEG_SHCP = 1;
- SEG_SHCP = 0; //SHCP引腳的上升沿移入數據
- ucData <<=1; //數據左移
- }
- }
- /*******************************************************
- 函數功能:在指定位置顯示一個數據
- 參數說明:Data是要顯示的數據,Addr是在第幾位顯示。
- Addr取值范圍是0~9。
- Addr=0~7時,選擇的是顯示在第幾位數碼管上;
- Addr=8 時,同時選中8位數碼管,即打開所有數碼管
- Addr=9 時,關閉8位數碼管
- 8位數碼管,左數依次為第0位,第1位...第7位。
- *******************************************************/
- void DisplayOneCharOnAddr(unsigned char Data,unsigned char Addr)
- {
- SEG_Send595OneByte(Seg_Addr[Addr]); //顯示在哪一個數碼管上
- SEG_Send595OneByte( Seg_Data[Data]); //顯示的數據
- SEG_STCP = 0;
- SEG_STCP = 1; //STCP引腳的上升沿更新數據
- SEG_STCP = 0;
-
- }
-
復制代碼
所有資料51hei提供下載:
萬年歷.rar
(71.02 KB, 下載次數: 9)
2018-6-30 12:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|