文档库 最新最全的文档下载
当前位置:文档库 › 51单片机 12864 st7920液晶 DS1302 DS18B20 万年历 显示出了温度值 温度符号时间

51单片机 12864 st7920液晶 DS1302 DS18B20 万年历 显示出了温度值 温度符号时间

/******************************************************************************
st7920显示驱动、ds1302驱动、ds18b20驱动 显示时间,温度
******************************************************************************/
#include

sbit Bell_Out = P2^2;//闹钟管脚输出,低有效

sbit DQ = P2^3;//ds1820data
sbit clock_clk = P1^7;//ds1302_clk
sbit clock_dat = P1^6;//ds1302_dat
sbit clock_Rst = P1^5;//ds1302_Rst

//键盘扫描
sbit Add_Key = P2^4;//加1键
sbit Dec_Key = P2^5;//减1键
sbit OK_Key = P2^6;//确定键

//引脚定义
sbit CS = P3^5; //片选 高电平有效 单片LCD使用时可固定高电平
sbit SID = P3^6; //数据
sbit SCLK = P3^4; //时钟
sbit PSB = P3^0;
//为了编程方便定义的位变量
sbit a0 = ACC ^ 0;
sbit a1 = ACC ^ 1;
sbit a2 = ACC ^ 2;
sbit a3 = ACC ^ 3;
sbit a4 = ACC ^ 4;
sbit a5 = ACC ^ 5;
sbit a6 = ACC ^ 6;
sbit a7 = ACC ^ 7;

bit flag, Bell_Swh,Hourb,Minb,Kgb;//闹钟调时闪烁标志位
bit sec=0,min=0,hour=0,year=0,mon=0,day=0,weekk=0; //闪烁标志位
unsigned char id;
unsigned char id2;
unsigned char d;
unsigned char e;
unsigned char S_1302;
unsigned char H_1302;
unsigned char H_Bell;
unsigned char S_Bell;

//Function Definition 函数声明
void Delay(int num);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
unsigned int ReadTemperature(void);
void clock_out(unsigned char dd);
unsigned char clock_in(void);
unsigned char read_clock(unsigned char ord);
void write_clock(unsigned char ord, unsigned char dd);
void Disp(void);
void id_case1_key(void);
void id_case2_key(void);
void Set_time(unsigned char sel,bit sel_1);
void Timer0_Init(void);
void Init_1302(void);
void Set_Bell(unsigned char sel, bit sel_1);
void Bell(void);

//12864
void Write_char(bit start, unsigned char ddata);
void Send_byte(unsigned char bbyte);
void Delaynms(unsigned int di);
void Lcd_init(void);
void Disp_img(unsigned char *img);

//void Lcd_img_Cls(void);
void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s);
void LCD_set_xy( unsigned char x, unsigned char y );

unsigned char code num[]={"0123456789 :."};
unsigned char code yi[]={"一"};
unsigned char code er[]={"二"};
unsigned char code san[]={"三"};
unsigned char code si[]={"四"};
unsigned char code wu[]={"五"};
unsigned char code liu[]={"六"};
unsigned char code ri[]={"日"};
unsigned char code guan[]={"关"};
unsigned char code kai[]={"开"};
unsigned char code bt[]={"张成万年历"};
unsigned char code nian[]={"年"};
unsigned char code yue[]={"月"};
unsigned char code xq[]={"星期"};
unsigned char code sw[]={"室温"};
unsigned char code ssd[]={"℃"};
unsigned char code nzbz []={"ON"};
unsigned char code nzsd []={"闹钟设定"};
unsigned char code colon []={":"};
unsigned char code nzsjd []={"闹钟时候到!"};
unsigned c

har code xsfz[]={"H : M"};
unsigned char code space_c[]={" "};

unsigned char code logo[]={
/*-- 调入了一幅图像:logo.bmp -- */
/*-- 宽度x高度=128x64 显示湘灵电子LOGO --*/
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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x06,0x00,0x00,0x30,0x00,0x00,0x37,0xF8,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0x30,0x06,0x00,0x01,0x20,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x30,0x06,0x00,0x02,0x60,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x38,0x06,0x00,0x16,0x40,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
0x3C,0x06,0x00,0x24,0x00,0x3F,0x80,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
0x3C,0x0F,0x00,0x64,0x01,0xFF,0xF0,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
0x3F,0x1F,0x00,0x60,0x0F,0xFF,0xFC,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
0x17,0xBF,0xE0,0x60,0x3F,0xFF,0xFE,0x7F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7F,0x80,0x80,0xFF,0x00,0x3F,0x7F,0xFF,0xC0,0x00,0x00,0x00,0x01,0x80,0x00,
0x00,0x7E,0x01,0x81,0xF8,0x00,0x0F,0x01,0xE0,0x00,0x00,0x00,0x00,0x01,0xE6,0x00,
0x00,0x0E,0x03,0x43,0xEF,0xFC,0x0F,0x80,0xC0,0x00,0x00,0x00,0x00,0x03,0x7F,0x00,
0x00,0x0E,0x03,0x07,0xCF,0xFE,0x0F,0x80,0xC0,0x00,0x00,0x00,0x00,0x06,0x19,0x80,
0x00,0x0E,0x06,0x0F,0xBF,0xFE,0x0F,0x80,0xC0,0x00,0x3F,0x80,0x00,0x06,0x00,0xC0,
0x60,0x0E,0x06,0x1F,0x3F,0xBE,0x0F,0x00,0xC0,0x00,0xFF,0xC0,0x00,0x04,0x00,0xC0,
0x60,0x0E,0x0E,0x3C,0x7F,0x9E,0x0F,0x10,0xC0,0x81,0x80,0x60,0x01,0x84,0x00,0xC0,
0x60,0x0E,0x0C,0x38,0xFF,0xFE,0x1E,0x10,0xC1,0x83,0x00,0x21,0xC6,0x8C,0x00,0x60,
0x38,0x1E,0x18,0x70,0xFF,0xFE,0x3C,0x30,0xC3,0x0E,0x00,0x63,0x2C,0x8C,0xE0,0x30,
0x7F,0x9E,0x18,0x71,0xFF,0xFC,0x78,0x70,0xC3,0x18,0x00,0x62,0x29,0x8D,0xF8,0x18,
0x3E,0xBF

,0x18,0xE1,0xFF,0xFC,0xF0,0x7C,0xC2,0x10,0x01,0xC2,0x25,0xF9,0x1E,0x08,
0x30,0x76,0x18,0xC1,0xFF,0xF1,0xE0,0xEC,0xC0,0x30,0x03,0x02,0x24,0xF9,0x03,0x8C,
0x20,0x66,0x11,0xC0,0xFF,0xE7,0x80,0x82,0x60,0x10,0x02,0x06,0x64,0x19,0x00,0x84,
0x20,0xC6,0x11,0x80,0xFF,0x9F,0x00,0x00,0xF0,0x19,0xC2,0x06,0x64,0x1F,0x10,0xCC,
0x01,0xC4,0x09,0x80,0x7F,0x7C,0x00,0x00,0xF8,0x0F,0x63,0x06,0x2C,0x1E,0x38,0xC8,
0x01,0x84,0x01,0x80,0x00,0xF8,0x0C,0x00,0xD8,0x00,0x23,0x06,0x38,0x12,0x01,0x98,
0x01,0x04,0x01,0x80,0x07,0xE0,0x18,0x00,0xCC,0x00,0x31,0x03,0x19,0xF6,0x01,0xF0,
0x00,0x04,0x01,0x98,0x7F,0x00,0x30,0x00,0x86,0x00,0x11,0x01,0x18,0x37,0x81,0x80,
0x00,0x04,0x01,0xC7,0xFC,0x00,0xE0,0x00,0x87,0x00,0x19,0x81,0x98,0x1D,0x9F,0x00,
0x00,0x04,0x01,0xC0,0x00,0x01,0x80,0x01,0x83,0x80,0x18,0xF0,0x98,0x18,0x03,0x00,
0x03,0x04,0x00,0xE0,0x00,0x07,0x00,0x01,0x01,0xC0,0xF8,0xD8,0x98,0xA8,0x03,0x00,
0x07,0x04,0x00,0xF0,0x00,0x1E,0x00,0x03,0x00,0xE0,0xC0,0x08,0x99,0xEF,0x3E,0x00,
0x0E,0x04,0x00,0x7C,0x00,0x7C,0x00,0x06,0x00,0x60,0xC0,0x08,0x99,0x12,0x36,0x00,
0x1C,0x04,0x00,0x3F,0xCF,0xF0,0x00,0x0C,0x00,0x30,0x40,0x0C,0x99,0x10,0x02,0x00,
0x3C,0x04,0x00,0x0F,0xFF,0xC0,0x00,0x38,0x00,0x18,0x7F,0xF8,0xFF,0x18,0x06,0x00,
0x3C,0x04,0x00,0x03,0xFF,0x00,0x00,0x60,0x00,0x00,0x3F,0xF0,0x66,0x1F,0xFC,0x00,
0x3C,0x04,0x00,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3C,0x0C,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3C,0x0C,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3C,0x0C,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x18,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,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,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,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,
};
/******************************************************************************************
* 函数名称 :Lcd_init
* 功能描述 :初始化LCD
******************************************************************************************/
void Lcd_init(void)
{
Delaynms(10); //启动等待,等LCM讲入工作状态
CS=1;
Write_char(0,0x30); //8 位介面,基本指令集
Write_char(0,0x0c); //显示打开,光标关,反白关
Write_char(0,0x01); //清屏,将DDRAM的地址计数器归零
}

