DSP28335定时器简易秒表设计

l利用DSP28335进行简单的定时器秒表设计,可利用按键实现正向计时、倒计时、暂停、继续以及清零的功能,通过简单的配置调试能利用4位数码管进行显示,且通过LED等进行反馈。调试的过程中由于中断函数放置的位置不同导致实现的功能不同,将中断放于主函数之后所有的问题迎刃而解,但是在编写调试之初中断函数在定时器初始化函数.c文件中,按键选择功能无法正常实现。对于我出现的问题希望有大佬帮忙解答一下。

 主函数部分:

void main()
{
	char key;

	//系统初始化
    InitSysCtrl();
	InitPieCtrl();
	IER=0x0000;
	IFR=0x0000;
	InitPieVectTable();

	//外设初始化
	LED_Init();
	SMG_Init();
	BEEP_Init();
	KEY_Init();
	//设置定时器0的中断入口地址为中断向量表的INT0
	EALLOW;
	PieVectTable.TINT0=&TIM0_IRQn;
	EDIS;


	while(1)
	{
		LED3_TOGGLE;
		key=KEY_Scan(0);
		switch(key)
		{
		case 1://KEY1_PRESS://开始计时
			mod=0;
			TIM0_Init(150,1000);
			break;
		case 3://KEY3_PRESS://暂停计时
			mod=1;
			TIM0_Init(150,1000);
			break;
		case 5://KEY5_PRESS://计时清零
			mod=2;
			ms=0;
			sec=0;
			min=0;
			TIM0_Init(150,1000);
			break;
		case 7://KEY7_PRESS://正计时
			mod=3;
			if(flag==1)
			{
				ms=0;
				sec=0;
				min=0;
			}
			TIM0_Init(150,1000);
			break;
		case 9://KEY9_PRESS://倒计时
			mod=4;
			TIM0_Init(150,1000);
			break;
		}

		LED4_TOGGLE;
	}
}

中断函数:

interrupt void TIM0_IRQn(void)
{

	if(mod==0&&flag==0)
		ms++;
	else if(mod==0&&flag==1&ms>0)
		ms--;
	else if(mod==3)
	{
		ms++;
		flag=0;
	}
	else if (mod==4)//倒计时设定时间为65534ms,由于系统为16为所以unsigned long int 取值范围为0~2^32-1
	{
		if(flag==0)
			ms=6000000;//倒计时100分钟
		ms--;
		flag=1;
	}
	if(flag==0)
	{
		sec=ms/1000;
		min+=sec/60;
		if(sec==60)//防止超出数据范围,对参数进行初始化
		{
			sec=0;
			ms=0;
		}
	}
	if(flag==1)
	{
		sec=ms/1000%60;
		min=ms/1000/60;
	}
	EALLOW;
	PieCtrlRegs.PIEACK.bit.ACK1=1;
	EDIS;
	SMG_DisplayInt(min,sec);
}

显示函数部分:

void SMG_DisplayInt(Uint16 min,Uint16 sec)
{
	unsigned char S[4];
	unsigned char i=0;

	S[0]=smgduan[min/10];
	S[1]=smgduan[min%10]|0x80;
	S[2]=smgduan[sec/10];
	S[3]=smgduan[sec%10];

	for(i=0;i<4;i++)
	{
		HC164SendData(S[i]);

		switch(i)
		{
			case 0:SEG1_SETH;SEG2_SETL;SEG3_SETL;SEG4_SETL;break;
			case 1:SEG1_SETL;SEG2_SETH;SEG3_SETL;SEG4_SETL;break;
			case 2:SEG1_SETL;SEG2_SETL;SEG3_SETH;SEG4_SETL;break;
			case 3:SEG1_SETL;SEG2_SETL;SEG3_SETL;SEG4_SETH;break;
		}
		DELAY_US(100);
	}

}

//74HC164发送数据函数
void HC164SendData(unsigned char dat)
{
	char i=0;
	for(;i<8;i++)
	{
		SPICLKA_SETL;
		if(dat&0x80)
			SPISIMOA_SETH;
		else
			SPISIMOA_SETL;
		SPICLKA_SETH;
		dat<<=1;
	}
}

程序中关于数据类型的取值范围在文末附上链接,在此向其作者表示感谢。

https://blog.csdn.net/baidu_37973494/article/details/100125363

 文章配套源程序代码链接如下,如有需要自取

https://download.csdn.net/download/m0_64271488/83911366?spm=1001.2014.3001.5503

  • 5
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
6.1.3、退出……………………..……………………………….…5 6.2、编辑…………………………..…………………………………5 6.2.1、灰度………………………..………………….……………5 6.2.2、亮度………………………..………………….……………6 6.2.3、截图…………………………..……………….……………7 6.2.4、缩放…………………………..…………….………………7 6.3、旋转…………………………………..…………………………9 6.3.1、上下翻转…………………….…………….………………9 6.3.2、左右翻转………………….…………….…………………9 6.3.3任意角度翻转…………………………….…………………9 6.4、噪声………………………………..…………..………………10 6.5、滤波……………………………………..………..……………10 6.6、直方图统计……………………………………………………11 6.7、频谱分析………………………………………..…..…………12 6.7.1、频谱图………………………… …… …… ……….……12 6.7.2、通过高通滤波器………………… …… .……………….12 6.7.3、通过低通滤波器……………………………….. ……….13 6.8、灰度图像处理………………………………………… . …….14 6.8.1、二值图像……………………………………………….. .14 6.8.2、创建索引图像……………………………………… .…..14 6.9、颜色模型转换……………………………..… ..……………14 6.10、操作界面设计……………………………………..…………15

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值