专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
TI
430钟表程序设计的问题。。。新人求罩
2019-07-15 16:41
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
7421
2
1276
用430f437在写钟表程序的时候,怎么使写的程序在按动按键的时候秒钟还能够继续走。我写的程序现在不具备这个功能
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
武力戡乱
1楼-- · 2019-07-15 20:31
哦,这个简单。定时中断,累加一个变量。在中断外做定时换算。比如哈,定时中断中Count++;
在main函数里面做查询Count并显示。
当然这时候你会问,如果发送按键呢。如果按键不在外部中断中做,这个时候完全没有影响,因为中断会被独立处理。如果按键在外部中断中做,而且要保证定时中断的稳定和准确性,就将定时中断嵌套在外部中断中。
加载中...
guybeast
2楼-- · 2019-07-16 00:34
#include<msp430x43x.h>
#define unit unsigned int
#define uchar unsigned char
#define hourH LCDMEM[10]
#define hourL LCDMEM[11]
#define miniteH LCDMEM[12]
#define miniteL LCDMEM[13]
#define secondeH LCDMEM[0]
#define secondeL LCDMEM[1]
#define yearH LCDMEM[14]
#define yearL LCDMEM[15]
#define monthH LCDMEM[16]
#define monthL LCDMEM[17]
#define dayH LCDMEM[18]
#define dayL LCDMEM[19]
#define KEY4 BIT0
#define KEY3 BIT1
#define KEY2 BIT2
#define KEY1 BIT3
uchar seconde=0; //秒
uchar minite=0; //分
uchar hour=0; //时
uchar day=0,month=0,year=0; //年月日
uchar hfsec;
int setflag;
char lcd_seg[10]={0x5f,0x50,0x3d,0x79,0x72,0x6b,0x6f,0x51,0x7f,0x7b}; //上0.1.2.3.4.5.6.7.8.9
char tab[10]={0xbf,0xb0,0xdb,0xf9,0xf4,0x7d,0x7f,0xb8,0xff,0xfd}; //下0 1 2 3 4 5 6 7 8 9,带第八位
char lcd_sed[10]={0xaf,0xa0,0xcb,0xe9,0xe4,0x6d,0x6f,0xa8,0xef,0xed}; //下0 1 2 3 4 5 6 7 8 9 不带第八位
char lcd_tab[3]={0x00,0x50,0x60}; //时钟的显示 时 的高位
/*定义一个延时函数*/
void delay(unit k)
{
unit j,l;
for(j=0;j<k;j++)
for(l=0;l<100;l++); //去按键抖动
}
/****LCD初始化*************/
void LCD_clear(){
unsigned char i;
for(i=0;i<20;i++)
LCDMEM
=0x00;
}
void P2_Init(void)
{ P2DIR&=~(KEY1|KEY2|KEY3); //KEY1和KEY2,KEY4为input
//P2OUT|=KEY1|KEY2;
P2IE|=KEY1|KEY2|KEY3; //开中断
P2IES|=KEY1|KEY2|KEY3; //下降沿
}
void LCDInit()
{
WDTCTL = WDTPW + WDTHOLD;
LCDCTL=0XFD;
BTCTL=0x2d; //定时器时钟设置 中断频率为2^15/256/64
SCFQCTL=SCFQ_64K;
P5SEL=0XFC;
P4SEL|=0XFC; //P4端口功能选择外接模块
LCD_clear();
}
/*********LCD全部置零********/
void Resit()
{
for(int i=0;i<2;i++)
LCDMEM
=0x5F;
for(int j=10;j<20;j++)
{
LCDMEM[j]=0xAF;
}
LCDMEM[10]=0x00;
}
//显示函数放在中断中则 初始值定义无效
void display()//
{
secondeL=lcd_seg[seconde%10];
secondeH=lcd_seg[seconde/10];
dayL=lcd_sed[day%10];//天低位
dayH=lcd_sed[day/10];//天的高位
monthL=lcd_sed[month%10];//月低位
monthH=lcd_sed[month/10];//月高位
yearL=lcd_sed[year%10];//年低位
yearH=lcd_sed[year/10]; //年高位
miniteL=lcd_sed[minite%10];//分的低位
miniteH=lcd_sed[minite/10];//分的高位
hourL=lcd_sed[hour%10];//时的低位
hourH=lcd_tab[hour/10];//时的高位
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;
FLL_CTL0|=XCAP18PF;
IE2|=0x80;
P2_Init();
LCDInit();
Resit();
_EINT();
for(;;)
{ //display();//显示程序放在主程序中不能闪烁显示
LPM3;
}
}
#pragma vector=PORT2_VECTOR //P2端口中断子程序
__interrupt void PORT2_ISR(void)
{
LPM3_EXIT;
if(P2IFG&KEY1)
{
delay(200);
if(P2IFG&KEY1)
{
setflag++;
setflag&=0x07;
display();
P2IFG&=~KEY1;
}
}
/*按键设置为加计数*/
else if(P2IFG&KEY2)
{
delay(200);
if(P2IFG&KEY2)
{
{
switch(setflag)
{
//case 0:
// break;
case 1:
hour++;
if(hour==24)
hour=0;
hourL=lcd_sed[hour%10];//时低位
hourH=lcd_tab[hour/10]; //时高位
break;
case 2:
minite++;
if(minite==60)
minite=0;
miniteL=lcd_sed[minite%10];//分低位
miniteH=lcd_sed[minite/10];//分高位
break;
case 3:
day++;
if(day==30)
day=0;
dayH=lcd_sed[day/10];
dayL=tab[day%10];
break;
case 4:
month++;
if(month==13)
month=0;
monthH=lcd_sed[month/10];
monthL=lcd_sed[month%10];
break;
case 5: //CASE语句的顺序不能变,否则会出现按键错乱
year++;
if(year==99)
year=0;
yearH=lcd_sed[year/10];
yearL=lcd_sed[year%10];
case 6:
seconde++;
if(seconde==60)
seconde=0;
secondeH=lcd_seg[seconde/10];
secondeL=lcd_seg[seconde%10];
// case 7:
// break;
default:
break;
}
}
}
P2IFG&=~KEY2;
}
/*按键设置为减计数*/
else if(P2IFG&KEY3)
{
delay(200);
if(P2IFG&KEY3)
{
{
switch(setflag)
{
//case 0:
// break;
case 1:
hour--;
if(hour==0)
hour=24;
hourL=lcd_sed[hour%10];//时低位
hourH=lcd_tab[hour/10]; //时高位
break;
case 2:
minite--;
if(minite==0)
minite=60;
miniteL=lcd_sed[minite%10];//分低位
miniteH=lcd_sed[minite/10];//分高位
break;
case 3:
day--;
if(day==0)
day=30;
dayH=lcd_sed[day/10];
dayL=tab[day%10];
break;
case 4:
month--;
if(month==0)
month=12;
monthH=lcd_sed[month/10];
monthL=lcd_sed[month%10];
break;
case 5: //CASE语句的顺序不能变,否则会出现按键错乱
year--;
if(year==0)
year=99;
yearH=lcd_sed[year/10];
yearL=lcd_sed[year%10];
case 6:
seconde--;
if(seconde==0)
seconde=60;
secondeH=lcd_seg[seconde/10];
secondeL=lcd_seg[seconde%10];
// case 7:
// break;
default:
break;
}
}
}
P2IFG&=~KEY3;
}
}
#pragma vector=BASICTIMER_VECTOR //基础定时器中断子程序
__interrupt void BT_ISR(void)
{
LPM3_EXIT;
hfsec++;
hfsec&=0x01; //满2进1
LCDM12^=0X10; //秒点闪烁,不改变其他位
LCDM16^=0x10;
if(setflag)
{
switch (setflag)
{
case 1:
hourH=hfsec*lcd_tab[hour/10];
hourL=hfsec*lcd_sed[hour%10];
break;
case 2:
miniteH=hfsec*lcd_sed[minite/10];
miniteL=hfsec*lcd_sed[minite%10];
break;
case 3:
dayH=hfsec*lcd_sed[day/10];
dayL=hfsec*lcd_sed[day%10];
break;
case 4:
monthH=hfsec*lcd_sed[month/10];
monthL=hfsec*lcd_sed[month%10];
break;
case 5:
yearH=hfsec*lcd_sed[year/10];
yearL=hfsec*tab[year%10];
break;
case 6:
secondeH=hfsec*lcd_seg[seconde/10];
secondeL=hfsec*lcd_seg[seconde%10];
//case 7:
// LCDMEM[2]=hfsec*0x5f;
// delay(1000);
// LCDMEM[2]=0x00;
default:
break;
}
}
else if(hfsec)
{
seconde++;
secondeL=lcd_seg[seconde%10];
secondeH=lcd_seg[seconde/10];
if(seconde==60)
{
minite++;
seconde=0;
miniteL=lcd_sed[minite%10];//分低位
miniteH=lcd_sed[minite/10];//分高位
if(minite==60)
{
hour++;
minite=0;
hourL=lcd_sed[hour%10];//时低位
hourH=lcd_tab[hour/10]; //时高位
if(hour==24)
{
hour=0;
day++;
dayL=lcd_sed[day%10];
dayH=lcd_sed[day/10];
if(day==30)
{
month++;
day=0;
monthL=lcd_sed[month%10];
monthH=lcd_sed[month/10];
if(month==12)
{
year++;
month=0;
yearL=lcd_sed[year%10];
yearH=lcd_sed[year/10];
if(year==99)
{
year=0;
}
}
}
}
}
}
}
}
附上我的程序[
[/color]
加载中...
一周热门
更多
>
相关问题
CPLD的方波输出
4 个回答
11个版本Quartus II 软件下载,安装包网盘合集,附教程,47G!
20 个回答
请大家帮忙到21IC发展大家谈支持我申请新版面
20 个回答
【通知】21ic中国电子网服务条款 (所有人员必读)
1 个回答
满载而归乙亥年,大展鸿途庚子年---集签赢好礼
20 个回答
携手ADI,踏上电子工程师之巅—车辆电气化视频,答题领奖!
1 个回答
如何提升论坛质量,看你了!
20 个回答
【最终名单】二姨家喊你来拿100份新年大礼啦~
20 个回答
相关文章
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
TI
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
在main函数里面做查询Count并显示。
当然这时候你会问,如果发送按键呢。如果按键不在外部中断中做,这个时候完全没有影响,因为中断会被独立处理。如果按键在外部中断中做,而且要保证定时中断的稳定和准确性,就将定时中断嵌套在外部中断中。
#define unit unsigned int
#define uchar unsigned char
#define hourH LCDMEM[10]
#define hourL LCDMEM[11]
#define miniteH LCDMEM[12]
#define miniteL LCDMEM[13]
#define secondeH LCDMEM[0]
#define secondeL LCDMEM[1]
#define yearH LCDMEM[14]
#define yearL LCDMEM[15]
#define monthH LCDMEM[16]
#define monthL LCDMEM[17]
#define dayH LCDMEM[18]
#define dayL LCDMEM[19]
#define KEY4 BIT0
#define KEY3 BIT1
#define KEY2 BIT2
#define KEY1 BIT3
uchar seconde=0; //秒
uchar minite=0; //分
uchar hour=0; //时
uchar day=0,month=0,year=0; //年月日
uchar hfsec;
int setflag;
char lcd_seg[10]={0x5f,0x50,0x3d,0x79,0x72,0x6b,0x6f,0x51,0x7f,0x7b}; //上0.1.2.3.4.5.6.7.8.9
char tab[10]={0xbf,0xb0,0xdb,0xf9,0xf4,0x7d,0x7f,0xb8,0xff,0xfd}; //下0 1 2 3 4 5 6 7 8 9,带第八位
char lcd_sed[10]={0xaf,0xa0,0xcb,0xe9,0xe4,0x6d,0x6f,0xa8,0xef,0xed}; //下0 1 2 3 4 5 6 7 8 9 不带第八位
char lcd_tab[3]={0x00,0x50,0x60}; //时钟的显示 时 的高位
/*定义一个延时函数*/
void delay(unit k)
{
unit j,l;
for(j=0;j<k;j++)
for(l=0;l<100;l++); //去按键抖动
}
/****LCD初始化*************/
void LCD_clear(){
unsigned char i;
for(i=0;i<20;i++)
LCDMEM=0x00;
}
void P2_Init(void)
{ P2DIR&=~(KEY1|KEY2|KEY3); //KEY1和KEY2,KEY4为input
//P2OUT|=KEY1|KEY2;
P2IE|=KEY1|KEY2|KEY3; //开中断
P2IES|=KEY1|KEY2|KEY3; //下降沿
}
void LCDInit()
{
WDTCTL = WDTPW + WDTHOLD;
LCDCTL=0XFD;
BTCTL=0x2d; //定时器时钟设置 中断频率为2^15/256/64
SCFQCTL=SCFQ_64K;
P5SEL=0XFC;
P4SEL|=0XFC; //P4端口功能选择外接模块
LCD_clear();
}
/*********LCD全部置零********/
void Resit()
{
for(int i=0;i<2;i++)
LCDMEM=0x5F;
for(int j=10;j<20;j++)
{
LCDMEM[j]=0xAF;
}
LCDMEM[10]=0x00;
}
//显示函数放在中断中则 初始值定义无效
void display()//
{
secondeL=lcd_seg[seconde%10];
secondeH=lcd_seg[seconde/10];
dayL=lcd_sed[day%10];//天低位
dayH=lcd_sed[day/10];//天的高位
monthL=lcd_sed[month%10];//月低位
monthH=lcd_sed[month/10];//月高位
yearL=lcd_sed[year%10];//年低位
yearH=lcd_sed[year/10]; //年高位
miniteL=lcd_sed[minite%10];//分的低位
miniteH=lcd_sed[minite/10];//分的高位
hourL=lcd_sed[hour%10];//时的低位
hourH=lcd_tab[hour/10];//时的高位
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;
FLL_CTL0|=XCAP18PF;
IE2|=0x80;
P2_Init();
LCDInit();
Resit();
_EINT();
for(;;)
{ //display();//显示程序放在主程序中不能闪烁显示
LPM3;
}
}
#pragma vector=PORT2_VECTOR //P2端口中断子程序
__interrupt void PORT2_ISR(void)
{
LPM3_EXIT;
if(P2IFG&KEY1)
{
delay(200);
if(P2IFG&KEY1)
{
setflag++;
setflag&=0x07;
display();
P2IFG&=~KEY1;
}
}
/*按键设置为加计数*/
else if(P2IFG&KEY2)
{
delay(200);
if(P2IFG&KEY2)
{
{
switch(setflag)
{
//case 0:
// break;
case 1:
hour++;
if(hour==24)
hour=0;
hourL=lcd_sed[hour%10];//时低位
hourH=lcd_tab[hour/10]; //时高位
break;
case 2:
minite++;
if(minite==60)
minite=0;
miniteL=lcd_sed[minite%10];//分低位
miniteH=lcd_sed[minite/10];//分高位
break;
case 3:
day++;
if(day==30)
day=0;
dayH=lcd_sed[day/10];
dayL=tab[day%10];
break;
case 4:
month++;
if(month==13)
month=0;
monthH=lcd_sed[month/10];
monthL=lcd_sed[month%10];
break;
case 5: //CASE语句的顺序不能变,否则会出现按键错乱
year++;
if(year==99)
year=0;
yearH=lcd_sed[year/10];
yearL=lcd_sed[year%10];
case 6:
seconde++;
if(seconde==60)
seconde=0;
secondeH=lcd_seg[seconde/10];
secondeL=lcd_seg[seconde%10];
// case 7:
// break;
default:
break;
}
}
}
P2IFG&=~KEY2;
}
/*按键设置为减计数*/
else if(P2IFG&KEY3)
{
delay(200);
if(P2IFG&KEY3)
{
{
switch(setflag)
{
//case 0:
// break;
case 1:
hour--;
if(hour==0)
hour=24;
hourL=lcd_sed[hour%10];//时低位
hourH=lcd_tab[hour/10]; //时高位
break;
case 2:
minite--;
if(minite==0)
minite=60;
miniteL=lcd_sed[minite%10];//分低位
miniteH=lcd_sed[minite/10];//分高位
break;
case 3:
day--;
if(day==0)
day=30;
dayH=lcd_sed[day/10];
dayL=tab[day%10];
break;
case 4:
month--;
if(month==0)
month=12;
monthH=lcd_sed[month/10];
monthL=lcd_sed[month%10];
break;
case 5: //CASE语句的顺序不能变,否则会出现按键错乱
year--;
if(year==0)
year=99;
yearH=lcd_sed[year/10];
yearL=lcd_sed[year%10];
case 6:
seconde--;
if(seconde==0)
seconde=60;
secondeH=lcd_seg[seconde/10];
secondeL=lcd_seg[seconde%10];
// case 7:
// break;
default:
break;
}
}
}
P2IFG&=~KEY3;
}
}
#pragma vector=BASICTIMER_VECTOR //基础定时器中断子程序
__interrupt void BT_ISR(void)
{
LPM3_EXIT;
hfsec++;
hfsec&=0x01; //满2进1
LCDM12^=0X10; //秒点闪烁,不改变其他位
LCDM16^=0x10;
if(setflag)
{
switch (setflag)
{
case 1:
hourH=hfsec*lcd_tab[hour/10];
hourL=hfsec*lcd_sed[hour%10];
break;
case 2:
miniteH=hfsec*lcd_sed[minite/10];
miniteL=hfsec*lcd_sed[minite%10];
break;
case 3:
dayH=hfsec*lcd_sed[day/10];
dayL=hfsec*lcd_sed[day%10];
break;
case 4:
monthH=hfsec*lcd_sed[month/10];
monthL=hfsec*lcd_sed[month%10];
break;
case 5:
yearH=hfsec*lcd_sed[year/10];
yearL=hfsec*tab[year%10];
break;
case 6:
secondeH=hfsec*lcd_seg[seconde/10];
secondeL=hfsec*lcd_seg[seconde%10];
//case 7:
// LCDMEM[2]=hfsec*0x5f;
// delay(1000);
// LCDMEM[2]=0x00;
default:
break;
}
}
else if(hfsec)
{
seconde++;
secondeL=lcd_seg[seconde%10];
secondeH=lcd_seg[seconde/10];
if(seconde==60)
{
minite++;
seconde=0;
miniteL=lcd_sed[minite%10];//分低位
miniteH=lcd_sed[minite/10];//分高位
if(minite==60)
{
hour++;
minite=0;
hourL=lcd_sed[hour%10];//时低位
hourH=lcd_tab[hour/10]; //时高位
if(hour==24)
{
hour=0;
day++;
dayL=lcd_sed[day%10];
dayH=lcd_sed[day/10];
if(day==30)
{
month++;
day=0;
monthL=lcd_sed[month%10];
monthH=lcd_sed[month/10];
if(month==12)
{
year++;
month=0;
yearL=lcd_sed[year%10];
yearH=lcd_sed[year/10];
if(year==99)
{
year=0;
}
}
}
}
}
}
}
}
附上我的程序[[/color]
一周热门 更多>