程序中用到两个时钟。
MCLK设置为8MHZ
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
定时器A0时钟选择SMCLK,32768HZ,可在proteus中设置
功能描述: 数码管显示秒、分。在显示过程中如果按下按键,则触发中断,停止计数,
再按一次,秒表继续计数。
开发中遇到的问题:在同时显示两个以上数码管时,由于P2端口的数据没有全部置位(共阳极数码管),
导致显示不完整,相同部分缺失。
解决办法,在扫描显示切换时,增加中间过渡数据如下
- void display(int sec, 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端口线恢复成0xff,这一点很重要
- //可以消除跳变导致的显示错误
-
- 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;
- }
复制代码
中断函数定义
- #pragma vector = PORT1_VECTOR
- __interrupt void PORT1_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 void TIMER0_ISR(void){
- sec++;
- display_flag = ~display_flag;
- if(sec == 60){
- sec = 0;
- min++;
- }
- }
复制代码 端口初始化
- void init_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;//清零 复位
- }
复制代码
全部资料51hei下载地址:
MSP430_秒表.zip
(435.05 KB, 下载次数: 90)
|