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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章