📄 newmain.c
字号:
//时钟设置
void settime()
{
uchar key = 0;
lcd_init() ; //清屏
Dis_settime();//进入时钟设置
do //等待返回键被按下
{key=namekey();}
while(key!=4);
program_1();
}
void Time_Dispose_Read()
{
P8563_Read();
minute1 = P8563_Store[0] & 0x0F;
minute10 = P8563_Store[0] & 0xF0;
hour1 = P8563_Store[1] & 0x0F;
hour10 = P8563_Store[1] & 0xF0;
day10 = P8563_Store[2] & 0xF0;
day1 = P8563_Store[2] & 0x0F;
month1 = P8563_Store[3] & 0x0F;
month10 = P8563_Store[3] & 0xF0;
year1 = P8563_Store[4] & 0x0F;
year10 = P8563_Store[4] & 0xF0;
}
void Time_Dispose_Set() //将年、月、日、时、分各位数字显示缓存区的数合并,并保存
{
P8563_Store[0] = minute10 * 10 + minute1; //分=十位分*10+个位分
P8563_Store[1] = hour10 * 10 + hour1; //时=十位时*10+个位时
P8563_Store[2] = day10 * 10 + day1; //日=十位日*10+个位日
P8563_Store[3] = month10 * 10 + month1; //月=十位月*10+个位月
P8563_Store[4] = year10 * 10 + year1; //年=十位年*10+个位年
P8563_settime(); //数字送器件8563内部寄存器
}
uchar Yp[]={16,24,48,56,80,88,112,120,144,152};//时钟设置界面时间列号
uchar utime[10];
//uchar KeyPosition = 0; //该数据值 保存着要修改的 数值信息,光标起始位置在0列
void time_mod() //修改时间函数
{
uchar KeyPosition = 0; //该数据值 保存着要修改的 数值信息,光标起始位置在0列
uchar keytmp,Keyc = 0;
utime[0] = year10;
utime[1] = year1;
utime[2] = month10;
utime[3] = month1;
utime[4] = day10;
utime[5] = day1;
utime[6] = hour10;
utime[7] = hour1;
utime[8] = minute10;
utime[9] = minute1;
while (1)
{
keytmp = namekey(); //读键值
switch ( keytmp)
{
case 1 : //上键,减少数字
switch ( KeyPosition )//光标起始位置
{
case 0: //光标在年的十位
if ( year10 == 9 ) //9+1=0
year10 = 0;
else
year10++;
df(4,Yp[0],year10,1);
utime[0] = year10;
break;
case 1: //光标在年的个位
if ( year1 == 9 )
year1 = 0;
else
year1++;
df(4,Yp[1],year1,1);
utime[1] = year1;
break;
case 2: //光标在月的十位
if ( month10 == 1 ) //月_十位=0,1
month10 = 0;
else
month10++;
df(4,Yp[2],month10,1);
utime[2] = month10;
break;
case 3: //光标在月的个位
if ( month1 == 9 )
month1 = 0;
else
month1++;
df(4,Yp[3],month1,1);
utime[3] = month1;
break;
case 4: //光标在日的十位
if ( day10 == 3 ) //日_十位=0,1,2,3
day10 = 0;
else
day10++;
df(4,Yp[4],day10,1);
utime[4] = day10;
break;
case 5: //光标在日的个位
if ( day1 == 9 )
day1 = 0;
else
day1++;
df(4,Yp[5],day1,1);
utime[5] = day1;
break;
case 6: //光标在时的十位
if ( hour10 == 2 ) //时_十位=0,1,2
hour10 = 0;
else
hour10++;
df(4,Yp[6],hour10,1);
utime[6] = hour10;
break;
case 7: //光标在时的个位
if ( hour1 == 9 )
hour1 = 0;
else
hour1++;
df(4,Yp[7],hour1,1);
utime[7] = hour1;
break;
case 8: //光标在分的十位
if ( minute10 == 5 ) //分_十位=0,1,2,3,4,5
minute10 = 0;
else
minute10++;
df(4,Yp[8],minute10,1);
utime[8] = minute10;
break;
case 9: //光标在分的个位
if ( minute1 == 9 )
minute1 = 0;
else
minute1++;
df(4,Yp[9],minute1,1);
utime[9] = minute1;
break;
}
break;
case 2 : //下键,增加数字
switch ( KeyPosition )
{
case 0: //光标在年的十位
if ( year10 == 0 )
year10 = 9;
else
year10--;
df(4,Yp[0],year10,1);
utime[0] = year10;
break;
case 1: //光标在年的个位
if ( year1 == 0 )
year1 = 9;
else
year1--;
df(4,Yp[1],year1,1);
utime[1] = year1;
break;
case 2: //光标在月的十位
if ( month10 == 0 ) //月_十位=0,1
month10 = 1;
else
month10--;
df(4,Yp[2],month10,1);
utime[2] = month10;
break;
case 3: //光标在月的个位
if ( month1 == 0 )
month1 = 9;
else
month1--;
df(4,Yp[3],month1,1);
utime[3] = month1;
break;
case 4: //光标在日的十位
if ( day10 == 0 ) //日_十位=0,1,2,3
day10 = 3;
else
day10--;
df(4,Yp[4],day10,1);
utime[4] = day10;
break;
case 5: //光标在日的个位
if ( day1 == 0 )
day1 = 9;
else
day1--;
df(4,Yp[5],day1,1);
utime[5] = day1;
break;
case 6: //光标在时的十位
if ( hour10 == 0 ) //时_十位=0,1,2
hour10 = 2;
else
hour10--;
df(4,Yp[6],hour10,1);
utime[6] = hour10;
break;
case 7: //光标在时的个位
if ( hour1 == 0 )
hour1 = 9;
else
hour1--;
df(4,Yp[7],hour1,1);
utime[7] = hour1;
break;
case 8: //光标在分的十位
if ( minute10 == 0 ) //分_十位=0,1,2,3,4,5
minute10 = 5;
else
minute10--;
df(4,Yp[8],minute10,1);
utime[8] = minute10;
break;
case 9: //光标在分的个位
if ( minute1 == 0 )
minute1 = 9;
else
minute1--;
df(4,Yp[9],minute1,1);
utime[9] = minute1;
break;
}
break;
case 3 : //右移键
if ( KeyPosition == 9) //光标停留在分的个位
{
df(4,Yp[KeyPosition],utime[KeyPosition],0); //将该位数字正显
KeyPosition = 0; //该值复0,即将光标移到首位(年之十位)
df(4,Yp[KeyPosition],utime[KeyPosition],1);//将首位数字反显
break ;
}
else
df(4,Yp[KeyPosition],utime[KeyPosition],0); //将该位数字正显
KeyPosition++;
df(4,Yp[KeyPosition],utime[KeyPosition],1); //将该位数字反显
break;
case 4: Time_Dispose_Set(); //返回键,确认已设置的时间,并返回主菜单
lcd_init();
program_1(); //返回主菜单
return;
}
}
}
//主菜单下按确定键处理程序
void program_7()
{
switch(KeyCount)
{
case 0: test(); break;//启动进入测试程序
case 1: history(); break;//进入历史查询
case 2:
Dis_settime(); //进入时钟设置
time_mod(); //修改时间函数
break;
}
}
//主菜单读取键值1(上)、2(下)、7(确定键)
void key_chuli_1(uchar key) //按键处理1,键值为3、4、5、6均不起作用
{
switch(key)
{
case 1: if( KeyCount > 0 )
KeyCount--;
else
KeyCount = 2;
program_1(); break; //光标上移
case 2: if( KeyCount < 2 )
KeyCount++;
else
KeyCount = 0;
program_1();
break; //光标下移
case 7:program_7(); break; //确定
}
}
//2543AD控制模块
//2543控制引脚宏定义
sbit AD_CLOCK = P1^1; /*2543时钟*/
sbit AD_D_IN = P1^2; /*2543输入*/
sbit AD_D_OUT = P1^3; /*2543输出*/
sbit AD_CS = P1^4; /*2543片选*/
//功能:延时模块 输入参数:n要延时的周期数
void delayy(uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
_nop_();
}
}
/**************************************
名称:read2543
功能:TLC2543驱动模块
输入参数:port通道号
输出参数:ad转换值
*************************************/
uint read2543(uchar port)
{
uint ad=0,i;
AD_CS = 1;
AD_CS = 0;
AD_CLOCK=0;
port<<=4;
for(i=0;i<12;i++)
{
if(AD_D_OUT) ad|=0x01;
AD_D_IN=(bit)(port&0x80);
AD_CLOCK=1;
delayy(3);
AD_CLOCK=0;
delayy(3);
port<<=1;
ad<<=1;
}
AD_CS=1;
ad>>=1;
return(ad);
}
//TLC5615 D/A 程序段
sbit DA_CS = P1^7 ;
sbit DA_CLK = P1^6;
sbit DA_DIN = P1^5;
void tlc5615(uint daTmp)//tlc5615送数程序
{
uchar i;
DA_CLK=0;//时钟低
DA_CS=0;//片选有效
for (i=0;i<12;i++)
{
if((daTmp&0x800)==0)//屏蔽低11位:00001000,00000000b
DA_DIN=0;
else
DA_DIN=1;
DA_CLK=1;//时钟高
daTmp=daTmp<<1;//左移一位
DA_CLK=0;//时钟低
}
DA_CS=1;
}
//外部中断0处理程序
void Int0_Interrupt_Dispose() interrupt 0
{
lcd_init();
dh(4,60,44,0);
dh(4,76,45,0);
dh(4,92,46,0);
dh(4,108,47,0);
df(4,124,32,0);
while(1);
}
//外部中断1处理程序
sbit u75 = P3^4;
uchar ucDianya =0,ucDianliu=0;
uchar mod_1000( uint* ulTmp) /*分离出千位数并返回,保留余下的部分*/
{
uint ult1;
ult1 = *ulTmp / 1000;
*ulTmp = *ulTmp % 1000;
return ult1;
}
uchar mod_100( uint* ulTmp) /*分离出百位数并返回,保留余下的部分*/
{
uint ult1;
ult1 = *ulTmp / 100;
*ulTmp = *ulTmp % 100;
return ult1;
}
uchar mod_10( uint* ulTmp) /*分离出十位数并返回,保留余下的部分*/
{
uint ult1;
ult1 = *ulTmp / 10;
*ulTmp = *ulTmp % 10;
return ult1;
}
void div_u_shuzi(uint ucTmp) //分离电压数字
{
uint uctmp;
uctmp = ucTmp;
Tmpbuf[0] = mod_100(&uctmp);
Tmpbuf[1] = mod_10(&uctmp);
Tmpbuf[2] = uctmp;
}
void div_i_shuzi(uint ucTmp) //分离电流数字
{
uint uctmp;
uctmp = ucTmp;
Tmpbuf[3] = mod_1000(&uctmp);
Tmpbuf[4] = mod_100(&uctmp);
Tmpbuf[5] = mod_10(&uctmp);
Tmpbuf[6] = uctmp;
}
void Shipin_UI_dispose() //处理电流电压读数 显示
{
ucDianya = (uchar)(read2543(0) * 0.00732);
div_u_shuzi(ucDianya);
ucDianliu = (uchar)(read2543(0) * 0.244);
div_i_shuzi(ucDianliu);
}
void Int1_Interrupt_Dispose() interrupt 2
{
daFlag = 1; //da送数标志位
u75 = 0;
delay1ms(500);
Shipin_UI_dispose();
disiping();
}
//定时器0中断 实时显示时间 电池电量监测
void Time0_Interrupt_Dispose() interrupt 1
{
uiTimeCout ++;
if ( uiTimeCout == 5000 )
{
time();
battery();
uiTimeCout = 0;
}
}
void dierping() //主菜单
{
battery(); //显示电池电量
time(); //显示实时时间
//反白显示,测试
dh(2,52,10,1);
dh(2,68,32,1);
dh(2,84,32,1);
dh(2,100,32,1);
dh(2,108,32,1);
dh(2,124,11,1);
dh(4,52,24,0); //历史数据
dh(4,76,25,0);
dh(4,100,26,0);
dh(4,124,27,0);
dh(6,52,28,0); //时钟设置
dh(6,76,29,0);
dh(6,100,30,0);
dh(6,124,31,0);
smkey:
do //等待有键被按下
{key=namekey();}
while(!key); //key=0,表示无键按下,继续扫描键盘
key_chuli_1(key); //有键被按下,转键盘处理1
goto smkey;
}
void main()
{
uchar key = 0;
uint uiTimeCout = 0;
/*
EA = 1;
ET0 = 1;
EX0 = 1;
EX1 = 1;
TMOD = 0x02;
TCON = 0x0F;
TH0 = 0x47;
TL0 = 0x47;
TR0 = 1;
*/
lcd_init() ; //液晶屏初始化,清屏
// Time_Dispose_Read();
diyiping(); //产品信息显示
do //等待确定键被按下
{key=namekey();}
while(key!=7);
lcd_init() ; //清屏
dierping(); //主菜单
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -