找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1053|回复: 0
收起左侧

MSP430F149万年历

[复制链接]
ID:362653 发表于 2022-4-15 16:00 | 显示全部楼层 |阅读模式
/**************************包含头文件******************/
#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





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表