电子表430程序.docx
《电子表430程序.docx》由会员分享,可在线阅读,更多相关《电子表430程序.docx(19页珍藏版)》请在冰豆网上搜索。
电子表430程序
#include
/*Privatetypedef-----------------------------------------------------------*/
/*Privatedefine------------------------------------------------------------*/
#defineCPU_F((double)1000000)
#definedelay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))
#definedelay_ms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))
//LCDsegmentdefinitions.
#defined0x01
#definec0x20
#defineb0x40
#definea0x80
#definedp0x10
#defineg0x04
#definef0x08
#definee0x02
#defineM6//液晶屏显示个数
#defineY10//分秒个位每位液晶屏显示字数
#defineX6//分秒十位每位液晶屏显示字数
/*Privatemacro-------------------------------------------------------------*/
/*Privatevariables---------------------------------------------------------*/
//const
charchar_gen[]={//Asusedin430DayWatchDemoboard
a+b+c+d+e+f,//Displays"0"
b+c,//Displays"1"
a+b+d+e+g,//Displays"2"
a+b+c+d+g,//Displays"3"
b+c+f+g,//Displays"4"
a+c+d+f+g,//Displays"5"
a+c+d+e+f+g,//Displays"6"
a+b+c,//Displays"7"
a+b+c+d+e+f+g,//Displays"8"
a+b+c+d+f+g,//Displays"9"
a+b+c+e+f+g,//Displays"A"
c+d+e+f+g,//Displays"b"
a+d+e+f,//Displays"c"
b+c+d+e+g,//Displays"d"
a+d+e+f+g,//Displays"E"
a+e+f+g,//Displays"f"
a+b+c+d+f+g,//Displays"g"
c+e+f+g,//Displays"h"
b+c,//Displays"i"
b+c+d,//Displays"j"
b+c+e+f+g,//Displays"k"
d+e+f,//Displays"L"
a+b+c+e+f,//Displays"n"
a+b+c+d+e+f+g+dp//Displays"full"
};
/*Privatefunctionprototypes-----------------------------------------------*/
voidInit_lcd(void);//LCD初始化
voidLcdGo(unsignedcharDot);//打开或关闭液晶
voidLcdBlink(unsignedchardoit);//显示或者消隐显示内容
voidLCD_Clear(void);//清屏
voidInit_TS3A5017DR(void);//ConfigureTS3A5017DRIN1andIN2
voidBacklight_Enable(void);//打开背光
/*Privatefunctions---------------------------------------------------------*/
/*!
*函数功能:
配置LCDsegmentoutput功能
*输入参数:
无
*返回值:
无
*/
voidInit_lcd(void)
{
LCDBCTL0=LCDDIV0+LCDPRE0+LCDMX1+LCDSSEL+LCDMX1+LCD4MUX;
LCDBPCTL0=LCDS0+LCDS1+LCDS2+LCDS3+LCDS4+LCDS5+LCDS6+LCDS7+LCDS8
+LCDS9+LCDS10+LCDS11;
P5SEL=0xfc;
}
/*****************************************************************************
打开或关闭液晶
1:
打开0:
关闭
*****************************************************************************/
/*!
*函数功能:
打开或者关闭液晶
*输入参数:
Dot
*Dot为1时:
打开液晶显示
*Dot为0时:
关闭液晶显示
*返回值:
无
*/
voidLcdGo(unsignedcharDot)
{
if(Dot==1)
{
//打开液晶显示
LCDBCTL0|=LCDON;
}
elseif(Dot==0)
{
//关闭液晶显示
LCDBCTL0&=~LCDON;
}
}
/*!
*函数功能:
显示或者消隐显示内容
*输入参数:
无
*返回值:
无
*/
voidLcdBlink(unsignedchardoit)
{
if(doit==0)
{
LCDBCTL0&=~LCDSON;
}
elseif(doit==1)
{
LCDBCTL0|=LCDSON;
}
}
/*!
*函数功能:
清除LCD的显示内容
*输入参数:
无
*返回值:
无
*/
voidLCD_Clear(void)//清屏
{
unsignedcharindex;
for(index=0;index<12;index++)
{
LCDMEM[index]=0;
}
}
/*!
*函数功能:
配置TS3A5017DR通道
*输入参数:
无
*返回值:
无
*/
voidInit_TS3A5017DR(void)
{
//ConfigureTS3A5017DRIN1andIN2
P1DIR|=BIT6+BIT7;//P3.4:
IN1;P3.5:
IN2setasoutput
P1OUT&=~BIT7;//IN1=0
P1OUT|=BIT6;//IN2=1
}
/*!
*函数功能:
LCDsegment背光使能
*输入参数:
无
*返回值:
无
*/
voidBacklight_Enable(void)
{
P8DIR|=BIT0;
P8OUT|=BIT0;
}
/*!
*函数功能:
LCDsegment相应的值加1
*输入参数:
LCDMEM[]地址
*返回值:
LCDMEM[]内容
*/
charadd1(char*addr)
{
charz;
addr++;
z=*addr;
returnz;
}
intmain()
{
inti=10,j,k,s,t,u,w,x,y;
WDTCTL=WDTPW+WDTHOLD;//StopWDT
Init_lcd();//LCD初始化
LcdGo
(1);//打开或关闭液晶
LcdBlink
(1);//显示或者消隐显示内容
LCD_Clear();//清屏
Init_TS3A5017DR();//ConfigureTS3A5017DRIN1andIN2
Backlight_Enable();//打开背光
P4DIR&=~(BIT2+BIT3);
P2IE|=BIT7+BIT6+BIT5;
P2IFG&=~(BIT7+BIT6+BIT5);
__enable_interrupt();
loop:
while
(1)
{
for(s=0;s<3;)//小时十位循环
{
for(t=0;t{
for(u=0;u{
for(w=0;w{
for(x=0;x{
for(y=0;y{
k=y;//k为保护i的中间变量
if(y==0&&x==0&&w==0&&u==0&t==0&&s==0)//初始化为00:
00:
00
{
for(j=0;jLCDMEM[j]=char_gen[y];
}
//elseif(y==0&&x==0&&w==0&&u==0&t==3&&s==2)
//{
//for(j=2;j//LCDMEM[j]=char_gen[y];
//}
else
{
for(j=0;j<3;j++)//寻找并保存第一位小时十位的值
{
if(LCDMEM[0]==char_gen[j])
{
s=j;
}
}
for(j=0;j{
if(LCDMEM[1]==char_gen[j])
{
t=j;
}
}
for(j=0;j{
if(LCDMEM[2]==char_gen[j])
{
u=j;
}
}
for(j=0;j{
if(LCDMEM[3]==char_gen[j])
{
w=j;
}
}for(j=0;j{
if(LCDMEM[4]==char_gen[j])
{
x=j;
}
}
/***
for(j=0;j{//第六位秒个位不可中断设置
if(LCDMEM[5]==char_gen[j])
{
y=j;
y++;
}
}
***/
LCDMEM[0]=char_gen[s];
LCDMEM[1]=char_gen[t];
LCDMEM[2]=char_gen[u];
LCDMEM[3]=char_gen[w];
if(LCDMEM[5]==char_gen[0]&&i==y-1)
{
x=0;
y=0;
k=y;
y++;
}
LCDMEM[4]=char_gen[x];
LCDMEM[5]=char_gen[y];
}
/**
for(j=0;j{
if(LCDMEM[5]==char_gen[j])
{
s=j;
}
}
**/
for(j=0;j<=42;j++)//延时25*43即1075ms,检测是否进入中断
{
if((P4IN&BIT2)==0)//判断是否进入中断
{
i=y;//求出进入中断前,y的值,以供出中断后(上面第四行)判断所用
P2IFG|=BIT7;
}
delay_ms(25);
}
P2IFG&=~BIT7;
//LCDMEM[2]=char_gen[u];
//LCDMEM[3]=char_gen[w];
//LCDMEM[4]=char_gen[x];
//LCDMEM[5]=char_gen[y];
y=k;
}
if(LCDMEM[5]==char_gen[Y-1])
{
x++;
LCDMEM[4]=char_gen[x];
LCDMEM[5]=char_gen[0];
}
}
if(LCDMEM[4]==char_gen[X]&&LCDMEM[5]==char_gen[0])
{
w++;
LCDMEM[3]=char_gen[w];
LCDMEM[4]=char_gen[0];
LCDMEM[4]=char_gen[0];
}
}
if(LCDMEM[3]==char_gen[Y]&&LCDMEM[4]==char_gen[0]&&LCDMEM[5]==char_gen[0])
{
u++;
LCDMEM[2]=char_gen[u];
LCDMEM[3]=char_gen[0];
LCDMEM[4]=char_gen[0];
LCDMEM[5]=char_gen[0];
}
}
if(LCDMEM[2]==char_gen[X]&&LCDMEM[3]==char_gen[0]&&LCDMEM[0]!
=char_gen[2])
{
t++;
LCDMEM[1]=char_gen[t];
LCDMEM[2]=char_gen[0];
LCDMEM[3]=char_gen[0];
LCDMEM[4]=char_gen[0];
LCDMEM[5]=char_gen[0];
}
elseif(LCDMEM[2]==char_gen[X]&&LCDMEM[3]==char_gen[0]&&LCDMEM[1]!
=char_gen[3]&&LCDMEM[0]==char_gen[2])
{
t++;
LCDMEM[1]=char_gen[t];
LCDMEM[2]=char_gen[0];
LCDMEM[3]=char_gen[0];
LCDMEM[4]=char_gen[0];
LCDMEM[5]=char_gen[0];
}
elseif(LCDMEM[2]==char_gen[X]&&LCDMEM[3]==char_gen[0]&&LCDMEM[1]==char_gen[3]&&LCDMEM[0]==char_gen[2])
{
LCDMEM[0]=char_gen[0];
LCDMEM[1]=char_gen[0];
LCDMEM[2]=char_gen[0];
LCDMEM[3]=char_gen[0];
LCDMEM[4]=char_gen[0];
LCDMEM[5]=char_gen[0];
gotoloop;
//for(j=0;j//LCDMEM[j]=char_gen[y];
}
}
if(LCDMEM[1]==char_gen[Y]&&LCDMEM[2]==char_gen[0]&&LCDMEM[0]!
=char_gen[2])
{
s++;
LCDMEM[0]=char_gen[s];
LCDMEM[1]=char_gen[0];
LCDMEM[2]=char_gen[0];
LCDMEM[3]=char_gen[0];
LCDMEM[4]=char_gen[0];
LCDMEM[5]=char_gen[0];
}
}
}
}
//gai
#pragmavector=PORT2_VECTOR
__interruptvoidport_2(void)
{
inti=10,j,k;
char*addr0,*addr1,*addr2,*addr3;
switch(P2IV)//switch语句仅用到case16情况,其他没用,应该用中断嵌套,不会用,改成goto语句
{
case0:
break;
case2:
break;
case4:
break;
case6:
break;
case8:
break;
case10:
break;
case12:
break;
case14:
break;
case16:
//if(P2IV==0x0010u)
{
LCDMEM[2]=0;
LCDMEM[3]=0;
LCDMEM[4]=0;
LCDMEM[5]=0;
SW5_hour:
for(i=0;i{
if(LCDMEM[1]==char_gen[i])
addr1=&char_gen[i];
//continue;
}
LCDMEM[1]=add1(addr1);
//LCDMEM[0]
if(LCDMEM[1]==char_gen[10]&&LCDMEM[0]!
=char_gen[2])
{
/**
for(j=0;j<3;j++)//寻找并保存第一位小时十位的值
{
if(LCDMEM[0]==char_gen[j])
{
s=j;
}
}//可替换下面for循环,但add1子函数需改变
***/
for(j=0;j<3;j++)//寻找并保存第一位小时十位的值
{
if(LCDMEM[0]==char_gen[j])
addr0=&char_gen[j];
//continue;
}
LCDMEM[0]=add1(addr0);
LCDMEM[1]=char_gen[0];
}
elseif(LCDMEM[1]==char_gen[4]&&LCDMEM[0]==char_gen[2])
{
LCDMEM[0]=char_gen[0];
LCDMEM[1]=char_gen[0];
}
delay_ms(300);
for(k=0;k<3000;)//在此处进入死循环,决定进入分钟修改界面,或者小时加一
{
if((P4IN&BIT3)==0)
{
gotoSW5_hour;
}
if((P4IN&BIT2)==0)//判断是否进入中断(切换到分钟界面)
{
gotoSW5_M;
}
//else
//P2IFG&=~BIT6;
delay_ms
(2);
}
P2IFG&=~BIT7;
}
break;
SW5_M:
{
//s=LCDMEM[0];
//t=LCDMEM[1];
//LCDMEM[0]=0;
//LCDMEM[1]=0;
LCDMEM[2]=char_gen[0];
LCDMEM[3]=char_gen[0];
LCDMEM[4]=0;
LCDMEM[5]=0;
SW5_minute:
for(i=0;i{
if(LCDMEM[3]==char_gen[i])
addr3=&char_gen[i];
//continue;
}
LCDMEM[3]=add1(addr3);
//LCDMEM[0]
if(LCDMEM[3]==char_gen[10]&&LCDMEM[2]!
=char_gen[5])
{
/**
for(j=0;j<3;j++)//寻找并保存第一位小时十位的值
{
if(LCDMEM[0]==char_gen[j])
{
s=j;
}
}//可替换下面for循环,但add1子函数需改变
***/
for(j=0;j{
if(LCDMEM[2]==char_gen[j])
addr2=&char_gen[j];
//continue;
}
LCDMEM[2]=add1(addr2);
LCDMEM[3]=char_gen[0];
}
elseif(LCDMEM[3]==char_gen[Y]&&LCDMEM[2]==char_gen[5])
{
LCDMEM[2]=char_gen[0];
LCDMEM[3]=char_gen[0];
}
delay_ms(300);
for(k=0;k<20;)//在此处等待按键信号,决定分钟加一,或者转到主界面
{
if((P4IN&BIT3)==0)
{
gotoSW5_minute;
}
if((P4IN&BIT2)==0)//判断是否进入中断(切换到秒界面)
{
gotoSW5_S;
//delay_ms(100);
}
delay_ms(300);
}
//LCDMEM[0]=s;
//LCDMEM[1]=t;
//P2IFG&=~BIT7;
}
break;
SW5_S:
{
LCDMEM[4]=char_gen[0];
LCDMEM[5]=char_gen[0];
delay_ms(300);
//if((P4IN&BIT2)==0)//判断是否进入中断(切换到分钟界面)
//{
//break;
//}
//delay_ms(300);
P2IFG&=~BIT7;
}
break;
}
}
/*****
#pragmavector=PORT2_VECTOR
__interruptvoidport_2(void)
{
inti,j;
char*addr0,*addr1;
cycle:
if((P4IN&BIT3)==0)
{
LCDMEM[2]=0;
LCDMEM[3]=0;
LCDMEM[4]=0;
LCDMEM[5]=0;
for(i=0;i{
if(LCDMEM[1]==char_gen[i])
addr1=&char_gen[i];
//continue;
}
LCDMEM[1]=add1(addr1);
//LCDMEM[0]
if(LCDMEM[1]==char_gen[10]&&LCDMEM[0]!
=char_gen[2])
{
for(j=0;j<3;j++)
{
if(LCDMEM[0]==char_gen[j])
addr0=&char_gen[j];
//c