|
/*********************************/
/*采用STC15F204EA 此單片機(jī)注意版本,
有A版與B版本之分,它引腳定義不一樣的,
請(qǐng)大家注意!
在12864上顯示萬(wàn)年歷:可以精確顯示
年月日星期時(shí)間,然后可以進(jìn)行時(shí)間任
意調(diào)整!長(zhǎng)按S1功能鍵后,進(jìn)行入調(diào)整
模式,此時(shí)顯示屏上光標(biāo)在閃動(dòng),再按
功能鍵可以跳到另一個(gè)需要調(diào)整的位置,
S2可以任意加值,按S3可以任意減值,
按8次功能鍵S1,可以回到走時(shí)狀態(tài)*/
以下是實(shí)物圖片展示!
單片機(jī)源程序如下:
/*********************************/
#include <reg52.h>//頭文件
#define uchar unsigned char//宏定義
#define uint unsigned int//宏定義
sfr P0M0 = 0x94;
sfr P0M1 = 0x93;
sfr P1M0 = 0x92;
sfr P1M1 = 0x91;
sfr P2M0 = 0x96;
sfr P2M1 = 0x95;
sfr P3M0 = 0xb2;
sfr P3M1 = 0xb1;
sfr P4M0 = 0xb4;
sfr P4M1 = 0xb3;
sfr P5M0 = 0xca;
sfr P5M1 = 0xc9;
sfr P6M0 = 0xcc;
sfr P6M1 = 0xcb;
sfr P7M0 = 0xe2;
sfr P7M1 = 0xe1;
sfr P5=0xC8;//xxxx,1111 端口5
sbit SCLK=P0^1;//時(shí)鐘信號(hào)線
sbit DATA=P3^1;//數(shù)據(jù)線
sbit RST=P3^0;//復(fù)位端
sbit rs=P2^0;//液晶1602控制端
sbit rw=P2^1;//液晶1602控制端
sbit e=P2^2; //液晶1602使能端
sbit s1=P3^2;//功能鍵
sbit s2=P2^7;//-鍵
sbit s3=P2^6;//+鍵
/******************************************************/
/*變量分別為:miao秒,fen分,shi時(shí),ri日,yue月,nian年,
xin星期,dii定計(jì)數(shù)變量,num5按鍵計(jì)數(shù),readvalue轉(zhuǎn)換后數(shù)*/
/*******************************************************/
uchar miao,fen,shi,ri,yue,nian,xin,dii,num5, readvalue;
/******************************************************/
/*變量分別為:flash秒--年調(diào)整標(biāo)志位,flag顯示標(biāo)志位,
flag1進(jìn)入功能模式標(biāo)志位,flag2星期調(diào)整標(biāo)志位*/
/*******************************************************/
bit flash,flag,flag1,flag2;
uchar code table[]={"0123456789"};//液晶1602數(shù)據(jù)表
/**********************************/
//延時(shí)函數(shù)1//
//入口參數(shù):z
/*********************************/
void delaya(uchar z)//延時(shí)1
{
uchar x;
for(x=z;x>0;x--);
}
/**********************************/
//延時(shí)函數(shù)2//
//入口參數(shù):z
/*********************************/
void delayb(uchar z)
{
uchar x,y;
for(y=z;y>0;y--)
for(x=100;x>0;x--);
}
/**********************************/
//向1302寫(xiě)一個(gè)字節(jié)數(shù)據(jù)//
//入口參數(shù):dat
/*********************************/
void write1302xei(uchar dat)
{
uchar x;
delaya(2);//等待一會(huì)兒
for(x=0;x<8;x++)//循環(huán)8次將一個(gè)字?jǐn)?shù)發(fā)送完畢
{
DATA=dat&0x01;//取出最低位,從而實(shí)現(xiàn)一位位傳送
delaya(2);//等待一會(huì)兒
SCLK=1;//置高形成上升沿
delaya(2);//延時(shí)
SCLK=0;//置低
dat>>=1;//等待傳送第二個(gè)字節(jié)
}
}
/**************************************/
//根據(jù)控制字向1302寫(xiě)一個(gè)字節(jié)數(shù)據(jù)//
//入口參數(shù):控制參數(shù)kong,實(shí)際參數(shù)can
/*************************************/
void write1302(uchar kong,uchar can)
{
SCLK=0;//置低
RST=0;//置低
RST=1;//高電平時(shí)送數(shù)據(jù)
delaya(2);//延時(shí)
write1302xei(kong);//寫(xiě)控制命令
write1302xei(can);//寫(xiě)數(shù)據(jù)
SCLK=1;//置高形成上升沿
RST=0;//置低
}
/**************************************/
//向1302讀一個(gè)字節(jié)數(shù)據(jù)//
//入口參數(shù):dat,x
/*************************************/
uchar read1302du()
{
uchar dat,x;
for(x=0;x<8;x++)//循環(huán)8次,讀完一個(gè)字節(jié)
{
dat>>=1;//右位一位為下一個(gè)字節(jié)發(fā)送作好準(zhǔn)備
//DATA=dat;
if(DATA==1)//如果數(shù)據(jù)端為1,則執(zhí)行下面語(yǔ)句
dat|=0x80;//將最高位給它
SCLK=1;//置高
delaya(2);//延時(shí)
SCLK=0;//置低
delaya(2);//延時(shí)
}
return dat;//將值返回
}
/**************************************/
//根據(jù)控制字向1302讀一個(gè)字節(jié)數(shù)據(jù)//
//入口參數(shù):控制參數(shù)kong 實(shí)際參:dat
/*************************************/
uchar read1302(uchar kong)
{
uchar dat;//定義變量
RST=0;//先置0
SCLK=0;//置0
RST=1;//準(zhǔn)備傳數(shù)據(jù)
write1302xei(kong);//寫(xiě)控制字
dat=read1302du();//讀數(shù)
SCLK=1;//形成上升沿
RST=0;//置0
return dat;//將值返回
}
void init1302()
{
/*以下是掉電保護(hù)函數(shù)通過(guò)判斷標(biāo)志位是否為1來(lái)判斷*/
uchar flag;
flag=read1302(0x81);//讀秒數(shù)據(jù)
if(flag&0x80==1)//判斷最高位是否為1,若為1則說(shuō)明芯片停止工作了,若為0則說(shuō)明沒(méi)有停止
{
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x80,((12/10)<<4)|(12%10));/*顯示54秒/*先將BCD碼求模得到高位,然后左移四位,
//得到了高四位,然后將BCD碼求余這樣就得到了低四位,然后相或就轉(zhuǎn)換成了二進(jìn)制代碼了*/
write1302(0x82,((59/10)<<4)|(59%10));//顯示59分
write1302(0x84,((23/10)<<4)|(23%10));//顯示23點(diǎn)
write1302(0x86,((7/10)<<4)|(7%10));//顯示07日
write1302(0x88,((3/10)<<4)|(3%10));//顯示03月
write1302(0x8c,((10/10)<<4)|(10%10));//顯示10年
write1302(0x8a,((7/10)<<4)|(7%10));//顯示星期天
write1302(0x90,0xa5);//打開(kāi)充電方式,選擇一個(gè)二極管2K電阻
write1302(0x8e,0x80);//打開(kāi)保護(hù)
}
/*以下是開(kāi)機(jī)復(fù)位函數(shù)*/
/*
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x80,((12/10)<<4)|(12%10));
write1302(0x82,((59/10)<<4)|(59%10));//顯示59分
write1302(0x84,((23/10)<<4)|(23%10));//顯示23點(diǎn)
write1302(0x86,((7/10)<<4)|(7%10));//顯示07日
write1302(0x88,((3/10)<<4)|(3%10));//顯示03月
write1302(0x8c,((10/10)<<4)|(10%10));//顯示10年
write1302(0x8a,((7/10)<<4)|(7%10));//顯示星期天
write1302(0x90,0xa5);//打開(kāi)充電方式,選擇一個(gè)二極管2K電阻
write1302(0x8e,0x80);//打開(kāi)保護(hù)
*/
}
/**************************************/
//以下是液晶模塊1602操縱
/*************************************/
/**************************************/
//寫(xiě)指令到液晶
//入口參數(shù):dat
/*************************************/
/************************************************************************/
/**********************延時(shí)50微秒子程序**********************************/
/************************************************************************/
void delay50us(uint z) //延時(shí)子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=19;y>0;y--);
}/***********寫(xiě)命令**********************/
void write1602(uchar dat)
{
rs=0;//控制端置低
rw=0;//控制端置低
e=0;//使能端置低
delay50us(50);
P1=dat;//送數(shù)
e=1;//使能端置1
delay50us(50);
e=0;//置0
delay50us(50);
}
/*void write1602(uchar dat)
{
write1602a(dat|0x80);//與0x80相或后得到的數(shù)
}*/
/**************************************/
//寫(xiě)數(shù)據(jù)(ASCII碼)到液晶
//入口參數(shù):dat
/*************************************/
void read1602(uchar dat)
{
rs=1;//控制端置高
rw=0;//控制端置低
e=0;//使能端置0
delay50us(50);
P1=dat;//送數(shù)據(jù)
e=1;//形成上升沿
delay50us(50);
e=0;//清0
delay50us(50);
}
void delayms(uint z) //延時(shí)子程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
/************************************************************************/
/************************漢字指針的顯示方法**********************************/
/************************************************************************/
void hanzi(uchar *ch)
{
while(*ch!=0)
read1602(*ch++);
delayms(200);
}
/**************************************/
//1602液晶初始化
/*************************************/
void init1602()
{
write1602(0x30);//
/************************************/
/*打開(kāi)所有顯示,0x08關(guān)顯示,關(guān)閉光標(biāo),關(guān)閉反白
0x0c開(kāi)顯示,關(guān)閉光標(biāo),關(guān)閉反白,0x0e開(kāi)顯示,開(kāi)光標(biāo),關(guān)閉反白,
0x0f開(kāi)顯示,開(kāi)光標(biāo),開(kāi)反白*/
/************************************/
write1602(0x01);//清屏
write1602(0x0c);//開(kāi)顯示,不顯示光標(biāo)
write1602(0x06);//光標(biāo)右移,AC自動(dòng)加1
write1602(0x89);//在第一行第2個(gè)位置顯示即相當(dāng)于0x81處顯示
hanzi("【牛電子鐘】");
write1602(0x98);//在第一行第2個(gè)位置顯示即相當(dāng)于0x81處顯示
hanzi("SL1302IC15W204EA");
write1602(0x80);//在第一行第2個(gè)位置顯示即相當(dāng)于0x81處顯示
read1602('D');//在第一行第3個(gè)位置顯示D
read1602('a');//在第一行第4個(gè)位置顯示a
read1602('t');//在第一行第5個(gè)位置顯示t
//read1602('e');//在第一行第6個(gè)位置顯示e
read1602(':');//在第一行第7個(gè)位置顯示:
read1602('2');//在第一行第8個(gè)位置顯示2
read1602('0');//在第一行第9個(gè)位置顯示0
write1602(0x84);//在第一行顯示
read1602('-'); //顯示-
read1602('-'); //顯示-
write1602(0x86);//在第一行顯示
read1602('-');//顯示-
read1602('-'); //顯示-
write1602(0x90);//在第二行第1個(gè)位置顯示a
read1602('T');//顯示T
read1602(':');//顯示:
write1602(0x92);//在第二行顯示
read1602(':');//顯示:
write1602(0x94);//在第二行顯示
read1602(':');//顯示:
write1602(0x96);//在第二行顯示
read1602('W');//顯示W(wǎng)
read1602(':');//顯示:
}
/**************************************/
//1302數(shù)據(jù)顯示程序
/*************************************/
/**************************************/
//秒顯示程序
//入口參數(shù):dat
/*************************************/
void Displaymiao(uchar dat)
{
write1602(0x95);//秒鐘顯示位置
read1602(table[(dat/10)]);//顯示秒鐘十位
read1602(table[(dat%10)]);//顯示秒鐘個(gè)位
}
/**************************************/
//分顯示程序
//入口參數(shù):dat
/*************************************/
void Displayfen(uchar dat)
{
write1602(0x93);//分鐘顯示位置
read1602(table[(dat/10)]);//顯示分鐘十位
read1602(table[(dat%10)]);//顯示分鐘個(gè)位
}
/**************************************/
//時(shí)顯示程序
//入口參數(shù):dat
/*************************************/
void Displayshi(uchar dat)
{
write1602(0x91);//時(shí)鐘顯示位置
read1602(table[(dat/10)]);//顯示時(shí)鐘十位
read1602(table[(dat%10)]);//顯示時(shí)鐘個(gè)位
}
/**************************************/
//日顯示程序
//入口參數(shù):dat
/*************************************/
void Displayri(uchar dat)
{
write1602(0x87);//日顯示位置
read1602(table[(dat/10)]);//顯示日十位
read1602(table[(dat%10)]);//顯示日個(gè)位
}
/**************************************/
//月顯示程序
//入口參數(shù):dat
/*************************************/
void Displayyue(uchar dat)
{
write1602(0x85);//月顯示位置
read1602(table[(dat/10)]);//顯示月十位
read1602(table[(dat%10)]);//顯示月個(gè)位
}
/**************************************/
//年顯示程序
//入口參數(shù):dat
/*************************************/
void Displaynian(uchar dat)
{
write1602(0x83);//年顯示位置
read1602(table[(dat/10)]);//顯示年十位
read1602(table[(dat%10)]);//顯示年個(gè)位
}
/**************************************/
//星期幾顯示程序
//入口參數(shù):dat
/*************************************/
void Displayxin(uchar dat)
{
write1602(0x97);//星期顯示位置
read1602(table[(dat%10)]);//顯示星期個(gè)位
}
/**************************************/
//從1302里讀出數(shù)據(jù)并送往1602液晶顯示
/*************************************/
void value()
{
readvalue=read1302(0x81);//讀出秒值給變量readvalue
miao=((readvalue&0x70)>>4)*10+(readvalue&0x0f);/*先將秒數(shù)最高位與低四位去掉,
然后右位四位*10得到高四位,然后將秒值保留低四位與高四位相加,這樣將二進(jìn)制碼轉(zhuǎn)換成了BCD碼*/
Displaymiao(miao);//將BCB碼送到液晶顯示
readvalue=read1302(0x83);//讀出分值給變量readvalue
fen=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//將分二進(jìn)制碼轉(zhuǎn)換成BCD碼
Displayfen(fen);//將分送液晶1602顯示
readvalue=read1302(0x85);//讀出時(shí)值給變量readvalue
shi=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//將時(shí)二進(jìn)制碼轉(zhuǎn)換成BCD碼
Displayshi(shi);//將時(shí)送液晶1602顯示
readvalue=read1302(0x87);//讀出日值給變量readvalue
ri=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//將日二進(jìn)制碼轉(zhuǎn)換成BCD碼
Displayri(ri);//將日送液晶1602顯示
readvalue=read1302(0x89);//讀出月值給變量readvalue
yue=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//將月二進(jìn)制碼轉(zhuǎn)換成BCD碼
Displayyue(yue);//將月送液晶1602顯示
readvalue=read1302(0x8d);//讀出年值給變量readvalue
nian=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//將月二進(jìn)制碼轉(zhuǎn)換成BCD碼
Displaynian(nian);//將年送液晶1602顯示
readvalue=read1302(0x8b);//讀出星期值給變量readvalue
xin=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//將星期二進(jìn)制碼轉(zhuǎn)換成BCD碼
Displayxin(xin);//將星期送液晶1602顯示
}
/**************************************/
/*************按鍵處理子函數(shù)**********/
/*************************************/
void sky()
{
if(flag1==1)//如果進(jìn)入功能模式標(biāo)志位為1,則執(zhí)行以下程序
{
write1302(0x8e,0x00);//讓時(shí)間停下來(lái)
write1302(0x80,0x80);
write1302(0x8e,0x80);//讓時(shí)間停下來(lái)
flag=1;//讓顯示子程序停下來(lái)
write1602(0x0f);//將液晶光標(biāo)閃動(dòng)打開(kāi),以便我們看清楚具體調(diào)哪個(gè)位置
write1602(0x97);//將光標(biāo)閃爍的位置選定
flash=1;//將秒---年標(biāo)志位打開(kāi)
flag2=1;//將星期調(diào)整加+與減-標(biāo)志位打開(kāi)
}
if(flag2==1)//如果星期調(diào)整加+與減-標(biāo)志位為1就執(zhí)行以下程序
{
if(s2==0)//如果+鍵按下就執(zhí)行以下程序
{
delayb(5);//去下抖
if(s2==0)//再次確認(rèn)是否按下了
{
while(!s2)//按鍵釋放
Displayxin(xin);//調(diào)用顯示星期子程序
xin++;//將星期+1
if(xin==8)//如果星期到了8就清它清1
xin=1;//清1
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x8a,((xin/10)<<4)|(xin%10));//顯示星期天
write1302(0x8e,0x80);//打開(kāi)保護(hù)
readvalue=read1302(0x8b);//讀星期
xin=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//將星期值還原
Displayxin(xin);//送顯示
write1602(0x97);//光標(biāo)停留位置
}
}
if(s3==0)//如果-按鍵按下了
{
delayb(5);//去抖
if(s3==0)//如果-按下了,就執(zhí)行以下程序
{
while(!s3)//按鍵釋放
Displayxin(xin);//星期顯示子程序
xin--;//減1
if(xin==(1-1))//如果到了(1-1)就給它7,因?yàn)樾瞧谥?---7
xin=7;//將它給7
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x8a,((xin/10)<<4)|(xin%10));//顯示星期天
write1302(0x8e,0x80);//打開(kāi)保護(hù)
readvalue=read1302(0x8b);
xin=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//讀星期值
Displayxin(xin);//星期顯示子程序
write1602(0x97);//光標(biāo)位置
}
}
}
if(flash==1)//如果秒---年標(biāo)志位打開(kāi),執(zhí)行以下程序
{
if(s1==0)//加+按鍵按下了嗎?
{
delayb(5);//去抖
if(s1==0)//再次判斷是否按下
{
while(!s1);//按鍵釋放
flag2=0;//將星期調(diào)整加+與減-標(biāo)志位關(guān)閉,防止星期調(diào)整部分動(dòng)作
num5++;//將按鍵記數(shù)器加1
switch(num5)//判斷按鍵記數(shù)器
{
case 1://如果等1調(diào)整秒
flag1=0;//將進(jìn)入功能模式標(biāo)志位清0,即不要它動(dòng)作
write1602(0x95);//光標(biāo)位置
break;//返回
case 2://調(diào)整分
write1602(0x93);//光標(biāo)位置
break;//返回
case 3://調(diào)整時(shí)
write1602(0x91);//光標(biāo)位置
break;//返回
case 4://調(diào)整日
write1602(0x87);//光標(biāo)位置
break;//返回
case 5://調(diào)整月
write1602(0x85);//光標(biāo)位置
break;//返回
case 6://調(diào)整年
write1602(0x83);//光標(biāo)位置
break;//返回
case 7://歸0
num5=0;//將記數(shù)器清0
if(num5==0)//如果記數(shù)器為0,則執(zhí)下以下程序
{
write1302(0x8e,0x00);//讓時(shí)間停下來(lái)
write1302(0x80,0x00);
write1302(0x8e,0x80);//讓時(shí)間停下來(lái)
flag=0;//讓時(shí)鐘開(kāi)始走
flash=0;//秒--年調(diào)整標(biāo)志位復(fù)位
flag1=0;//星期調(diào)整加+與減-標(biāo)志位復(fù)位
TR0=1;//定時(shí)器打開(kāi),以準(zhǔn)備下次調(diào)整
write1602(0x0c);//關(guān)閉光標(biāo)閃動(dòng)
break;
}
}
}
}
}
if(num5!=0)//如果將按鍵記數(shù)器不為0則執(zhí)行以下程序
{
switch(num5)//判斷它num5情況
{
/**************************************/
/*************秒處理子函數(shù)**********/
/*************************************/
case 1://miao秒調(diào)整
if(s2==0)//加按鍵有按下嗎?
{
delayb(5);
if(s2==0)
{
while(!s2)//按鍵釋放
Displaymiao(miao);//調(diào)用顯示
miao++;//秒加1
if(miao==60)//到了60?
miao=0;//清0
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x80,((miao/10)<<4)|(miao%10));//秒數(shù)據(jù)寫(xiě)入
write1302(0x8e,0x80);//打開(kāi)保護(hù)
readvalue=read1302(0x81);//調(diào)用讀秒子程序
miao=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//還原秒
Displaymiao(miao);//顯示
write1602(0x95);//光標(biāo)位置
}
}
if(s3==0)//減按鍵是否有按下?
{
delayb(5);
if(s3==0)
{
while(!s3)//按鍵釋放
Displaymiao(miao);//調(diào)用秒顯示
miao--;//減1
if(miao==(0-1))//如果秒等于(0-1)
miao=59;//將秒寄存器給59
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x80,((miao/10)<<4)|(miao%10));//秒數(shù)據(jù)寫(xiě)入
write1302(0x8e,0x80);//打開(kāi)保護(hù)
readvalue=read1302(0x81);//讀秒數(shù)據(jù)
miao=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//轉(zhuǎn)換秒數(shù)據(jù)
Displaymiao(miao);//送顯示
write1602(0x95);//光標(biāo)位置
}
}
break;//返回
/**************************************/
/*************分處理子函數(shù)**********/
/*************************************/
case 2://fen分鐘調(diào)整
if(s2==0)
{
delayb(5);
if(s2==0)
{
while(!s2)
Displayfen(fen);
fen++;
if(fen==60)
fen=0;
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x82,((fen/10)<<4)|(fen%10));//分?jǐn)?shù)據(jù)寫(xiě)入
write1302(0x8e,0x80);//打開(kāi)保護(hù)
readvalue=read1302(0x83);
fen=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
Displayfen(fen);
write1602(0x93);
}
}
if(s3==0)
{
delayb(5);
if(s3==0)
{
while(!s3)
Displayfen(fen);
fen--;
if(fen==(0-1))
fen=59;
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x82,((fen/10)<<4)|(fen%10));//分?jǐn)?shù)據(jù)寫(xiě)入
write1302(0x8e,0x80);//打開(kāi)保護(hù)
readvalue=read1302(0x83);
fen=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
Displayfen(fen);
write1602(0x93);
}
}
break;
/**************************************/
/*************小時(shí)處理子函數(shù)**********/
/*************************************/
case 3://shi小時(shí)調(diào)整
if(s2==0)
{
delayb(5);
if(s2==0)
{
while(!s2)
Displayshi(shi);
shi++;
if(shi==24)
shi=0;
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x84,((shi/10)<<4)|(shi%10));//時(shí)數(shù)據(jù)寫(xiě)入
write1302(0x8e,0x80);//打開(kāi)保護(hù)
readvalue=read1302(0x85);
shi=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
Displayshi(shi);
write1602(0x91);
}
}
if(s3==0)
{
delayb(5);
if(s3==0)
{
while(!s3)
Displayshi(shi);
shi--;
if(shi==(0-1))
shi=23;
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x84,((shi/10)<<4)|(shi%10));//時(shí)數(shù)據(jù)寫(xiě)入
write1302(0x8e,0x80);//打開(kāi)保護(hù)
readvalue=read1302(0x85);
shi=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
Displayshi(shi);
write1602(0x91);
}
}
break;
/**************************************/
/*************日處理子函數(shù)**********/
/*************************************/
case 4://ri日調(diào)整
if(s2==0)
{
delayb(5);
if(s2==0)
{
while(!s2)
Displayri(ri);
ri++;
if(ri==32)
ri=1;
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x86,((ri/10)<<4)|(ri%10));//日數(shù)據(jù)寫(xiě)入
write1302(0x8e,0x80);//打開(kāi)保護(hù)
readvalue=read1302(0x87);
ri=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
Displayri(ri);
write1602(0x87);
}
}
if(s3==0)
{
delayb(5);
if(s3==0)
{
while(!s3)
Displayri(ri);
ri--;
if(ri==(1-1))
ri=31;
Displayri(ri);
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x86,((ri/10)<<4)|(ri%10));//日數(shù)據(jù)寫(xiě)入
write1302(0x8e,0x80);//打開(kāi)保護(hù)
readvalue=read1302(0x87);
ri=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
Displayri(ri);
write1602(0x87);
}
}
break;
/**************************************/
/*************月處理子函數(shù)**********/
/*************************************/
case 5://yue月調(diào)整
if(s2==0)
{
delayb(5);
if(s2==0)
{
while(!s2)
Displayyue(yue);
yue++;
if(yue==13)
yue=1;
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x88,((yue/10)<<4)|(yue%10));//月數(shù)據(jù)寫(xiě)入
write1302(0x8e,0x80);//打開(kāi)保護(hù)
readvalue=read1302(0x89);
yue=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
Displayyue(yue);
write1602(0x85);
}
}
if(s3==0)
{
delayb(5);
if(s3==0)
{
while(!s3)
Displayyue(yue);
yue--;
if(yue==(1-1))
yue=12;
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x88,((yue/10)<<4)|(yue%10));//月數(shù)據(jù)寫(xiě)入
write1302(0x8e,0x80);//打開(kāi)保護(hù)
readvalue=read1302(0x89);
yue=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//月轉(zhuǎn)換
Displayyue(yue);
write1602(0x85);
}
}
break;
/**************************************/
/*************年處理子函數(shù)**********/
/*************************************/
case 6://nian年調(diào)整
if(s2==0)
{
delayb(5);
if(s2==0)
{
while(!s2)
Displaynian(nian);
nian++;
if(nian==99)
nian=0;
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x8c,((nian/10)<<4)|(nian%10));//年數(shù)據(jù)寫(xiě)入
write1302(0x8e,0x80);//打開(kāi)保護(hù)
readvalue=read1302(0x8d);
nian=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//年數(shù)據(jù)轉(zhuǎn)換
Displaynian(nian);
write1602(0x83);
}
}
if(s3==0)
{
delayb(5);
if(s3==0)
{
while(!s3)
Displaynian(nian);
nian--;
if(nian==(0-1))
nian=99;
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x8c,((nian/10)<<4)|(nian%10));//年數(shù)據(jù)寫(xiě)入
write1302(0x8e,0x80);//打開(kāi)保護(hù)
readvalue=read1302(0x8d);
nian=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
Displaynian(nian);
write1602(0x83);
}
}
break;
}
}
}
/**************************************/
/************主程序處理部分***********/
/*************************************/
void main()
{
P0M0=0x00;
P0M1=0x00;
P1M0=0x00;
P1M1=0x00;
P2M0=0x00;
P2M1=0x00;
P3M0=0x00;
P3M1=0x00;
P5M0=0x00;
P5M1=0x00;
P4M0=0x00;
P4M1=0x00;
TMOD=0x01;//選擇定時(shí)器工作方式
TH0=(65536-20000)/256;//賦值給高位
TL0=(65536-20000)%256;//賦值給低位
EA=1;//開(kāi)總中斷
ET0=1;//開(kāi)定時(shí)器中斷
TR0=1;//開(kāi)定時(shí)器
init1302();//初始化1302子程序
init1602();//初始化1602子程序
while(1)
{
if(flag==0)//如果標(biāo)志位flag等于0,則執(zhí)行顯示程序,即調(diào)整時(shí)間時(shí)不執(zhí)行顯示程序
value();//調(diào)用顯示子程序
sky();//調(diào)用按鍵子程序
}
}
/**************************************/
/*****長(zhǎng)按功能鍵進(jìn)行調(diào)整處理部分*****/
/*************************************/
void led() interrupt 1 //中斷服務(wù)子程序
{
TH0=(65536-20000)/256;//賦值高位
TL0=(65536-20000)%256;//賦值低位
dii++;//將中斷次數(shù)加1
if(dii==120)//到了120次中斷嗎?
{
dii=0;//清0準(zhǔn)備下一次中斷
if(s1==0)//功能鍵按下了嗎?
{
delayb(5);//消抖
if(s1==0)//再次確認(rèn)
{
while(!s1);//按鍵釋放
flag1=1;//將進(jìn)入功能鍵標(biāo)置位置1
TR0=0;//關(guān)閉定時(shí)器,防止操縱其它功能時(shí)誤動(dòng)作
}
}
}
}
下載地址:
實(shí)測(cè)視頻.rar
(2.31 MB, 下載次數(shù): 40)
2019-12-16 16:56 上傳
點(diǎn)擊文件名下載附件
實(shí)測(cè)視頻
|
評(píng)分
-
查看全部評(píng)分
|