字號(hào):
timecount=0;
flag=~flag;
}
}
//id為1時(shí)的下一級(jí)選擇
void id_case1_key()
{
if (P0_5==0) //增加
{
Delay5Ms();
if(P0_5==0) Set(id,0);
if(id!=7) while(P0_5==0);
}
if (P0_4==0) //減少
{
Delay5Ms();
if(P0_4==0) Set(id,1);
if(id!=7) while(P0_4==0);
}
}
//根據(jù)選擇調(diào)整相應(yīng)項(xiàng)目并寫(xiě)入DS1302
void Set(uchar sel,uchar sel_1)
{
signed char address,item;
signed char max,mini;
if(sel==7) {address=0x80; max=0;mini=0;} //秒
if(sel==6) {address=0x82; max=59;mini=0;} //分鐘
if(sel==5) {address=0x84; max=23;mini=0;} //小時(shí)
if(sel==3) {address=0x86; max=31;mini=1;} //日
if(sel==2) {address=0x88; max=12;mini=1;} //月
if(sel==1) {address=0x8c; max=99;mini=0;} //年
if(sel==4) {address=0x8a; max=7; mini=1;} //星期
item=R1302(address+1)/16*10+R1302(address+1)%16;
if (sel_1==0) item++; else item--;
if(item>max) item=mini;
if(item<mini) item=max;
W1302(0x8e,0x00);//允許寫(xiě)操作
W1302(address,item/10*16+item%10);
W1302(0x8e,0x80);//寫(xiě)保護(hù),禁止寫(xiě)操作
}
//屏幕顯示第一行 時(shí)間和溫度
void Disp_line1(void)
{
Read_Temperature(10,0); //溫度顯示
//冒號(hào)閃爍
if(flag==0)
{DisplayOneChar(3,0,0x3a); DisplayOneChar(6,0,0x3a);}
else
{DisplayOneChar(3,0,0x20); DisplayOneChar(6,0,0x20);}
if(sec==1) //秒閃爍標(biāo)志位
{
if(flag==1)
{
DisplayOneChar(7,0,R1302(0x81)/16+0x30); //顯示秒
DisplayOneChar(8,0,R1302(0x81)%16+0x30);
}
else
{
DisplayOneChar(7,0,0x20); //顯示秒
DisplayOneChar(8,0,0x20);
}
}
else
{
DisplayOneChar(7,0,R1302(0x81)/16+0x30); //顯示秒
DisplayOneChar(8,0,R1302(0x81)%16+0x30);
}
if(min==1) //分鐘閃爍標(biāo)志位
{
if(flag==1)
{
DisplayOneChar(4,0,R1302(0x83)/16+0x30); //顯示分鐘
DisplayOneChar(5,0,R1302(0x83)%16+0x30);
}
else
{
DisplayOneChar(4,0,0x20); //顯示分鐘
DisplayOneChar(5,0,0x20);
}
}
else
{
DisplayOneChar(4,0,R1302(0x83)/16+0x30); //顯示分鐘
DisplayOneChar(5,0,R1302(0x83)%16+0x30);
}
if(hour==1) //小時(shí)閃爍標(biāo)志位
{
if(flag==1)
{
DisplayOneChar(1,0,R1302(0x85)/16+0x30);//顯示小時(shí)
DisplayOneChar(2,0,R1302(0x85)%16+0x30);
}
else
{
DisplayOneChar(1,0,0x20); //顯示小時(shí)
DisplayOneChar(2,0,0x20);
}
}
else
{
DisplayOneChar(1,0,R1302(0x85)/16+0x30);//顯示小時(shí)
DisplayOneChar(2,0,R1302(0x85)%16+0x30);
}
}
// 屏幕顯示第二行 日期和星期
void Disp_line2(void)
{
DisplayOneChar(3,1,0x2f); //顯示固定字符
DisplayOneChar(6,1,0x2f);
DisplayListChar(10,1,week);
if(year==1) //年閃爍標(biāo)志位
{
if(flag==1)
{
DisplayOneChar(1,1,R1302(0x8d)/16+0x30);//顯示年
DisplayOneChar(2,1,R1302(0x8d)%16+0x30);
}
else
{
DisplayOneChar(1,1,0x20); //顯示年
DisplayOneChar(2,1,0x20);
}
}
else
{
DisplayOneChar(1,1,R1302(0x8d)/16+0x30);//顯示年
DisplayOneChar(2,1,R1302(0x8d)%16+0x30);
}
if(mon==1) //月閃爍標(biāo)志位
{
if(flag==1)
{
DisplayOneChar(4,1,R1302(0x89)/16+0x30);//顯示月
DisplayOneChar(5,1,R1302(0x89)%16+0x30);
}
else
{
DisplayOneChar(4,1,0x20); //顯示月
DisplayOneChar(5,1,0x20);
}
}
else
{
DisplayOneChar(4,1,R1302(0x89)/16+0x30);//顯示月
DisplayOneChar(5,1,R1302(0x89)%16+0x30);
}
if(day==1) //日閃爍標(biāo)志位
{
if(flag==1)
{
DisplayOneChar(7,1,R1302(0x87)/16+0x30);//顯示日
DisplayOneChar(8,1,R1302(0x87)%16+0x30);
}
else
{
DisplayOneChar(7,1,0x20); //顯示日
DisplayOneChar(8,1,0x20);
}
}
else
{
DisplayOneChar(7,1,R1302(0x87)/16+0x30);//顯示日
DisplayOneChar(8,1,R1302(0x87)%16+0x30);
}
if(weekk==1) //星期閃爍標(biāo)志位
{
if(flag==1)
{
DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//顯示星期
}
else
{
DisplayOneChar(15,1,0x20); //顯示星期
}
}
else
{
DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//顯示星期
}
}
//********* LCM1602驅(qū)動(dòng)程序 ***************
//寫(xiě)數(shù)據(jù)
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //檢測(cè)忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在這后加小的延時(shí)
LCM_E = 0; //延時(shí)
LCM_E = 1;
}
//寫(xiě)指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時(shí)忽略忙檢測(cè)
{
if (BuysC) ReadStatusLCM(); //根據(jù)需要檢測(cè)忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
//讀狀態(tài)
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); //檢測(cè)忙信號(hào)
return(LCM_Data);
}
//LCM初始化
void LCMInit(void)
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次顯示模式設(shè)置,不檢測(cè)忙信號(hào)
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,1); //顯示模式設(shè)置,開(kāi)始要求每次檢測(cè)忙信號(hào)
WriteCommandLCM(0x08,1); //關(guān)閉顯示
WriteCommandLCM(0x01,1); //顯示清屏
WriteCommandLCM(0x06,1); // 顯示光標(biāo)移動(dòng)設(shè)置
WriteCommandLCM(0x0C,1); // 顯示開(kāi)及光標(biāo)設(shè)置
}
//按指定位置顯示一個(gè)字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //當(dāng)要顯示第二行時(shí)地址碼+0x40;
X |= 0x80; //算出指令碼
WriteCommandLCM(X, 0); //這里不檢測(cè)忙信號(hào),發(fā)送地址碼
WriteDataLCM(DData);
}
//按指定位置顯示一串字符 ***原來(lái)的遇到空格0x20就不顯示***
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength,j;
ListLength = strlen(DData);
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (X <= 0xF) //X坐標(biāo)應(yīng)小于0xF
{
for(j=0;j<ListLength;j++)
{
DisplayOneChar(X, Y, DData[j]); //顯示單個(gè)字符
X++;
}
}
}
//5ms延時(shí)
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
//400ms延時(shí)
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
//********DS1302讀寫(xiě)程序***************
/********************************************************************
函 數(shù) 名:RTInputByte()
功 能:實(shí)時(shí)時(shí)鐘寫(xiě)入一字節(jié)
說(shuō) 明:往DS1302寫(xiě)入1Byte數(shù)據(jù) (內(nèi)部函數(shù))
入口參數(shù):d 寫(xiě)入的數(shù)據(jù)
返 回 值:無(wú)
***********************************************************************/
void RTInputByte(uchar d)
{
uchar i;
ACC = d;
for(i=8; i>0; i--)
{
T_IO = ACC0; /*相當(dāng)于匯編中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/********************************************************************
函 數(shù) 名:RTOutputByte()
功 能:實(shí)時(shí)時(shí)鐘讀取一字節(jié)
說(shuō) 明:從DS1302讀取1Byte數(shù)據(jù) (內(nèi)部函數(shù))
入口參數(shù):無(wú)
返 回 值:ACC
設(shè) 計(jì):zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
uchar RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; /*相當(dāng)于匯編中的 RRC */
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************************************
函 數(shù) 名:W1302()
功 能:往DS1302寫(xiě)入數(shù)據(jù)
說(shuō) 明:先寫(xiě)地址,后寫(xiě)命令/數(shù)據(jù) (內(nèi)部函數(shù))
調(diào) 用:RTInputByte() , RTOutputByte()
入口參數(shù):ucAddr: DS1302地址, ucData: 要寫(xiě)的數(shù)據(jù)
返 回 值:無(wú)
***********************************************************************/
void W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
RTInputByte(ucDa); /* 寫(xiě)1Byte數(shù)據(jù)*/
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
函 數(shù) 名:R1302()
功 能:讀取DS1302某地址的數(shù)據(jù)
說(shuō) 明:先寫(xiě)地址,后讀命令/數(shù)據(jù) (內(nèi)部函數(shù))
調(diào) 用:RTInputByte() , RTOutputByte()
入口參數(shù):ucAddr: DS1302地址
返 回 值:ucData :讀取的數(shù)據(jù)
***********************************************************************/
uchar R1302(uchar ucAddr)
{
uchar ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
ucData = RTOutputByte(); /* 讀1Byte數(shù)據(jù) */
T_CLK = 1;
T_RST = 0;
return(ucData);
}
/********************************************************************
函 數(shù) 名:Set1302()
功 能:設(shè)置初始時(shí)間
說(shuō) 明:先寫(xiě)地址,后讀命令/數(shù)據(jù)(寄存器多字節(jié)方式)
調(diào) 用:W1302()
入口參數(shù):pClock: 設(shè)置時(shí)鐘數(shù)據(jù)地址 格式為: 秒 分 時(shí) 日 月 星期 年
7Byte (BCD碼)1B 1B 1B 1B 1B 1B 1B
返 回 值:無(wú)
***********************************************************************/
void Set1302(uchar *pClock)
{
uchar i;
uchar ucAddr = 0x80;
W1302(0x8e,0x00); /* 控制命令,WP=0,寫(xiě)操作?*/
for(i =7; i>0; i--)
{
W1302(ucAddr,*pClock); /* 秒 分 時(shí) 日 月 星期 年 */
pClock++;
ucAddr +=2;
}
W1302(0x8e,0x80); /* 控制命令,WP=1,寫(xiě)保護(hù)?*/
}
//*********** 18B20驅(qū)動(dòng) **************************
//延時(shí)
void delay(word useconds)
{
for(;useconds>0;useconds--);
}
//復(fù)位
byte ow_reset(void)
{
byte presence;
DQ = 0; //拉低總線
delay(29); // 保持 480us
DQ = 1; // 釋放總線
delay(3); // 等待回復(fù)
presence = DQ; // 讀取信號(hào)
delay(25); // 等待結(jié)束信號(hào)
return(presence); // 返回 0:正常 1:不存在
}
//從 1-wire 總線上讀取一個(gè)字節(jié)
byte read_byte(void)
{
byte i;
byte value = 0;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0;
DQ = 1;
delay(1);
if(DQ)value|=0x80;
delay(6);
}
return(value);
}
//向 1-WIRE 總線上寫(xiě)一個(gè)字節(jié)
void write_byte(char val)
{
byte i;
for (i=8; i>0; i--) // 一次寫(xiě)一位
{
DQ = 0; //
DQ = val&0x01;
delay(5); //
DQ = 1;
val=val/2;
}
delay(5);
}
//讀取和顯示溫度
Read_Temperature(char xx,char yy)
{
unsigned char i,tl_temp;
unsigned int x;
unsigned char ct[8];
union{byte c[2]; int x;}temp;
ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0x44); // 轉(zhuǎn)換溫度
ow_reset();
write_byte(0xCC); //Skip ROM
write_byte(0xbe); // 讀取寄存器
temp.c[1]=read_byte();//讀出溫度低8位
temp.c[0]=read_byte();//讀出溫度高8位
// 零下溫度判斷
sflag=0; //溫度零下標(biāo)志 0:零上,1:零下
if((temp.c[0]&0xf8)!=0x00)
{
sflag=1; //零下標(biāo)志位置1
temp.c[1]=~temp.c[1]; //低8位取反
temp.c[0]=~temp.c[0]; //高8位取反
tl_temp=temp.c[1]+1; //低8位加1
temp.c[1]=tl_temp; //計(jì)算后重新存入數(shù)組
if(tl_temp>255) temp.c[0]++; //如果低8位大于255,向高8位進(jìn)1
}
x=((temp.c[0]&0x07)*256+temp.c[1])*.625;
for(i=0;i<8;i++)
{
ct[i]=0;
}
i=0;
while(x/10)
{
ct[i]=x%10;
x=x/10;
i++;
}
ct[i]=x;
if(sflag==1) DisplayOneChar(xx-1,yy,0x2d);
else DisplayOneChar(xx-1,yy,0x20);
DisplayOneChar(xx, yy,ct[2]+0x30);//顯示溫度十位數(shù)
DisplayOneChar(xx+1,yy,ct[1]+0x30);//顯示溫度個(gè)位數(shù)
DisplayOneChar(xx+2,yy,0x2e);//顯示小數(shù)點(diǎn)
DisplayOneChar(xx+3,yy,ct[0]+0x30);//顯示溫度小數(shù)位
DisplayOneChar(xx+4,yy,0x01);//顯示自定義字符
DisplayOneChar(xx+5,yy,0x43);//顯示字符“C
}
//溫度分辨率調(diào)整
void adjust_res(char res) ///res 分別等于 0x1f, 0x3f, 0x5f 溫度讀數(shù)分辨率分別對(duì)應(yīng)
// 0.5, 0.25, 0.125
{
ow_reset(); //復(fù)位
write_byte(0xcc); //跳過(guò)Rom
write_byte(0x4e); //寫(xiě)暫存器
write_byte(0x02); //寫(xiě)TH
write_byte(0x01); //寫(xiě)TL
//write_byte(0x5f); //寫(xiě)結(jié)構(gòu)寄存器
write_byte(res);
ow_reset(); //復(fù)位
write_byte(0xcc); //跳過(guò)Rom
write_byte(0x48); //把暫存器內(nèi)容寫(xiě)到EPRam中
}
void mychar()//自定義字符
{
///////////////////////自定義字符
WriteCommandLCM(0x48, 0); //第一行
WriteDataLCM(0x02);
WriteCommandLCM(0x49, 0); //第2行
WriteDataLCM(0x05);
WriteCommandLCM(0x4a, 0); //第3
WriteDataLCM(0x05);
WriteCommandLCM(0x4b, 0); //第4
WriteDataLCM(0x02);
WriteCommandLCM(0x4c, 0); //第5
WriteDataLCM(0x00);
WriteCommandLCM(0x4d, 0); //第6
WriteDataLCM(0x00);
WriteCommandLCM(0x4e, 0); //第7
WriteDataLCM(0x00);
WriteCommandLCM(0x4f, 0); //第8
WriteDataLCM(0x00);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -