📄 main.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 + -