/**************************包含頭文件******************/
#include <msp430f149.h>
#include "DS18B20.h"
#include "DS1302.h"
#include "lcd.h"
#include "key.h"
/*****************************************************/
#define uint unsigned int
#define uchar unsigned char
/*****************************************************/
int t;
/*****************************************************/
void Set1302(char *pClock)
{
char i=0;
char ucAddr = 0x80;
write_1302(0x8e,0x00); /* 控制命令,WP=0,寫操作?*/
for(i=7;i>0;i--)
{
write_1302(ucAddr,*pClock); /* 秒 分 時 日 月 星期 年 */
pClock++;
ucAddr+=2;
}
write_1302(0x8e,0x80); /* 控制命令,WP=1,寫保護?*/
}
/*****************************************************************
*函數功能:主程序
*入口參數:
*出口參數:
******************************************************************/
void main(void)
{
WDTCTL=WDTPW+WDTHOLD; //關看門狗
keyInit();
init_lcd();
Clr_Scr();
ds1302_init();
RST_OUT;
SCLK_OUT;
DATA_OUT;
Init_Ds18b20();
while(1)
{
t=ReadTemperature();//溫度轉換
if(shi>=shikai) //實際時間大于等于設定時間
{
if(t>=High) P2OUT&=~BIT7;//實際溫度大于等于設定溫度
if(t<=Low) P2OUT|=BIT7;//實際溫度小于等于設定溫度
}
else if(shi<=shiguan)//實際時間小于等于設定時間
{
if(t>=High) P2OUT&=~BIT7;//實際溫度大于等于設定溫度
if(t<=Low) P2OUT|=BIT7;//實際溫度小于等于設定溫度
}
else P2OUT&=~BIT7;
flag=ReadTemperature();//將18b2頭文件運行返回的函數結果送到變量FLAG中,用于顯示
//讀取秒時分周日月年七個數據(DS1302的讀寄存器與寫寄存器不一樣):
miao=BCD_Decimal(read_1302(0x81));
fen=BCD_Decimal(read_1302(0x83));
shi=BCD_Decimal(read_1302(0x85));
ri=BCD_Decimal(read_1302(0x87));
yue=BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));
P4OUT&=~CS1; //左顯示
P4OUT|=CS2;
LCDdelay(5);
//年月日
hz_LCDDisp8(0,8,xs[2]);
hz_LCDDisp8(0,16,xs[0]);
hz_LCDDisp8(0,24,xs[nian/10]);
hz_LCDDisp8(0,32,xs[nian%10]);
hz_LCDDisp16(0,40,xnian);
hz_LCDDisp8(0,56,xs[yue/10]);
//時間
hz_LCDDisp12(2,8,shk[shi/10]);
hz_LCDDisp12(2,24,shk[shi%10]);
hz_LCDDisp12(2,36,shmaohao);
hz_LCDDisp12(2,50,shk[fen/10]);
//溫度
hz_LCDDisp16(6,0,xwen);
hz_LCDDisp16(6,16,xdu);
hz_LCDDisp8(6,32,xs[flag/10]);
hz_LCDDisp8(6,40,xs[flag%10]);
hz_LCDDisp16(6,48,xfuhao);
P4OUT|=CS1;
P4OUT&=~CS2;//右顯示
//年月日
hz_LCDDisp8(0,0,xs[yue%10]);
hz_LCDDisp16(0,8,xyue);
hz_LCDDisp8(0,24,xs[ri/10]);
hz_LCDDisp8(0,32,xs[ri%10]);
hz_LCDDisp16(0,40,xri);
//時間
hz_LCDDisp12(2,2,shk[fen%10]);
hz_LCDDisp12(2,15,shmaohao);
hz_LCDDisp12(2,28,shk[miao/10]);
hz_LCDDisp12(2,44,shk[miao%10]);
//星期
hz_LCDDisp16(6,8,xxing);
hz_LCDDisp16(6,24,xqi);
hz_LCDDisp16(6,40,ds[week]);
}}
/*************************************************
*函數名: PORT1_ISR() /
*作用 :外部中斷服務函數 /
*返回值:無 /
*參數 :無 /
*作者 :huasir /
*時間 :2017.10.28 /
**************************************************/
#pragma vector = PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
if((P1IN&BIT0)==0)
{
delay(20);//延時,用于消抖動
if((P1IN&BIT0)==0)//延時后再次確認按鍵按下
key1n=1;
keyscan();
}
if((P1IN&BIT3)==0)
{
delay(20);//調延時,消抖動
if((P1IN&BIT3)==0)
{
P4OUT^=BIT2;//switch(key1n)
P1IFG=0;
_BIC_SR_IRQ(LPM3_bits);
}}}
#ifndef _LCD_H_
#define _LCD_H_
/*********************************/
#include <msp430f149.h>
/************************************************/
#define uint unsigned int
#define uchar unsigned char
unsigned char const digit[10]={"0123456789"}; //定義字符數組顯示數字
/********************************命令字定義*********************************/
#define LCDDisp_On 0x3f
#define LCDDisp_Off 0x3e
#define LCDCol_Add 0x40 //列地址
#define Page_Add 0xb8 //頁地址
#define Start_Line 0xc0 //行地址
/*********************************端口定義*************/
#define DataPort P5OUT
#define CLR_RS P4OUT|=BIT3 //P4.3
#define SET_RS P4OUT&=~BIT3
#define CLR_RW P4OUT|=BIT4 //P4.3
#define SET_RW P4OUT&=~BIT4
#define CLR_E P4OUT|=BIT5 //P4.3
#define SET_E P4OUT&=~BIT5
#define CS1 BIT7 //P4.6
#define CS2 BIT6 //P4.7
#define EL BIT2 //P4.2
/******************************************************/
char xnian[]={
/*-- 文字: 年 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00,
0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,
};
char xyue[]={
/*-- 文字: 月 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00,
};
char xri[]={
/*-- 文字: 日 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00,
};
char xxiao[]={
/*-- 文字: 小 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x20,0x40,0x80,0x00,0x00,
0x08,0x04,0x03,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x01,0x0E,0x00,
};
char xshi[]={
/*-- 文字: 時 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0xFC,0x84,0x84,0x84,0xFC,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x00,
0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x01,0x06,0x40,0x80,0x7F,0x00,0x00,0x00,
};
char xfen2[]={
/*-- 文字: 分 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x80,0x40,0x20,0x90,0x88,0x86,0x80,0x80,0x80,0x83,0x8C,0x10,0x20,0x40,0x80,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,
};
char xfen[]={
/*-- 文字: 份 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x80,0x60,0xF8,0x07,0x80,0x40,0xB0,0x8E,0x80,0x80,0x87,0x98,0x60,0x80,0x00,
0x01,0x00,0x00,0xFF,0x00,0x80,0x40,0x30,0x0F,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,
};
char xzhong[]={
/*-- 文字: 鐘 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x20,0x10,0x2C,0xE7,0x24,0x24,0x00,0xF0,0x10,0x10,0xFF,0x10,0x10,0xF0,0x00,
0x00,0x01,0x01,0x01,0x7F,0x21,0x11,0x00,0x07,0x02,0x02,0xFF,0x02,0x02,0x07,0x00,
};
char xtiao[]={
/*-- 文字: 調 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x40,0x42,0xCC,0x00,0x00,0xFE,0x82,0x92,0x92,0xFE,0x92,0x92,0x82,0xFE,0x00,
0x00,0x00,0x00,0x3F,0x10,0x88,0x7F,0x00,0x1E,0x12,0x12,0x12,0x5E,0x80,0x7F,0x00,
};
char xzheng[]={
/*-- 文字: 整 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x04,0x74,0xD4,0x54,0xFF,0x54,0xD4,0x74,0x14,0x08,0x77,0x84,0x44,0x3C,0x04,0x00,
0x82,0x89,0x88,0xE8,0x8B,0x88,0x88,0xF9,0xA8,0xAA,0xA9,0xA8,0xA9,0x8A,0x82,0x00,
};
char xxing[]={
/*-- 文字: 星 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,0x00,
0x00,0x44,0x42,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x41,0x40,0x00,0x00,
};
char xqi[]={
/*-- 文字: 期 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x04,0xFF,0x24,0x24,0x24,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,
0x88,0x48,0x2F,0x09,0x09,0x19,0xAF,0x48,0x30,0x0F,0x02,0x42,0x82,0x7F,0x00,0x00,
};
char xwen[]={
/*-- 文字: 溫 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x10,0x22,0x64,0x0C,0x80,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFF,0x02,0x00,0x00,
0x04,0x04,0xFE,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,
};
char xdu[]={
/*-- 文字: 度 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x34,0x26,0x04,0x00,
0x40,0x20,0x9F,0x80,0x42,0x42,0x26,0x2A,0x12,0x2A,0x26,0x42,0x40,0xC0,0x40,0x00
};
char xfuhao[]={
/*-- 文字: ℃ --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x08,0x14,0x08,0x80,0xE0,0x30,0x18,0x08,0x08,0x08,0x18,0x30,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x07,0x18,0x30,0x20,0x20,0x20,0x20,0x10,0x08,0x00,0x00,
};
char xxiaoshi[]={
/*-- 文字: h --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,
};
char shmaohao[]={
/*-- 文字: : --*/
/*-- 宋體18; 此字體下對應的點陣為:寬x高=12x24 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x38,0x3C,0x3C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1C,0x1E,0x1E,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
char xmaohao[]={
/*-- 文字: : --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,
};
char xmiao[]={
/*-- 文字: 秒 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00,
};
char xshu[]={
/*-- 文字: 數 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x10,0x92,0x54,0x38,0xFF,0x38,0x54,0x52,0x80,0xF0,0x1F,0x12,0x10,0xF0,0x10,0x00,
0x42,0x42,0x2A,0x2E,0x13,0x1A,0x26,0x02,0x40,0x20,0x13,0x0C,0x33,0x60,0x20,0x00,
};
char xshe[]={
/*-- 文字: 設 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x40,0x40,0x42,0xCC,0x00,0x40,0xA0,0x9E,0x82,0x82,0x82,0x9E,0xA0,0x20,0x20,0x00,
0x00,0x00,0x00,0x3F,0x90,0x88,0x40,0x43,0x2C,0x10,0x28,0x46,0x41,0x80,0x80,0x00,
};
char xding[]={
/*-- 文字: 定 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x10,0x0C,0x44,0x44,0x44,0x44,0x45,0xC6,0x44,0x44,0x44,0x44,0x44,0x14,0x0C,0x00,
0x80,0x40,0x20,0x1E,0x20,0x40,0x40,0x7F,0x44,0x44,0x44,0x44,0x44,0x40,0x40,0x00,
};
char xgao[]={
/*-- 文字: H --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,
};
char xdi[]={
/*-- 文字: L --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,
};
char xkai[]={
/*-- 文字: 開 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x80,0x00,
0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,
};
char xguan[]={
/*-- 文字: 關 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x10,0x11,0x16,0x10,0x10,0xF0,0x10,0x10,0x14,0x13,0x10,0x00,0x00,0x00,
0x81,0x81,0x41,0x41,0x21,0x11,0x0D,0x03,0x0D,0x11,0x21,0x41,0x41,0x81,0x81,0x00,
};
/*******************大寫數碼************************/
char ds[8][32]={
{
/*-- 文字: 一 --這個是個墊頭,為了讓大寫一的顯示碼在ds[1]位置*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
},
{
/*-- 文字: 一 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
},
{
/*-- 文字: 二 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,
},
{
/*-- 文字: 三 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
},
{
/*-- 文字: 四 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00,
},
{
/*-- 文字: 五 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x02,0x42,0x42,0x42,0xC2,0x7E,0x42,0x42,0x42,0x42,0xC2,0x02,0x02,0x00,0x00,
0x40,0x40,0x40,0x40,0x78,0x47,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x00,
},
{
/*-- 文字: 六 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x20,0x20,0x20,0x20,0x20,0x20,0x21,0x22,0x2C,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x01,0x02,0x04,0x18,0x60,0x00,0x00,
},
{
/*-- 文字: 日 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,
}
};
/*******************阿拉伯數碼************************/
char xs[10][16]={
{
/*-- 文字: 0 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
},
{
/*-- 文字: 1 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
},
{
/*-- 文字: 2 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
},
{
/*-- 文字: 3 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
},
{
/*-- 文字: 4 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
},
{
/*-- 文字: 5 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
},
{
/*-- 文字: 6 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
},
{
/*-- 文字: 7 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
},
{
/*-- 文字: 8 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
},
{
/*-- 文字: 9 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
}
};
/*************************用于顯示時分秒**************************/
char shk[10][64]={
/*-- 中特 此字體下對應的點陣為:寬x高=16x28 --*/
{
/*-- 文字: 0 --*/
0x00,0x00,0x00,0x80,0xC0,0x40,0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00,0xF0,0xFE,
0x0F,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0xFE,0xF0,0x00,0x1F,0xFF,0xE0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xFF,0x1F,0x00,0x00,0x00,0x01,0x03,0x06,0x04,
0x04,0x04,0x06,0x03,0x01,0x00,0x00,0x00,
},
{
/*-- 文字: 1 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x01,0x01,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x06,
0x07,0x07,0x06,0x04,0x04,0x04,0x00,0x00,
},
{
/*-- 文字: 2 --*/
0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x40,0x40,0xC0,0x80,0x80,0x00,0x00,0x00,0x1E,
0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC1,0x7F,0x3E,0x00,0x00,0x00,0x80,0x40,
0x20,0x10,0x08,0x04,0x02,0x01,0x00,0x00,0xE0,0x00,0x00,0x07,0x06,0x06,0x06,0x06,
0x06,0x06,0x06,0x06,0x06,0x07,0x01,0x00,
},
{
/*-- 文字: 3 --*/
0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x0F,
0x0F,0x00,0x00,0x80,0x80,0x80,0xC0,0x61,0x3F,0x1E,0x00,0x00,0x00,0xE0,0xE0,0x00,
0x00,0x00,0x00,0x00,0x01,0x01,0x03,0xFE,0x78,0x00,0x00,0x01,0x03,0x02,0x04,0x04,
0x04,0x04,0x04,0x02,0x03,0x01,0x00,0x00,
},
{
/*-- 文字: 4 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0x60,0x30,0x0C,0x02,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x10,0x1C,0x12,0x11,
0x10,0x10,0x10,0x10,0xFF,0xFF,0xFF,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x08,
0x08,0x08,0x0F,0x0F,0x0F,0x08,0x08,0x08,
},
{
/*-- 文字: 5 --*/
0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,
0xF8,0x87,0x40,0x20,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00,0xE0,0x61,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x7E,0x00,0x00,0x01,0x02,0x04,0x04,0x04,
0x04,0x04,0x04,0x02,0x03,0x01,0x00,0x00,
},
{
/*-- 文字: 6 --*/
0x00,0x00,0x00,0x00,0x80,0xC0,0x40,0x40,0x40,0x40,0x80,0x00,0x00,0x00,0xE0,0xFC,
0x0E,0x81,0x80,0x40,0x40,0x40,0x40,0xC0,0x83,0x03,0x00,0x00,0x3F,0xFF,0xC3,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0x7E,0x00,0x00,0x00,0x01,0x03,0x06,0x04,
0x04,0x04,0x04,0x02,0x03,0x01,0x00,0x00,
},
{
/*-- 文字: 7 --*/
0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x0F,
0x03,0x01,0x00,0x00,0x00,0x80,0x60,0x18,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xE0,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
},
{
/*-- 文字: 8 --*/
0x00,0x00,0x00,0x80,0xC0,0x40,0x40,0x40,0x40,0xC0,0x80,0x00,0x00,0x00,0x00,0x1E,
0x3F,0x71,0xE0,0xC0,0x80,0x80,0x80,0x80,0x61,0x3F,0x1E,0x00,0xF8,0xFC,0x06,0x03,
0x01,0x00,0x01,0x01,0x03,0x07,0x0E,0xFC,0xF8,0x00,0x00,0x01,0x03,0x02,0x04,0x04,
0x04,0x04,0x04,0x02,0x03,0x01,0x00,0x00,
},
{
/*-- 文字: 9 --*/
0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0xFC,0xFF,
0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0xFE,0xF8,0x00,0x00,0x81,0x83,0x06,
0x04,0x04,0x04,0x04,0x02,0x83,0xF1,0x7F,0x0F,0x00,0x00,0x03,0x03,0x04,0x04,0x04,
0x04,0x06,0x03,0x01,0x00,0x00,0x00,0x00,
},
};
char xsc[][18]={
{
/*-- 文字: 0 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=9x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,
0x00,0x00,
},
{
/*-- 文字: 1 --*/
0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,
0x00,0x00,
},
{
/*-- 文字: 2 --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,
0x00,0x00,
},
{
/*-- 文字: 3 --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,
0x00,0x00,
},
{
/*-- 文字: 4 --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,
0x00,0x00,
},
{
/*-- 文字: 5 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=9x16 --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,
0x00,0x00,
},
{
/*-- 文字: 6 --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,
0x00,0x00,
},
{
/*-- 文字: 7 --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,
0x00,0x00,
},
{
/*-- 文字: 8 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=9x16 --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,
0x00,0x00,
},
{
/*-- 文字: 9 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,
0x00,0x00,
}
};
/********************************************************/
char maptbl[]= { 0x01,0x03,0x07,0x0f, 0x1f,0x3f,0x7f,0xff };
/********************************************************/
void LCDdelay(unsigned int t);
void delayl (uint ms);
void CheckState();
void write_cmdcode( char COM);
void write_data(char dat);
void Clr_Scr();
void hz_LCDDisp16(char pag, char col, char *hzk);
void hz_LCDDisp8(char pag,char col, char *hzk);
void hz_LCDDisp12(char pag,char col, char *hzk);
void hz_LCDDisp9(char pag,char col, char *hzk);
/*****************************************************
函數功能:延時程序
入口參數:t
出口參數:
*****************************************************/
void LCDdelay(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++);
for(j=0;j<10;j++);
}
void delayl (uint ms)
{
uint i,j;
for(i=0;i<ms;i++);
for(j=0;j<1000;j++);
}
/**************************************************
*狀態檢查,LCD是否忙
*************************************************/
void CheckState(void)
{
uchar cradd1;
P4OUT&=~BIT3;
P4OUT|=BIT4; //RS=0, R/W=1,以便讀液晶狀態
P5DIR=0x00; //P4 口為輸入口
do
{
P4OUT|=BIT5; //E=1
cradd1=P5IN;
P4OUT&=~BIT5; //E=0
}
while((cradd1&0x80)!=0);
}
/************************************************
函數功能:寫命令到LCD程序(左)
入口參數:cmdcode
出口參數:
*************************************************/
void write_cmdcode(char COM)
{
CheckState(); //檢查是否忙
P4OUT&=~BIT4; //rw=0
P5DIR=0xff; //P4 口為輸出口
P5OUT=COM;
P4OUT|=BIT5; //E=1
P4OUT&=~BIT5; //E=0
}
/***********************************************
函數功能:寫數據到LCD程序(左)
入口參數:LCDDispdata
出口參數:
************************************************/
void write_data( char dat)
{
CheckState(); //檢查是否忙
P4OUT|=BIT3; //rs=1
P4OUT&=~BIT4; //rw=0
P5DIR=0xff; //P4 口為輸出口
P5OUT=dat;
P4OUT|=BIT5; //E=1
P4OUT&=~BIT5; //E=0
}
/************************************************
函數功能:清除LCD內存程序
入口參數:pag,col,hzk
出口參數:
************************************************/
void Clr_Scr()
{
char i,j;
P4OUT&=~CS1;//左顯示
P4OUT&=~CS2;
for(i=0;i<8;i++)
{
write_cmdcode(i|0xb8); //設置頁地址
write_cmdcode(0x40); //設置列地址
for(j=0;j<64;j++) //寫 0x00
{
write_data(0x00);
}}}
//******************滿屏 ************************
void AllScreen(void)
{ uchar i,j;
for(i=0;i<8;i++)
{
write_cmdcode(i|0xb8); //設置頁地址
write_cmdcode(0x40); //設置列地址
for(j=0;j<64;j++) //寫 0xff
{
write_data(0xff);
}}}
/************************************************
函數功能:LCD初始化程序
入口參數:
出口參數:
************************************************/
void init_lcd(void)
{
P4DIR|=BIT2; //P2.7 為輸出口
P4OUT|=EL;//背光燈
delayl(5);
P4DIR|=BIT7; //P3.3 為輸出口
P4OUT|=CS1; //CS1=0
P4DIR|=BIT6; //P3.2 為輸出口
P4OUT|=CS2; //CS2=0
P4DIR|=BIT3; //P3.1 為輸出口
P4OUT&=~BIT3; //RS=0
P4DIR|=BIT4; //P3.0 為輸出口
P4OUT&=~BIT4; //RW=0
P4DIR|=BIT5; //P2.7 為輸出口
P4OUT&=~BIT5; //E=0
write_cmdcode(0xc0);//顯示開始行
write_cmdcode(0x3f);//開顯示
CheckState();
}
/*******************************************************/
void write_word(char colum,char dx,const char *pRam)
{
uchar i,j,colum0;
uchar flag;
for(j=0;j<2;j++)
{
write_cmdcode(dx|0xb8); //頁
colum0=colum;
if(colum0>63) //右屏
{
colum0=colum0-64;
flag=1;
}
else //左屏
{
write_cmdcode(colum0|0x40);
flag=0;
}
for(i=0;i<16;i++)
{
if(flag==0)
{
write_data(*pRam);
}
else
{
}
pRam++;
if(colum0==64) //列=64
{
colum0=0;
if(flag==0)
{
flag=1;
}
else
{
break;
}}}
dx++;
}}
/*****************************************************************************
函數功能:指定位置顯示數字16*16程序
入口參數:pag,col,hzk
出口參數:
*****************************************************************************/
void hz_LCDDisp16(char pag, char col, char *hzk)
{
char j=0,i=0;
for(j=0;j<2;j++)
{
write_cmdcode(Page_Add+pag+j);
write_cmdcode(LCDCol_Add+col);
for(i=0;i<16;i++)
write_data(hzk[16*j+i]);
}
}
/*****************************************************************************
函數功能:指定位置顯示數字8*16程序
入口參數:pag,col,hzk
出口參數:
*****************************************************************************/
void hz_LCDDisp8( char pag, char col, char *hzk)
{
char j=0,i=0;
for(j=0;j<2;j++)
{
write_cmdcode(Page_Add+pag+j);
write_cmdcode(LCDCol_Add+col);
for(i=0;i<8;i++)
write_data(hzk[8*j+i]);
}
}
/*****************************************************************************
函數功能:指定位置顯示數字9*16程序
入口參數:pag,col,hzk
出口參數:
*****************************************************************************/
void hz_LCDDisp9(char pag,char col, char *hzk)
{
char j=0,i=0;
for(j=0;j<2;j++)
{
write_cmdcode(Page_Add+pag+j);
write_cmdcode(LCDCol_Add+col);
for(i=0;i<9;i++)
write_data(hzk[9*j+i]);
}
}
/*****************************************************************************
函數功能:指定位置顯示數字14*28程序
入口參數:pag,col,hzk
出口參數:
*****************************************************************************/
void hz_LCDDisp12(char pag,char col, char *hzk)
{
char j=0,i=0;
for(j=0;j<4;j++)
{
write_cmdcode(Page_Add+pag+j);
write_cmdcode(LCDCol_Add+col);
for(i=0;i<14;i++)
write_data(hzk[14*j+i]);
}
}
#endif
#ifndef _KEY_H_
#define _KEY_H_
/****************************************/
#include <msp430f149.h>
/*************************************************/
#define uint unsigned int
#define uchar unsigned char
char a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;
int High=37;
int Low=35;
int shikai=21;
int shiguan=6;
void keyInit(void);
void keyscan(void);
/*************************************************************/
void delay(uint xms)//延時函數,有參函數
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
/****************************************************************************
*函數名: keyInit() /
*作用 :設置與四個獨立按鍵相關的IO的配置,包括輸入輸出方向,中斷觸發方式 /
*返回值:無 /
*參數 :無 /
*作者 :huasir /
*時間 :2017.10.28 /
*****************************************************************************/
void keyInit(void)
{
P1DIR &= ~(BIT0+BIT1+BIT2+BIT3);//設置四個按鍵的接受口為輸入,注意,使用外部中斷并不屬于第二功能
P1IES |= BIT0+BIT1+BIT2+BIT3; //設置四個按鍵的中斷觸發方式為下降沿觸發
P1IE |= BIT0+BIT1+BIT2+BIT3; //打開四個按鍵的外部中斷
_EINT();
P4DIR|=BIT2;
P4OUT|=BIT2;
}
/****************鍵盤掃描有關函數**********************/
void keyscan()
{
init_lcd();
Clr_Scr();
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
hz_LCDDisp16(4,32,xtiao);
hz_LCDDisp16(4,48,xzheng);
P4OUT|=CS1;
P4OUT&=~CS2;//右顯示
hz_LCDDisp16(4,0,xfen2);
hz_LCDDisp16(4,16,xzhong);
while(1)
{
flag=ReadTemperature();//將18b20頭文件運行返回的函數結果送到變量FLAG中,用于顯示
//讀取秒時分周日月年七個數據(DS1302的讀寄存器與寫寄存器不一樣):
miao = BCD_Decimal(read_1302(0x81));
fen= BCD_Decimal(read_1302(0x83));
shi= BCD_Decimal(read_1302(0x85));
ri= BCD_Decimal(read_1302(0x87));
yue= BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
LCDdelay(2);
//年月日
hz_LCDDisp8(0,8,xs[2]);
hz_LCDDisp8(0,16,xs[0]);
hz_LCDDisp8(0,24,xs[nian/10]);
hz_LCDDisp8(0,32,xs[nian%10]);
hz_LCDDisp16(0,40,xnian);
hz_LCDDisp8(0,56,xs[yue/10]);
//時間
hz_LCDDisp9(2,28,xsc[shi/10]);
hz_LCDDisp9(2,38,xsc[shi%10]);
hz_LCDDisp8(2,47,xmaohao);
hz_LCDDisp9(2,55,xsc[fen/10]);
//星期
//氣溫
hz_LCDDisp16(6,0,xwen);
hz_LCDDisp16(6,16,xdu);
hz_LCDDisp8(6,32,xs[flag/10]);
hz_LCDDisp8(6,40,xs[flag%10]);
hz_LCDDisp16(6,48,xfuhao);
P4OUT|=CS1; //右顯示
P4OUT&=~CS2;
//年月日
hz_LCDDisp8(0,0,xs[yue%10]);
hz_LCDDisp16(0,8,xyue);
hz_LCDDisp8(0,24,xs[ri/10]);
hz_LCDDisp8(0,32,xs[ri%10]);
hz_LCDDisp16(0,40,xri);
//時間
hz_LCDDisp9(2,0,xsc[fen%10]);
hz_LCDDisp8(2,9,xmaohao);
hz_LCDDisp9(2,17,xsc[miao/10]);
hz_LCDDisp9(2,26,xsc[miao%10]);
//星期
hz_LCDDisp16(6,8,xxing);
hz_LCDDisp16(6,24,xqi);
hz_LCDDisp16(6,40,ds[week]);
//---------------key1為功能鍵(設置鍵)--------------------
if((P1IN&BIT0)==0)
{
delay(20);//延時,用于消抖動
if((P1IN&BIT0)==0)//延時后再次確認按鍵按下
{
delay(20);
while(!key1n);
key1n++;
if(key1n==12)
{
key1n=1;//設置按鍵共有秒、分、時、星期、日、月、年、返回,8個功能循環
}
switch(key1n)
{
case 1: //switch(P1IFG)
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
hz_LCDDisp16(4,32,xtiao);
hz_LCDDisp16(4,48,xzheng);
P4OUT|=CS1;//右顯示
P4OUT&=~CS2;
hz_LCDDisp16(4,0,xfen2);
hz_LCDDisp16(4,16,xzhong);
break;
case 2:
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
hz_LCDDisp16(4,32,xtiao);
hz_LCDDisp16(4,48,xzheng);
P4OUT|=CS1;
P4OUT&=~CS2; //右顯
hz_LCDDisp16(4,0,xxiao);
hz_LCDDisp16(4,16,xshi);
break;
case 3:
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
hz_LCDDisp16(4,32,xtiao);
hz_LCDDisp16(4,48,xzheng);
P4OUT|=CS1;
P4OUT&=~CS2; //右顯示
hz_LCDDisp16(4,0,xxing);
hz_LCDDisp16(4,16,xqi);
break;
case 4:
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
hz_LCDDisp16(4,32,xtiao);
hz_LCDDisp16(4,48,xzheng);
P4OUT|=CS1;
P4OUT&=~CS2; //右顯示
hz_LCDDisp16(4,0,xri);
hz_LCDDisp16(4,16,xqi);
break;
case 5:
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
hz_LCDDisp16(4,32,xtiao);
hz_LCDDisp16(4,48,xzheng);
P4OUT|=CS1; //右顯示
P4OUT&=~CS2;
hz_LCDDisp16(4,0,xyue);
hz_LCDDisp16(4,16,xfen);
break;
case 6:
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
hz_LCDDisp16(4,32,xtiao);
hz_LCDDisp16(4,48,xzheng);
P4OUT|=CS1; //右顯示
P4OUT&=~CS2;
hz_LCDDisp16(4,0,xnian);
hz_LCDDisp16(4,16,xfen);
break;
case 7:
init_lcd();
Clr_Scr();
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
hz_LCDDisp16(4,0,xwen);
hz_LCDDisp16(4,16,xdu);
hz_LCDDisp16(4,32,xshe);
hz_LCDDisp16(4,48,xding);
P4OUT|=CS1;
P4OUT&=~CS2; //右顯示
hz_LCDDisp8(4,8,xgao);
hz_LCDDisp8(4,24,xs[High/10]);
hz_LCDDisp8(4,32,xs[High%10]);
hz_LCDDisp16(4,40,xfuhao);
break;
case 8:
init_lcd();
Clr_Scr();
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
hz_LCDDisp16(4,0,xwen);
hz_LCDDisp16(4,16,xdu);
hz_LCDDisp16(4,32,xshe);
hz_LCDDisp16(4,48,xding);
P4OUT|=CS1;
P4OUT&=~CS2; //右顯示
hz_LCDDisp8(4,8,xdi);
hz_LCDDisp8(4,24,xs[Low/10]);
hz_LCDDisp8(4,32,xs[Low%10]);
hz_LCDDisp16(4,40,xfuhao);
break;
case 9:
init_lcd();
Clr_Scr();
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
hz_LCDDisp16(4,0,xding);
hz_LCDDisp16(4,16,xshi);
hz_LCDDisp16(4,32,xshe);
hz_LCDDisp16(4,48,xding);
P4OUT|=CS1;
P4OUT&=~CS2; //右顯示
hz_LCDDisp16(4,8,xkai);
hz_LCDDisp8(4,24,xs[shikai/10]);
hz_LCDDisp8(4,32,xs[shikai%10]);
//hz_LCDDisp8(4,40,xxiaoshi);
break;
case 10:
init_lcd();
Clr_Scr();
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
hz_LCDDisp16(4,0,xding);
hz_LCDDisp16(4,16,xshi);
hz_LCDDisp16(4,32,xshe);
hz_LCDDisp16(4,48,xding);
P4OUT|=CS1;
P4OUT&=~CS2; //右顯示
hz_LCDDisp16(4,8,xguan);
hz_LCDDisp8(4,24,xs[shiguan/10]);
hz_LCDDisp8(4,32,xs[shiguan%10]);
//hz_LCDDisp8(4,40,xxiaoshi);
break;
case 11:
init_lcd();
Clr_Scr();
return;
break;
}}
}
/*------------------------------加鍵key2---------------------------- */
{
if((P1IN&BIT1)==0) //上調鍵
{
delay(20);
if((P1IN&BIT1)==0)
delay(20);
{
switch(key1n)
{
case 1:
fen++;
if(fen==60)
fen=0;
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
hz_LCDDisp9(2,55,xsc[fen/10]);
P4OUT|=CS1;
P4OUT&=~CS2; //右顯示
hz_LCDDisp9(2,0,xsc[fen%10]);//令LCD在正確位置顯示"加"設定好的分數據
temp=(fen)/10*16+(fen)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x82,temp);//向DS1302內寫分寄存器82H寫入調整后的分數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
break;
case 2:
shi++;
if(shi==24)
shi=0;
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
hz_LCDDisp9(2,28,xsc[shi/10]);
hz_LCDDisp9(2,38,xsc[shi%10]);//令LCD在正確的位置顯示"加"設定好的小時數據
temp=(shi)/10*16+(shi)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x84,temp);//向DS1302內寫小時寄存器84H寫入調整后的小時數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
break;
case 3:
week++;
if(week==8)
week=1;
P4OUT|=CS1;
P4OUT&=~CS2;//右顯示
hz_LCDDisp16(6,40,ds[week]);
temp=(week)/10*16+(week)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x8a,temp);//向DS1302內寫周寄存器8aH寫入調整后的周數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
break;
case 4:
ri++;
if(ri==32)
ri=1;
P4OUT|=CS1;
P4OUT&=~CS2; //右顯示
hz_LCDDisp8(0,24,xs[ri/10]);
hz_LCDDisp8(0,32,xs[ri%10]);//令LCD在正確的位置顯示"加"設定好的日期數據
temp=(ri)/10*16+(ri)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x86,temp);//向DS1302內寫日期寄存器86H寫入調整后的日期數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
break;
case 5:
yue++;
if(yue==13)
yue=1;
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
hz_LCDDisp8(0,56,xs[yue/10]);
P4OUT|=CS1;
P4OUT&=~CS2;//右顯示
hz_LCDDisp8(0,0,xs[yue%10]);//令LCD在正確的位置顯示"加"設定好的月份數據
temp=(yue)/10*16+(yue)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x88,temp);//向DS1302內寫月份寄存器88H寫入調整后的月份數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
break;
case 6:
nian++;
if(nian==100)
nian=0;
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
hz_LCDDisp8(0,24,xs[nian/10]);
hz_LCDDisp8(0,32,xs[nian%10]);//令LCD在正確的位置顯示"加"設定好的年份數據
temp=(nian)/10*16+(nian)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x8c,temp);//向DS1302內寫年份寄存器8cH寫入調整后的年份數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
break;
case 7:
High++;
if(High==100)
High=0;
P4OUT|=CS1;
P4OUT&=~CS2;//右顯示
hz_LCDDisp8(4,24,xs[High/10]);
hz_LCDDisp8(4,32,xs[High%10]);
temp=(High)/10*16+(High)%10;
Init_Ds18b20();
Write_Ds18b20(0xCC);//跳過 ROM 配置
Write_Ds18b20(0x4e); //寫入溫度上下限值
Init_Ds18b20();
Write_Ds18b20(0xCC);//跳過 ROM 配置
Write_Ds18b20(0x48);//溫度報警值存入DS18B20
break;
case 8:
Low++;
if(Low==100)
Low=0;
P4OUT|=CS1;
P4OUT&=~CS2;//右顯示
hz_LCDDisp8(4,24,xs[Low/10]);
hz_LCDDisp8(4,32,xs[Low%10]);
temp=(Low)/10*16+(Low)%10;
Init_Ds18b20();
Write_Ds18b20(0xCC);//跳過 ROM 配置
Write_Ds18b20(0x4e); //寫入溫度上下限值
Init_Ds18b20();
Write_Ds18b20(0xCC);//跳過 ROM 配置
Write_Ds18b20(0x48);//溫度報警值存入DS18B20
break;
case 9:
shikai++;
if(shikai==100)
shikai=0;
P4OUT|=CS1;
P4OUT&=~CS2;//右顯示
hz_LCDDisp8(4,24,xs[shikai/10]);
hz_LCDDisp8(4,32,xs[shikai%10]);
temp=(shikai)/10*16+(shikai)%10;
break;
case 10:
shiguan++;
if(shiguan==100)
shiguan=0;
P4OUT|=CS1;
P4OUT&=~CS2;//右顯示
hz_LCDDisp8(4,24,xs[shiguan/10]);
hz_LCDDisp8(4,32,xs[shiguan%10]);
temp=(shiguan)/10*16+(shiguan)%10;
break;
}}}
//------------------減鍵key3,各句功能參照'加鍵'注釋---------------
if((P1IN&BIT2)==0)
{
delay(20);//調延時,消抖動
if((P1IN&BIT2)==0)
delay(20);
{
switch(key1n)
{
case 1:
fen--;
if(fen==(unsigned char)-1)
fen=59;
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
hz_LCDDisp9(2,55,xsc[fen/10]);
P4OUT|=CS1;
P4OUT&=~CS2; //右顯示
hz_LCDDisp9(2,0,xsc[fen%10]);//令LCD在正確位置顯示"加"設定好的分數據
temp=(fen)/10*16+(fen)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x82,temp);//向DS1302內寫分寄存器82H寫入調整后的分數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
break;
case 2:
shi--;
if(shi==(unsigned char)-1)
shi=23;
P4OUT&=~CS2;//左顯示 ;
P4OUT|=CS2;//
hz_LCDDisp9(2,28,xsc[shi/10]);
hz_LCDDisp9(2,38,xsc[shi%10]);//令LCD在正確的位置顯示"加"設定好的小時數據
temp=(shi)/10*16+(shi)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x84,temp);//向DS1302內寫小時寄存器84H寫入調整后的小時數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
break;
case 3:
week--;
if(week==0)
week=7;
P4OUT|=CS1;//CS1_L;
P4OUT&=~CS2;//右顯示
hz_LCDDisp16(6,40,ds[week]);
temp=(week)/10*16+(week)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x8a,temp);//向DS1302內寫周寄存器8aH寫入調整后的周數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
break;
case 4:
ri--;
if(ri==0)
ri=31;
P4OUT|=CS1;
P4OUT&=~CS2;//右顯示
hz_LCDDisp8(0,24,xs[ri/10]);
hz_LCDDisp8(0,32,xs[ri%10]);//令LCD在正確的位置顯示"加"設定好的日期數據
temp=(ri)/10*16+(ri)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x86,temp);//向DS1302內寫日期寄存器86H寫入調整后的日期數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
break;
case 5:
yue--;
if(yue==0)
yue=12;
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;
hz_LCDDisp8(0,56,xs[yue/10]);
P4OUT|=CS1;
P4OUT&=~CS2;//右顯示
hz_LCDDisp8(0,0,xs[yue%10]);
hz_LCDDisp16(0,8,xyue);//令LCD在正確的位置顯示"加"設定好的月份數據
temp=(yue)/10*16+(yue)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x88,temp);//向DS1302內寫月份寄存器88H寫入調整后的月份數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
break;
case 6:
nian--;
if(nian==(unsigned char)-1)
nian=99;
P4OUT&=~CS1;//左顯示
P4OUT|=CS2;//
hz_LCDDisp8(0,24,xs[nian/10]);
hz_LCDDisp8(0,32,xs[nian%10]);//令LCD在正確的位置顯示"加"設定好的年份數據
temp=(nian)/10*16+(nian)%10;//十進制轉換成DS1302要求的DCB碼
write_1302(0x8e,0x00);//允許寫,禁止寫保護
write_1302(0x8c,temp);//向DS1302內寫年份寄存器8cH寫入調整后的年份數據BCD碼
write_1302(0x8e,0x80);//打開寫保護
break;
case 7:
High--;
if(High==(unsigned char)-1)
High=99;
P4OUT|=CS1;
P4OUT&=~CS2;//右顯示
hz_LCDDisp8(4,24,xs[High/10]);
hz_LCDDisp8(4,32,xs[High%10]);
temp=(High)/10*16+(High)%10;
Init_Ds18b20();
Write_Ds18b20(0xCC);//跳過 ROM 配置
Write_Ds18b20(0x4e); //寫入溫度上下限值
Init_Ds18b20();
Write_Ds18b20(0xCC);//跳過 ROM 配置
Write_Ds18b20(0x48);//溫度報警值存入DS18B20
break;
case 8:
Low--;
if(Low==(unsigned char)-1)
Low=99;
P4OUT|=CS1;
P4OUT&=~CS2;//右顯示
hz_LCDDisp8(4,24,xs[Low/10]);
hz_LCDDisp8(4,32,xs[Low%10]);
temp=(Low)/10*16+(Low)%10;
Init_Ds18b20();
Write_Ds18b20(0xCC);//跳過 ROM 配置
Write_Ds18b20(0x4e); //寫入溫度上下限值
Init_Ds18b20();
Write_Ds18b20(0xCC);//跳過 ROM 配置
Write_Ds18b20(0x48);//溫度報警值存入DS18B20
break;
case 9:
shikai--;
if(shikai==(unsigned char)-1)
shikai=99;
P4OUT|=CS1;
P4OUT&=~CS2;//右顯示
hz_LCDDisp8(4,24,xs[shikai/10]);
hz_LCDDisp8(4,32,xs[shikai%10]);
temp=(shikai)/10*16+(shikai)%10;
break;
case 10:
shiguan--;
if(shiguan==(unsigned char)-1)
shiguan=99;
P4OUT|=CS1;
P4OUT&=~CS2;//右顯示
hz_LCDDisp8(4,24,xs[shiguan/10]);
hz_LCDDisp8(4,32,xs[shiguan%10]);
temp=(shiguan)/10*16+(shiguan)%10;
break;
}}}
}
}
}
#endif
#ifndef _DS1302_H_
#define _DS1302_H_
/**************************************************/
#include <msp430f149.h>
/******************************************************/
#define uint unsigned int
#define uchar unsigned char
/************************************************/
#define Busy 0X80
#define Ctr1Dir
#define SCLK_1 P2OUT|=BIT3//1302芯片時鐘端口
#define SCLK_0 P2OUT&=~BIT3
#define SCLK_OUT P2DIR|=BIT3
#define SCLK_IN P2DIR&=~BIT3
#define DATA_1 P2OUT|=BIT4//1302芯片數據端口
#define DATA_0 P2OUT&=~BIT4
#define DATA_OUT P2DIR|=BIT4
#define DATA_IN P2DIR&=~BIT4
#define DATA (P2IN&BIT4)
#define RST_1 P2OUT|=BIT5//復位端口
#define RST_0 P2OUT&=~BIT5
#define RST_OUT P2DIR|=BIT5
#define RST_IN P2DIR&=~BIT5
#define CPU_F ((double)11900000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
/*****************************************************
函數功能:向1302寫一個字節數據
入口參數:x
***************************************************/
void write_byte(uchar dat)
{
uchar i;
DATA_OUT;//
SCLK_0;
delay_us(2);
for(i=0;i<8;i++)
{
if(dat&0x01) DATA_1;
else DATA_0;
delay_us(2);
SCLK_1;
delay_us(2);
SCLK_0;
dat>>=1;
}
}
/*****************************************************
函數功能:從1302讀一個字節數據
入口參數:x
***************************************************/
uchar read_byte()//讀一個字節uchar Read1302(void)
{
uchar i,dat;
delay_us(2);
DATA_IN;
DATA_0;//
for(i=0;i<8;i++)
{
dat>>=1;
if(DATA!=0) dat|=0x80;
else dat&=0x7f;
SCLK_1;
delay_us(2);
SCLK_0;
delay_us(2);
}
DATA_OUT;//
return dat;
}
/*****************************************************
函數功能:根據命令字,向1302寫一個字節數據
入口參數:Cmd,儲存命令字;dat,儲存待寫的數據
***************************************************/
void write_1302(uchar add,uchar dat)//向1302芯片寫函數,指定寫入地址,數據void WriteSet1302(uchar Cmd,uchar dat)
{
RST_0;
SCLK_0;
RST_1;
delay_us(2);
write_byte(add);
write_byte(dat);
SCLK_1;
RST_0;
}
/*****************************************************
函數功能:根據命令字,從1302讀取一個字節數據
入口參數:Cmd
***************************************************/
uchar read_1302(uchar Cmd)//從1302讀數據函數,指定讀取數據來源地址uchar ReadSet1302(uchar Cmd)
{
uchar dat;
RST_0;
SCLK_0;
RST_1;
write_byte(Cmd);
dat=read_byte();
SCLK_1;
RST_0;
return dat;
}
uchar BCD_Decimal(uchar bcd)//BCD碼轉十進制函數,輸入BCD,返回十進制
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0f));
}
//--------------------------------------
void ds1302_init() //1302芯片初始化子函數(2010-01-07,12:00:00,week4)
{
RST_0;
SCLK_0;
write_1302(0x8e,0x00); //允許寫,禁止寫保護
/*==========設置初始日期========*/
write_1302(0x80,0x00); //向DS1302內寫秒寄存器80H寫入初始秒數據00
write_1302(0x82,0x00);//向DS1302內寫分寄存器82H寫入初始分數據00
write_1302(0x84,0x12);//向DS1302內寫小時寄存器84H寫入初始小時數據12
write_1302(0x8a,0x04);//向DS1302內寫周寄存器8aH寫入初始周數據4
write_1302(0x86,0x01);//向DS1302內寫日期寄存器86H寫入初始日期數據01
write_1302(0x88,0x01);//向DS1302內寫月份寄存器88H寫入初始月份數據01
write_1302(0x8c,0x10);//向DS1302內寫年份寄存器8cH寫入初始年份數據10
/*===========設置初始日期========*/
write_1302(0x8e,0x80); //打開寫保護
}
#endif
#ifndef _DS18B20_H_
#define _DS18B20_H_
/**********************************************************************/
#include <msp430f149.h>
/**********************************************************************/
#define uint unsigned int
#define uchar unsigned char
/***************************DS18B20 管腳配置*******************************/
#define DS18B20_DIR P2DIR
#define DS18B20_OUT P2OUT
#define DS18B20_IN P2IN
#define DS18B20_DQ BIT1
#define DS18B20_H DS18B20_OUT|=DS18B20_DQ//DQ 置位
#define DS18B20_L DS18B20_OUT&=~DS18B20_DQ//DQ 復位
#define DQ_IN DS18B20_DIR&=~DS18B20_DQ//設置 DQ 為輸入
#define DQ_OUT DS18B20_DIR|=DS18B20_DQ//設置 DQ 為輸出
#define READ_DQ (DS18B20_IN&DS18B20_DQ)//讀 DQ 電平
/*********************************************************************/
int Alarm_Temp_HL[2]={70,20};
/*****************************************************************/
void delay_50us(unsigned int t)
{
unsigned int j;
for(;t>0;t--)
for(j=10;j>0;j--);
}
void delayms(uint t)
{
uint i;
while(t--)
{
for(i=0;i<125;i++);
}
}
/********************初始化 DS18B20************************/
void Init_Ds18b20()
{
int i=1;
P2DIR|=BIT1; //單片機輸出
P2OUT|=BIT1; //接口先拉高
delay_50us(2); //短暫延時
P2OUT&= ~BIT1; //接口拉低
delay_50us(12); //600us 480-960us 之間的復位脈沖
P2OUT|= BIT1; //電阻上拉
P2DIR&= ~BIT1; //單片機輸入, DS1820 控制
do
{
if(!(P2IN&BIT1))
{
P2DIR |= BIT1; //如果接到一個 DS1820 的低電平則下一步, 否則繼續等待
i=0;
}
}while(i);
}
/****************DS18B20 寫命令函數************************/
void Write_Ds18b20(uchar temp)
{
int j;
for(int i=0;i<8;i++)
{
P2DIR |= BIT1;
P2OUT |= BIT1; //先拉高
P2OUT &= ~BIT1; //再拉低
j++; // 1us
if(temp&0x01) //最低位移出
P2OUT |= BIT1; //寫完以后寫高
else
P2OUT &= ~BIT1;
delay_50us(2); //持續 60us 以上
temp=temp>>1; //右移 1 位
}
}
/****************DS18B20 讀字節函數***********************/
char Read_Ds18b20(void)
{
int j;
uchar temp=0;
for(int i=0;i<8;i++)
{
temp>>=1;
P2DIR |= BIT1; //單片機輸出
P2DIR |= BIT1;
P2OUT &= ~BIT1; //拉低
j++; //1us 延時
P2OUT |= BIT1; //1us 延時后拉高
j++;
P2DIR &= ~BIT1;
if(P2IN&BIT1) temp|=0x80; //寫入為 1
else ; //寫入為 0
delay_50us(2); //100 us 至少 60us
}
return(temp);
}
/******************************* 讀取溫度函數 *****************************
* 功能:如果單總線節點上只有一個器件則可以直接掉用本函數。如果節點上有多個器
* 件,為了避免數據沖突,應使用Match ROM函數來選中特定器件。
* 注: 本函數是根據DS1820的溫度數據格式編寫的,若用于DS18B20,必須根據
* DS18B20的溫度數據格式作適當修改。
**************************************************************************/
unsigned int ReadTemperature(void)
{
unsigned char get[10];
unsigned char temp_lsb,temp_msb;
unsigned int t;
unsigned char k;
Init_Ds18b20();
delay_50us(18);
Write_Ds18b20(0xCC); // 跳過 ROM
Write_Ds18b20(0x44); // 啟動溫度轉換
Init_Ds18b20();
delay_50us(18);
Write_Ds18b20(0xCC); // 跳過 ROM
Write_Ds18b20(0xBE); // 讀暫存器
for (k=0;k<2;k++)
{
get[k]=Read_Ds18b20();
}
temp_msb = get[1]; // Sign byte + lsbit
temp_lsb = get[0]; // Temp data plus lsb
t=temp_msb*256+temp_lsb;
t=t&0x0ff0;
if(t<0xff&&t>0xf0)
t=(-1)*t;
return t>>4;
}
/****************設置DS18B20溫度報警值*********************/
void Set_Alarm_Temp_Value()
{
Init_Ds18b20();
Write_Ds18b20(0xCC);//跳過 ROM 配置
Write_Ds18b20(0x4e); //寫入溫度上下限值
Write_Ds18b20(Alarm_Temp_HL[0]);//寫TH
Write_Ds18b20(Alarm_Temp_HL[1]); // 寫TL
Write_Ds18b20(0x7f);
Init_Ds18b20();
Write_Ds18b20(0xCC);//跳過 ROM 配置
Write_Ds18b20(0x48);//溫度報警值存入DS18B20
}
#endif
|