DSP开发,F28335通过SPI和定时器实现数码管计数器以及按键使用-不使用Delay函数

DSP开发,F28335通过SPI和定时器实现数码管计数器以及按键使用-不使用Delay函数

1 概述

实验的代码已经上传。

1.1 资源概述

开发板: 普中DSP开发板
CCS编译器版本:6.2.11
主控芯片型号:TMS320F28335
开发板

1.2 程序简介

在定时器中实现计时器,并在定时器中触发中断,中断服务函数中实现数码管的刷新工作,在while(1)中进行按键的检测,通过按键控制LED灯和蜂鸣器,继电器的闭合。

2 程序源码

2.1 main主函数


#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

#include "leds.h"
#include "time.h"
#include "uart.h"
#include "spi.h"
#include "smg.h"
#include "secwatch.h"
#include "key.h"
#include "beep.h"
#include "relay.h"

unsigned char sec=0;
unsigned int mms=0;

/*******************************************************************************
* 函 数 名         : main
* 函数功能		   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main()
{

	char key=0;

	InitSysCtrl();
	InitPieCtrl();
	IER = 0x0000;
	IFR = 0x0000;
	InitPieVectTable();

	LED_Init();

	BEEP_Init();

	Relay_Init();

	KEY_Init();

	UARTa_Init(4800);

	TIM1_Init(150,1000);//1ms

	SMGSPIA_Init();

#ifdef Flash_Prog

	MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);

	InitFlash();

#endif


	while(1)
	{

		key=KEY_Scan(0);
		switch(key)
		{
		case KEY1_PRESS: LED2_TOGGLE;break;
		case KEY2_PRESS: LED3_TOGGLE;break;
		case KEY3_PRESS: LED4_TOGGLE;break;
		case KEY4_PRESS: LED5_TOGGLE;break;
		case KEY5_PRESS: LED6_TOGGLE;break;
		case KEY6_PRESS: LED7_TOGGLE;break;
		case KEY7_PRESS: BEEP_P(1000,100);break;
		case KEY8_PRESS: RELAY_TOGGLE;break;
		case KEY9_PRESS: LED2_OFF|LED3_OFF|LED4_OFF|LED5_OFF|LED6_OFF|LED7_OFF;break;
		}

	}
}

2.2计时器显示程序源码

这里不使用delay函数,通过对4求余的方式,实现四个数码管的轮流显示,进一次中断刷新一个数码管,刷新4个数码管进入4次中断。而不是进一次中断刷新四次,中间通过delay函数处理。优化了程序,避免进行无用的延时。

#include "secwatch.h"
#include "smg.h"
#include "spi.h"

extern unsigned char smgduan[16];

void SECWatch_Display(unsigned char sec,unsigned char mms)
{
	unsigned char buf[4];
	unsigned char i=mms%4;
		switch(i)
		{
			case 0:buf[0]=smgduan[sec/10]; 		SEG1_SETH;SEG2_SETL;SEG3_SETL;SEG4_SETL;break;
			case 1:buf[1]=smgduan[sec%10]|0x80; SEG1_SETL;SEG2_SETH;SEG3_SETL;SEG4_SETL;break;
			case 2:buf[2]=smgduan[mms/100]; 		SEG1_SETL;SEG2_SETL;SEG3_SETH;SEG4_SETL;break;
			case 3:buf[3]=smgduan[mms%100/10];		SEG1_SETL;SEG2_SETL;SEG3_SETL;SEG4_SETH;break;
		}
		SPIA_SendReciveData(buf[i]);

}

2.3 定时器中断服务函数

SECWatch_Display(sec,mms)为数码管刷新用的函数

extern unsigned char sec;
extern unsigned int mms;

interrupt void TIM1_IRQn(void)
{

	mms++;
	if(mms==1000)
	{
		mms=0;
		LED1_TOGGLE;
		sec++;
		if(sec==100)
		{
			sec=0;
		}
	}
	SECWatch_Display(sec,mms);
}
  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32F030F4是一种基于ARM Cortex-M0内核的微控制器,它支持多种外设和功能。编写STM32F030F4按键程序的过程如下: 首先,我们需要确保设置了正确的引脚模式和输入模式来使用按键。对于STM32F030F4,我们可以选择任何一个GPIO引脚作为按键输入。我们可以在STM32CubeMX软件中设置正确的引脚。 其次,我们需要初始化GPIO引脚作为输入,并启用外部中断功能。可以使用STM32的库函数或手动设置来完成这些操作。这样,当按键按下或释放时,我们就能够检测到外部中断引脚的状态变化。 接下来,我们需要编写中断处理函数来处理按键事件。当按键按下或释放时,中断处理函数会被触发。在中断处理函数中,我们可以根据需要执行特定的操作,比如改变LED的状态或发送数据到串口等。 在主程序中,我们需要设置中断优先级和使能外部中断以及启动主循环。在主循环中,我们可以继续执行其他任务,同时检查按键状态,以便及时响应按键事件。 最后,在编译后,我们可以将程序烧录到STM32F030F4的闪存中,并通过按下或释放按键来测试程序的功能。 综上所述,编写STM32F030F4按键程序的关键步骤包括设置引脚模式和输入模式、初始化GPIO引脚并启用外部中断、编写中断处理函数、设置中断优先级和使能外部中断、在主循环中检测按键状态以及烧录程序到STM32F030F4的闪存中。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值