欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機LCD1602顯示DS1302時鐘,按鍵可調時間程序
[打印本頁]
作者:
19970623
時間:
2018-12-17 11:23
標題:
單片機LCD1602顯示DS1302時鐘,按鍵可調時間程序
上個帖子是不可調節。這個程序為可調節,用了矩陣按鍵里7個按鍵,每個按鍵調一個,因為弄成光標移動選擇調節的話,光標顏色很暗,不知道什么原因。
/********************************************/
#include <reg52.h>
#include"inc/lcd.h"
#include"inc/key.h"
#define uchar unsigned char
#define uint unsigned int
sbit IO = P3^6;
sbit SCLK = P3^5;
sbit RST = P3^7;
sbit ACC_0 = ACC^0;
sbit ACC_7 = ACC^7;
//寫的地址
uchar code write_addr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
//讀的地址
uchar code read_addr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
/*形式上為十六進,數值是BCD碼*/
//存儲格式是BCD碼秒 分 時 日 月 周 年
uchar time[7]={0x50,0x59,0x14,0x20,0x06,0x06,0x19};
/*如果數值時間是十進制,寫入時間時要先轉化為BCD碼*/
//uchar time[7]={0,25,15,15,12,6,18}; //十進制
uchar KEYRETURN;//鍵值
void write_byte(uchar dat)//寫一個字節
{
uchar i;
ACC=dat;
for(i=8;i>0;i--)
{
IO=ACC_0;
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
/*
uchar i;
for(i=0;i<8;i++)
{
IO = (bit)(dat & 0x01);
SCLK = 0;
SCLK = 1;
dat >>= 1;
}
*/
}
uchar read_byte() //讀一個字節
{
uchar i;
for(i=0;i<8;i++)
{
ACC_7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
IO=0;
return (ACC);
/*
uchar dat,i;
for(i=0;i<8;i++)
{
if(IO == 1)
{
dat = dat|0x80;
}
SCLK = 1;
SCLK = 0;
dat >>= 1;
}
IO = 0;
return (dat);
*/
}
void write_1302(uchar add,uchar dat) //向1302芯片寫函數,指定寫入地址,數據
{
RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
uchar read_1302(uchar add) //從1302讀數據函數,指定讀取數據來源地址
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
void ds1302_init()
{
uchar k;
write_1302(0x8e,0x00); //禁止寫保護,即允許數據寫入
for(k=0;k<7;k++) //寫入7個字節的時鐘信號:分秒時日月周年
{
write_1302(write_addr[k],time[k]);
}
write_1302(0x8e,0x80); //打開寫保護
/*//寫入時間時要先轉化為BCD碼
uchar i,tmp;
write_1302(0x8e,0x00); //禁止寫保護,即允許數據寫入
for (i=0; i<7; i++)
{
tmp = time[i] / 10;
time[i] = time[i] % 10;
time[i] = time[i] + tmp*16; // 十進制轉化為BCD格式
write_1302(write_addr[i],time[i]);
//寫入7個字節的時鐘信號:分秒時日月周年
}
write_1302(0x8e,0x80); //打開寫保護
*/
}
void BCD_STRING(uchar bcd, uchar *str) //BCD轉化為字符串
{
*str = (bcd >> 4) + '0';
*(str+1) = (bcd & 0x0f) + '0';
}
void read_time(uchar *timedata)
{
uchar n;
for(n=0;n<7;n++)
{
timedata[n]=read_1302(read_addr[n]); //讀取分秒時日月周年
}
BCD_STRING(timedata[6], LCD_TIME+0);//轉化后年,存放在LCD_TIME
BCD_STRING(timedata[4], LCD_TIME+2);//轉化后月
BCD_STRING(timedata[3], LCD_TIME+4);//轉化后日
BCD_STRING(timedata[5], LCD_TIME+6);//轉化后周
BCD_STRING(timedata[2], LCD_TIME+8);//轉化后時
BCD_STRING(timedata[1], LCD_TIME+10);//轉化后分
BCD_STRING(timedata[0], LCD_TIME+12);//轉化后秒
}
uchar TEN_BCD(uchar time_buf ) // 十進制轉化為BCD格式
{
uchar tmp;
tmp = time_buf / 10;
time_buf = time_buf % 10;
time_buf = time_buf + tmp*16;
return(time_buf);
}
uchar BCD_TEN(uchar bcd) //BCD碼轉十進制函數
{
uchar ten;
ten=bcd>>4;
return(ten=ten*10+(bcd&=0x0F));
}
void change_time()
{
// 年 月 日 周 時 分
uchar tmp=0,tmp1=1,tmp2=1,tmp3=1,tmp4=0,tmp5=0;
uchar year,mon,day,week,hour,minu;
KEYRETURN=KEY();
if(KEYRETURN!=0)
{
delay(400);
switch(KEYRETURN)
{ /*************年*************/
case 0x11:
write_1302(0x8e,0x00);//關閉保護
if(BCD_TEN(time[6])<99)//先將讀取出來的時間轉化為十進制比大小
{
tmp=BCD_TEN(time[6]);//變量等于當前值
tmp++; //變量再++
}
else
tmp=0;//大于99變回0
year=TEN_BCD(tmp);//再轉化為BCD碼
write_1302(0x8c,year); //再寫入
write_1302(0x8e,0x80);;//打開保護
break;
/*效果就是比如初始年是19,按一下鍵,變成20,而不是從0開始。
如果把讀取出來的時間轉化為16進制,再改程序,我試了不行*/
/*************月*************/
case 0x21:
write_1302(0x8e,0x00);
if(BCD_TEN(time[4])<12)
{
tmp1=BCD_TEN(time[4]);
tmp1++;
}
else
tmp1=1;
mon=TEN_BCD(tmp1);
write_1302(0x88,mon);
write_1302(0x8e,0x80);break;
/**********效果同上************/
/**************日************/
case 0x41:
write_1302(0x8e,0x00);
if(BCD_TEN(time[3])<31)
{
tmp2=BCD_TEN(time[3]);
tmp2++;
}
else
tmp2=1;
day=TEN_BCD(tmp2);
write_1302(0x86,day);
write_1302(0x8e,0x80);break;
/**********效果同上*********/
/**************周************/
case 0x81:
write_1302(0x8e,0x00);
if(BCD_TEN(time[5])<7)
{
tmp3=BCD_TEN(time[5]);
tmp3++;
}
else
tmp3=1;
week=TEN_BCD(tmp3);
write_1302(0x8a,week);
write_1302(0x8e,0x80);break;
/**********效果同上********/
/**************時************/
case 0x12:
write_1302(0x8e,0x00);
if(BCD_TEN(time[2])<23)
{
tmp4=BCD_TEN(time[2]);
tmp4++;
}
else
tmp4=0;
hour=TEN_BCD(tmp4);
write_1302(0x84,hour);
write_1302(0x8e,0x80);break;
/**********效果同上*******/
/**************分************/
case 0x22:
write_1302(0x8e,0x00);
if(BCD_TEN(time[1])<59)
{
tmp5=BCD_TEN(time[1]);
tmp5++;
}
else
tmp5=0;
minu=TEN_BCD(tmp5);
write_1302(0x82,minu);
write_1302(0x8e,0x80);break;
/***********效果同上*******/
/**************秒************/
case 0x42:
write_1302(0x8e,0x00);
write_1302(0x80,0x00);
write_1302(0x8e,0x80);break;
/*效果為按下鍵歸0,不像上面按下加1按下加1*/
}
}
KEYRETURN=0;
}
void main()
{
ds1302_init();//1302初始化,設定時間
Lcd_init(); // lcd初始化
while(1)
{
read_time(&time); //讀取時間
lcd_dis(); // 顯示在lcd
change_time(); //按鍵調時
}
while(1); //等待
}
復制代碼
詳細程序可下載免費
按鍵調節加lcd顯示時鐘.rar
(43.4 KB, 下載次數: 176)
2018-12-17 11:22 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
附件
作者:
Huangqianqian
時間:
2019-11-23 20:30
為什么我試了一下,什么反映也沒有
作者:
8imi8
時間:
2020-9-19 22:21
沒Uv2文件,初學者不會
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1