久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1693|回復: 2
打印 上一主題 下一主題
收起左側

12864數字鐘程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:202895 發表于 2018-12-27 22:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/*------------------------------------------------------------------------------------------
  名稱:12864萬歷時鐘
  內容:顯示年月日、24小時、星期、所在年份、實時溫度基本功能,帶1路可設置鬧鐘;亮屏20s自動熄滅
  晶振:12MHZ
  單片機:AT89S52
  顯示屏:12864帶中文字庫
  DS18B20數字溫度采集

  作者:愛好者
  交流QQ群:481250892
  日期:2017/8/5
////////////////////////////////////////////////////////////////////////////////////////////

  按鍵功能:
sbit k1=P3^0;  //單獨使用  鬧鐘響起時關閉鬧鈴、亮屏

sbit k2=P3^1;  //菜單           設置功能鍵
sbit k3=P3^2; //確認           確認鍵
sbit k4=P3^3; //+                   加
sbit k5=P3^4; //-                   減

備注:當畫面處于主頁界面:(1)只有k2按鍵有效。
                          (2)k3、k4同時按下可快速打開或關閉鬧鐘

      當畫面處于設置界面:(1)k2、k3同時按下直接返回主頁
////////////////////////////////////////////////////////////////////////////////////////////
12864引腳接線
sbit RS = P2^3;
sbit RW = P2^4;
sbit E  = P2^5;
sbit RES = P2^7;
sbit PSB = P2^0;
sbit LCD_led=P1^2;        //背光控制
#define DataPort P0        //MCU P0<------> LCD_12864 data
-------------------------------------------------------------------------------------------------*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

sbit RS = P2^3;
sbit RW = P2^4;
sbit E  = P2^5;
sbit RES = P2^7;
sbit PSB = P2^0;
sbit LCD_led=P1^2;        //背光控制

sbit k1=P3^0;  //主頁面
sbit k2=P3^1;  //菜單
sbit k3=P3^2; //確認
sbit k4=P3^3; //+
sbit k5=P3^4; //-
sbit deep=P1^0;  //鬧鐘響鈴輸出

#define DataPort P0        //MCU P0<------> LCD_12864 data

uchar num,num1=55,num2=59,num3=23,max,wan,qian,bai,shi,ge,nian=17,yue=8,ri=1;
uchar n_num1,n_num2,n_num3;
uchar day=1,k=0,dip=0,flag=0,clok=0,set=0,set_time=0,set_t=0;
uchar t_set=0;
uint tr1_time=0;

//-----------------------------------------------
uchar xdata lcdPosX, lcdPosY;                                                        //X,Y坐標
uchar xdata halfScr, halfLineCnt, basicBlock;                        //半屏,半屏行數,N*8塊
//-----------------------------------------------

sbit DQ=P1^1;                //18B20數據接口
uchar point,n,temp,flag,aa;
uchar code ditab[16]= {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; //小數補償

////////////////////////////////////////////////////////////////////////

//設定哪一行,從那一個位置開始到那一個位置結束使用反白   
//x=液晶屏上漢字的位置(1~8);end_x=漢字結束的地址(1~8);y=1~4行   
//clear=1:清除反白;clear=0:設置反白;   
void Set_White(uchar x,uchar y,uchar end_x,uchar clear);
/*------------------------------------------------
uS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
mS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void delay(uint t)
{
        uint i,j;
        for(i=t;i>0;i--)
        for(j=112;j>0;j--);
}
void delays(uint t) //微妙延時
{
for(;t>0;t--);
}
/*---------------------------------------------------------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------------------------------------------------------*/
unsigned char code sum[11][64]={       

{// 圖片數字0
0x00,0x00,0x3F,0xFC,0x5F,0xFA,0x6F,0xF6,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,
0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x60,0x06,0x40,0x02,0x00,0x00,
0x40,0x02,0x60,0x06,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,
0x70,0x0E,0x70,0x0E,0x70,0x0E,0x6F,0xF6,0x5F,0xFA,0x3F,0xFC,0x00,0x00,0x00,0x00},       
{// 圖片數字1
0x00,0x00,0x00,0x20,0x00,0x60,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,
0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0x60,0x00,0x20,0x00,0x00,0x00,0x20,
0x00,0x60,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,
0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0x60,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00},
{// 圖片數字2
0x00,0x00,0x3F,0xFC,0x1F,0xFA,0x0F,0xF6,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,
0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x06,0x1F,0xFA,0x3F,0xFC,
0x5F,0xF8,0x60,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,
0x70,0x00,0x70,0x00,0x70,0x00,0x6F,0xF8,0x5F,0xFC,0x3F,0xFE,0x00,0x00,0x00,0x00},       
{// 圖片數字3
0x00,0x00,0x3F,0xFC,0x1F,0xFA,0x0F,0xF6,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,
0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x06,0x1F,0xFA,0x3F,0xFC,
0x1F,0xFA,0x00,0x06,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,
0x00,0x0E,0x00,0x0E,0x00,0x0E,0x0F,0xF6,0x1F,0xFA,0x3F,0xFC,0x00,0x00,0x00,0x00},       
{// 圖片數字4
0x00,0x00,0x40,0x02,0x60,0x06,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,
0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x60,0x06,0x5F,0xFA,0x3F,0xFC,
0x1F,0xFA,0x00,0x06,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,
0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x06,0x00,0x02,0x00,0x00,0x00,0x00},       
{// 圖片數字5
0x00,0x00,0x3F,0xFC,0x5F,0xF8,0x6F,0xF0,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,
0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x60,0x00,0x5F,0xF8,0x3F,0xFC,
0x1F,0xFA,0x00,0x06,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,
0x00,0x0E,0x00,0x0E,0x00,0x0E,0x0F,0xF6,0x1F,0xFA,0x3F,0xFC,0x00,0x00,0x00,0x00},       
{// 圖片數字6
0x00,0x00,0x3F,0xFC,0x5F,0xF8,0x6F,0xF0,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,
0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x60,0x00,0x5F,0xF8,0x3F,0xFC,
0x5F,0xFA,0x60,0x06,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,
0x70,0x0E,0x70,0x0E,0x70,0x0E,0x6F,0xF6,0x5F,0xFA,0x3F,0xFC,0x00,0x00,0x00,0x00},       
{// 圖片數字7
0x00,0x00,0x3F,0xFC,0x1F,0xFA,0x0F,0xF6,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,
0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x06,0x00,0x02,0x00,0x00,
0x00,0x02,0x00,0x06,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,
0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x06,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00},
{// 圖片數字8
0x00,0x00,0x3F,0xFC,0x5F,0xFA,0x6F,0xF6,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,
0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x60,0x06,0x5F,0xFA,0x3F,0xFC,
0x5F,0xFA,0x60,0x06,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,
0x70,0x0E,0x70,0x0E,0x70,0x0E,0x6F,0xF6,0x5F,0xFA,0x3F,0xFC,0x00,0x00,0x00,0x00},       
{// 圖片數字9
0x00,0x00,0x3F,0xFC,0x5F,0xFA,0x6F,0xF6,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,
0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x60,0x06,0x5F,0xFA,0x3F,0xFC,
0x1F,0xFA,0x00,0x06,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,
0x00,0x0E,0x00,0x0E,0x00,0x0E,0x1F,0xF6,0x3F,0xFA,0x7F,0xFC,0x00,0x00,0x00,0x00},       
{// 圖片":"        10
//6X6方點
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x07,0xE0,
0x07,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xE0,
0x07,0xE0,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
};

//16x16圖標-----------------------------------------------------------------//
//PCtoLCD2002取模:順向,逐行式/
unsigned char code bmp1616[5][32]={
//"℃"          tt=0
{0x00,0x00,0x30,0x00,0x48,0x00,0x49,0xC0,0x33,0xE8,0x06,0x38,0x0C,0x18,0x0C,0x08,
0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x06,0x08,0x03,0x10,0x01,0xE0,0x00,0x00},     

//溫度計圖標
{0x00,0x00,0x01,0x80,0x02,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x02,0xC0,0x02,0x40,
0x02,0xC0,0x02,0x40,0x03,0xC0,0x07,0xE0,0x0F,0xF0,0x0F,0xF0,0x07,0xE0,0x03,0xC0},

//鬧鐘圖標
{
0x00,0x00,0x38,0x1C,0x60,0x06,0x43,0xC2,0x4C,0x32,0x11,0x08,0x11,0x08,0x21,0x04,
0x21,0xF4,0x20,0x04,0x10,0x08,0x10,0x08,0x0C,0x30,0x13,0xC8,0x20,0x04,0x00,0x00},

//無任何圖片顯示
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},


//。顯示
{
0x00,0x00,0x00,0x00,0x07,0xE0,0x08,0x10,0x10,0x08,0x20,0x04,0x20,0x04,0x21,0x84,
0x21,0x84,0x20,0x04,0x20,0x04,0x10,0x08,0x08,0x10,0x07,0xE0,0x00,0x00,0x00,0x00,}
};
/*********************************************************/

/*---------------------------------------------------------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------------------------------------------------------*/

/*------------------------------------------------
                    檢測忙位
------------------------------------------------*/
void Check_Busy()
{  
    RS=0;
    RW=1;
    E=1;
    DataPort=0xff;
    while((DataPort&0x80)==0x80);//忙則等待
    E=0;
}
/*------------------------------------------------
                   寫命令
------------------------------------------------*/
void Write_Cmd(unsigned char Cmd)
{
        Check_Busy();
        RS=0;
        RW=0;
        E=1;
        DataPort=Cmd;
        DelayUs2x(5);
        E=0;
        DelayUs2x(5);
}
/*------------------------------------------------
                    寫數據
------------------------------------------------*/
void Write_Data(unsigned char Data)
{
        Check_Busy();
        RS=1;
        RW=0;
        E=1;
        DataPort=Data;
        DelayUs2x(5);
        E=0;
        DelayUs2x(5);
}
/*------------------------------------------------
                   液晶屏初始化
------------------------------------------------*/
void Init_ST7920()
{  
         PSB = 1; //并口方式
         delay(1);            //延時
         Write_Cmd(0x30); //基本指令, 擴充指令為34H
         delay(10);
         RES=0;                 //復位
         delay(1);            //延時
         RES=1;   
         Write_Cmd(0x0c); //顯示開, 關光標
         delay(10);
         Write_Cmd(0x01); //清屏
         delay(10);
}

/*------------------------------------------------
                   顯示字符串
x:橫坐標值,范圍0~8
y:縱坐標值,范圍1~4
*s指針,表示對s地址中的內容進行操作
------------------------------------------------*/
void LCD_PutString(unsigned char x,unsigned char y,unsigned char *s)
{
switch(y)
     {
          case 1: Write_Cmd(0x80+x);break;
          case 2: Write_Cmd(0x90+x);break;
          case 3: Write_Cmd(0x88+x);break;
          case 4: Write_Cmd(0x98+x);break;
      default:break;
         }
while(*s>0)
   {
      Write_Data(*s);
      s++;
      DelayUs2x(50);
   }
}

/*------------------------------------------------
                      清屏
------------------------------------------------*/
void ClrScreen()
{
   Write_Cmd(0x01);
   delay(15);
}
          
///*------------------------------------------------
//                   顯示圖片
//------------------------------------------------*/
//void LCD_PutGraphic(unsigned char code *img)
//{
// int i,j;
////顯示上半屏內容設置
//   for(i=0;i<32;i++)            
//    {
//      Write_Cmd(0x80 + i); //SET  垂直地址 VERTICAL ADD
//      Write_Cmd(0x80);     //SET  水平地址 HORIZONTAL ADD
//      for(j=0;j<16;j++)
//       {
//         Write_Data(*img);
//         img++;
//       }
//    }
////顯示下半屏內容設置
//   for(i=0;i<32;i++)            
//    {
//      Write_Cmd(0x80 + i); //SET 垂直地址 VERTICAL ADD
//      Write_Cmd(0x88);     //SET 水平地址 HORIZONTAL ADD
//      for(j=0;j<16;j++)
//       {
//         Write_Data(*img);
//         img++;
//       }
//    }  
//           
//}

/*------------------------------------------------
                   白屏
------------------------------------------------*/
void LCD_cluck(void)
{
        int i,j;
//顯示上半屏內容設置
   for(i=0;i<32;i++)            
    {
      Write_Cmd(0x80 + i); //SET  垂直地址 VERTICAL ADD
      Write_Cmd(0x80);     //SET  水平地址 HORIZONTAL ADD
      for(j=0;j<16;j++)
       {
         Write_Data(0x00);
         //img++;
       }
    }
//顯示下半屏內容設置
   for(i=0;i<32;i++)            
    {
      Write_Cmd(0x80 + i); //SET 垂直地址 VERTICAL ADD
      Write_Cmd(0x88);     //SET 水平地址 HORIZONTAL ADD
      for(j=0;j<16;j++)
       {
         Write_Data(0x00);
       }
    }  

}


/*------------------------------------------------
                 設置到繪圖模式
------------------------------------------------*/
void SetGraphicMode()
{
   Write_Cmd(0x36);       //關閉繪圖顯示功能
   DelayUs2x(20);

}

void SetNormalMode()
{
   Write_Cmd(0x30);       //打開繪圖顯示功能
   DelayUs2x(20);

}
void huatu(unsigned char x,unsigned char code *img)
{
        unsigned char i,j;
        SetGraphicMode();
        for(i=0;i<32;i++)
        {
                if(i<16)
                {
                        Write_Cmd(0x80+16+i);      //將D15 ——D8寫入到RAM中
                        Write_Cmd(0x80+x);
                }
                if(i>=16)
                {
                        Write_Cmd(0x80+i-16);      //將D7——D0寫入到RAM中;
                        Write_Cmd(0x88+x);       
                }
                for(j=0;j<2;j++)
                {
                        Write_Data(*img);
                img++;       
                }       
        }
        SetNormalMode();       
}
/*使用繪圖的方法讓一個16*16的漢字符反白----------------------------------------------*/
//形式參數:uchar x,uchar y,uchar wide,uchar bkcor
//行參說明:坐標水平位置,坐標垂直位置,反白行數,要反白還是清除(1:反白,0:清除)   
void write1616GDRAM(uchar x,uchar y,uchar sign,uchar *bmp)       
{                  //x-列,y-行,sign-反白選擇(1不反白,0反白),bmp-圖畫的選擇
        uchar i,j,basex;
        Write_Cmd(0x36);      //擴展指令,繪圖模式命令,開顯示也可以繪.(關圖片顯示0x34)
        if(y==1||y==2)          //第一第二行
        {
                basex=0x80;           //上半屏
                y=(y-1)*16;          //垂直位址從0X80開始.
        }
        if(y==3||y==4)        //第三第四行
        {
                basex=0x88;         //下半屏
                y=(y-3)*16;         //垂直位址都是從0X80開始的,不管上下半屏。
        }
        for(i=0;i<16;i++)        //
        {                                                                                                                       
                Write_Cmd(0x80+y+i);  //寫入垂直位址。
                Write_Cmd(basex+x-1); //再寫入水平位址(上半屏第一字為0X80,……第七字為0X87)
                                                           //下半屏第一字為0X88,……第七字為0X8F;
                for(j=0;j<2;j++)   //再寫入兩個8位元的數據,AC會自動增一,接著寫數據
                {
                        if(sign==1)  
                                Write_Data(~(*bmp++));
                        else  
                                Write_Data(*bmp++);
                }
        }       
        Write_Cmd(0x36);  //寫完數據,開圖片顯示     
}
/**************************************************************************************
//函數功能:顯示16X16圖形,適用于st7920型液晶
//形式參數:uchar x,uchar y,uchar *bmp
//行參說明:橫坐標X列,縱坐標Y行,sign=1反白、=0不反,tt是要顯示的圖形bmp1616中的第幾個
//************************************************************************************/
void set1616pic(uchar x,uchar y,uchar sign,uchar tt)
{                                //x-列,y-行,sign-反白選擇(1不反白,0反白),tt-圖畫的選擇
        uchar (*pp)[32];         //定義指針
        pp=bmp1616;          //二維數組首地址給指針,故指針指向下一個數組地址應為加64
        write1616GDRAM(x,y,sign,pp[tt]); //寫入小時的十位          
}

