1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
2个回答
|
|
哦,这个简单。定时中断,累加一个变量。在中断外做定时换算。比如哈,定时中断中Count++;
在main函数里面做查询Count并显示。 当然这时候你会问,如果发送按键呢。如果按键不在外部中断中做,这个时候完全没有影响,因为中断会被独立处理。如果按键在外部中断中做,而且要保证定时中断的稳定和准确性,就将定时中断嵌套在外部中断中。 |
|
|
|
#include
#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 } /****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] |
|
|
|
只有小组成员才能发言,加入小组>>
3053个成员聚集在这个小组
加入小组2974 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3697 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2366 浏览 1 评论
4832 浏览 1 评论
2593 浏览 1 评论
1436浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3697浏览 2评论
2974浏览 1评论
1631浏览 0评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 20:26 , Processed in 1.245520 second(s), Total 81, Slave 65 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号