⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.c.bak

📁 在TMS320LF2407DSP上实现实时时钟功能
💻 BAK
字号:
/*                     7段译码表                      */
/*			dp	g	f	e	d	c	b	a             */
/*	1	:	1	1	1	1	1	0	0	1	0xF9      */
/*	2	:	1	0	1	0	0	1	0	0	0xA4      */
/*	3	:	1	0	1	1	0	0	0	0	0xB0      */
/*	4	:	1	0	0	1	1	0	0	1	0x99      */
/*	5	:	1	0	0	1	0	0	1	0	0x92      */
/*	6	:	1	0	0	0	0	0	1	0	0x82      */
/*	7	:	1	1	1	1	1	0	0	0	0xF8      */
/*	8	:	1	0	0	0	0	0	0	0	0x80      */
/*	9	:	1	0	0	1	0	0	0	0	0x90      */
/*	0	:	1	1	0	0	0	0	0	0	0xC0      */


#include "2407A.h"  

void initial();                             /*初始化子程序 */ 
void timer1initial();                       /*定时器1初始化子程序 */
void SPIinitial();                          /*PWM初始化子程序 */

unsigned char sec_h=0;	        		    /*时间变量高位*/
unsigned char sec_l=0;			            /*时间变量低位 */
unsigned int  flag,tflag;

void inline disable()
{
	asm(" SETC INTM");	                    /*禁止所有中断*/
}

void inline enable()
{
	asm(" CLRC INTM");	                    /*开放所有中断 */
}

void initial()
{
	asm(" SETC SXM");                       /*抑制符号位扩展 */ 
	asm(" SETC OVM");                       /*根据遇到溢出的情况,累加器被设置为它的最大正值或负值 */
	asm(" SETC CNF");                       /*B0被设置为程序存储空间 */

	*SCSR1=0X8FFE;			                /*clock=0.5fin;使能ADC、SCI、SPI、CAN、EVA、EVB模块*/	
	*WDCR=0X06f;
	*WDKEY=0X5555;
	*WDKEY=0XAAAA;                          /*不使能看门狗*/
	
	*IMR=0X0002;				            /*允许INT2中断*/
	*IFR=0XFFFF;				            /*清除全部中断标志*/
	WSGR=0X00;				                /*禁止所有等待状态*/
	
	*MCRB=0X003C;			                /*IOPC2~4端口设置为基本功能,SPI模块*/
    /**PADATDIR=*PADATDIR|0X1C00;             /*IOPC2~4设置为输出方式*/ 
}
void  timer1initial()
{
	*EVAIMRA=*EVAIMRA|0X0080;	            /*允许定时器1的周期中断 */
	*EVAIFRA=*EVAIFRA|0X0FFFF;	            /*清除定时器1周期中断标志*/
	*T1CON=0X170C;			                /*Timer1为连续增计数模式,预分频值为128,使用内部时钟*/
	*T1PER=0X9896;			                /*Timer1的周期寄存器的值根据1s延时和预分频值确定,改状态*/
	*T1CNT=0X0000;			                /*Timer1的计数器清零*/
}

void  SPIinitial()
{
    *SPICCR=0X000F;                         /*在SPICLK的下降沿发送数据,数据长度为16位*/   
    *SPICTL=0X000E;                         /*主动工作模式,正常的SPI时钟方式,允许发送,SPI中断BU 使能*/
    *SPIBRR=0X0004;                         /*波特率设为1Mbps*/                                            
    *SPICCR=*SPICCR|0X0080;                 /*SPI退出复位状态*/
}

unsigned char decode(unsigned char sec_data)
{
	unsigned char undecoded,decoded;
	undecoded=sec_data;
	switch(undecoded)
	{
		case 0x01:
			decoded=0xF9;
			break;
		case 0x02:
			decoded=0xA4;
			break;
		case 0x03:
			decoded=0xB0;
			break;
		case 0x04:
			decoded=0x99;
			break;
		case 0x05:
			decoded=0x92;
			break;
		case 0x06:
			decoded=0x82;
			break;
		case 0x07:
			decoded=0xF8;
			break;
		case 0x08:
			decoded=0x80;
			break;
		case 0x09:
			decoded=0x90;
			break;
/*		case 0x00:
			decoded=0xC0;
			break;*/
		default:decoded=0xC0;
	}
	return decoded;
}

void display()
{
	unsigned char dataout_h,dataout_l,temp;
	dataout_h=decode(sec_h);
	dataout_l=decode(sec_l);
	temp=dataout_h;                    /*要显示的数据高位写入SPI的发送缓冲寄存器*/
	temp=temp<<8; 
	temp=temp|dataout_l;
	*SPITXBUF=temp;
	
	while(1)
	{
		flag=*SPISTS&0X40;
        if(flag==0X40)                      /*如果SPI的中断标志为1,说明SPI发送成功,停止等待*/
        {
            break;
        }
	}   
	*SPIRXBUF=*SPIRXBUF;                    /*虚读SPIRXBUF寄存器,以清除SPI中断标志*/
}  


void interrupt T1_INT()
{
    tflag=*EVAIFRA&0X0080;
	if(tflag==0X0080)
	{
        *T1CNT=0X00;     		                /*Timer1计数器清零*/
    	*EVAIFRA=*EVAIFRA|0X0080;       	    /*清除Timer1周期中断标志 */
	
	    display();
	    sec_l++;
	    if(sec_l>9)
	    {
	       sec_l=0;
	       sec_h++;
	       if(sec_h>9) sec_h=0;
	    }
       enable();				                /*开中断*/
	   return;	                                /*中断返回 */  
    }
	else 
	{
		enable();
		return;
	}  
 }
    				                                  
void main()
{
	disable();
	initial();                              /*系统初始化*/
	timer1initial();                        /*Timer1初始化*/
    SPIinitial();                           /*SPI初始化*/
	enable();
	*T1CON=*T1CON|0X0040;			        /*启动Timer1*/
	
	while(1)
	{
	asm(" nop"); 
	}
}           

void interrupt nothing( ) 
{
 	enable();
 	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -