高级会员
- 积分
- 805
- 威望
- 525
- 贡献
- 168
- 兑换币
- 9
- 注册时间
- 2011-9-21
- 在线时间
- 56 小时
|
/*---------------------------------------------------------*/
/************************************************************
刚开始学,各位见笑了 帮忙找找问题 问题还似乎挺多的
主要想实现通过“按键控制流水灯的流速”
现在流水灯程序是没问题的
关键加了 按键中断的程序后流水灯就不流了 似乎没进for循环
按键中断没找到相关资料 相关寄存器也不是太了解
学长帮忙看看程序 问题出在哪?
有什么好资料麻烦发到 邮箱1047861637@qq.com
万分感谢
万分感谢
万分感谢
************************************************************/
/*---------------------------------------------------------*/
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define LED PORTB //B口
#define LED_dir DDRB
#define UP PTIH_PTIH0 //按键 H口 上
#define DOWN PTIH_PTIH1 //下
#define UP_dir DDRH_DDRH0
#define DOWN_dir DDRH_DDRH1
#define BUS_CLOCK 32000000 //总线频率
#define OSC_CLOCK 16000000 //晶振频率
unsigned char data=0x01; //定义 流水灯 初始化
unsigned int time=20; //时间
/*************************************************************/
/* 初始化锁相环 */
/*************************************************************/
void INIT_PLL(void)
{
CLKSEL &= 0x7f; //set OSCCLK as sysclk
PLLCTL &= 0x8F; //Disable PLL circuit
CRGINT &= 0xDF;
#if(BUS_CLOCK == 40000000)
SYNR = 0x44;
#elif(BUS_CLOCK == 32000000)
SYNR = 0x43;
#elif(BUS_CLOCK == 24000000)
SYNR = 0x42;
#endif
REFDV = 0x81; //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
PLLCTL =PLLCTL|0x70; //Enable PLL circuit
asm NOP;
asm NOP;
while(!(CRGFLG&0x08)); //PLLCLK is Locked already
CLKSEL |= 0x80; //set PLLCLK as sysclk
}
/*************************************************************/
/* 延时函数 */
/*************************************************************/
void delay(unsigned int t)
{
unsigned int i,j;
for(j=0;j<t;j++)
for(i=0;i<10000;i++)
;
}
/*************************************************************/
/* 初始化按键 */
/*************************************************************/
void init_key(void)
{
UP_dir=0; //设置为输入
DOWN_dir=0;
PPSH = 0x00; //极性选择寄存器,选择下降沿;
PIFH = 0x03; //对PIFH的每一位写1来清除标志位;
PIEH = 0x03; //中断使能寄存器;
}
/*************************************************************/
/* 按键中断函数 */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void PTH_inter(void)
{
if(PIFH != 0) //判断中断标志
{
PIFH = 0xff; //清除中断标志
if(UP == 0) //按键UP按下
{
delay(1);
if(UP == 0)
{
if(time<100)
time+=5; //流速加快
while(UP == 0);
}
}
if(DOWN == 0)
{
delay(1);
if(DOWN == 0)
{
if(time> 0)
time-=5 ; //流速减慢
while(DOWN == 0);
}
}
}
}
#pragma CODE_SEG DEFAULT
/*************************************************************/
/* 主函数 */
/*************************************************************/
void main(void) {
DisableInterrupts;
init_key();
INIT_PLL();
LED_dir=0xff; //设置为输出
LED=~data; //点亮LED1
EnableInterrupts;
for(;;)
{
delay(time); //延时
data=data<<1; //左移一位
if(data==0)
data=0x01; //for循环的流水灯正常 没问题
LED = ~data;
}
}
|
|