欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-09 16:34:17
...

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

1 概述

实验的代码已经上传。

1.1 资源概述

开发板: 普中DSP开发板
CCS编译器版本:6.2.11
主控芯片型号:TMS320F28335
DSP开发,F28335通过SPI和定时器实现数码管计数器以及按键使用-不使用Delay函数

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);
}