/

******************************************************************************************
* 函数名称 :Write_char
* 功能描述 :写指令或数据
******************************************************************************************/
void Write_char(bit start, unsigned char ddata)
{
unsigned char start_data,Hdata,Ldata;
if(start==0)
start_data=0xf8; //写指令
else
start_data=0xfa; //写数据

Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
Send_byte(start_data); //发送起始信号
Delaynms(5); //延时是必须的
Send_byte(Hdata); //发送高四位
Delaynms(1); //延时是必须的
Send_byte(Ldata); //发送低四位
Delaynms(1); //延时是必须的
}

/******************************************************************************************
* 函数名称 :Send_byte
* 功能描述 :发送一个字节
******************************************************************************************/
void Send_byte(unsigned char bbyte)
{
unsigned char i;
for(i=0;i<8;i++)
{
SID=bbyte&0x80; //取出最高位
SCLK=1;
SCLK=0;
bbyte<<=1; //左移
}
}

/******************************************************************************************
* 函数名称 :Delaynms
* 功能描述 :延时
******************************************************************************************/
void Delaynms(unsigned int di)
{
unsigned int da,db;
for(da=0;dafor(db=0;db<10;db++);
}

/******************************************************************************************
* 函数名称 :Disp_img
* 功能描述 :图形方式12864显示字模221 横向取膜
******************************************************************************************/
void Disp_img(unsigned char *img)
{
unsigned char i,j;
unsigned int k = 0;

Write_char(0,0x36); //图形方式
for(i=0;i<32;i++)
{
Write_char(0,0x80+i);
Write_char(0,0x80);
for(j=0;j<16;j++)
{
Write_char(1,img[k++]);
}
}

for(i=0;i<32;i++)
{
Write_char(0,0x80+i);
Write_char(0,0x88);
for(j=0;j<16;j++)
{
Write_char(1,img[k++]);
}
}
}

/******************************************************************************************
* 函数名称 :Clr_Scr
* 功能描述 :清屏函数
******************************************************************************************/
void Clr_Scr(void)//清屏函数
{
Write_char(0,0x01);
}

/******************************************************************************************
* 函数名称 : LCD_set_xy
* 功能描述 :设置LCD显示的起始位置,X为行,Y为列
******************************************************************************************/
void LCD_set_xy( uns

igned char x, unsigned char y )
{
unsigned char address;
switch(x)
{
case 0:
address = 0x80 + y;
break;
case 1:
address = 0x80 + y;
break;
case 2:
address = 0x90 + y;
break;
case 3:
address = 0x88 + y;
break;
case 4:
address = 0x98 + y;
break;
default:
address = 0x80 + y;
break;
}
Write_char(0, address);
}

/******************************************************************************************
* 函数名称 :LCD_Write_string
* 功能描述 :中英文字符串显示函数
******************************************************************************************/
void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
{
LCD_set_xy( X, Y );

while (*s)
{
Write_char( 1, *s );
s ++;
Delaynms(1);
}
}

/******************************************************************************************
* 函数名称 :LCD_Write_number
* 功能描述 :数字显示函数
******************************************************************************************/
void LCD_Write_number(unsigned char s)// 数字显示函数
{
Write_char(1,num[s]);
Delaynms(1);
}

/******************************************************************************************
* 函数名称 :LCD_Write_week
* 功能描述 :显示星期几函数
******************************************************************************************/
void LCD_Write_week(unsigned char s)
{
switch(s)
{
case 1:
LCD_Write_string(3,2,yi);
break;
case 2:
LCD_Write_string(3,2,er);
break;
case 3:
LCD_Write_string(3,2,san);
break;
case 4:
LCD_Write_string(3,2,si);
break;
case 5:
LCD_Write_string(3,2,wu);
break;
case 6:
LCD_Write_string(3,2,liu);
break;
case 7:
LCD_Write_string(3,2,ri);
break;
case 8:
LCD_Write_string(3,2,space_c);
break;//显示空格,为调整时间用
default:
break;
}
}

/******************************************************************************************
* 函数名称 :Delay
* 功能描述 :延时函数
******************************************************************************************/
void Delay(int num)
{
while(num--);
}

/******************************************************************************************
* 函数名称 :Init_DS18B20
* 功能描述 :初始化ds18B20
******************************************************************************************/
void Init_DS18B20(void)//初始化ds1820
{
unsigned char x=0;
DQ = 1; //DQ复位
Delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
Delay(14);
x=DQ; //稍做延时后 如果

x=0则初始化成功 x=1则初始化失败
Delay(20);
}

/******************************************************************************************
* 函数名称 :ReadOneChar
* 功能描述 :读一个字节
******************************************************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}

/******************************************************************************************
* 函数名称 :WriteOneChar
* 功能描述 :写一个字节
******************************************************************************************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay(5);
DQ = 1;
dat>>=1;
}
}

/******************************************************************************************
* 函数名称 :ReadTemperature
* 功能描述 :读取温度
******************************************************************************************/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;


Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读高8位
t=b;
t<<=8;
t=t|a;
if(t<0x0fff)
tflag=0;
else
{
t=~t+1;
tflag=1;
}
t=((b*256)+a)*0.0625*100; //乘以100,既是精确到小数点后2位
return(t);
}

