機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
128X64LCD萬年歷(網(wǎng)友作品)
128X64LCD萬年歷(網(wǎng)友作品)
 更新時間:2008-7-27 13:59:38  點(diǎn)擊數(shù):3
【字體: 字體顏色

概述

這是送給一個好友的生日禮物,希望他可以放在書桌上,每當(dāng)他需要的時候提醒他時間。本制作我創(chuàng)造了幾處個性設(shè)計(jì),臺歷式外型可以立在書桌上又可以折疊存放;模擬觸摸屏的按鍵設(shè)計(jì),使屏幕四角據(jù)有輸入功能,按鍵功能顯示在屏幕上,可以自由更改,同時也隱藏了難看的按鍵。

基本信息

作品名        12864液晶電子鐘 (12864 Lcd Clock)

程序名        12864LcdClock_c52_v1.01

程序版本     V1.01(最新版本)        [了解版本格式]

硬件版本     V1.00(最新版本)

啟劃人        杜洋

啟劃日期     2006-11-26

主要特征    

  • 顯示當(dāng)前年、月、日、星期、小時、分鐘、秒、溫度和節(jié)日信息

  • 整點(diǎn)報(bào)時(早8點(diǎn)至晚21點(diǎn))

  • 時鐘調(diào)整

  • 128*64LED顯示,亮度高,一目了然

  • 備用電池,長久走時

  • 溫度顯示,00.0度高精度(0~99度)

  • 模擬觸摸屏的方位按鍵,即操作簡單又隱藏按鍵

  • 國際、國內(nèi)公歷重要節(jié)日提醒

  • 日歷臺式外型設(shè)計(jì),至于桌面美觀大方 


 

//---程序說明---//

/*
 名字:main.c
 作者:杜洋(doyoung)
 創(chuàng)建日:2006-11-26
 工程:智能助理電子鐘(AI-timer)
*/

//---修改日志---//

/*

*/


//---硬件說明---//

/*
P0.0~0.7 NC

P1.0  右上角LED-G  低電平有效(L)
P1.1  右下角LED-G  L
P1.2  左下角LED-G  L
P1.3  左上角LED-G  L
P1.4  4個LED-R  L

P1.5~1.7 ISP下載用  ~

P2.1  LCM -5 SID  串行數(shù)據(jù)輸入,~
P2.2  LCD -6 CLK  串行時鐘,~

P2.3  左上角KEY  -
P2.4  左下角KEY  -
P2.5  右上角KEY  -
P2.6  右下角KEY  -

P2.7  背后LED-B  L

P3.0  溫度單總線  ~

P3.1  BEEP   L

P3.2  KEY中斷   -

P3.3  DS1302 -5 RST_ 低電平復(fù)位(L)
P3.4  DS1302 -6 IO ~
P3.5  DS1302 -7 SCLK ~

P3.6  24C02 -6 SCL ~
P3.7  24C02 -5 SDA ~

*/

