这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » TI » 【MSP焕新大作战】课程2+任务2用定时器中断实现数码管数值的递减

共3条 1/1 1 跳转至

【MSP焕新大作战】课程2+任务2用定时器中断实现数码管数值的递减

菜鸟
2024-07-25 20:02:41     打赏

【实现目标】用定时器中断实现数码管数值的递减

◆◆◆软件开发环境: CCS + TI System Configuration Tool

◆◆◆硬件开发环境:TI提供的LP-MSPM0L1306开发板,数码管模块以及排线

◆◆◆工作原理

74HC595是一个串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7'输出,而并行输出则是在RCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。

数码管模块的原理图如下

image.png

◆◆◆操作步骤

 1. 用排线连接开发板与数码管模块。数码管与开发板的连接图,如下

image.png

2. 新建或者copy一个空项目(详见课程一的帖子)

3. 配置.syscfg参数。

GPIO配置如下

image.png

定时器配置如下

image.png


4. 编写程序

显示服务程序:

//应用数据

void Display_0ut()

{

    HC595_RCK(0);

    delay_cycles(32);

    HC595_RCK(1);

    delay_cycles(32);

}


//写数据

void HC595_WriteData(unsigned char data)

{

    unsigned char i;

    for(i=0;i<8;i++)

    {

        if(data & 0x80)

        {

            HC595_DAT(1);

        }

        else

        {

            HC595_DAT(0);

        }

        data <<= 1;

        HC595_CLK(0);

        delay_cycles(32);

        HC595_CLK(1);

        delay_cycles(32);

    }

}


//发送数据

void HC595_Send_Data(uint8_t dis_num,uint8_t dis_bit)

{

    HC595_WriteData(dis_num);

    HC595_WriteData(1<<dis_bit);

    Display_0ut();

}


//拆分显示数据

void Display_Data(uint16_t u16DataH)

{

    uint16_t templ,tempH;

    uint8_t num_q,num_b,num_s,num_g;


    tempH = u16DataH;

    num_q = tempH/1000;

    num_b = tempH/100%10;

    num_s = tempH/10%10;

    num_g = tempH%10;

    HC595_Send_Data(Disp_DX[num_q],7);

    HC595_Send_Data(Disp_DX[num_b],6);

    HC595_Send_Data(Disp_DX[num_s],5);

    HC595_Send_Data(Disp_DX[num_g],4);

}

定时器中断处理程序:

void TIMER_0_INST_IRQHandler(void)

{

     switch(DL_TimerG_getPendingInterrupt(TIMER_0_INST))

        {

        case DL_TIMER_IIDX_ZERO:

            TimerCnt++;

            if(TimerCnt >=100)

            {

                TimerCnt=0;

                tempval++;

                if(tempval>10)tempval=0;

            }

            break;

        default:

            break;

        }

}


主程序:

int main(void)

{

    SYSCFG_DL_init();

    //开中断

    NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);

    while (1) {

        Display_Data(tempval);

     }

}

5. 编译并调试。效果如下
848b6f5fbcfcc1367dec77d541766b3.jpg


这样第二个任务就完成了。




专家
2024-07-26 00:11:54     打赏
2楼

感谢楼主分享


专家
2024-07-26 07:57:49     打赏
3楼

学习一下


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]