📄 main.c
字号:
T1TCR = 0X00; // 停止TIME1捕获
IO0CLR = A_IN1|B_IN1;
IO0CLR = A_IN2|B_IN2;
//IO0CLR = PWM1;
//IO0CLR = PWM3;
k = 1;
}
break;
case 0xef:
if(FunChgKey) //按键4,功能为左转键
{
PWMTCR = 0X00;
PWMPCR = 0X0200;
PWMTCR = 0x09; // 启动PWM输出
T0TCR = 0X01; // 启动TIME0
T1TCR = 0X01; // 启动TIME1捕获
IO0CLR = PWM3;
k=0;
}
break;
case 0xF7:
if(FunChgKey) //按键3,功能为右转键
{
PWMTCR = 0X00;
PWMPCR = 0X0800;
PWMTCR = 0x09; // 启动PWM输出
T0TCR = 0X01; // 启动TIME0
T1TCR = 0X01; // 启动TIME1捕获
IO0CLR = PWM1;
k=0;
}
break;
case 0xbf: //移位
if(l)
{ if(ShiftKey<7)
ShiftKey++;
else
ShiftKey=0;
}
break;
case 0xdf:
if(FunChgKey) //按键5,功能为上翻键
{flag++;
ParaBCD1(FunData[flag]);
ParaBCD2(flag);
k=1;
}
break;
case 0x7f:
if(l)
{ if(BCDDATA[ShiftKey]<9)
BCDDATA[ShiftKey]++;
else
BCDDATA[ShiftKey]=0;
k=1;
}
break;
default:
break;
}
}
}
/*
*********************************************************************************************************
** 函数名称 :Timer0_Init()
** 函数功能 :定时器0中断服务程
**入口参数:无
**出口参数:无
** 调试说明 :
*********************************************************************************************************
*/
void __irq Timer0_Int (void)
{ T1CCR = 0X00;
H1=0X00;
H2 = 0X00;
NP1 = k1;
NP2 = k2;
k1=0;
k2=0;
if(CAP2_1>CAP1_1)
F1 = (Fpclk/((CAP2_1-CAP1_1)/(NP1-1)));
if(CAP2_2>CAP1_2)
F2 = (Fpclk/((CAP2_2-CAP1_2)/(NP2-1)));
T0IR = 0X01;
T1CCR = (1<<7)|
(1<<8)|
(1<<10)|
(1<<11);
VICVectAddr = 0x00;
}
/*
*********************************************************************************************************
** 函数名称 :Timer1_CapInit()
** 函数功能 :定时器1捕获中断服务程
**入口参数:无
**出口参数:无
** 调试说明 :有问题???????
*********************************************************************************************************
*/
void __irq Timer1_CapInt (void)
{
if((T1IR&0X40)!=0)
{if(H1==0)
{CAP1_1= T1CR2;
H1 = 0X01;}
else
CAP2_1=T1CR3;
k1++;
FunData1[0]=k1/12;
T1IR = 1<<6;}
if((T1IR&0X80)!=0)
{if(H2==0)
{CAP1_2=T1CR2;
H2=0X01;}
else
CAP2_2 = T1CR3;
k2++;
FunData2[0]=k2/12;
T1IR = 1<<7;}
VICVectAddr = 0x00;
}
/*
*********************************************************************************************************
** 函数名称 :I2cInit()
** 函数功能 :I2C初始化
** 入口参数 :Fi2c I2C总线频率(最大400K)
** 出口参数 :无
*********************************************************************************************************
*/
void I2cInit(uint32 Fi2c)
{
if (Fi2c > 400000)
Fi2c = 400000;
//PINSEL0 = (PINSEL0 & 0xFFFFFF0F) | 0x50; /* 设置I2C控制口有效 */
PINSEL0 = (PINSEL0 & (~0xF0)) | 0x50; // 不影响其它管脚连接
I2SCLH = (Fpclk/Fi2c + 1) / 2; /* 设定I2C时钟 */
I2SCLL = (Fpclk/Fi2c)/2;
I2CONCLR = 0x2C;
/* 设置I2C中断允许
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl0 = (0x20 | 0x09); // I2C通道分配到IRQ slot0,最高优先级
VICVectAddr0 = (int32)IRQ_I2C; // 设置I2C中断向量
VICIntEnable = (1 << 9); // 使能I2C中断 */
}
/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :PWM音乐输出实验。
** 调试说明 :需要将music.h包含进来。
*********************************************************************************************************
*/
int main (void)
{
PINSEL0 = 0x0000550A; // 设置SPI管脚连接
// P0.0选择PWM1功能,P0.1选择PWM3功能
PINSEL1 =0X00000014; // P0.17选择CAP1.2功能,P0.18选择CAP1.3功能
PINSEL2 = 0x00000000;
MSPI_Init();
DispBoardInit();
IO0DIR = RCLK|A_IN1|A_IN2|B_IN1|B_IN2|PWM1|PWM3;
IO1DIR = RCLK|led;
IO1SET = RCLK|led;
I2cInit(400000);
/*设置TIMER0/1中断*/
IRQEnable();
VICIntSelect = 0x00000000;
VICVectCntl0 = 0x20|0x04;
VICVectCntl1 = 0x20|0x05;
VICVectCntl2 = 0x20|0x09;
VICVectAddr0 = (uint32)Timer0_Int;
VICVectAddr1 = (uint32)Timer1_CapInt;
VICVectAddr2 = (int32)IRQ_I2C; /* 设置I2C中断向量 */
//VICIntEnable = (1<<0X05);
VICIntEnable = (1<<0X04)|(1<<0X05)|(1<<0X09);
IO1SET = RCLK; //打开中断
I2CONSET = 0x40; //使能主I2C
I2C_ReadNByte(CAT1025, ONE_BYTE_SUBA, 0x00, FunData, 10);
DelayNS(10);
I2CONSET = 0x00; // 禁止主I2C
//IO0SET = A_IN1|B_IN1;
//IO0SET |= B_IN1;
//IO0CLR = A_IN2;
//IO0CLR |=B_IN2;
/* PWM初始化 */
PWMPR = 0x00; // 不分频,计数频率为Fpclk
PWMMCR = 0x02; // 设置PWMMR0匹配时复位PWMTC
PWMMR0 = Fpclk /(FunData[5]*10);
PWMMR1 = PWMMR0/2; // 50%占空比
PWMMR3 = PWMMR0/2;
PWMLER = 0x0A; // PWM0和PWM1/3匹配锁存
PWMTCR = 0x02; // 复位PWMTC
/* TIME0初始化 */
T0TC = 0;
T0PR = 0;
T0MCR = 0X03;
T0MR0 = Fpclk/10; //1S定时
/* TIME1初始化 */
T1PR = 0;
T1CCR = (1<<7)|
(1<<8)|
(1<<10)|
(1<<11);
T1TC =0;
T1CR2 = 0;
T1CR3 = 0;
// T1MR0 = Fpclk*2;
IO0CLR = PWM1;
IO0CLR = PWM3;
//PWMTCR = 0x09; // 启动PWM输出
//T0TCR = 0X01; // 启动TIME0
//T1TCR = 0X01; // 启动TIME1捕获
//PWMTCR = 0X00;
//T1TCR = 0X00;
//flag = 0;
//ParaBCD1(FunData[flag]);
//ParaBCD2(flag);
while(1)
{
Sensor = ((IO0PIN &0X0000AA00)>>8);
switch(Sensor)
{case 0xAA:{ORA = FunData[1]*10;
ORB = FunData[2]*10;}
//IO0CLR = led;
//DelayNS(10);}
break;
case 0x8A:{ORA = (FunData[1]-FunData[3])*10;
ORB = (FunData[1]+FunData[3])*10;}
break;
case 0xA2:{ORA = (FunData[1]+FunData[3])*10;
ORB = (FunData[1]-FunData[3])*10;}
break;
case 0x2A:{ORA =( FunData[1]-5*FunData[3])*10;
ORB = (FunData[1]+5*FunData[3])*10;}
break;
case 0xA8:{ORA = (FunData[1]+5*FunData[3])*10;
ORB = (FunData[1]-5*FunData[3])*10;}
break;
default:break;
}
EK1_2 = ORA - F1;
EK2_2 = ORB - F2;
UK1 = UK1 +150*(EK1_2-EK1_1)+5*EK1_1;
UK2 = UK2 +150*(EK2_2-EK2_1)+5*EK2_1;
EK1_1 = EK1_2;
EK2_1 = EK2_2;
if(UK1>(PWMMR0-10))
UK1 = (PWMMR0 - 10);
if(UK1<10)
UK1=10;
if(UK2>(PWMMR0-10))
UK2 = (PWMMR0 - 10);
if(UK2<10)
UK2=10;
PWMMR1 = UK1;
PWMMR3 = UK2;
PWMLER =0X0A;
KeyScan();
DisplayFun();
}
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -