好久沒玩51單片機啦,趁有空花幾天時間玩了下   時鐘部分因ds1302模塊沒帶回來,所以我直接用定時計數(shù)器來跑了
顯示小圖片的函數(shù)是借鑒了其他高手的寫法;從中學習了知識,不勝感激
再附上原理圖供大家參考,有瑕疵請各位大神指點哈 謝謝
原理圖
設置界面
時鐘顯示界面
開機界面
單片機源程序如下:
- /*------------------------------------------------------------------------------------------
- 名稱:12864萬歷時鐘
- 內(nèi)容:顯示年月日、24小時、星期、所在年份、實時溫度基本功能,帶1路可設置鬧鐘;亮屏20s自動熄滅
- 晶振:12MHZ
- 單片機:AT89S52
- 顯示屏:12864帶中文字庫
- DS18B20數(shù)字溫度采集
-
- 作者:愛好者
- 交流QQ群:481250892
- 日期:2017/8/5
- ////////////////////////////////////////////////////////////////////////////////////////////
- 按鍵功能:
- sbit k1=P3^0; //單獨使用 鬧鐘響起時關(guān)閉鬧鈴、亮屏
- sbit k2=P3^1; //菜單 設置功能鍵
- sbit k3=P3^2; //確認 確認鍵
- sbit k4=P3^3; //+ 加
- sbit k5=P3^4; //- 減
- 備注:當畫面處于主頁界面:(1)只有k2按鍵有效。
- (2)k3、k4同時按下可快速打開或關(guān)閉鬧鐘
- 當畫面處于設置界面:(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; //半屏,半屏行數(shù),N*8塊
- //-----------------------------------------------
- sbit DQ=P1^1; //18B20數(shù)據(jù)接口
- 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}; //小數(shù)補償
- ////////////////////////////////////////////////////////////////////////
- //設定哪一行,從那一個位置開始到那一個位置結(jié)束使用反白
- //x=液晶屏上漢字的位置(1~8);end_x=漢字結(jié)束的地址(1~8);y=1~4行
- //clear=1:清除反白;clear=0:設置反白;
- void Set_White(uchar x,uchar y,uchar end_x,uchar clear);
- /*------------------------------------------------
- uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
- 長度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*------------------------------------------------
- mS延時函數(shù),含有輸入?yún)?shù) 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]={
- {// 圖片數(shù)字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},
- {// 圖片數(shù)字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},
- {// 圖片數(shù)字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},
- {// 圖片數(shù)字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},
- {// 圖片數(shù)字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},
- {// 圖片數(shù)字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},
- {// 圖片數(shù)字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},
- {// 圖片數(shù)字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},
- {// 圖片數(shù)字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},
- {// 圖片數(shù)字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);
- }
- /*------------------------------------------------
- 寫數(shù)據(jù)
- ------------------------------------------------*/
- 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); //顯示開, 關(guān)光標
- delay(10);
- Write_Cmd(0x01); //清屏
- delay(10);
- }
-
- /*------------------------------------------------
- 顯示字符串
- x:橫坐標值,范圍0~8
- y:縱坐標值,范圍1~4
- ------------------------------------------------*/
- 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;
- ////顯示上半屏內(nèi)容設置
- // 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++;
- // }
- // }
- ////顯示下半屏內(nèi)容設置
- // 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;
- //顯示上半屏內(nèi)容設置
- 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++;
- }
- }
- //顯示下半屏內(nèi)容設置
- 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); //選擇8bit數(shù)據(jù)流 圖形模式
- DelayUs2x(20);
- }
- void SetNormalMode()
- {
- Write_Cmd(0x30); //選擇8bit數(shù)據(jù)流 圖形模式
- 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);
- Write_Cmd(0x80+x);
- }
- if(i>=16)
- {
- Write_Cmd(0x80+i-16);
- Write_Cmd(0x88+x);
- }
- for(j=0;j<2;j++)
- {
- Write_Data(*img);
- img++;
- }
- }
- SetNormalMode();
- }
- /*使用繪圖的方法讓一個16*16的漢字符反白----------------------------------------------*/
- //形式參數(shù):uchar x,uchar y,uchar wide,uchar bkcor
- //行參說明:坐標水平位置,坐標垂直位置,反白行數(shù),要反白還是清除(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); //擴展指令,繪圖模式命令,開顯示也可以繪.(關(guān)圖片顯示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位元的數(shù)據(jù),AC會自動增一,接著寫數(shù)據(jù)
- {
- if(sign==1)
- Write_Data(~(*bmp++));
- else
- Write_Data(*bmp++);
- }
- }
- Write_Cmd(0x36); //寫完數(shù)據(jù),開圖片顯示
- }
- /**************************************************************************************
- //函數(shù)功能:顯示16X16圖形,適用于st7920型液晶
- //形式參數(shù):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; //二維數(shù)組首地址給指針,故指針指向下一個數(shù)組地址應為加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; //定時器開關(guān)打開
- ET1=1;
- TR1=1; //定時器開關(guān)打開
- }
- /*------------------------------------------------
- 調(diào)時
- ------------------------------------------------*/
- 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,"狀態(tài) : "); //
- if(clok==0) LCD_PutString(3,4,"關(guān)閉");
- 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) //寫字節(jié)
- {
- 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);
- }
- //讀字節(jié)
- 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); //發(fā)轉(zhuǎn)換命令
- }
- //讀溫度函數(shù)
- void read_temp()
- {
- uchar temp_l,temp_h;//定義高低字節(jié)
- ow_reset();
- Rx_Wait(); //等待應答信號
- write_byte(0xcc); //跳過序列號
- write_byte(0xbe); //讀取暫存器內(nèi)容
- temp_l=read_byte(); //低字節(jié)在前
- temp_h=read_byte(); //高字節(jié)在后
- 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;
- }
- //讀出溫度數(shù)據(jù)進行分離,在顯示屏上顯示
- 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();//轉(zhuǎn)換初始化
- 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) //鬧鐘關(guān)閉標志
- {
- set1616pic(4,4,0,3);
- deep=1; //鬧鐘輸出關(guān)閉
- }
- 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)) //鬧鐘時間過期,關(guān)閉鬧鐘
- {
- 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.鬧鐘開關(guān)"); //鬧鐘 開、關(guān)
- if(clok==0) LCD_PutString(7,3,"×");
- if(clok==1) LCD_PutString(7,3,"√");
- LCD_PutString(0,4,"確認 取消"); //鬧鐘 開、關(guān)
- 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)) //選擇鬧鐘開、關(guān)
- {
- 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,"關(guān)");
- 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,"關(guān)");
- 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))) //鬧鐘開啟、關(guān)閉快捷鍵
- {
- 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)))) //鬧鐘響起時,按下任何鍵可關(guān)閉鬧鈴
- {
- deep=1;
- }
- }
- /*----------------------------------------------------------------------------
- 主程序
- -----------------------------------------------------------------------------*/
- void main()
- {
- deep=1;
-
- Init_ST7920(); //液晶屏初始化
- LCD_PutString(2,1,"Welcome");
- LCD_PutString(2,2,"歡迎使用");
- LCD_PutString(1,3," <聯(lián)創(chuàng)電子> ");
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
12864萬歷時鐘.rar
(444.77 KB, 下載次數(shù): 149)
2017-8-16 17:43 上傳
點擊文件名下載附件
|