?? lcd1602.c
字號:
write_1302(0x8e,0x80);
break;
case 2: write_1602com(er+6);//按2次fen位置顯示光標
//write_1602com(0x0f);
break;
case 3: write_1602com(er+3);//按動3次,shi
//write_1602com(0x0f);
break;
case 4: write_1602com(yh+0x0e);//按動4次,week
//write_1602com(0x0f);
break;
case 5: write_1602com(yh+0x0a);//按動5次,ri
//write_1602com(0x0f);
break;
case 6: write_1602com(yh+0x07);//按動6次,yue
//write_1602com(0x0f);
break;
case 7: write_1602com(yh+0x04);//按動7次,nian
//write_1602com(0x0f);
break;
case 8:
write_1602com(0x0c);//按動到第8次,設置光標不閃爍
TR0=1;//打開定時器
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao數據寫入DS1302
write_1302(0x8e,0x80);
break;
}
}
}
//------------------------------加鍵key2----------------------------
if(key1n!=0)//當key1按下以下。再按以下鍵才有效(按鍵次數不等于零)
{
if(key2==0) //上調鍵
{
delay(10);
if(key2==0)
{
buzzer=0;//蜂鳴器短響一次
delay(20);
buzzer=1;
while(!key2);
switch(key1n)
{
case 1:miao++;//設置鍵按動1次,調秒
if(miao==60)
miao=0;//秒超過59,再加1,就歸零
write_sfm(0x08,miao);//令LCD在正確位置顯示"加"設定好的秒數
temp=(miao)/10*16+(miao)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00); //允許寫,禁止寫保護
write_1302(0x80,temp); //向DS1302內寫秒寄存器80H寫入調整后的秒數據BCD碼
write_1302(0x8e,0x80); //打開寫保護
write_1602com(er+0x09);//因為設置液晶的模式是寫入數據后,光標自動右移,所以要指定返回
//write_1602com(0x0b);
break;
case 2:fen++;
if(fen==60)
fen=0;
write_sfm(0x05,fen);//令LCD在正確位置顯示"加"設定好的分數據
temp=(fen)/10*16+(fen)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x82,temp);//向DS1302內寫分寄存器82H寫入調整后的分數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
write_1602com(er+6);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置
break;
case 3:shi++;
if(shi==24)
shi=0;
write_sfm(2,shi);//令LCD在正確的位置顯示"加"設定好的小時數據
temp=(shi)/10*16+(shi)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x84,temp);//向DS1302內寫小時寄存器84H寫入調整后的小時數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
write_1602com(er+3);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
break;
case 4:week++;
if(week==8)
week=1;
write_1602com(yh+0x0C);//指定'加'后的周數據顯示位置
write_week(week);//指定周數據顯示內容
temp=(week)/10*16+(week)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x8a,temp);//向DS1302內寫周寄存器8aH寫入調整后的周數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
write_1602com(yh+0x0e);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
break;
case 5:ri++;
if(ri==32)
ri=1;
write_nyr(9,ri);//令LCD在正確的位置顯示"加"設定好的日期數據
temp=(ri)/10*16+(ri)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x86,temp);//向DS1302內寫日期寄存器86H寫入調整后的日期數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
write_1602com(yh+10);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
break;
case 6:yue++;
if(yue==13)
yue=1;
write_nyr(6,yue);//令LCD在正確的位置顯示"加"設定好的月份數據
temp=(yue)/10*16+(yue)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x88,temp);//向DS1302內寫月份寄存器88H寫入調整后的月份數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
write_1602com(yh+7);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
break;
case 7:nian++;
if(nian==100)
nian=0;
write_nyr(3,nian);//令LCD在正確的位置顯示"加"設定好的年份數據
temp=(nian)/10*16+(nian)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x8c,temp);//向DS1302內寫年份寄存器8cH寫入調整后的年份數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
write_1602com(yh+4);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
break;
}
}
}
//------------------減鍵key3,各句功能參照'加鍵'注釋---------------
if(key3==0)
{
delay(10);//調延時,消抖動
if(key3==0)
{
buzzer=0;//蜂鳴器短響一次
delay(20);
buzzer=1;
while(!key3);
switch(key1n)
{
case 1:miao--;
if(miao==-1)
miao=59;//秒數據減到-1時自動變成59
write_sfm(0x08,miao);//在LCD的正確位置顯示改變后新的秒數
temp=(miao)/10*16+(miao)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00); //允許寫,禁止寫保護
write_1302(0x80,temp); //向DS1302內寫秒寄存器80H寫入調整后的秒數據BCD碼
write_1302(0x8e,0x80); //打開寫保護
write_1602com(er+0x09);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置
//write_1602com(0x0b);
break;
case 2:fen--;
if(fen==-1)
fen=59;
write_sfm(5,fen);
temp=(fen)/10*16+(fen)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x82,temp);//向DS1302內寫分寄存器82H寫入調整后的分數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
write_1602com(er+6);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置
break;
case 3:shi--;
if(shi==-1)
shi=23;
write_sfm(2,shi);
temp=(shi)/10*16+(shi)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x84,temp);//向DS1302內寫小時寄存器84H寫入調整后的小時數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
write_1602com(er+3);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
break;
case 4:week--;
if(week==0)
week=7;
write_1602com(yh+0x0C);//指定'加'后的周數據顯示位置
write_week(week);//指定周數據顯示內容
temp=(week)/10*16+(week)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x8a,temp);//向DS1302內寫周寄存器8aH寫入調整后的周數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
write_1602com(yh+0x0e);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
break;
case 5:ri--;
if(ri==0)
ri=31;
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x86,temp);//向DS1302內寫日期寄存器86H寫入調整后的日期數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
write_1602com(yh+10);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
break;
case 6:yue--;
if(yue==0)
yue=12;
write_nyr(6,yue);
temp=(yue)/10*16+(yue)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x88,temp);//向DS1302內寫月份寄存器88H寫入調整后的月份數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
write_1602com(yh+7);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
break;
case 7:nian--;
if(nian==-1)
nian=99;
write_nyr(3,nian);
temp=(nian)/10*16+(nian)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x8c,temp);//向DS1302內寫年份寄存器8cH寫入調整后的年份數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
write_1602com(yh+4);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
break;
}
}
}
}
}
//-------------------------------
void init() //定時器、計數器設置函數
{
TMOD=0x11; //指定定時/計數器的工作方式為3
TH0=0; //定時器T0的高四位=0
TL0=0; //定時器T0的低四位=0
EA=1; //系統允許有開放的中斷
ET0=1; //允許T0中斷
TR0=1; //開啟中斷,啟動定時器
}
//*******************主函數**************************
//***************************************************
void main()
{
lcd_init(); //調用液晶屏初始化子函數
ds1302_init(); //調用DS1302時鐘的初始化子函數
init(); //調用定時計數器的設置子函數
led=0; //打開LCD的背光電源
buzzer=0;//蜂鳴器長響一次
delay(80);
buzzer=1;
while(1) //無限循環下面的語句:
{
keyscan(); //調用鍵盤掃描子函數
}
}
void timer0() interrupt 1 //取得并顯示日歷和時間
{
//Init_DS18B20();//溫度傳感器DS18b2初始化子函數,在頭文件中
flag=ReadTemperature();//將18b2頭文件運行返回的函數結果送到變量FLAG中,用于顯示
//讀取秒時分周日月年七個數據(DS1302的讀寄存器與寫寄存器不一樣):
miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));
//顯示溫度、秒、時、分數據:
write_temp(12,flag);//顯示溫度,從第二行第12個字符后開始顯示
write_sfm(8,miao);//秒,從第二行第8個字后開始顯示(調用時分秒顯示子函數)
write_sfm(5,fen);//分,從第二行第5個字符后開始顯示
write_sfm(2,shi);//小時,從第二行第2個字符后開始顯示
//顯示日、月、年數據:
write_nyr(9,ri);//日期,從第二行第9個字符后開始顯示
write_nyr(6,yue);//月份,從第二行第6個字符后開始顯示
write_nyr(3,nian);//年,從第二行第3個字符后開始顯示
write_week(week);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -