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

📄 main.c

📁 键盘LED控制芯片与2407的C程序
💻 C
字号:
/************** start of head files ********************/ 
#include  "2407reg_c.h" 
#include  "2407_pin.h"
#include  "CH452_CMD.h" 
                                                                                                   
/************** end of head files ********************/ 

/************** start of macro definition ********************/ 

#define timer2_per   1000 /* 0.1ms timer2 period with a 1/4 timer prescaler and 40MHz CPUCLK */

#define pwm_half_per 500   /* period/2, 10KHz symmetric PWM with a 40MHz CPUCLK */

#define pwm_duty     25   /* 25% PWM duty cycle */    

/************** end of macro definition ********************/

 
/**************  start of global variables definition ********************/
                                  
                                  
int dig0,dig1,dig2,dig3;
int second_counter;                      



/**************  start of global variables definition ********************/
                             
                             
                             
/************** start of main ********************/ 

main()
{
	              
   	asm(" setc	INTM");			/*disable general interrupters*/
	asm(" clrc	SXM");			/*抑制符号位扩展*/
	asm(" clrc	OVM");			/*累加器结果正常溢出*/
	asm(" clrc	CNF");			/*CNF=0 see wonee.cmd*/

	*SCSR1=0x8F;	/*IOPE0 valid see MCRC configuration(I/O mux control register)
								  IOPE0 can also be configured as CLOCKOUT pin*/
								/*low power mode: IDLE1*/
								/*system clock=PLL*Fin=4*10=40M */ 
								/*enable ADC EVA EVB CLOCK*/ 
								/*disable SCI SPI CAN CLOCK*/
								/*clear ILLADR*/
	

 
	*WDCR=0x0EB;				/*disable WD in software*/
								/*overload time is 13.1ms*/
		     					/*when DSP working 40M*/
		     					/*E8--3.28ms,EA--6.6ms,EB--13.1ms,EC--26.2ms*/
		     					/*ED--52.4ms,EE--104.9ms,EF--209.7ms*/
	/* *XINT1CR= */	     					
	/* *XINT2CR= */		     					
		     					
/*** cofigurate shared pins ***/ 
/*******************IO PORT INITIALIZE*************************/ 
    *MCRA = 0x0fff0;                     
/*	bit 15             0=IOPB7,     1=TCLKINA
	bit 14               0=IOPB6,     1=TDIRA
	bit 13      IIC_SDA  0=IOPB5,     1=T2PWM/T2CMP
	bit 12      IIC_SCL  0=IOPB4,     1=T1PWM/T1CMP
	bit 11       PWM6    0=IOPB3,     1=PWM6
	bit 10       PWM5    0=IOPB2,     1=PWM5
	bit 9        PWM4    0=IOPB1,     1=PWM4
	bit 8        PWM3    0=IOPB0,     1=PWM3
	bit 7        PWM2    0=IOPA7,     1=PWM2
	bit 6        PWM1    0=IOPA6,     1=PWM1
	bit 5                0=IOPA5,     1=CAP3
	bit 4  ENCODER_Y     0=IOPA4,     1=CAP2/QEP2
	bit 3  ENCODER_X     0=IOPA3,     1=CAP1/QEP1
	bit 2                0=IOPA2,     1=XINT1
	bit 1  SCIRXD        0=IOPA1,     1=SCIRXD
	bit 0  SCITXD        0=IOPA0,     1=SCITXD		*/


    /* *MCRB = 0xFFFC; new configure*/
    *MCRB = 0x0;    /*old configure*/    
                 
/*	bit 15      1_       0=reserved,  1=TMS2 (always write as 1)
	bit 14        1_       0=reserved,  1=TMS  (always write as 1)
	bit 13        1_       0=reserved,  1=TD0  (always write as 1)
	bit 12        1_       0=reserved,  1=TDI  (always write as 1)
	bit 11        1_       0=reserved,  1=TCK  (always write as 1)
	bit 10        1_       0=reserved,  1=EMU1 (always write as 1)
	bit 9         1_       0=reserved,  1=EMU0 (always write as 1)
 	bit 8     I_DC_SOC --->0=IOPD0,     1=XINT2/ADCSOC
 	bit 7         1_       0=IOPC7,     1=CANRX
	bit 6         1_       0=IOPC6,     1=CANTX
	bit 5         1_       0=IOPC5,     1=SPISTE
	bit 4         1_       0=IOPC4,     1=SPICLK
	bit 3   jumper4    --->0=IOPC3,     1=SPISOMI
	bit 2   jumper3    --->0=IOPC2,     1=SPISIMO
	bit 1   jumper2    --->0=IOPC1,     1=B\I\O\
	bit 0   jumper1    --->0=IOPC0,     1=W/R\		*/

    *MCRC = 0x0;        
                 
/*	bit 15               reserved
	bit 14  dout       --->0=IOPF6,     1=IOPF6
	bit 13  Load   <---    0=IOPF5,     1=TCLKINB
	bit 12  din    <---    0=IOPF4,     1=TDIRB
 	bit 11  dck    <---    0=IOPF3,     1=T4PWM/T4CMP
 	bit 10  ERR    <---    0=IOPF2,     1=T3PWM/T3CMP
 	bit 9   DCL    <---    0=IOPF1,     1=CAP6
 	bit 8   DOL    <---    0=IOPF0,     1=CAP5/QEP4
 	bit 7   DO         --->0=IOPE7,     1=CAP4/QEP3
	bit 6   DC         --->0=IOPE6,     1=PWM12
 	bit 5   DS         --->0=IOPE5,     1=PWM11
 	bit 4   DOL_IN1    --->0=IOPE4,     1=PWM10
 	bit 3   DCL_IN1    --->0=IOPE3,     1=PWM9
 	bit 2   DOL_IN2    --->0=IOPE2,     1=PWM8
 	bit 1   DCL_IN2    --->0=IOPE1,     1=PWM7
 	bit 0   IPM_EN <---    0=IOPE0,     1=CLKOUT		*/       
            

 
/*** Initial IO Ports ** */
/*HIGH 8 BITS:1=OUTPUT;
              0=INPUT
              
  LOW  8 BITS:1=INPUT HIGH
              0=INPUT LOW  */
    *PCDATDIR = 0x0000;		 
    *PFDATDIR = 0x3f00;		    
    *PEDATDIR = 0x0101   ;             
    
/*******************IO PORT INITIALIZE*************************/ 

   
    
    
/*******************TIMER INITIALIZE*************************/ 

 /*** Setup the event manager interrupts ***/
 *EVAIFRA |= 0xFFFF; /* clear all EVA group A interrupts */
 *EVAIFRB |= 0xFFFF; /* clear all EVA group B interrupts */
 *EVAIFRC |= 0xFFFF; /* clear all EVA group C interrupts */
 *EVAIMRA = 0x0001; /* enable desired EVA group A interrupts */
 *EVAIMRB = 0x0001; /* enable desired EVA group B interrupts ENABLE T2P INT*/
 *EVAIMRC = 0x0000; /* enable desired EVA group C interrupts */
  
 /*** Setup the event manager interrupts ***/

    
/*** Setup timers 1 and 2, and the PWM configuration ***/
 *T1CON = 0x0000; /* disable timer 1 */
 *T2CON = 0x0000; /* disable timer 2 */

 *GPTCONA = 0x0000; /* configure GPTCONA */
 /*
 bit 15      0: reserved
 bit 14      0: T2STAT, read–only
 bit 13      0: T1STAT, read–only
 bit 12:11  00: reserved
 bit 10:9   00: T2TOADC, 00 = no timer2 event starts ADC
 bit 8:7    00: T1TOADC, 00 = no timer1 event starts ADC
 bit 6       0: TCOMPOE, 0 = Hi–z all timer compare outputs
 bit 5:4    00: reserved
 bit 3:2    00: T2PIN, 00 = forced low
 bit 1:0    00: T1PIN, 00 = forced low
 */


 /* Timer 1: configure to clock the PWM on PWM1 pin */
 /* Symmetric PWM, 20KHz carrier frequency, 25% duty cycle */
 *T1CNT = 0x0000; /* clear timer counter */
 *T1PR = pwm_half_per; /* set timer period */
 *DBTCONA = 0x0025; /* deadband units off */
 *CMPR1 = pwm_duty; /* set PWM1 duty cycle */
 *CMPR2 = pwm_duty<<1; /* set PWM1 duty cycle */
 *CMPR3 = pwm_duty<<2; /* set PWM1 duty cycle */
 *ACTRA = 0x0666; /* PWM1 pin set active high */
 /*
 bit 15      0: space vector dir is CCW (don’t care)
 bit 14:12 000: basic space vector is 000 (dont’ care)
 bit 11:10  00: PWM6/IOPB3 pin forced low
 bit 9:8    00: PWM5/IOPB2 pin forced low
 bit 7:6    00: PWM4/IOPB1 pin forced low
 bit 5:4    00: PWM3/IOPB0 pin forced low
 bit 3:2    00: PWM2/IOPA7 pin forced low
 bit 1:0    10: PWM1/IOPA6 pin active high
 */

 *COMCONA = 0x8200; /* configure COMCON register */
 /*
 bit 15       1: 1 = enable compare operation
 bit 14:13   00: 00 = reload CMPRx regs on timer 1 underflow
 bit 12       0: 0 = space vector disabled
 bit 11:10   00: 00 = reload ACTR on timer 1 underflow
 bit 9        1: 1 = enable PWM pins
 bit 8        0: 0’s: reserved
 */


 *T1CON = 0x0a40; /* configure T1CON register */
 /*
 bit 15:14   00:      stop immediately on emulator suspend
 bit 13       0:      reserved
 bit 12:11   01:  01= continous–up/down count mode
 bit 10:8   010: 000= x/4 prescaler
 bit 7        0:      reserved in T1CON
 bit 6        1:      TENABLE, 1 = enable timer
 bit 5:4     00: 00 = CPUCLK is clock source
 bit 3:2     00: 00 = reload compare reg on underflow
 bit 1        0: 0  = disable timer compare
 bit 0        0:      reserved in T1CON
 */


 /* Timer 2: configure to generate a 0.1ms periodic interrupt */
 *T2CNT = 0x0000; /* clear timer counter */
 *T2PR = timer2_per; /* set timer period */

 *T2CON = 0xD240; /* configure T2CON register */
 /*
 bit 15:14  11: stop immediately on emulator suspend
 bit 13      0: reserved
 bit 12:11  10: 10 = continous up count mode
 bit 10:8  010: 010 = x/4 prescaler
 bit 7       0: T2SWT1, 0 = use own TENABLE bit
 bit 6       1: TENABLE, 1 = enable timer
 bit 5:4    00: 00 = CPUCLK is clock source
 bit 3:2    00: 00 = reload compare reg on underflow
 bit 1       0: 0 = disable timer compare
 bit 0       0: SELT1PR, 0 = use own period register
 */    
    
     /*** Setup the core interrupts ***/
 *IMR = 0x0000; /* clear the IMR register */
 *IFR = 0x003F; /* clear any pending core interrupts */
 *IMR = 0x0004; /* enable desired core interrupts */


 
 /****************** variables initialize*********************/
 
 
    second_counter=10000;  
    
    dig0=0;
    dig1=0;
    dig2=0;
    dig3=0;
    
    
 /****************** variables initialize*********************/


      asm(" CLRC	INTM");			/*disable general interrupters*/	


    CH452_Write(CH452_SYSON2);	
	CH452_Write(CH452_BCD); 
    CH452_Write(CH452_DIG0|0X0);
	CH452_Write(CH452_DIG1|0X0); 
    CH452_Write(CH452_DIG2|0X0); 
    CH452_Write(CH452_DIG3|0X0);
    
/************************ main loop begin here ********************************/     
    
while(1)
{    
    int k,key;
                                   
      
     if(second_counter==0)
    {
         second_counter=10000; 
         dig0+=1;
         if(dig0>=10)
         {
               dig0=0;
               dig1+=1;
               if(dig1>=6)
               {
                      dig1=0;
                      dig2+=1;
                      k=dig2&0x0f;
                      
                      if(k>=10)
                      {
                            dig2&=0x0F0;
                            dig3+=1;
                            if(dig3>=6)
                            {
                                dig3=0;
                            }
                      }
                } 
          }
     
          if(dig2>=0x80)
          {
                dig2-=0x0080;
                asm(" SETC	XF");
                k=*PEDATDIR;
                k&=0x0FE;
                switch(k)
			    {
			    case 0x0FE:break;
                case 0x0FC:IO_DOL_SET ;                       break;
                case 0x0FA:            IO_DCL_SET ;           break;
                case 0x0F6:                        IO_ERR_SET;break;
                case 0x0EE:IO_DOL_SET ;IO_DCL_SET ;           break;
                case 0x0DE:IO_DOL_SET ;            IO_ERR_SET;break;
                case 0x0BE:            IO_DCL_SET ;IO_ERR_SET;break;
                case 0x07E:IO_DOL_SET ;IO_DCL_SET ;IO_ERR_SET;break;
			    default:break;
			    }
		   }	    
           else     
           {
           dig2+=0x0080;
           asm(" CLRC XF");
          
           IO_DOL_CLR;				
	       IO_DCL_CLR;			
	       IO_ERR_CLR;
          	
     }       
     CH452_Write(CH452_DIG0|dig0);
     CH452_Write(CH452_DIG1|dig1);
     CH452_Write(CH452_DIG2|dig2);
     CH452_Write(CH452_DIG3|dig3);
    
     }

    
 	k=*PFDATDIR;
	k&=bit_6;
	if(k==0)
		{
			key=CH452_Read();
			switch(key)
			{
			    case 0x40:dig0+=1;dig0&=0x0f; CH452_Write(CH452_DIG0|dig0);break;
			    case 0x48:dig1+=1;dig1&=0x0f; CH452_Write(CH452_DIG1|dig1);break;
			    case 0x50:dig2+=1;dig2&=0x0f; CH452_Write(CH452_DIG2|dig2);break;
			    case 0x58:dig3+=1;dig3&=0x0f; CH452_Write(CH452_DIG3|dig3);break;
			    case 0x60:IPM_EN_CLR;break;
			    case 0x68:IPM_EN_SET;break;
			    default: ;			
			}
			
			
		}
		else
     	;			           

}


/************** end of main ********************/

	  
/************** start of timer2 peroid interrupt service routine ********************/   
}

interrupt void timer2_isr(void)
{

    second_counter-=1;                              
     *EVAIFRB = *EVAIFRB & 0x0001; /* clear T2PINT flag */   
     
     asm(" CLRC	INTM");
     
     
} 



void interrupt nothing()
 {
 return;
 }
 	
void DELAY(n)
 {
  int i,k;
  for(i=n;i>=0;i--)
  {
  	 for(k=60000;k=0;k--)
  	;
  }
  
 
 }
 	

⌨️ 快捷键说明

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