/******************************************************************************/
//十二生肖顯示
/******************************************************************************/
void lcmshengxiao()
{
  uchar y=0;
  y=(2000+nian-1900)%12;
switch(y)
{
  case 0:         LCD_PutString(0, 4,"子鼠");
          break;
  case 1:         LCD_PutString(0, 4,"丑牛");
          break;
  case 2:         LCD_PutString(0, 4,"寅虎");
          break;
  case 3:          LCD_PutString(0, 4,"卯兔");
          break;
  case 4:          LCD_PutString(0, 4,"辰龍");
          break;
  case 5:         LCD_PutString(0, 4,"巳蛇");
          break;
  case 6:         LCD_PutString(0, 4,"午馬");
          break;
  case 7:         LCD_PutString(0, 4,"未羊");
          break;
  case 8:          LCD_PutString(0, 4,"申猴");
          break;
  case 9:          LCD_PutString(0, 4,"酉雞");
          break;
  case 10:  LCD_PutString(0, 4,"戌狗");
          break;
  case 11:         LCD_PutString(0, 4,"亥豬");
          break;
}
}

/*------------------------------------------------
                    定時器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
        TMOD=0x11;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;         //定時器開關打開
        ET1=1;
        TR1=1;         //定時器開關打開
}



/*------------------------------------------------
                 調時
------------------------------------------------*/
void set1_TIME(void)                                        //時間設置
{
        LCD_PutString(0,1,"設置: ");        //設置時、分、日期
           Write_Cmd(0x90+2);
        Write_Data(0x30+num3/10);
        Write_Data(0x30+num3%10);
        Write_Data(0x3a);
        Write_Data(0x30+num2/10);
        Write_Data(0x30+num2%10);
        Write_Data(0x3a);
        Write_Data(0x30+num1/10);
        Write_Data(0x30+num1%10);
                                                 //日期
        Write_Cmd(0x98+1);
        Write_Data(0x32);
        Write_Data(0x30);
        Write_Data(0x30+nian/10);
        Write_Data(0x30+nian%10);
        LCD_PutString(3,5,"年");
        Write_Data(0x30+yue/10);
        Write_Data(0x30+yue%10);
        LCD_PutString(5,5,"月");
        Write_Data(0x30+ri/10);
        Write_Data(0x30+ri%10);
        LCD_PutString(7,5,"日");
        LCD_PutString(5,1,"sun: ");                  //星期
        Write_Cmd(0x80+7);
        Write_Data(0x30+day);
                                 
        if(t_set==0)        {Write_Cmd(0x88+2);        Write_Data(0x1e);Write_Cmd(0x90+7);        Write_Data(0x20);}
        if(t_set==1)        {Write_Cmd(0x88+4);        Write_Data(0x1e);Write_Cmd(0x88+2);        Write_Data(0x20);}
        if(t_set==2)        {Write_Cmd(0x88+5);        Write_Data(0x1e);Write_Cmd(0x88+4);        Write_Data(0x20);}                                       
        if(t_set==3)        {Write_Cmd(0x88+2);        Write_Data(0x1f);Write_Cmd(0x88+5);        Write_Data(0x20);}
        if(t_set==4)        {Write_Cmd(0x88+4);        Write_Data(0x1f);Write_Cmd(0x88+2);        Write_Data(0x20);}
        if(t_set==5)        {Write_Cmd(0x88+6);        Write_Data(0x1f);Write_Cmd(0x88+4);        Write_Data(0x20);}                                       
        if(t_set==6)        {Write_Cmd(0x90+7);        Write_Data(0x1e);Write_Cmd(0x88+6);        Write_Data(0x20);}                                         
                                                 
}
/*------------------------------------------------
                 鬧鐘
-------------------------------------------------*/
void set3_clok(void)
{
        LCD_PutString(0,1,"鬧鐘設置: ");        //設置時、分、日期
           Write_Cmd(0x90+2);
        Write_Data(0x30+n_num3/10);
        Write_Data(0x30+n_num3%10);
        Write_Data(0x3a);
        Write_Data(0x30+n_num2/10);
        Write_Data(0x30+n_num2%10);
        Write_Data(0x3a);
        Write_Data(0x30+n_num1/10);
        Write_Data(0x30+n_num1%10);
        LCD_PutString(0,4,"狀態 : ");        //
        if(clok==0)         LCD_PutString(3,4,"關閉");
    if(clok==1)         LCD_PutString(3,4,"開啟");
        if(t_set==0)        {Write_Cmd(0x88+2);        Write_Data(0x1e);Write_Cmd(0x98+5);        Write_Data(0x20);}
        if(t_set==1)        {Write_Cmd(0x88+4);        Write_Data(0x1e);Write_Cmd(0x88+2);        Write_Data(0x20);}
        if(t_set==2)        {Write_Cmd(0x88+5);        Write_Data(0x1e);Write_Cmd(0x88+4);        Write_Data(0x20);}                                       
        if(t_set==3)        {Write_Cmd(0x98+5);        Write_Data(0x11);Write_Cmd(0x88+5);        Write_Data(0x20);}
                                                         
                                               
}