/****************************************************************************/
//頭文件
#include <AT89X52.h>
#include <string.h>
/*****************************************************************************/
//燈與蜂鳴器定義
sbit led_b = P2^7;
sbit led_r = P1^4;
sbit led_g1 = P1^3;
sbit led_g2 = P1^2;
sbit led_g3 = P1^0;
sbit led_g4 = P1^1;
sbit beep   = P3^1;
/*****************************************************************************/
//溫度傳感器定義
sbit DQ = P3 ^ 0;//ds18B20
/*****************************************************************************/
//鍵盤引腳定義
sbit KEY_1 = P2^3;  //左上
sbit KEY_2 = P2^4;  //左下
sbit KEY_3 = P2^6;  //右上
sbit KEY_4 = P2^5;  //右下
sbit KEY_I = P3^2;  //常0
/****************************************************************************/
//引腳定義
sbit   SID   =  P2^1; //數(shù)據(jù)
sbit   SCLK  =  P2^2; //時鐘
/*****************************************************************************/
//定義DS1302時鐘接口
sbit clock_clk = P3 ^ 5;//ds1302_clk(時鐘線)
sbit clock_dat = P3 ^ 4;//ds1302_dat(數(shù)據(jù)線)
sbit clock_Rst = P3 ^ 3;//ds1302_Rst(復(fù)位線)
/*****************************************************************************/
//定義累加器A中的各位
sbit a0   = ACC ^ 0;
sbit a1   = ACC ^ 1;
sbit a2   = ACC ^ 2;
sbit a3   = ACC ^ 3;
sbit a4   = ACC ^ 4;
sbit a5   = ACC ^ 5;
sbit a6   = ACC ^ 6;
sbit a7   = ACC ^ 7;
/****************************************************************************/
//定義全局變量
unsigned char yy,mo,dd,xq,hh,mm,ss;//定義時間映射全局變量(專用寄存器)
bit w = 0; //調(diào)時標(biāo)志位
static unsigned char menu = 0;//定義靜態(tài)小時更新用數(shù)據(jù)變量
static unsigned char keys = 0;//定義靜態(tài)小時更新用數(shù)據(jù)變量
static unsigned char timecount = 0;//定義靜態(tài)軟件計(jì)數(shù)器變量
/****************************************************************************/
void DelayM(unsigned int a){//延時函數(shù) 1MS/次 
  unsigned char i;
  while( --a != 0){  
   for(i = 0; i < 125; i++);  //一個 ; 表示空語句,CPU空轉(zhuǎn)。
  }          //i 從0加到125,CPU大概就耗時1毫秒
}
/****************************************************************************/
//函數(shù)聲明
void lcm_w_word(unsigned char *str) ;  //寫字符  例:lcm_w_word("您好!");
void lcm_w_test(bit start,unsigned char ddata);  //(0,指令) (1,數(shù)據(jù))
void lcm_w_byte(unsigned char bbyte);  //寫一個字節(jié)給lcm
void delaynms(unsigned int di);  //延時
void lcm_init(void); //lcm初始化
void lcm_clr(void);  //清屏

void days (viod) {   //公歷節(jié)日數(shù)據(jù)庫
  
  lcm_w_test(0,0x80);
  lcm_w_word("[Dis]      [Set]");

  lcm_w_test(0,0x98);
//            ----|----------------|

  if ( mo == 0x01 && dd == 0x01 ){ lcm_w_word("Happy New Year!!"); }//1月
  if ( mo == 0x01 && dd == 0x28 ){ lcm_w_word("  世界麻風(fēng)日    "); }
  
  if ( mo == 0x02 && dd == 0x02 ){ lcm_w_word("  世界濕地日    "); }//2月
  if ( mo == 0x02 && dd == 0x13 ){ lcm_w_word("  明天情人節(jié)了  "); }  
  if ( mo == 0x02 && dd == 0x14 ){ lcm_w_word("  今天是情人節(jié)  "); }
    
  if ( mo == 0x03 && dd == 0x01 ){ lcm_w_word("  國際海豹日    "); }//3月  
  if ( mo == 0x03 && dd == 0x03 ){ lcm_w_word("  全國愛耳日    "); }  
  if ( mo == 0x03 && dd == 0x08 ){ lcm_w_word("   3.8婦女節(jié)    "); }  
  if ( mo == 0x03 && dd == 0x12 ){ lcm_w_word("    植樹節(jié)      "); }  
  if ( mo == 0x03 && dd == 0x14 ){ lcm_w_word("  國際警察日    "); }  
  if ( mo == 0x03 && dd == 0x15 ){ lcm_w_word("  消費(fèi)者權(quán)益日  "); }  
  if ( mo == 0x03 && dd == 0x17 ){ lcm_w_word("  國際航海日    "); }  
  if ( mo == 0x03 && dd == 0x21 ){ lcm_w_word("  世界森林日    "); }  
  if ( mo == 0x03 && dd == 0x22 ){ lcm_w_word("    世界水日    "); }  
  if ( mo == 0x03 && dd == 0x23 ){ lcm_w_word("  世界氣象日    "); }  
  if ( mo == 0x03 && dd == 0x24 ){ lcm_w_word("世界防治結(jié)核病日"); }
    
  if ( mo == 0x04 && dd == 0x01 ){ lcm_w_word("愚人節(jié)  小心上當(dāng)"); }//4  
  if ( mo == 0x04 && dd == 0x07 ){ lcm_w_word("  世界衛(wèi)生日    "); }  
  if ( mo == 0x04 && dd == 0x08 ){ lcm_w_word("    復(fù)活節(jié)      "); }  
  if ( mo == 0x04 && dd == 0x13 ){ lcm_w_word("  黑色星期五    "); }
    
  if ( mo == 0x05 && dd == 0x01 ){ lcm_w_word("  勞動節(jié)  放假  "); }//5  
  if ( mo == 0x05 && dd == 0x04 ){ lcm_w_word("    青年節(jié)      "); }  
  if ( mo == 0x05 && dd == 0x08 ){ lcm_w_word("  世界紅十字日  "); }  
  if ( mo == 0x05 && dd == 0x12 ){ lcm_w_word("  國際護(hù)士節(jié)    "); }  
  if ( mo == 0x05 && dd == 0x05 ){ lcm_w_word("近日注意母親節(jié)  "); }  
  if ( mo == 0x05 && dd == 0x15 ){ lcm_w_word("  國際家庭日    "); }
  if ( mo == 0x05 && dd == 0x31 ){ lcm_w_word("  世界無煙日    "); }  
    
  if ( mo == 0x06 && dd == 0x01 ){ lcm_w_word("  國際兒童節(jié)    "); }//6
  if ( mo == 0x06 && dd == 0x05 ){ lcm_w_word("  世界環(huán)境日    "); }  
  if ( mo == 0x06 && dd == 0x26 ){ lcm_w_word("  國際禁毒日    "); }  
  if ( mo == 0x06 && dd == 0x06 ){ lcm_w_word("  全國愛眼日    "); }  
  if ( mo == 0x06 && dd == 0x13 ){ lcm_w_word("近日注意父親節(jié)  "); }
  if ( mo == 0x06 && dd == 0x15 ){ lcm_w_word("近日注意父親節(jié)  "); }
    
  if ( mo == 0x07 && dd == 0x01 ){ lcm_w_word("香港回歸記念日  "); }//7
  if ( mo == 0x07 && dd == 0x07 ){ lcm_w_word("抗日戰(zhàn)爭記念日  "); }
  if ( mo == 0x07 && dd == 0x11 ){ lcm_w_word("  世界人口日    "); }

  if ( mo == 0x08 && dd == 0x01 ){ lcm_w_word("  八一建軍節(jié)    "); }//8
  if ( mo == 0x08 && dd == 0x08 ){ lcm_w_word("  中國男子節(jié)    "); }
  if ( mo == 0x08 && dd == 0x15 ){ lcm_w_word("抗戰(zhàn)勝利記念日  "); }

  if ( mo == 0x09 && dd == 0x10 ){ lcm_w_word("  中國教師節(jié)    "); }//9
  if ( mo == 0x09 && dd == 0x18 ){ lcm_w_word("九·一八事變記念"); }
  if ( mo == 0x09 && dd == 0x20 ){ lcm_w_word("  國際愛牙日    "); }
  if ( mo == 0x09 && dd == 0x27 ){ lcm_w_word("  世界旅游日    "); }

  if ( mo == 0x10 && dd == 0x01 ){ lcm_w_word("  中國國慶節(jié)    "); }//10
  if ( mo == 0x10 && dd == 0x04 ){ lcm_w_word("  世界動物日    "); }
  if ( mo == 0x10 && dd == 0x24 ){ lcm_w_word("    聯(lián)合國日    "); }
  if ( mo == 0x10 && dd == 0x12 ){ lcm_w_word("明天國際教師節(jié)  "); }
  if ( mo == 0x10 && dd == 0x13 ){ lcm_w_word("  國際教師節(jié)    "); }

  if ( mo == 0x11 && dd == 0x10 ){ lcm_w_word("  世界青年節(jié)    "); }//11
  if ( mo == 0x11 && dd == 0x17 ){ lcm_w_word("  世界學(xué)生節(jié)    "); }

  if ( mo == 0x12 && dd == 0x01 ){ lcm_w_word("  世界艾滋病日  "); }//12
  if ( mo == 0x12 && dd == 0x23 ){ lcm_w_word("  明晚平安夜    "); }
  if ( mo == 0x12 && dd == 0x24 ){ lcm_w_word("  今晚平安夜    "); }
  if ( mo == 0x12 && dd == 0x25 ){ lcm_w_word("    圣誕快樂    "); }
  if ( mo == 0x12 && dd == 0x31 ){ lcm_w_word("    明日新年    "); }

  else{
   if ( hh >= 0x04 && hh <  0x06 ){ lcm_w_word("★★__▲▲__凌晨"); }
   if ( hh >= 0x06 && hh <  0x08 ){ lcm_w_word("☆○__▲△__早晨"); }
   if ( hh >= 0x08 && hh <  0x12 ){ lcm_w_word("__●__▲▲__上午"); }
   if ( hh == 0x12)               { lcm_w_word("____▲●▲__中午"); }
   if ( hh >= 0x13 && hh <  0x18 ){ lcm_w_word("__▲▲__●__下午"); }
   if ( hh >= 0x18 && hh <  0x22 ){ lcm_w_word("△▲__●☆__晚上"); }
   if ( hh >= 0x22 && hh <= 0x23 ){ lcm_w_word("△▲__★☆__夜里"); }
   if ( hh >= 0x00 && hh <  0x04 ){ lcm_w_word("__★▲▲★__深夜"); }
   }

 

}
/****************************************************************************/
//初始化LCM
void lcm_init(void)  {
 delaynms(100); //啟動等待,等LCM講入工作狀態(tài)
   lcm_w_test(0,0x30);  //8 位介面,基本指令集
   lcm_w_test(0,0x0c);  //顯示打開,光標(biāo)關(guān),反白關(guān)
   lcm_w_test(0,0x01);  //清屏,將DDRAM的地址計(jì)數(shù)器歸零
 delaynms(100); //啟動等待,等LCM講入工作狀態(tài)
 
}
/******************************************************************************/
//寫指令或數(shù)據(jù)  (0,指令) (1,數(shù)據(jù))
void lcm_w_test(bit start, unsigned char ddata) {
 unsigned char start_data,Hdata,Ldata;
   if(start==0)
  start_data=0xf8;  //0:寫指令
    else   
     start_data=0xfa;  //1:寫數(shù)據(jù)
 
   Hdata=ddata&0xf0;    //取高四位
   Ldata=(ddata<<4)&0xf0;  //取低四位
   lcm_w_byte(start_data);   //發(fā)送起始信號
   delaynms(5); //延時是必須的
   lcm_w_byte(Hdata);       //發(fā)送高四位
   delaynms(5);  //延時是必須的
   lcm_w_byte(Ldata);    //發(fā)送低四位
   delaynms(5);  //延時是必須的
}

