電子萬年歷是一種非常廣泛日常計時工具,給人們的帶來了很大的方便,在社會上越來越流行。 它可以對年、月、日、時、分、秒進行計時,采用直觀的數字顯示,可以同時顯示年月日時分秒和溫度等信息,還有時間校準、鬧鐘等功能。該電子萬年歷主要采用STC89C52單片機作為主控核心,用DS1302時鐘芯片作為時鐘、液晶12864顯示屏顯示。STC89C52單片機是由宏晶公司推出的,功耗小,電壓可選用4~6V電壓供電;DS1302時鐘芯片是美國DALLAS公司推出的具有細電流充電功能的低功耗實時時鐘芯片,它可以對年、月、日、星期、時、分、秒進行計時,還具有閏年補償等多種功能,而且DS1302的使用壽命長,誤差。粩底诛@示是采用的12864液晶顯示屏來顯示,可以同時顯示年、月、日、星期、時、分、秒和溫度等信息。此外,該電子萬年歷還具有時間校準等功能。
2.1 功能要求
本萬年歷能動態顯示年、月、日、星期、小時、分鐘、秒、溫度。
2.2 方案論證
2.2.1技術可行性
方案一:采用傳統的51單片機作為整個電路的控制核心。單片機算術運算功能強,軟件編程靈活、自由度大,可用軟件編程實現各種算法和邏輯控制,并且由于其功耗低、體積小、技術成熟和成本低等優點,使其在各個領域應用廣泛。
方案二:采用FTC10F04單片機,還帶有非易失性Flash程序存儲器。它是一種高性能、低功耗的8位CMOS微處理芯片,市場應用最多。其主要特點如下:8KB Flash ROM,可以擦除1000次以上,數據保存10年。
由于方案一已能滿足設計要求,故選用方案一。
2.2.3顯示模塊的選擇
方案一:使用液晶顯示屏顯示時間數字。液晶顯示屏(LCD)具有輕薄短小、低耗電量、無輻射危險,平面直角顯示以及影象穩定不閃爍等優勢,可視面積大,畫面效果好,分辨率高,抗干擾能力強等特點。液晶顯示屏分兩種,一種是以點陣的模式顯示各種符號,需要利用控制芯片創建字符庫,編程工作量大,控制器的資源占用較多,其成本也偏高。在使用時,不能有靜電干擾,否則易燒壞液晶的顯示芯片,不易維護,另外一種是帶字庫版本,省去了編程字符庫的過程操作簡單便捷便于使用。
方案二:使用傳統的LED數碼管顯示。 數碼管具有:低能耗、低損耗、低壓、壽命長、耐老化、防曬、防潮、防火、防高(低)溫,對外界環境要求低,易于維護,同時其精度比較高,稱重輕,精確可靠,操作簡單。數碼管采用BCD編碼顯示數字,程序編譯容易,資源占用較少。
根據以上的論述,雖然LED的各方面性能比較好,但是目前在已有的原件中有一塊帶字庫的LCD,省去了創建字庫符的編程且控制相對簡單,故采用方案一。
2.2.4鍵盤模塊的選擇
在對日期和時間進行切換,對日期和時間進行調節校準過程中,系統需要,產生激勵電流,因此需要用按鍵。
方案一:使用獨立式鍵盤。獨立式鍵盤是指直接用I/O口線構成的單個按鍵電路。獨立式按鍵電路配置靈活,軟件結構簡單。
方案二:使用矩陣式鍵盤。矩陣式鍵盤是由行線和列線組成,按鍵位于行、列的交叉點上,行線、列線分別連接到按鍵開關的兩端。其特點是簡單且不增加成本,這種鍵盤適合按鍵數量較多的場合。
根據以上的論述,因本系統需要的按鍵不多,上下左右調節四個按鍵、功能控制兩個按鍵,要求簡單。所以采用方案一獨立式鍵盤。
2.2.5 總體方案論證與選擇
3 硬件電路設計及概述
3.1 系統的結構設計
本設計采用的是宏晶公司的STC89C52單片機為核心,通過單片機與時鐘芯片DS1302通信來對時間的讀寫,保證時鐘時間的穩定性,并帶有內部電源模塊,使系統斷電時時鐘數據不會丟失,以DS18B20溫度感應芯片作為溫度電路的核心,向單片機發出獲取到的溫度數據,并通過LCD12864將時間、顯示出來,并可以通過按鍵調整時間日期和鬧鐘時間。
圖3.1
3.2 單片機的系統結構
3.2.1 單片機的內部結構
一個基本的MCS-51單片機通常包括:中央處理器、ROM、
RAM、定時/計數器和I/O口等各功能部件,各個功能由內部的總線連接起來,從而實現數據通信。其內部框圖如圖3.2所示
圖3.2
3.2.2 單片機的引腳
常見的51單片機中一般采用雙列直插(DIP)封裝,共40個引腳。圖3.3為引腳排列圖。其中的40個引腳大致可以分為4類:電源、時鐘、控制和I/O引腳。
3.2.3 最小系統的介紹
單片機最小系統主要由電源、復位、振蕩電路以及擴展部分等部分組成。最小系統原理圖如圖3.4所示。
圖3.4
3.3 按鍵開關去抖動
鍵盤在單片機系統中是一個很重要的部件。為了輸入數據、查詢和控制系統的工作狀態,都要用到鍵盤,鍵盤是人工干預計算機的主要手段。
鍵盤可分為編碼和非編碼鍵盤兩種。編碼鍵盤采用硬件線線路來實現鍵盤編碼,每按下一個鍵,鍵盤能自動生成按鍵代碼,鍵數較多,而且還具有去抖動功能。這種鍵盤使用方便,但硬件較復雜,PC機所用的鍵盤就屬于這種。非編碼鍵盤僅提供按鍵開關工作狀態,其他工作由軟件完成,這種鍵盤鍵數較少,硬件簡單,一般在單片機應用系統中廣泛使用。此處主要介紹該類非編碼鍵盤及其與單片機的接口。
按鍵開關在電路中的連接如圖3.5(a)所示。按鍵未按下時,A點電位為高電平5V;按鍵按下時,A點電位為低電平。A點電位就用于向CPU傳遞按鍵的開關狀態。但是由于按鍵的結構為機械彈性開關,在按鍵按下和斷開時,觸點在閉合和斷開瞬間還會接觸不穩定,引起A點電平不穩定,如圖3.5(b)所示,鍵盤的抖動時間一般為5~10ms,抖動現象會引起CPU對一次鍵操作進行多次處理,從而可能產生錯誤。因此必須設法消除抖動的不良后果。
消除抖動的不良后果的方法有硬、軟件兩種。
為了節省硬件,通常在單片機系統中,一般不采用硬件方法消除鍵的抖動,而是用軟件消除抖動的方法。根據抖動特性,在第一次檢測到按鍵按下后,執行一段延時5~10ms讓前延抖動消失后再一次檢測鍵的狀態,如果仍保持閉合狀態電平,則確認真正有鍵按下。當檢測到按鍵釋放后,也要給5~10ms的延時,待后延抖動消失后才轉入該鍵處理程序。
3.4 鍵盤掃描控制方式
在單片機應用系統中,對鍵盤的處理工作僅是CPU工作內容的一部分,CPU還要進行數據處理、顯示和其他輸入輸出操作,因此鍵盤處理工作既不能占用CPU太多時間,又需要CPU對鍵盤操作及時作出響應。CPU對鍵盤處理控制的工作方式有以下幾種:
程序控制掃描方式是在CPU工作空余,調用鍵盤掃描子程序,響應鍵輸入信號要求。
(2) 定時控制掃描方式
定時控制掃描方式是利用定時/計數器每隔一段時間產生定時中斷,CPU響應中斷后對鍵盤進行掃描,并在有鍵閉合時轉入該鍵的功能子程序。
(3)中斷控制掃描方式
中斷控制掃描方式是利用外部中斷源,響應輸入信號。當無按鍵按下時,CPU執行正常工作程序。當有按鍵按下時,CPU立即產生中斷。在中斷服務子程序中掃描鍵盤,判斷是哪一個鍵被按下,然后執行該鍵的功能子程序。這種控制方式克服了前兩種控制方式可能產生的空掃描和不能及時響應鍵輸入的缺點,既能及時處理鍵輸入,又能提高CPU運行效率,但要占用一個寶貴的中斷資源。
因為時間的走時需要不斷的進行掃描,并且在任何時刻都可能進行時間調整,所以需要按鍵在任何時候都能控制整個系統,故采用中斷掃描方式。
3.5 DS1302工作方式簡介及數據操作原理
DS1302可以對年、月、日、星期、時、分、秒進行計時, 且具有閏年補償功能, 工作電壓寬達2.5~5.5V。采用三線接口與CPU進行同步通信, 并可采用突發方式一次傳送多個字節的時鐘信號或RAM數據。DS1302內部有一個33x8的用于臨時性存放數據的RAM寄存器。DS1302是的DS1202升級產品, 與DS1202兼容, 但增加了主電源/后背電源雙電源引腳, 同時提供了對后背電源進行涓細電流充電的能力。
file:///C:/Users/13909/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg
圖3.6
DS1302在任何數據傳送時必須先初始化,把RST腳置為高電平,然后把8位地址和命令字裝入移位寄存器,數據在SCLK的上升沿被訪問到。在開始8個時鐘周期,把命令字節裝入移位寄存器后,另外的時鐘周期在讀操作時輸出數據,在寫操作時寫入數據。時鐘脈沖的個數在單字節方式下為8+8,在多字節方式下為8+字節數,最大可達248字節數。如果在傳送過程中置RST腳為低電平,則會終止本次數據傳送,并且I/O引腳變為高阻態。上電運行時,在Vcc≥2.5V之前,RST腳必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。
DS1302的控制字如圖所示?刂谱止澋淖罡哂行唬ㄎ7)必須是邏輯1,如果它為0,則不能把數據寫入到DS1302中。位6如果為0,則表示存取日歷時鐘數據;為1則表示存取RAM數據。位5~1(A4~A0)指示操作單元的地址。最低有效位(位0)如果為0,則表示藥進行寫操作;為1表示進行讀操作。控制字節總是從最低位開始輸入/輸出。
為了提高對32個地址尋址能力(地址/命令位1~5=邏輯1),可以把時鐘/日歷或RAM寄存器規定為多字節(burst)方式。位6規定時鐘或RAM,而位0規定讀或寫。在時鐘/日歷寄存器中的地址9~31或RAM寄存器中的地址31不能存儲數據。在多字節方式下,讀或寫從地址0的位0開始。必須按數據傳送的次序寫最先的8個寄存器。但是,當以多字節方式寫RAM時,為了傳送數據不必寫所有的31字節,不管是否寫了全部31字節,所寫的每一字節都將傳送至RAM。
DS1302共有12個寄存器,其中有7個寄存器與日歷、時鐘相關,存放的數據位為BCD碼形式。其日歷、時間寄存器及其控制字如下表所示,其中奇數為讀操作,偶數為寫操作。
timg.jpg (108.19 KB, 下載次數: 228)
下載附件
2017-6-6 10:48 上傳
圖3.7
時鐘暫停:秒寄存器的位7定義位時鐘暫停位。當它為1時,DS1302停止振蕩,進入低功耗的備份方式,通常在對DS1302進行寫操作時(如進入時鐘調整程序),停止振蕩。當它為0時,時鐘將開始啟動。
AM-PM/12-24小時方式:小時寄存器的位7定義為12或24小時方式選擇位。它為高電平時,選擇12小時方式。在此方式下,位5為第二個10小時位(20~23h)。
DS1302的晶振選用32768Hz,電容推薦值為6pF。因為振蕩頻率較低,也可以不接電容,對計時精度影響不大。
3.6 DS18B20數據原理
引腳功能.jpg (206.03 KB, 下載次數: 176)
下載附件
2017-6-6 10:47 上傳
圖3.8
DS18B20測溫原理如圖3.8所示。圖中低溫度系數晶振的振蕩頻率受溫度影響很小,用于產生固定頻率的脈沖信號送給計數器1。高溫度系數晶振隨溫度變化其振蕩率明顯改變,所產生的信號作為計數器2的脈沖輸入。計數器1和溫度寄存器被預置在-55℃所對應的一個基數值。計數器1對低溫度系數晶振產生的脈沖信號進行減法計數,當計數器1的預置值減到0時,溫度寄存器的值將加1,計數器1的預置將重新被裝入,計數器1重新開始對低溫度系數晶振產生的脈沖信號進行計數,如此循環直到計數器2計數到0時,停止溫度寄存器值的累加,此時溫度寄存器中的數值即為所測溫度。斜率累加器用于補償和修正測溫過程中的非線性,其輸出用于修正計數器1的預置值。
圖3.9
3.7 系統模塊介紹
4.1.1 主程序流程
4.1.2 DS1302與按鍵控制流程
圖4.2
4.2 程序編寫
采用Keil uVision4編譯軟件,具體程序編寫說明參照附錄1。
附錄1:程序代碼
#include<reg51.h>
#include<intrins.h>
#include<LCD1602.h>
#include<DS18b20.h>
#include<DS1302.h>
#ifndef __DS1302_H__
#define __DS1302_H__
#include<reg51.h>
#include<intrins.h> //包含_nop_()函數定義的頭文件
#define uchar unsignedchar
#define uint unsignedint
#ifndef __LCD1602_H__
#define __LCD1602_H__
#include<reg51.H>
#include<intrins.h> //包含_nop_()函數定義的頭文件
#define uint unsignedint
#define uchar unsignedchar
#define OUT P0
#define yh 0x80
#define er0x80+0x40
//液晶屏的與C51之間的引腳連接定義
#ifndef __DS18b20_H__
#define __DS18b20_H__
#include<reg51.h>
#include<intrins.h>
#define uchar unsignedchar
#define uint unsignedint
uint tvalue;
uchar tflag;
sbit DQ=P3^3;
sbit rs=P2^0;
sbit en=P2^2;
sbit rw=P2^1; //如果硬件上rw接地,就不用寫這句和后面的rw=0了
sbit BF=P0^7;
void delay_18B20(unsigned int i)
{
while(i--);
}
void ds1820rst()
{ unsigned char x=0;
DQ = 1;
delay_18B20(4);
DQ = 0;
delay_18B20(100);
DQ = 1;
delay_18B20(40);
}
uchar ds1820rd()
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{ DQ = 0;
dat>>=1;
可調用**************/
uchar BusyTest(void)
{
bit result;
rs=0; //根據規定,RS為低電平,RW為高電平時,可以讀狀態
rw=1;
en=1; //E=1,才允許讀寫
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬件反應時間
result=BF; //將忙碌標志電平賦給result
en=0;
return result;
}
/********液晶寫入指令函數與寫入數據函數,以后可調用**************/
write_1602com(uchar com) //****液晶寫入指令函數****
{
while(BusyTest()==1);
rs=0; //數據/指令選擇置為指令
rw=0; //讀寫選擇置為寫
OUT=com; //送入數據
delay(1);
en=1; //拉高使能端,為制造有效的下降沿做準備
delay(1);
en=0; //en由高變低,產生下降沿,液晶執行命令
}
voidwrite_1602dat(uchar dat) //***液晶寫入數據函數****
{
while(BusyTest()==1);
rs=1; //數據/指令選擇置為數據
rw=0; //讀寫選擇置為寫
OUT=dat; //送入數據
delay(1);
en=1; //en置高電平,為制造下降沿做準備
delay(1);
en=0; //en由高變低,產生下降沿,液晶執行命令
}
void lcd_init() //***液晶初始化函數****
{
write_1602com(0x38); //設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據
write_1602com(0x0c); //開顯示不顯示光標
write_1602com(0x06); //整屏不移動,光標自動右移
write_1602com(0x01); //清顯示
}
#endif
//DS1302時鐘芯片與C51之間的引腳連接定義
sbit IO=P1^7;
sbit SCLK=P1^6;
sbit RST=P1^5;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
/***************DS1302有關子函數********************/
void write_byte(uchardat)//寫一個字節
{ uchar a;
ACC=dat;
RST=1;
for(a=8;a>0;a--)
{
IO=ACC0;
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
uchar read_byte() //讀一個字節
{ uchar a;
RST=1;
for(a=8;a>0;a--)
{
ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
return (ACC);
}
//----------------------------------------
void write_1302(ucharadd,uchar dat) //向1302芯片寫函數,指定寫入地址,數據
{
RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
uchar read_1302(ucharadd) //從1302讀數據函數,指定讀取數據來源地址
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
uchar BCD_Decimal(ucharbcd) //BCD碼轉十進制函數,輸入BCD,返回十進制
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
//--------------------------------------
void ds1302_init() //1302芯片初始化子函數(2010-01-07,12:00:00,week4)
{
RST=0;
SCLK=0;
write_1302(0x8e,0x00); //允許寫,禁止寫保護
write_1302(0x80,0x00); //向DS1302內寫秒寄存器80H寫入初始秒數據00
write_1302(0x82,0x00); //向DS1302內寫分寄存器82H寫入初始分數據00
write_1302(0x84,0x12); //向DS1302內寫小時寄存器84H寫入初始小時數據12
write_1302(0x8a,0x05); //向DS1302內寫周寄存器8aH寫入初始周數據4
write_1302(0x86,0x18); //向DS1302內寫日期寄存器86H寫入初始日期數據07
write_1302(0x88,0x03); //向DS1302內寫月份寄存器88H寫入初始月份數據01
write_1302(0x8c,0x16); //向DS1302內寫年份寄存器8cH寫入初始年份數據10
write_1302(0x8e,0x80); //打開寫保護
}
#endif
uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;
void write_sfm(uchar add,uchar dat);
void write_week(uchar week);
void write_nyr(uchar add,uchar dat);
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
sbit buzzer=P1^3;
uchar code tab1[]={"20 - - "};
uchar code tab2[]={" : : "};
void write_temp(uchar add,uchar dat)
{
uchar gw,sw;
gw=dat%10;
sw=dat/10;
write_1602com(er+add);
if(tflag==0)
write_1602dat(' ');
else
write_1602dat('-');
if(sw==0)
{write_1602dat(' ');write_1602dat(0x30+gw);}
else
{write_1602dat(0x30+sw);
write_1602dat(0x30+gw);}
write_1602dat(0xdf);
write_1602dat(0x43);
}
void write_sfm(uchar add,uchar dat)
{
uchar gw,sw;
gw=dat%10;
sw=dat/10;
write_1602com(er+add);
write_1602dat(0x30+sw);
write_1602dat(0x30+gw);
}
void write_nyr(uchar add,uchar dat)
{
uchar gw,sw;
gw=dat%10;
sw=dat/10;
write_1602com(yh+add);
write_1602dat(0x30+sw);
write_1602dat(0x30+gw);
}
void write_week(uchar week)
{
write_1602com(yh+0x0c);
switch(week)
{
case 1:write_1602dat('M');
write_1602dat('O');
write_1602dat('N');
break;
case 2:write_1602dat('T');
write_1602dat('U');
write_1602dat('E');
break;
case 3:write_1602dat('W');
write_1602dat('E');
write_1602dat('D');
break;
case 4:write_1602dat('T');
write_1602dat('H');
write_1602dat('U');
break;
case 5:write_1602dat('F');
write_1602dat('R');
write_1602dat('I');
break;
case 6:write_1602dat('S');
write_1602dat('T');
write_1602dat('R');
break;
case 7:write_1602dat('S');
write_1602dat('U');
write_1602dat('N');
break;
}
}
void keyscan()
{
if(key1==0)
{
delay(9);
if(key1==0)
{
buzzer=0;
delay(20);
buzzer=1;
while(!key1);
key1n++;
if(key1n==9)
key1n=1;
switch(key1n)
{
case 1: TR0=0;
write_1602com(er+0x09);
write_1602com(0x0f);
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp);
write_1302(0x8e,0x80);
break;
case 2: write_1602com(er+6);
break;
case 3:write_1602com(er+3);
break;
case 4:write_1602com(yh+0x0e);
break;
case 5:write_1602com(yh+0x0a);
break;
case 6:write_1602com(yh+0x07);
break;
case 7:write_1602com(yh+0x04);
break;
case 8:
write_1602com(0x0c);
TR0=1;
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);
write_1302(0x8e,0x80);
break;
}
}
}
if(key1n!=0)
{
if(key2==0)
{
delay(10);
if(key2==0)
{
buzzer=0;
delay(20);
buzzer=1;
while(!key2);
switch(key1n)
{
case 1:miao++;
if(miao==60)
miao=0;
write_sfm(0x08,miao);
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+0x09);
break;
case 2:fen++;
if(fen==60)
fen=0;
write_sfm(0x05,fen);
temp=(fen)/10*16+(fen)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+6);
break;
case 3:shi++;
if(shi==24)
shi=0;
write_sfm(2,shi);
temp=(shi)/10*16+(shi)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
break;
case 4:week++;
if(week==8)
week=1;
write_1602com(yh+0x0C);
write_week(week);
temp=(week)/10*16+(week)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
break;
case 5:ri++;
if(ri==32)
ri=1;
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(yh+10);
break;
case 6:yue++;
if(yue==13)
yue=1;
write_nyr(6,yue);
temp=(yue)/10*16+(yue)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(yh+7);
break;
case 7:nian++;
if(nian==100)
nian=0;
write_nyr(3,nian);
temp=(nian)/10*16+(nian)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(yh+4);
break;
}
}
}
}
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;
write_sfm(0x08,miao);
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+0x09);
break;
case 2:fen--;
if(fen==-1)
fen=59;
write_sfm(5,fen);
temp=(fen)/10*16+(fen)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+6);
break;
case 3:shi--;
if(shi==-1)
fen=23;
write_sfm(2,shi);
temp=(shi)/10*16+(shi)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
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;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
break;
case 5:ri--;
if(ri==-1)
ri=31;
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(yh+10);
break;
case 6:ri--;
if(yue==0)
yue=12;
write_nyr(6,yue);
temp=(yue)/10*16+(yue)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(yh+7);
break;
write_nyr(9,ri);
write_nyr(6,yue);
write_nyr(3,nian);
write_week(week);
}
|