level 11
明天给你一个!你是ok6410还是tiny6410
2013年11月02日 15点11分
7
level 11
#include "head.h"
#define value 66000000
int value_2=value/2;
int led=~(0x0f<<4);
void Main(void)
{
beep_init();
INT_init();
T1_config();
while(1)
{
;
}
}
void beep_init(void)
{
//rGPFCON=0xdfffffff;
//rGPFPUD=0xcfffffff;
rGPFCON=(rGPFCON&(~(0x3<<28)))|0x2<<28;
BEEP_OFF;
rGPFPUD=0;
rGPKCON=~(0xffff<<16);
rGPKCON|=0x1<<16| (0x1<<20)| (0x1<<24)| (0x1<<28);
rGPKPUD=0;
rGPKDAT=~led;
}
void INT_init(void) //中断初始化
{
rVIC0INTENCLEAR=0xffffffff;
rVIC1INTENCLEAR=0xffffffff; //关闭64个中断源
rVIC0ADDRESS=0x00;
//VIC1ADDRESS=0x00; //清空中断指示寄存器值
}
void __irq T1_ISR(void)
{
//value_2=(value_2)/2; //改变比较值
//if(value_2<500) value_2=value/2; //新一轮
led=~led;
rGPKDAT=led;
rTCNTB0=value; //重装初值--周期不变
rTCMPB0=value_2; //重装比较值--与上一次有所改变【会自动重装】
rTINT_CSTAT=rTINT_CSTAT|(0x01<<5); //定时器T1中断发生,硬件将定时器中断标志寄存器6位置1,需软件将6位清空【写1清空】
rVIC0ADDRESS=0x00;
}
void T1_config(void)
{
rVIC0INTSELECT=rVIC0INTSELECT&(~(0x01<<23));
rVIC0VECTADDR23=(unsigned int)T1_ISR; //安装中断
rTINT_CSTAT=rTINT_CSTAT&(~(0x01))&(~(0x01<<5)); //+++定时器中断控制和标志寄存器
rTINT_CSTAT=rTINT_CSTAT|(0x01)|(0x01<<5); //定时计数器0启动并清除中断标状态位
rTCFG0=rTCFG0&(~0xff); //+++预分频--一级分频
rTCFG0=rTCFG0|0;
//[7:0]--T0 T1 先清空,再赋预分频值【分频值:1=0+1】--66MHZ
rTCFG1=rTCFG1&(~(0x0f)); //+++二级分频
rTCFG1=rTCFG1|0;
//[3:0]--T0 先清空,再赋预分频值【分频值:1--0000】--66MHZ
rTCNTB0=value; //装初值
rTCMPB0=value_2;//装比较值
rTCON=rTCON&(~(0x0f));
rTCON=rTCON|(0x01<<2); //反转器:0-初始电平0 1-初始电平1 【此处不是反转器的开关】--初始为高电平
//初始为1--1将越来越多,高电平响时间逐渐增长; 初始为0--0将越来越多,低电平不响时将逐渐增长
rTCON=rTCON|(0x0b); //[0:3]--T1 自动加载【1-开】 反转初始电平【保持初状】 手动更新【1-开】 启动关闭T1【1-启动】
rTCON=rTCON&(~(0x02)); //关闭手动更新
rVIC0INTENABLE=rVIC0INTENABLE|(0x01<<23); //开总中断
}
void delay(int times)
{
int i;
for(;times>0;times--)
for(i=0;i<3000;i++);
}I
2013年11月03日 10点11分
9