/******************************************************************************/
//發(fā)送一個字節(jié)(底層函數(shù))
void lcm_w_byte(unsigned char bbyte) {
 unsigned char i;
  for(i=0;i<8;i++){
     SID=bbyte&0x80; //取出最高位
   SCLK=1;
     SCLK=0;
     bbyte<<=1; //左移
    } 
}

/******************************************************************************/
//延時(LCM占用)
void delaynms(unsigned int di) {
 unsigned int da,db;
  for(da=0;da<di;da++);
     for(db=0;db<10;db++);
}
 
/*****************************************************************************/
//清屏函數(shù)
void lcm_clr(void){
 lcm_w_test(0,0x01);
 delaynms(40); //啟動等待,等LCM講入工作狀態(tài)

}

/*****************************************************************************/
//向LCM發(fā)送一個字符串,長度64字符之內(nèi)。
//應(yīng)用:lcm_w_word("您好!");
void lcm_w_word(unsigned char *str){
  while(*str != '\0'){
   lcm_w_test(1,*str++);
        }
  *str = 0;
}
/******************************************************************************/
void Delay(int num)//延時函數(shù)
{
 while(num--) ;

/******************************************************************************/
void Init_DS18B20(void)//初始化ds1820
{
 unsigned char x=0;
 DQ = 1;    //DQ復(fù)位
 Delay(8);  //稍做延時
 DQ = 0;    //單片機(jī)將DQ拉低
 Delay(80); //精確延時 大于 480us
 DQ = 1;    //拉高總線
 Delay(14);
 x=DQ;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
 Delay(20);
}
/******************************************************************************/
unsigned char ReadOneChar(void)//讀一個字節(jié)
{
 unsigned char i=0;
 unsigned char dat = 0;
 for (i=8;i>0;i--)
 {
  DQ = 0; // 給脈沖信號
  dat>>=1;
  DQ = 1; // 給脈沖信號
  if(DQ)
  dat|=0x80;
  Delay(4);
 }
 return(dat);
}

/******************************************************************************/
void WriteOneChar(unsigned char dat)//寫一個字節(jié)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
  Delay(5);
  DQ = 1;
  dat>>=1;
 }
}
/******************************************************************************/
unsigned int ReadTemperature(void)//讀取溫度
{
 unsigned char a=0;
 unsigned char b=0;
 unsigned int t=0;
 float tt=0;
 Init_DS18B20();
 WriteOneChar(0xCC); // 跳過讀序號列號的操作
 WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換
 Init_DS18B20();
 WriteOneChar(0xCC); //跳過讀序號列號的操作
 WriteOneChar(0xBE); //讀取溫度寄存器
 a=ReadOneChar();  //讀低8位
 b=ReadOneChar(); //讀高8位
 t=b;
 t<<=8;
 t=t|a;
 tt=t*0.0625;
 t= tt*10+0.5; //放大10倍輸出并四舍五入
 return(t);
}
/*****************************************************************************/
//聲明
void lcm_w_ss(void);void lcm_w_mm(void);
void lcm_w_hh(void);void lcm_w_dd(void);
void lcm_w_mo(void);void lcm_w_yy(void);void lcm_w_xq(void);
unsigned char clock_in(void);
void clock_out(unsigned char dd);
void Init_1302(void);
unsigned char read_clock(unsigned char ord);
void read_clockS(void);
void Set_time(unsigned char sel);
void write_clock(unsigned char ord, unsigned char dd);
void updata (void);
/*****************************************************************************/
//常用時鐘數(shù)據(jù)讀取
void read_clockS(void){
 ss = read_clock(0x81);//讀取秒數(shù)據(jù)
 mm = read_clock(0x83);//讀取分鐘數(shù)據(jù)
 hh = read_clock(0x85);//小時
 dd = read_clock(0x87);//日
 mo = read_clock(0x89);//月
 xq = read_clock(0x8b);//星期
 yy = read_clock(0x8d);//年
}
/*****************************************************************************/
//調(diào)時用加1程序
void Set_time(unsigned char sel){ //根據(jù)選擇調(diào)整的相應(yīng)項(xiàng)目加1并寫入DS1302
  signed char address,item;
  signed char max,mini;
  lcm_w_test(0,0x9a);
  lcm_w_word("調(diào)整");
  //if(sel==6)  {lcm_w_word("秒鐘");address=0x80; max=0;mini=0;}     //秒7
  if(sel==5)  {lcm_w_word("分鐘");address=0x82; max=59;mini=0;}    //分鐘6
  if(sel==4)  {lcm_w_word("小時");address=0x84; max=23;mini=0;}    //小時5
  if(sel==3)  {lcm_w_word("星期");address=0x8a; max=7;mini=1;}    //星期4 
  if(sel==2)  {lcm_w_word("日期");address=0x86; max=31;mini=1;}    //日3
  if(sel==1)  {lcm_w_word("月份");address=0x88; max=12;mini=1;}    //月2
  if(sel==0)  {lcm_w_word("年份");address=0x8c; max=99; mini=0;}    //年1
 
  //讀取1302某地址上的數(shù)值轉(zhuǎn)換成10進(jìn)制賦給item
  item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
  if(KEY_2 == 0){
   item++;//數(shù)加 1 
  }
  if(KEY_4 == 0){
   item--;//數(shù)減 1
  }
  if(item>max) item=mini;//查看數(shù)值有效范圍  
  if(item<mini) item=max;          
  write_clock(0x8e,0x00);//允許寫操作
  write_clock(address,(item/10)*16+item%10);//轉(zhuǎn)換成16進(jìn)制寫入1302
  write_clock(0x8e,0x80);//寫保護(hù),禁止寫操作
  updata (); //刷新數(shù)據(jù)
  lcm_w_mm();//刷新 分
}
/*****************************************************************************/
//設(shè)置1302的初始時間
void Init_1302(void){//(2007年1月1日00時00分00秒星期一)
 write_clock(0x8e,0x00);//允許寫操作

 write_clock(0x8c,0x07);//年
 write_clock(0x8a,0x01);//星期
 write_clock(0x88,0x01);//月
 write_clock(0x86,0x01);//日
 write_clock(0x84,0x00);//小時
 write_clock(0x82,0x00);//分鐘
 write_clock(0x80,0x00);//秒
 write_clock(0x90,0xa5);//充電 
 write_clock(0x8e,0x80);//禁止寫操作
}
/*****************************************************************************/
//DS1302寫數(shù)據(jù)(底層協(xié)議)
void write_clock(unsigned char ord, unsigned char dd){
 clock_clk=0;
 clock_Rst=0;
 clock_Rst=1;
 clock_out(ord);
 clock_out(dd);
 clock_Rst=0;
 clock_clk=1;
}
/*****************************************************************************/
//1302驅(qū)動程序(底層協(xié)議)
void clock_out(unsigned char dd){
 ACC=dd;
 clock_dat=a0; clock_clk=1; clock_clk=0;
 clock_dat=a1; clock_clk=1; clock_clk=0;
 clock_dat=a2; clock_clk=1; clock_clk=0;
 clock_dat=a3; clock_clk=1; clock_clk=0;
 clock_dat=a4; clock_clk=1; clock_clk=0;
 clock_dat=a5; clock_clk=1; clock_clk=0;
 clock_dat=a6; clock_clk=1; clock_clk=0;
 clock_dat=a7; clock_clk=1; clock_clk=0;
}
/*****************************************************************************/
//DS1302寫入字節(jié)(底層協(xié)議)
unsigned char clock_in(void){
 clock_dat=1;
 a0=clock_dat;
 clock_clk=1; clock_clk=0; a1=clock_dat;
 clock_clk=1; clock_clk=0; a2=clock_dat;
 clock_clk=1; clock_clk=0; a3=clock_dat;
 clock_clk=1; clock_clk=0; a4=clock_dat;
 clock_clk=1; clock_clk=0; a5=clock_dat;
 clock_clk=1; clock_clk=0; a6=clock_dat;
 clock_clk=1; clock_clk=0; a7=clock_dat;
 return(ACC);
}
/*****************************************************************************/
//DS1302讀數(shù)據(jù)(底層協(xié)議)
unsigned char read_clock(unsigned char ord){
 unsigned char dd=0;
 clock_clk=0;
 clock_Rst=0;
 clock_Rst=1;
 clock_out(ord);
 dd=clock_in();
 clock_Rst=0;
 clock_clk=1;
 return(dd);
}
/*****************************************************************************/
//向LCM中填寫 年 數(shù)據(jù)
void lcm_w_yy(void){
 //if(read_clock(0x8d) != yy){
  yy = read_clock(0x8d);
  lcm_w_test(0,0x83);
  lcm_w_word("20");
  lcm_w_test(0,0x84);
  lcm_w_test(1,(yy/16)+0x30); 
  lcm_w_test(1,yy%16+0x30);
} //}
/*****************************************************************************/
//向LCM中填寫 月 數(shù)據(jù)
void lcm_w_mo(void){
 //if(read_clock(0x89) != mo){
  mo = read_clock(0x89);
  lcm_w_test(0,0x90);
   if(mo/16 != 0){lcm_w_test(1,(mo/16)+0x30);} //十位消隱
   else{lcm_w_test(1,0x20);}//同上   
  lcm_w_test(1,mo%16+0x30);
  lcm_w_test(0,0x91);
  lcm_w_word("月");
} //}
/*****************************************************************************/
//星期處理并送入LCM的指定區(qū)域
void lcm_w_xq(void){
 unsigned char sel;

 //if(read_clock(0x8b) != xq){
 xq = read_clock(0x8b);
 sel = (read_clock(0x8b))%16; //字節(jié)低4位的BCD碼放入sel
 lcm_w_test(0,0x97);//寫入指定區(qū)域(97H 第二行第8個字)
 if(sel==7)  {lcm_w_word("日");}    //
   if(sel==6)  {lcm_w_word("六");}    //
   if(sel==5)  {lcm_w_word("五");}    //
   if(sel==4)  {lcm_w_word("四");}    //
   if(sel==3)  {lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //此指令等于lcm_w_word("三"); 因?yàn)椤叭钡膬?nèi)碼失效。
   if(sel==2)  {lcm_w_word("二");}    //
   if(sel==1)  {lcm_w_word("一");}    //星期一
 lcm_w_test(0,0x95);
 lcm_w_word("星期");
 //}
}
/*****************************************************************************/
//向LCM中填寫 日 數(shù)據(jù)
void lcm_w_dd(void){
// if(read_clock(0x87) != dd){
  dd = read_clock(0x87);
  lcm_w_test(0,0x92);
   if(dd/16 != 0){lcm_w_test(1,(dd/16)+0x30);} //十位消隱
   else{lcm_w_test(1,0x20);}//同上 
  lcm_w_test(1,dd%16+0x30);
  lcm_w_test(0,0x93);
  lcm_w_word("日  ");
    
} //}
/*****************************************************************************/
//向LCM中填寫 小時 數(shù)據(jù)
void lcm_w_hh(void){
 if(read_clock(0x85) != hh){
  hh = read_clock(0x85);
   if (hh > 0x07 && hh < 0x22 && w == 0){
    beep = 0; led_r = 0;
    DelayM(100);
    beep = 1; led_r = 1;
   }
  }
  lcm_w_test(0,0x88);
  lcm_w_test(1,(hh/16)+0x30);
  lcm_w_test(1,hh%16+0x30);
    
} //}
/*****************************************************************************/
//向LCM中填寫 分鐘 數(shù)據(jù)
void lcm_w_mm(void){
 if(read_clock(0x83) != mm){  
  mm = read_clock(0x83);
  if( w == 0){    
   days();    //節(jié)日顯示
   updata (); //刷新數(shù)據(jù)
  }    
 }
 lcm_w_test(0,0x89); 
 lcm_w_test(1,0x3a);   //":"
 lcm_w_test(1,(mm/16)+0x30);
 lcm_w_test(1,mm%16+0x30);
 lcm_w_test(1,0x2e);  //"." 
}
/*****************************************************************************/
//刷新數(shù)據(jù)
void updata (void){
  lcm_w_hh();//刷新 小時
  lcm_w_dd();//刷新 日
  lcm_w_xq();//更新星期值 
  lcm_w_mo();//刷新 月
  lcm_w_yy();//刷新 年
  
}
/*****************************************************************************/
//向LCM中填寫 秒 數(shù)據(jù)
void lcm_w_ss(void){
 unsigned int i=0;
 unsigned char a=0,b=0,c=0;
 if(read_clock(0x81) != ss){ //判斷是否需要更新
  ss = read_clock(0x81); //更新數(shù)據(jù)
  lcm_w_test(0,0x8b);  //秒值在LCM上的寫入位置
  lcm_w_test(1,(ss/16)+0x30); //寫十位  
  lcm_w_test(1,ss%16+0x30); //寫個位
  led_b = ~led_b;    //背光閃爍
  lcm_w_mm();//刷新 分  
 lcm_w_test(0,0x8d);  //溫度在LCM上的寫入位置  
 i=ReadTemperature();//讀溫度并送顯
 a=i/100;
 lcm_w_test(1,a+0x30); //顯示溫度十位
 b=i/10-a*10;
 lcm_w_test(1,b+0x30); //個位
 lcm_w_test(1,0x2e);  //"."
 c=i-a*100-b*10;
 lcm_w_test(1,c+0x30); //小位1位  
 lcm_w_word("℃"); //度C
} }
/*****************************************************************************/
//---主程序---//

main() {
 
 unsigned char e=0;
 KEY_I = 0;KEY_1 = 1;KEY_2 = 1;KEY_3 = 1;KEY_4 = 1;//初始鍵盤
 yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各數(shù)據(jù)刷新
  beep = 0;
  DelayM(900);
  beep = 1;
 lcm_init();//初始化液晶顯示器
 lcm_clr();//清屏
 lcm_w_word("  12864LcdClock                  Hello !!       from DoYoung.net");//顯示歡迎字
 //----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//標(biāo)尺
 DelayM(3000); //顯示等留3秒
 //lcm_w_test(0,0x80);
 //lcm_w_word("[Dis]      [Set]");

while(1){
  if (w == 0){   //正常走時
  lcm_w_ss();//刷新 秒
  }
  else {  //啟動調(diào)時


  }

  //------------------------------------------------------------------
  if (KEY_3 == 0) // 設(shè)置時間
       {
         DelayM(20);    //去抖
   led_g3 = 0;led_r = 1;
   if(KEY_3 == 0 && w == 1)  //當(dāng)是調(diào)時狀態(tài) 本鍵用于調(diào)整下一項(xiàng)
   {
    e++;
    if (e >= 6 ){e = 0;}
    Set_time(e);//調(diào)整    
   }
   
   if(KEY_3 == 0 && w == 0)  //當(dāng)是正常狀態(tài)時就進(jìn)入調(diào)時狀態(tài)
   {
    led_b = 1;//
    lcm_clr();//清屏
    //yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各數(shù)據(jù)刷新
    w=1;   //進(jìn)入調(diào)時    
    lcm_w_test(0,0x9e);
    lcm_w_word(" [-]");
    lcm_w_test(0,0x80);
    lcm_w_word("[Esc]");
    lcm_w_test(0,0x85);
    lcm_w_word("[Next]");
    lcm_w_test(0,0x98);
    lcm_w_word("[+]");
    Set_time(e);//調(diào)整
   }
         while(KEY_3 == 0);//等待鍵松開
   led_g3 = 1; led_r = 0;//紅燈亮,表示調(diào)時 
       }

  //------------------------------------------------------------------
  if (KEY_1 == 0) // 當(dāng)在調(diào)時狀態(tài)時就退出調(diào)時
       {
         DelayM(20);led_g1 = 0;led_r = 1;
         if(KEY_1 == 0 && w == 1){    
    w = 0;   //退出調(diào)時
    e = 0;  //“下一項(xiàng)”計(jì)數(shù)器清0        
   }

   if(KEY_1 == 0 && w == 0){    
    lcm_clr();//清屏
    lcm_w_test(0,0x80);
    lcm_w_word("  12864LcdClock V1.01 2006-11-26 Hello !!       from DoYoung.net");
    //----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//標(biāo)尺    
    while(KEY_1 == 0);//等待鍵松開 
   }
    lcm_clr();//清屏
    //lcm_w_word("[Dis]      [Set]");
    //yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各數(shù)據(jù)刷新    
    days();    //節(jié)日顯示
    updata (); //刷新數(shù)據(jù)
    lcm_w_mm();//刷新 分
    

         while(KEY_1 == 0);//等待鍵松開 
   led_g1 = 1;
       }

  //------------------------------------------------------------------
  if (KEY_2 == 0 && w == 1){ // 加減調(diào)整{
         DelayM(20);led_g2 = 0;led_r = 1;
         if(KEY_2 == 0 && w == 1){    
    Set_time(e);//調(diào)整
   }
         while(KEY_2 == 0);//等待鍵松開
   led_g2 = 1; led_r = 0;  
       }

  //------------------------------------------------------------------
  if (KEY_4 == 0 && w == 1){ // 加減調(diào)整       
         DelayM(20); led_g4 = 0;led_r = 1;
         if(KEY_4 == 0 && w == 1){    
    Set_time(e);//調(diào)整
   }
         while(KEY_4 == 0);//等待鍵松開
   led_g4 = 1; led_r = 0;  
       }

    //------------------------------------------------------------------
   if(KEY_1 == 1 && KEY_2 == 0 && KEY_3 == 1 && KEY_4 == 0){ //時鐘初始化{
   led_r = 0;
   DelayM(3000);
   led_r = 1;
   if(KEY_1 == 0 && KEY_2 == 0&& KEY_3 == 1&& KEY_4 == 0){
    Init_1302();
       lcm_w_test(0,0x80);
    lcm_clr();//清屏
    lcm_w_word("初始化成功!    2007-1-1 00:00.0");
    //----------|-------1-------|-------3-------| 
    while(1);
   }
  }   
} }

/*****************************************************************************/
/*
//編程日志
2007-02-10 修改為正式發(fā)布版。
2007-01-26 用每分鐘刷新數(shù)據(jù),防止顯示亂碼。
2006-11-30
2006-11-29 時鐘主顯示部分完成。
2006-11-28 時鐘驅(qū)動程序植入完成。
2006-11-27 LCM驅(qū)動程序植入完成。
2006-11-26 硬件制作完成。

/*****************************************************************************/

完整程序請點(diǎn)下面的下載文件:

28X64LCD萬年歷

12864LCD電子鐘說明文檔:

temp_08012317175152.rar

12864LCD資料:
temp_08012317187853.rar

DS1302資料:


temp_08012317187210.rar

 

  • 上一篇: 點(diǎn)陣式LED簡單圖形顯示技術(shù)
  • 下一篇: 電子萬年歷
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請聯(lián)系機(jī)電之家,機(jī)電之家將及時作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會
    中國行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1