标题: 请教一下如何把这个msp430程序改成倒计时的程序 [打印本页]
作者: SuperJcl 时间: 2020-6-1 10:02
标题: 请教一下如何把这个msp430程序改成倒计时的程序
#include"msp430x24x.h"
#define CPU_F((double)1000000)
#definedelay_us8M(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#definedelay_ms8M(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define ucharunsigned char
#define uintunsigned int
#define KEYIN(P1IN&BIT0)
//共阳极数码管 "0-9"
ucharSEG[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int sec = 0, min= 0;
char flag =0xff;//默认开启秒表
chardisplay_flag = 0x00;
voidinit_seg_port(void);//port2 port3
voidinit_exti_port(void);
void display(intsec, int min);
#pragma vector =PORT1_VECTOR
__interrupt voidPORT1_ISR(void){
if(KEYIN == 0){
delay_ms8M(20);
flag = ~flag;
delay_ms8M(5);
if(!flag){
TACCTL0 &= ~CCIE;//中断失能,关闭
}else{
TACCTL0 |= CCIE;//开启
}
}
P1IFG = 0;
delay_ms8M(5);
}
#pragma vector =TIMERA0_VECTOR
__interrupt voidTIMER0_ISR(void){
sec++;
display_flag = ~display_flag;
if(sec == 60){
sec = 0;
min++;
}
}
int main(void)
{
// Stop watchdog timer to prevent time outreset
WDTCTL = WDTPW + WDTHOLD;
init_seg_port();
init_exti_port();
TACCTL0 |= CCIE;//
TACCR0 = 32768;
TACTL = TASSEL_2 + MC_1;//ACLK 连续计数模式
_EINT();//开启总中断
while(1){
display(sec, min);
}
return 0;
}
voidinit_seg_port(void){
P2DIR = 0XFF;
P2OUT = SEG[0];
P3DIR = 0XFF;
P3OUT = 0X00;
}
void init_exti_port(void){
P1DIR &= ~BIT0;
P1IES |= BIT0;
P1IE |= BIT0;
P1IFG &= ~BIT0;//清0复位
}
void display(intsec, int min){
//数码管显示字数缓存
uchar buf[] = {0, 0, 0, 0};
buf[0] = sec%10;
buf[1] = sec/10%10;
buf[2] = min%10;
buf[3] = min/10%10;
P2OUT = SEG[buf[0]];
P3OUT = 0x08;
delay_ms8M(1);
P2OUT = 0xff;// 将P2端恢复成0xoff如果没有这个代码会显示错误
P2OUT = SEG[buf[1]];
P3OUT = 0x04;
delay_ms8M(1);
P2OUT = 0xff;
P2OUT = SEG[buf[2]];
P3OUT = 0x02;
delay_ms8M(1);
P2OUT = 0xff;
P2OUT = SEG[buf[3]];
P3OUT = 0x01;
delay_ms8M(1);
P2OUT = 0xff;
}
作者: f556 时间: 2020-6-1 15:50
先对sec min给初值,把
sec++; min++;改为--
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |