一个按键怎么显示数码管的00-99的主函数怎么写_DSP基础(1):实现一个秒表所需要的知识...

本篇讲述了如何使用DSP去实现一个秒表功能。刚入门DSP去做一些小的项目,可以很好的把一些知识综合起来,并且能够快速熟悉开发的环境,是一个非常好的选择。本文采用开发板型号为F28335,编译器CCS6.2。

任务:利用数码管实现秒表计时,同时要求具有按键复位功能。

1. 总体思路

实现一个秒表,我们需要使用数码管显示数字;计时需要设计时长1s的定时器中断,每过一秒将触发一次Timer0中断使秒表+1;复位要设计按键key,同时与中断结合,利用按键触发外部中断使秒表清零。因此可以看到,一个简单的秒表功能结合了 按键控制、外部中断、定时器中断、数码管显示这些功能。

2. 各功能设计

2.1 数码管显示

数码管仅靠IO口驱动是不行的,需要使用74HC164 芯片,原理图如下。开发板自带的是4位数码管,四个位选线原理图如下,我们要让哪一位显示数字,只需要让位选控制 IO 口XD输出高电平,此时三极管导通,对应的位选信号线SEG为低电平选通。

v2-8327eea5d9848b08534553fcb906b4f4_b.jpg

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用DSP28335的秒表程序示例,同时使用了数码管显示时间,并且按下按键1开始计时,按下按键3暂停计时: ```c #include "DSP2833x_Device.h" #include "DSP2833x_Examples.h" // 定义计时器变量和状态变量 Uint32 timerCount = 0; Uint16 timerRunning = 0; // 数码管显示函数 void displayTime(Uint32 count) { // 计算时分秒 Uint32 seconds = count % 60; Uint32 minutes = count / 60; // 将时分秒转换为BCD码 Uint16 sec_1 = seconds % 10; Uint16 sec_10 = seconds / 10; Uint16 min_1 = minutes % 10; Uint16 min_10 = minutes / 10; // 将BCD码输出到数码管 GpioDataRegs.GPADAT.bit.GPIO0 = 1; // 使能锁存器 GpioDataRegs.GPADAT.bit.GPIO1 = 0; // 选择第一个数码管 GpioDataRegs.GPBDAT.all = sec_1 | (sec_10 << 4) | (min_1 << 8) | (min_10 << 12); // 输出BCD码 DELAY_US(1); // 延时1us GpioDataRegs.GPADAT.bit.GPIO0 = 0; // 禁止锁存器 } // 按键1中断处理函数 interrupt void key1ISR(void) { // 如果计时器没有在运行,则开始计时 if (!timerRunning) { // 初始化计时器 timerCount = 0; timerRunning = 1; // 初始化定时器 InitCpuTimers(); ConfigCpuTimer(&CpuTimer0, 150, 1000000); // 定时1秒 CpuTimer0Regs.TCR.all = 0x4001; } PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 清除中断标志 } // 按键3中断处理函数 interrupt void key3ISR(void) { // 如果计时器在运行,则暂停计时 if (timerRunning) { timerRunning = 0; CpuTimer0Regs.TCR.all = 0x4000; // 停止定时器 } PieCtrlRegs.PIEACK.all = PIEACK_GROUP12; // 清除中断标志 } void main(void) { // 禁用全局中断 DINT; // 初始化系统时钟 InitSysCtrl(); // 初始化GPIO InitGpio(); GpioCtrlRegs.GPAMUX1.all = 0x0000; // 将GPIO0和GPIO1设置为普通GPIO GpioCtrlRegs.GPADIR.all = 0x0003; // 将GPIO0和GPIO1设置为输出 GpioCtrlRegs.GPBMUX1.all = 0x0000; // 将GPIO32-39设置为普通GPIO GpioCtrlRegs.GPBDIR.all = 0xFF00; // 将GPIO32-39设置为输出 GpioIntRegs.GPIOXINT1SEL.all = 0x000B; // 将GPIO12设置为中断源 GpioIntRegs.GPIOXINT3SEL.all = 0x000D; // 将GPIO14设置为中断源 XIntruptRegs.XINT1CR.bit.POLARITY = 1; // 设置中断为上升沿触发 XIntruptRegs.XINT3CR.bit.POLARITY = 1; // 设置中断为上升沿触发 XIntruptRegs.XINT1CR.bit.ENABLE = 1; // 使能中断 XIntruptRegs.XINT3CR.bit.ENABLE = 1; // 使能中断 // 启用全局中断 EINT; while(1) { // 如果计时器在运行,则显示计时器的值 if (timerRunning) { displayTime(timerCount); } } } ``` 该程序在上一个程序的基础上,添加了按键的中断处理函数,实现了按下按键1开始计时,按下按键3暂停计时的功能。在`key1ISR`函数中,如果计时器没有在运行,则初始化计时器并启动定时器;在`key3ISR`函数中,如果计时器在运行,则暂停计时器。在主循环中,如果计时器在运行,则显示计时器的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值