/*--------------------------------------------------------------------------------------------------------------------------------
                 18B20溫度
--------------------------------------------------------------------------------------------------------------------------------*/
void ow_reset(void) //18B20復位
{
  uint i;               
  DQ=0;
  i=103;
  while(i>0)i--;
  DQ=1;
  i=4;
  while(i>0)i--;
}
/* 等待應答脈沖 */
void Rx_Wait(void)
{
        uint i;       
        while(DQ);       
        while(~DQ);                        // 檢測到應答脈沖
        i = 4;
        while (i>0)i--;
}
void write_byte(uchar val) //寫字節
{
        uchar i;
        for(i=8;i>0;i--)
        {
                DQ=1;_nop_();_nop_();
                DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
                DQ=val&0x01;
                delays(6);
                val>>=1;
        }
        DQ=1;
        delays(1);
}
//讀字節
uchar read_byte(void)
{
        uchar i;
        uchar value=0;
        for(i=8;i>0;i--)
        {
                DQ=1;_nop_();_nop_();
                value >>=1;
                DQ=0;
                _nop_();_nop_();_nop_();_nop_();
                DQ=1;
                _nop_();_nop_();_nop_();_nop_();
                if(DQ) value|=0x80;
                delays(6);
        }
        DQ=1;
        return(value);
}
//18B20初始化
void tmpchange(void)  
{
  ow_reset();     //復位      
  Rx_Wait();     //等待應答信號   
  write_byte(0xcc); //跳過序列號
  write_byte(0x44);  //發轉換命令
}
//讀溫度函數
void read_temp()
{
        uchar temp_l,temp_h;//定義高低字節
        ow_reset();
        Rx_Wait();        //等待應答信號
        write_byte(0xcc); //跳過序列號
        write_byte(0xbe); //讀取暫存器內容
        temp_l=read_byte(); //低字節在前
        temp_h=read_byte(); //高字節在后
        if(temp_h>127) //溫度小于0度時取補
        {
                temp_h=(~temp_h);
                temp_l=(~temp_l)+1; //取反加一,將補碼變成原碼
                n=1;
        }
        else n=0;
        temp=((temp_l&0xf0)>>4)|((temp_h&0x0f)<<4);
        point=temp_l&0x0f;  
}
//讀出溫度數據進行分離,在顯示屏上顯示
void dis_temp()
{

        if(n==0)//溫度大于0度
        {
                Write_Cmd(0x98+5);
        //        Write_Data(0x30+temp/10);
                Write_Data(0x30+(temp%100)/10);
                Write_Data(0x30+temp%10);
                Write_Data(0x2e);
                Write_Data(0x30+ditab[point]);
        }
        //溫度小于0度
        if(n==1)
        {
                  Write_Cmd(0x98+5);
                  Write_Data('-');
                  Write_Data(0x30+(temp%100)/10);
                  Write_Data(0x30+temp%10);

        }
}
/*--------------------------------------------------------------------------------------------------------------------------------
                 12864液晶屏顯示
--------------------------------------------------------------------------------------------------------------------------------*/

void display()
{         
        if(dip==0)                        //模式0顯示-主界面
        {
                 huatu(0,sum[max=num3/10]);                                //時
                 huatu(1,sum[wan=num3%10]);
                 huatu(2,sum[10]);
                 huatu(3,sum[qian=num2/10]);                        //分
                 huatu(4,sum[bai=num2%10]);
                 huatu(5,sum[10]);
                 huatu(6,sum[shi=num1/10]);                                //秒
                 huatu(7,sum[ge=num1%10]);
                 LCD_PutString(6,1,"周");                                         //星期
                 if(day==1)          LCD_PutString(7,1,"一");
                 if(day==2)          LCD_PutString(7,1,"二");
                 if(day==3)          LCD_PutString(7,1,"三");
                 if(day==4)          LCD_PutString(7,1,"四");
                 if(day==5)          LCD_PutString(7,1,"五");
                 if(day==6)          LCD_PutString(7,1,"六");
                 if(day==7)          LCD_PutString(7,1,"日");
                 lcmshengxiao();                                  //顯示所在年分的生肖
               

tmpchange();//轉換初始化
read_temp();//讀出溫度
dis_temp();//顯示溫度
                   //日期
                Write_Cmd(0x80);
                Write_Data(0x32);
                Write_Data(0x30);
                Write_Data(0x30+nian/10);
                Write_Data(0x30+nian%10);
                Write_Data('-');
                Write_Data(0x30+yue/10);
                Write_Data(0x30+yue%10);
                 Write_Data('-');
                Write_Data(0x30+ri/10);
                Write_Data(0x30+ri%10);
                set1616pic(8,4,0,0);        //溫度符號
                set1616pic(5,4,0,1);         //溫度圖標

                 if(clok==0)                          //鬧鐘關閉標志
                 {       
                         set1616pic(4,4,0,3);
                         deep=1;                          //鬧鐘輸出關閉
                 }
                 if(clok==1)                          //鬧鐘開啟標志
                 {
                         set1616pic(4,4,0,2);
                        if((n_num3==num3)&&(n_num2==num2)&&(n_num1==num1))          //鬧鐘時間到達,開啟鬧鐘
                        {
                                deep=0;
                        }
                        if((n_num3!=num3)||(n_num2!=num2))           //鬧鐘時間過期,關閉鬧鐘
                        {
                                deep=1;
                        }
                 }
        }
        if(dip==1)                        //模式1顯示        --菜單
        {
               
        if(flag==0)
        {
                TR0=0;
                Init_ST7920();                //液晶屏初始化
                SetGraphicMode();   //設置成繪圖模式
                LCD_cluck();            //液晶屏顯示為白屏,進行清屏
                delay(500);
                SetNormalMode();        //設置成文字模式
                flag=1;
        }

                //顯示菜單
                LCD_PutString(1,1,"1.時間設置");        //設置時、分、日期
                LCD_PutString(1,2,"2.鬧鐘設置");        //鬧鐘時間設置
                LCD_PutString(1,3,"3.鬧鐘開關");        //鬧鐘 開、關
                if(clok==0)         LCD_PutString(7,3,"×");
                if(clok==1)         LCD_PutString(7,3,"√");
                LCD_PutString(0,4,"確認        取消");        //鬧鐘 開、關
                if(set==0)       
                {
                        LCD_PutString(0,1,"☆");
                        LCD_PutString(0,2,"  ");
                        LCD_PutString(0,3,"  ");
                }       
                if(set==1)       
                {
                        LCD_PutString(0,1,"  ");
                        LCD_PutString(0,2,"☆");
                        LCD_PutString(0,3,"  ");
                }
                if(set==2)       
                {
                        LCD_PutString(0,1,"  ");
                        LCD_PutString(0,2,"  ");
                        LCD_PutString(0,3,"☆");
                }
        }
        if(dip==4)                  ////模式4顯示,時間設置界面
        {
        if(set_time==0)
        {
                set_time=1;
    Init_ST7920();                //液晶屏初始化
        SetGraphicMode();   //設置成繪圖模式
        LCD_cluck();            //液晶屏顯示為白屏,進行清屏
        delay(500);
         SetNormalMode();        //設置成文字模式
       
        }
                set1_TIME();
        }
        if(dip==5)                         ////模式5顯示,鬧鐘設置界面
        {
        if(set_time==0)
        {
                set_time=1;
    Init_ST7920();                //液晶屏初始化
        SetGraphicMode();   //設置成繪圖模式
        LCD_cluck();            //液晶屏顯示為白屏,進行清屏
        delay(500);
         SetNormalMode();        //設置成文字模式
       
        }
                set3_clok();
        }
}

