#include \"VIIC_C51.h\" #include \"ZLG7290.h\"#define #define #define
PCF8563
0xA2
//定义器件地址
WRADDR 0x00 RDADDR 0x02
//定义写单元首地址 //定义读单元首地址
#define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define
ZLG7290
0x70
//定义器件地址
//定义TLC549串行总线操作端口 sbit sbit sbit
CLK=P1^0; DAT=P1^1; CS=P1^2;
//定义I2C总线控制端口 sbit sbit
SDA=P1^7; SCL=P1^6;
//显示缓冲区初始化:DP-51PRO
unsigned char disp_buf[8]={0,0,0,0,0,0,0,0};//显示缓存 uchar bdata ADCdata; sbit sbit sbit
ADbit=ADCdata^0; KEY_INT=P3^2; RST=P1^0;
//保存键值
unsigned char KEY;
/*************************************************** **函数名称: **函数功能:
TLC549ADC()
读取上一次A/D转换的数据,启动下一次A/D转换
****************************************************/ uchar TLC549ADC(void) {
uchar i;
}
CLK=0; DAT=1; CS=0;
for(i=0;i<8;i++) { }
return (ADCdata);
CLK=1; _nop_(); _nop_(); ADCdata<<=1; ADbit=DAT; CLK=0; _nop_();
/**************************************** **函数名称: **函数功能: **入口参数:
delay() 硬件延时程序 i
****************************************/ unsigned char DelayNS(unsigned char no) {
unsigned char i,j; for(; no>0; no--)
for(i=0; i<100; i++)
for(j=0; j<100; j++);
//延时参数
return 0; }
/*A/D数据转换处理和输出显示功能函数*/
/******************************************* **函数名称: **函数功能:
display()
处理A/D转换后的数据并输出显示
********************************************/ void display(uchar advalue) {
ulong ad_disp;
ad_disp=((ulong)advalue)*500/255;
disp_buf[2] =(uchar)(ad_disp/100%10)+0x80; disp_buf[1] =(uchar)(ad_disp/10%10); disp_buf[0] =(uchar)(ad_disp/1%10);
disp_buf[3] = 31;
disp_buf[4] = 31; disp_buf[5] = 31; disp_buf[6] = 31; disp_buf[7] = 31;
ZLG7290_SendBuf(disp_buf,8); }
unsigned char display_time(unsigned char *sd) {
sd[0]=sd[0]&0x7f;//秒屏蔽保留位
sd[1]=sd[1]&0x7f;//分屏蔽保留位 sd[2]=sd[2]&0x3f;//时屏蔽保留位
disp_buf[0] =(sd[0]%16); disp_buf[1] =(sd[0]/16); disp_buf[2] = 31; disp_buf[3] =(sd[1]%16); disp_buf[4] =(sd[1]/16); disp_buf[5] = 31;
disp_buf[6] =(sd[2]%16); disp_buf[7] =(sd[2]/16);
ZLG7290_SendBuf(disp_buf,8); }
unsigned char display_date(unsigned char *sd) {
sd[0]=sd[0]&0x3f;//日屏蔽保留位 sd[2]=sd[2]&0x1f;//月屏蔽保留位 disp_buf[0] =(sd[0]%16);
return 0;
disp_buf[1] =(sd[0]/16);
disp_buf[2] =(sd[2]%16)+0x80;//后面加小数点 disp_buf[3] =(sd[2]/16);
disp_buf[4] =(sd[3]%16)+0x80;//后面加小数点 disp_buf[5] =(sd[3]/16); disp_buf[6] =0; disp_buf[7] =2;
ZLG7290_SendBuf(disp_buf,8); } void {
uchar ad_sample;
uchar key1_count=0,key2_count=0,key3_count=0; unsigned char code
main() return 0;
td[9]={0x00,0x12,0x00,0x15,0x12,0x13,0x05,0x01,0x11};//定义初始化字
unsigned char rd[7]; //定义接收缓冲区 RST=0; DelayNS(1);
RST=1;
ISendStr(PCF8563,WRADDR,td,0x5); DelayNS(1);
ISendStr(PCF8563,WRADDR+5,&td[5],0x4);//初始化PCF8563 ZLG7290_SendBuf(disp_buf,8); ZLG7290_SendData(0X15,0X02);
//初始化PCF8563
disp_buf[7] =0x1f;
disp_buf[6] =0x1f; disp_buf[5] =0x1f; disp_buf[4] =0x1f; disp_buf[3] =0x1f;
DelayNS(50);
IRcvStr(PCF8563,RDADDR,rd,0x7); //读现在的时、分、秒 DelayNS(1); while(1) {
if(KEY_INT==0)
{
KEY=ZLG7290_GetKey(); if(KEY==1)
{
key1_count++; if(key1_count>2) key1_count=0; }
if(KEY==2) //调整日期 {
key2_count++; if(key2_count>3)
//显示切换
}
}
key2_count=0;
if(KEY==3) //调整时间 { } { }
ad_sample=TLC549ADC(); if(KEY==5) //采集电压 key3_count++; if(key3_count>2) key3_count=0;
/*修改日期*/
if(key2_count==1) {
disp_buf[5] =31; disp_buf[4] =31;
//调整年
ZLG7290_SendBuf(disp_buf,8);
DelayNS(2);
if(KEY==4) {rd[6]++;
if((rd[6]&0x0f)>=0x0a) { }
}
rd[6]&=0xf0; rd[6]+=0x10;
else if(key2_count==2) //调整月
{
disp_buf[3] =31; disp_buf[2] =31;
ZLG7290_SendBuf(disp_buf,8);
DelayNS(2); if(KEY==4)
{rd[5]++;
if((rd[5]&0x0f)>=0x0a) { }
if(rd[5]>=0x13)
rd[5]=0x01;
rd[5]&=0xf0; rd[5]+=0x10;
}
}
else if(key2_count==3) //调整日 { disp_buf[1] =31;
disp_buf[0] =31;
ZLG7290_SendBuf(disp_buf,8);
DelayNS(2); if(KEY==4)
{
rd[3]++;
if((rd[3]&0x0f)>=0x0a) {
rd[3]&=0xf0; rd[3]+=0x10; }
} }
if(rd[3]>=0x32)
rd[3]=0x01;
/*修改时间*/
if(key3_count==1) {
disp_buf[6] =31;
disp_buf[7] =31;
//修改小时
ZLG7290_SendBuf(disp_buf,8);
DelayNS(2);
if(KEY==4) {
rd[2]++;
if((rd[2]&0x0f)>=0x0a)
{
rd[2]&=0xf0;
}
}
}
rd[2]+=0x10;
if(rd[2]>=0x24)
rd[2]=0x00;
else if(key3_count==2) { disp_buf[3] =31;
disp_buf[4] =31;
//修改分钟
ZLG7290_SendBuf(disp_buf,8);
DelayNS(2); if(KEY==4)
}
{rd[1]++; } }
if((rd[1]&0x0f)>=0x0a) { }
if((rd[1]&0xf0)>=0x60)
rd[1]=0x00;
rd[1]&=0xf0; rd[1]+=0x10;
if(key1_count==0) }
else if(key1_count==1) display_time(rd); else { {
display_date(rd+3); //调用显示日期子程序
display(ad_sample); }
DelayNS(1); } }