DSP开发,F28335通过SPI和定时器实现数码管计数器以及按键使用-不使用Delay函数
程序员文章站
2022-06-09 16:34:17
...
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);
}