/*-------------------------------------------------------------------------------------
                    按鍵識別
-------------------------------------------------------------------------------------*/
void key1()
{
///////////////////////////////////////////////////////////////////////
        if(((k2==0)&&(k3==0))&&(dip!=0))                        //返回主頁面
        {
                delay(5);
                if(((k2==0)&&(k3==0))&&(dip!=0))
                {
                        tr1_time=0;
                        TR1=1;
                        while(!k2||!k3);
        dip=0,flag=0,set=0,set_time=0,set_t=0,TR0=1,t_set=0;;
        Init_ST7920();                //液晶屏初始化
        SetGraphicMode();   //設置成繪圖模式
        LCD_cluck();            //液晶屏顯示為白屏,進行清屏
        delay(500);
                }
        }
//////////////////////////////////////////////////////////////////
        if((k2==0)&&(dip==0))                                           //菜單鍵
        {
                delay(5);
                if((k2==0)&&(dip==0))
                {
                        while(!k2);
                        tr1_time=0;
                        TR1=1;
                        dip=1;
//                        if(dip==2)
//                        {
//                                dip=0;
//                                set=0;
//                Init_ST7920();                //液晶屏初始化
//                SetGraphicMode();   //設置成繪圖模式
//                LCD_cluck();            //液晶屏顯示為白屏,進行清屏
//                delay(500);
//                        TR0=1;
//                        flag=0;       
//                        }
                }
        }
/////////////////////////菜單設置界面/////////////////////////////////////////
if(dip==1)
{
        if(k4==0)                //菜單往下
        {
                delay(5);
                if(k4==0)
                {
                        while(!k4);
                        set++;
                        if(set==3)
                        {
                                set=0;
                        }
                }
        }

        if(k5==0)                //菜單往上
        {
                delay(5);
                if(k5==0)
                {
                        while(!k5);
                        set--;
                        if(set==-1)
                        {
                                set=2;
                        }
                }
        }
/////////////////////////////////////////////////////////////////
        if((k3==0)&&(set==2))  //選擇鬧鐘開、關
        {
                delay(5);
                if((k3==0)&&(set==2))
                {
                        while(!k3);
                        clok++;
                        if(clok==3)        clok=0;
                }
        }
/////////////////////////////////////////////////////////////////
        if((k3==0)&&(set==0))  //選擇時間設置
        {
                delay(5);
                if((k3==0)&&(set==0))
                {
                        while(!k3);
                        dip=4;
                }

        }               
}       
        if(dip==4)                   //時間設置界面
        {
                if(k3==0)                //往下
                {
                        delay(5);
                        if(k3==0)
                        {
                                while(!k3);
                                t_set++;
                                if(t_set==7)
                                {
                                        t_set=0;
                                }
                        }
                }
                if(k4==0)                          //加
                {
                        delay(5);
                        if(k4==0)
                        {
                                while(!k4);
                                if(t_set==0)        num3++;        if(num3==24)        num3=0;
                                if(t_set==1)        num2++;        if(num2==60)        num2=0;
                                if(t_set==2)        num1++;        if(num1==60)        num1=0;
                                if(t_set==3)        nian++;        if(nian==100)        nian=0;
                                if(t_set==4)        yue++;        if(yue==13)        yue=1;
                                if(t_set==5)        ri++;
                                        if((ri==32)&&((yue==1)||(yue==3)||(yue==5)||(yue==7)||(yue==8)||(yue==10)||(yue==12)))        ri=1;
                                        if((ri==31)&&((yue==4)||(yue==6)||(yue==9)||(yue==11)))        ri=1;
                                        if((ri==29)&&((yue==2)&&(nian%4!=0)))        ri=1;
                                        if((ri==30)&&((yue==2)&&(nian%4==0)))        ri=1;
                                if(t_set==6)        day++;        if(day==8)        day=1;
                        }
                }
                if(k5==0)                        //減
                {
                        delay(5);
                        if(k5==0)
                        {
                                while(!k5);
                                if(t_set==0)        num3--;        if(num3==-1)        num3=23;
                                if(t_set==1)        num2--;        if(num2==-1)        num2=59;
                                if(t_set==2)        num1--;        if(num1==-1)        num1=59;
                                if(t_set==3)        nian--;        if(nian==-1)        nian=99;
                                if(t_set==4)        yue--;        if(yue==0)        yue=12;
                                if(t_set==5)        ri--;        if(ri==0)        ri=31;
                                        if((ri==-1)&&((yue==1)||(yue==3)||(yue==5)||(yue==7)||(yue==8)||(yue==10)||(yue==12)))        ri=31;
                                        if((ri==-1)&&((yue==4)||(yue==6)||(yue==9)||(yue==11)))        ri=30;
                                        if((ri==-1)&&((yue==2)&&(nian%4!=0)))        ri=28;
                                        if((ri==-1)&&((yue==2)&&(nian%4==0)))        ri=29;
                                if(t_set==6)        day--;        if(day==0)        day=7;
                        }
                }
        }
       
////////////////////////、、、、、、、、、///////////////////////////////////////////
        if((k3==0)&&((set==1)&&(dip==1)))  //鬧鐘設置界面
        {
                delay(5);
                if((k3==0)&&((set==1)&&(dip==1)))
                {
                        while(!k3);
                        dip=5;
                }
        }

        if(dip==5)                  //鬧鐘設置界面
        {
                if(k3==0)                //往下
                {
                        delay(5);
                        if(k3==0)
                        {
                                while(!k3);
                                t_set++;
                                if(t_set==4)
                                {
                                        t_set=0;
                                }
                        }
                }

                if(k4==0)                          //加
                {
                        delay(5);
                        if(k4==0)
                        {
                                while(!k4);
                                if(t_set==0)        n_num3++;        if(n_num3==24)        n_num3=0;
                                if(t_set==1)        n_num2++;        if(n_num2==60)        n_num2=0;
                                if(t_set==2)        n_num1++;        if(n_num1==60)        n_num1=0;
                                if(t_set==3)        clok++;        if(clok==2) clok=0; if(clok==0)         LCD_PutString(3,4,"關");
                                                                                                                        if(clok==1)         LCD_PutString(3,4,"開");
                               
                        }
                }
                if(k5==0)                        //減
                {
                        delay(5);
                        if(k5==0)
                        {
                                while(!k5);
                                if(t_set==0)        n_num3--;        if(n_num3==-1)        n_num3=23;
                                if(t_set==1)        n_num2--;        if(n_num2==-1)        n_num2=59;
                                if(t_set==2)        n_num1--;        if(n_num1==-1)        n_num1=59;
                                if(t_set==3)        clok--;        if(clok==-1) clok=1;        if(clok==0)         LCD_PutString(3,4,"關");
                                                                                                                                if(clok==1)         LCD_PutString(3,4,"開");
                               
                        }
                }
        }
///////////////////////////////////////////////////////////////////////////////////
        if((k1==0)||(k2==0)||(k3==0)||(k4==0)||(k5==0))                          //任何按鍵按下,LCD顯示屏亮20s
        {
                tr1_time=0;
                TR1=1;
        }

///////////////////////////////////////////////////////////////////////////////////
if((dip==0)&&((k4==0)&&(k3==0)))                   //鬧鐘開啟、關閉快捷鍵
{
        delay(5);
        if((dip==0)&&((k4==0)&&(k3==0)))
        {
                while(!k4||!k3);
                clok++;
                if(clok==3)        clok=0;
        }
       
}
///////////////////////////////////////////////////////////////////////////////////
if((deep==0)&&((dip==0)&&((k1==0)||(k3==0)||(k4==0)||(k5==0))))          //鬧鐘響起時,按下任何鍵可關閉鬧鈴
{
          deep=1;
}
}
/*----------------------------------------------------------------------------
                 主程序
-----------------------------------------------------------------------------*/
void main()
{
deep=1;

        Init_ST7920();                //液晶屏初始化
        LCD_PutString(2,1,"Welcome");
        LCD_PutString(2,2,"歡迎使用");
        LCD_PutString(1,3," <聯創電子> ");
        LCD_PutString(0,4,"LCD12864萬歷時鐘");
        delay(5000);
        Init_ST7920();                //液晶屏初始化
        Init_Timer0();                //定時器初始化
        SetGraphicMode();   //設置成繪圖模式
        LCD_cluck();            //液晶屏顯示為白屏,進行清屏
        delay(500);
ow_reset();
write_byte(0xcc);//跳過序列號
write_byte(0x44);
LCD_led=1;
    while(1)
    {
            display(); //顯示屏顯示
                key1();
    }
}

/*------------------------------------------------
                 定時器0中斷子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==20)
{
        num=0;num1++;
       
        if(num1==60)
        {
                num1=0;num2++;
                if(num2==60)
                {
                        num2=0;num3++;
                        if(num3==24)
                        {
                                num3=0;
                                day++;
                                if(day==8)
                                {
                                        day=1;
                                }
                                ri++;
                                if((ri==32)&&((yue==1)||(yue==3)||(yue==5)||(yue==7)||(yue==8)||(yue==10)||(yue==12)))         //大月
                                {
                                        ri=1;
                                        yue++;
                                        if(yue==13)
                                        {
                                                yue=1;
                                                nian++;
                                                if(nian==99)  nian=0;
                                        }
                                }
                                if((ri==31)&&((yue==4)||(yue==6)||(yue==9)||(yue==11)))         //小月
                                {
                                        ri=1;
                                        yue++;
                                        if(yue==13)
                                        {
                                                yue=1;
                                                nian++;
                                                if(nian==99)  nian=0;
                                        }
                                }
                                if((ri==29)&&((yue==2)&&(nian%4!=0)))           //2月份有28天
                                {
                                        ri=1;
                                        yue++;
                                        if(yue==13)
                                        {
                                                yue=1;
                                                nian++;
                                                if(nian==99)  nian=0;
                                        }
                                }
                                if((ri==30)&&((yue==2)&&(nian%4==0)))          //2月份有29天
                                {
                                        ri=1;
                                        yue++;
                                        if(yue==13)
                                        {
                                                yue=1;
                                                nian++;
                                                if(nian==99)  nian=0;
                                        }
                                       
                                }
                               
                        }
                }
        }
}
}

/*------------------------------------------------
                 定時器0中斷子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3
{
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        tr1_time++;
        if(tr1_time)
        {
                LCD_led=0;
                if(tr1_time==400)                   //亮屏20s自動熄屏
                {
                        tr1_time=1;
                        LCD_led=1;
                        TR1=0;
                }
        }
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2018-12-28 02:35 | 只看該作者
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
回復

使用道具 舉報

板凳
ID:461428 發表于 2019-2-22 19:01 | 只看該作者
記號。。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费一区二区三区在线视频 | 中文字幕成人av | 亚洲精品乱码久久久久久按摩观 | 精品国产乱码久久久久久蜜退臀 | 亚洲精品女人久久久 | 成人国产精品免费观看视频 | 成人欧美一区二区三区在线播放 | 色欧美日韩 | 国产精品久久久久久久久久久久久 | 久久久国产一区二区三区 | 国产一区二区三区 | 国产高清精品一区二区三区 | 久久夜视频 | 欧美精品v国产精品v日韩精品 | 一区在线播放 | 成人在线观看免费视频 | 欧美伊人久久久久久久久影院 | 欧美11一13sex性hd | 国产精品日韩欧美一区二区三区 | 中文字幕在线电影观看 | 伊人网综合在线 | 国产欧美在线一区二区 | 国产精品福利在线观看 | 国产精品久久精品 | 亚洲国产成人精品女人久久久 | 成人视屏在线观看 | 久久丁香 | 伊人伊人 | 99久久国产综合精品麻豆 | 欧美中文字幕一区二区 | 精品在线 | 欧美精品v国产精品v日韩精品 | 日韩精品一区二区三区免费观看 | 久久精品国产免费高清 | 久久久久久久久国产成人免费 | 中文字幕不卡视频在线观看 | 午夜久久久久久久久久一区二区 | 欧美成人一区二区 | 91福利在线观看视频 | 成人在线免费网站 | 欧美影院 |