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