/******************************************************************************************
* 函数名称 :clock_out
******************************************************************************************/
void clock_out(unsigned char dd)
{
ACC=dd;
clock_dat=a0; clock_clk=1; clock_clk=0;
clock_dat=a1; clock_clk=1; clock_clk=0;
clock_dat=a2; clock_clk=1; clock_clk=0;
clock_dat=a3; clock_clk=1; clock_clk=0;
clock_dat=a4; clock_clk=1; clock_clk=0;
clock_dat=a5; clock_clk=1; clock_clk=0;
clock_dat=a6; clock_clk=1; clock_clk=0;
clock_dat=a7; clock_clk=1; clock_clk=0;
}

/******************************************************************************************
* 函数名称 :clock_in
******************************************************************************************/
unsigned char clock_in(void)
{
clock_dat=1;
a0=clock_dat;
clock_clk=1; clock_clk=0; a1=clock_dat;
clock_clk=1; clock_clk=0; a2=clock_dat;
clock_clk=1; clock_clk=0; a3=clock_dat;
clock_clk=1; clock_clk=0; a4=clock_dat;
clock_clk=1; clock_clk=0; a5=clock_dat;


clock_clk=1; clock_clk=0; a6=clock_dat;
clock_clk=1; clock_clk=0; a7=clock_dat;
return(ACC);
}

/******************************************************************************************
* 函数名称 :read_clock
******************************************************************************************/
unsigned char read_clock(unsigned char ord)
{
unsigned char dd=0;
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
dd=clock_in();
clock_Rst=0;
clock_clk=1;
return(dd);
}

/******************************************************************************************
* 函数名称 : write_clock
******************************************************************************************/
void write_clock(unsigned char ord, unsigned char dd)
{
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
clock_out(dd);
clock_Rst=0;
clock_clk=1;
}

/******************************************************************************************
* 函数名称 :Disp
* 功能描述 :显示和闪烁函数
******************************************************************************************/
void Disp(void)
{
unsigned int i=0;
unsigned char a=0,b=0,c=0,d=0,f=0;
uchar flagdat;

if(tflag==0)
flagdat=0x2b;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-

i=ReadTemperature();//读温度并送显
a=i/1000;

LCD_set_xy(4,2);
Write_char(1,flagdat);
LCD_Write_number(a);
b=i%1000/100;
LCD_Write_number(b);
LCD_Write_number(12);//.
c=i%1000%100/10;
LCD_Write_number(c);
d=i%1000%100%10;
LCD_Write_number(d);
Write_char(1,0xdf);

if(hour==1) //小时闪烁标志位
{
if(flag==1)
{
d=read_clock(0x85);//读小时
e=d;
d=d>>4;
e=e&0x0f;
LCD_set_xy(3,3);
LCD_Write_number(d);
LCD_Write_number(e);
}
else
{
LCD_set_xy(3,3);
LCD_Write_number(10); //显示空格
LCD_Write_number(10);
}
}
else
{
d=read_clock(0x85);//读小时
e=d;
d=d>>4;
e=e&0x0f;
LCD_set_xy(3,3);
LCD_Write_number(d);
LCD_Write_number(e);
}

if(flag == 0)
LCD_Write_number(11); //显示:
else
LCD_Write_number(10);

if(min==1) //分钟闪烁标志位
{
if(flag==1)
{
d=read_clock(0x83);//读分钟
e=d;
d=d>>4;
e=e&0x0f;
LCD_Write_number(d);
LCD_Write_number(e);
}
else
{
LCD_Write_number(10); //显示空格
LCD_Write_number(10);
}
}
else
{
d=read_clock(0x83);//读分钟
e=d;
d=d>>4;
e=e&0x0f;
LCD_Write_number(d);
LCD_Write_number(e);
}

if(flag == 0)
LCD_Write_number(1

1);//显示:
else
LCD_Write_number(10);

if(sec==1) //秒闪烁标志位
{
if(flag==1)
{
d=read_clock(0x81);//读秒
e=d;
d=d>>4;
e=e&0x0f;
LCD_Write_number(d);//送显示
LCD_Write_number(e);
}
else
{
LCD_Write_number(10); //显示数字空格
LCD_Write_number(10);
}
}
else
{
d=read_clock(0x81);//读秒
e=d;
d=d>>4;
e=e&0x0f;
LCD_Write_number(d);
LCD_Write_number(e);
}

if(year==1) //年闪烁标志位
{
if(flag==1)
{
d=read_clock(0x8d);//读年
e=d;
d=d>>4;
e=e&0x0f;
LCD_set_xy(2,2);
LCD_Write_number(d);
LCD_Write_number(e);
}
else
{
LCD_set_xy(2,2);
LCD_Write_number(10); //显示空格
LCD_Write_number(10);
}
}
else
{
d=read_clock(0x8d);//读年
e=d;
d=d>>4;
e=e&0x0f;
LCD_set_xy(2,2);
LCD_Write_number(d);
LCD_Write_number(e);
}

if(mon==1) //月闪烁标志位
{
if(flag==1)
{
d=read_clock(0x89);//读月
e=d;
d=d>>4;
e=e&0x0f;
LCD_set_xy(2,4);
LCD_Write_number(d);
LCD_Write_number(e);

}
else
{
LCD_set_xy(2,4);
LCD_Write_number(10); //显示空格
LCD_Write_number(10);
}
}
else
{
d=read_clock(0x89);//读月
e=d;
d=d>>4;
e=e&0x0f;
LCD_set_xy(2,4);
LCD_Write_number(d);
LCD_Write_number(e);
}

if(day==1) //日闪烁标志位
{
if(flag==1)
{
d=read_clock(0x87);//读日
e=d;
d=d>>4;
e=e&0x0f;
LCD_set_xy(2,6);
LCD_Write_number(d);
LCD_Write_number(e);
}
else
{
LCD_set_xy(2,6);
LCD_Write_number(10); //显示空格
LCD_Write_number(10);
}
}
else
{
d=read_clock(0x87);//读日
e=d;
d=d>>4;
e=e&0x0f;
LCD_set_xy(2,6);
LCD_Write_number(d);
LCD_Write_number(e);
}

if(weekk==1) //星期闪烁标志位
{
if(flag==1)
{
d=read_clock(0x8b);//读星期
LCD_Write_week(d);
}
else
{
LCD_Write_week(8); //显示空格
}
}
else
{
d=read_clock(0x8b);//读星期
LCD_Write_week(d);
}
}

/******************************************************************************************
* 函数名称 :Disp2
* 功能描述 :显示和闪烁函数

******************************************************************************************/
void Disp2(void)
{
if(Kgb==1) //

开关闪烁标志位
{
if(flag==1)
{
if(Bell_Swh == 0)//0为关
{
LCD_Write_string(1,6,guan);//显示关
}
else
{
LCD_Write_string(1,6,kai);//显示开
}
}
else
{
LCD_Write_string(1,6,space_c); //显示空格
}
}
else
{
if(Bell_Swh == 0)//关
{
LCD_Write_string(1,6,guan);
}
else
{
LCD_Write_string(1,6,kai);
}
}

if(Hourb==1) //时闪烁标志位
{
if(flag==1)
{
d=read_clock(0xc3);//读闹钟小时的数值
e=d;
d=d>>4;
e=e&0x0f;
LCD_set_xy(3,3);
LCD_Write_number(d);
LCD_Write_number(e);
}
else
{
LCD_set_xy(3,3);
LCD_Write_number(10); //显示空格
LCD_Write_number(10);
}
}
else
{
d=read_clock(0xc3);//读闹钟小时的数值
e=d;
d=d>>4;
e=e&0x0f;
LCD_set_xy(3,3);
LCD_Write_number(d);
LCD_Write_number(e);
}

if(flag == 0)
LCD_Write_number(11);//显示:构成闪烁壮
else
LCD_Write_number(10);

if(Minb==1) //分钟闪烁标志位
{
if(flag==1)
{
d=read_clock(0xc5);//读闹钟分钟的数值
e=d;
d=d>>4;
e=e&0x0f;
LCD_Write_number(d);
LCD_Write_number(e);
}
else
{
LCD_Write_number(10); //显示空格
LCD_Write_number(10);
}
}
else
{
d=read_clock(0xc5);//读闹钟分钟的数值
e=d;
d=d>>4;
e=e&0x0f;
LCD_Write_number(d);
LCD_Write_number(e);
}
}

/******************************************************************************************
* 函数名称 :id_case1_key
* 功能描述 :id为1时的下一级选择
******************************************************************************************/
void id_case1_key(void)
{
if(Add_Key == 0) //增加
{
Delay(100);
if(Add_Key == 0)
Set_time(id,0); //调用Set_time函数
while(Add_Key ==0);
}
if (Dec_Key==0) //减少
{
Delay(100);
if(Dec_Key == 0)
Set_time(id,1);
while(Dec_Key ==0);
}
}

/******************************************************************************************
* 函数名称 :Set_time
* 功能描述 :根据选择调整相应项目并写入DS1302
******************************************************************************************/
void Set_time(unsigned char sel, bit sel_1)
{
signed char address,item;
signed char max,mini;
if(sel==7)
{
address=0x80;
max=0;
mini=0;
} //秒
if(sel==6)
{
address=0x82;
max=59;
mini=0;
} //分钟
if(sel==5)
{
address=0x84;
max=23;
mini=0;
} //小时
if(sel==3)
{
address=0x8

6;
max=31;
mini=1;
} //日
if(sel==2)
{
address=0x88;
max=12;
mini=1;
} //月
if(sel==1)
{
address=0x8c;
max=99;
mini=0;
} //年
if(sel==4)
{
address=0x8a;
max=7;
mini=1;
} //星期

//读取1302某地址上的数值转换成10进制赋给item
item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
if(sel_1==0)
item++;
else
item--;
if(item>max)
item=mini;
if(itemitem=max;

write_clock(0x8e,0x00);//允许写操作
write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
write_clock(0x8e,0x80);//写保护,禁止写操作
}

/******************************************************************************************
* 函数名称 :id_case2_key
* 功能描述 :id为1时的下一级选择
******************************************************************************************/
void id_case2_key(void)
{
if(Add_Key == 0) //增加
{
Delay(100);
if(Add_Key == 0)
Set_Bell(id2,0); //调用Set_time函数
while(Add_Key ==0);
}
if (Dec_Key==0) //减少
{
Delay(100);
if(Dec_Key == 0)
Set_Bell(id2,1);
while(Dec_Key ==0);
}
}

/******************************************************************************************
* 函数名称 :Set_Bell
* 功能描述 :根据选择调整相应项目
******************************************************************************************/
void Set_Bell(unsigned char sel, bit sel_1)
{
signed char address,item;
signed char max,mini;
if(sel==4)
{
address=0xc6;
max=59;
mini=0;
} //秒
if(sel==3)
{
address=0xc4;
max=59;
mini=0;
} //分
if(sel==2)
{
address=0xc2;
max=23;
mini=0;
} //时
if(sel==1) //标志位
{
address=0xc8;//for read
if(Add_Key ==0 || Dec_Key ==0)
Bell_Swh=~Bell_Swh;
write_clock(address,Bell_Swh);
} //开关

item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
if(sel_1==0)
item++;
else
item--;
if(item>max)
item=mini;
if(itemitem=max;

write_clock(0x8e,0x00); //允许写操作
write_clock(address,(item/10)*16+item%10); //转换成16进制写入1302
write_clock(0x8e,0x80); //写保护,禁止写操作
}

/******************************************************************************************
* 函数名称 :Timer0_Init
* 功能描述 :定时器0初始化
******************************************************************************************/
void Timer0_Init(void)
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
}



/******************************************************************************************
* 函数名称 :Timer0
* 功能描述 :中断入口,冒号闪烁

******************************************************************************************/
void Timer0(void) interrupt 1 using 1
{
static unsigned char timecount = 0;//

TH0=(65535-50000)/256; //50ms定时
TL0=(65535-50000)%256;
timecount++;
if(timecount > 9)//500MS
{
timecount = 0;
flag = ~flag;
}
}

/******************************************************************************************
* 函数名称 :Init_1302
* 功能描述 :设置1302的初始时间
******************************************************************************************/
void Init_1302(void)//设置1302的初始时间
{
write_clock(0x8e,0x00);//允许写操作
write_clock(0x8c,0x05);//年
write_clock(0x8a,0x06);//星期
write_clock(0x88,0x01);//月
write_clock(0x86,0x01);//日
write_clock(0x84,0x12);//小时
write_clock(0x82,0x00);//分钟
write_clock(0x80,0x00);//秒
write_clock(0x90,0xa5);//充电
write_clock(0x8e,0x80);//禁止写操作
}

/******************************************************************************************
* 函数名称 :Lcd_Mark1
* 功能描述 :在预定的位置上写入汉字
******************************************************************************************/
void Lcd_Mark1(void)//在预定的位置上写入汉字
{
Clr_Scr();//清屏

LCD_Write_string(1,1,bt);//标题-电子万年历-
LCD_set_xy(2,1);
LCD_Write_number(2);//2
LCD_Write_number(0);//0
LCD_Write_string(2,3,nian);//显示年月日
LCD_Write_string(2,5,yue);
LCD_Write_string(2,7,ri);
LCD_Write_string(3,0,xq);//星期
LCD_Write_string(4,0,sw);//室温
LCD_Write_string(4,4,ssd);//℃

if(Bell_Swh == 1)//闹钟为开
{
LCD_Write_string(4,6,nzbz);//显示闹钟图标
}
}

/******************************************************************************************
* 函数名称 :Lcd_Mark2
******************************************************************************************/
void Lcd_Mark2(void)
{
Clr_Scr();//清屏

//显示闹钟设定等几个汉字
LCD_Write_string(1,1,nzsd);//
LCD_Write_string(2,3,xsfz);//
}

/******************************************************************************************
* 函数名称 :Beep
* 功能描述 :输出函数

******************************************************************************************/
void Bell(void)
{
Bell_Out = 0;
Delaynms(150);//150ms
Bell_Out = 1;
Delaynms(50);//50ms
Bell_Out = 0;
Delaynms(250);//250ms
Bell_Out = 1;
Delaynms(400);//400ms
}

******************************************************************************************/
void main(void)//主函数
{
PSB = 0;
T

imer0_Init();//定时器T0初始化
Lcd_init();//设置液晶显示器

Clr_Scr();//清屏
Disp_img(logo); //显示湘灵电子LOGO
Delaynms(1000);
Lcd_init();//从图形显示状态下返回

Bell_Swh = read_clock(0xc9);//读取开关的状态
Lcd_Mark1( );

while(1)//主循环
{
//设置时钟的初始值,显示05年1月1号12:00:00
if(Add_Key == 0 && Dec_Key == 0)
{
Delay(1000);
if(Add_Key == 0 && Dec_Key == 0)
{
Init_1302();
}
}

if(OK_Key == 0 && Dec_Key ==0 )//进入闹钟设置界面
{
Delaynms(100);
if(OK_Key == 0 && Dec_Key ==0 )
{
Lcd_Mark2();
if(Bell_Swh == 0)
{
LCD_Write_string(1,6,guan);
}//关
else
{
LCD_Write_string(1,6,kai);
}
while(1)
{
if (OK_Key == 0) // 设置和选择项目键
{
Delay(1000);
if(OK_Key == 0)
{
id2++;
if(id2>4)
id2=0;
}
while(OK_Key == 0);//等待键松开
}
switch( id2 )
{
case 0:
Disp2();
break;//正常显示
case 1:
Kgb = 1;
id_case2_key();
Disp2();
break;//开关
case 2:
Kgb= 0;
Hourb=1;
id_case2_key();
Disp2();
break;//
case 3:
Hourb=0;
Minb=1;
id_case2_key();
Disp2();break;
case 4:
Minb=0;
id2=0;
Lcd_Mark1();
goto MF;
break;//返回主界面
default:
break;
}
}//while(1)
}//if
}//if
/*****************************************/
MF: //返回主界面
/*****************************************/
if (OK_Key == 0) // 设置和选择项目键
{
Delay(1000);
if(OK_Key == 0)
{
id++;if(id>7)id=0;
}
while(OK_Key == 0);//等待键松开
}
switch( id )
{
case 0:
sec=0;
Disp();
break;//正常显示
case 1:
year=1;
id_case1_key();
Disp();
break;//年
case 2:
year=0;
mon=1;
id_case1_key();
Disp();
break;//月
case 3:
mon=0;
day=1;
id_case1_key();
Disp();
break; //日
case 4:
day=0;
weekk=1;
id_case1_key();
Disp();
break;//星期
case 5:
weekk=0;
hour=1;
id_case1_key();
Disp();
break; //小时
case 6:
hour=0;
min=1;
id_case1_key();
Disp();
break; //分钟
case 7:
min=0;
sec=1;
id_case1_key();
Disp();
break;

//秒
default:
break;
}

if(Bell_Swh == 1)//闹钟为开
{
H_Bell=read_clock(0xc3);//读取闹钟的时
S_Bell=read_clock(0xc5);//读取闹钟的分

H_1302=read_clock(0x85);//读小时
S_1302=read_clock(0x83);//读分钟

if(H_Bell == H_1302)
{
if(S_Bell == S_1302)
{
Clr_Scr();//清屏
LCD_Write_string(2,2,nzsjd);//闹钟显示时间到!

while(S_Bell == S_1302)//判断是否到闹钟设定时间
{
Bell();
S_Bell=read_clock(0x83);//读分钟

if(Add_Key ==0 ||Dec_Key ==0 || OK_Key ==0)
break;//按任意键退出
}
Lcd_Mark1();
}//if
}
}//if
}//while
}//main

相关文档
相关文档 最新文档