|
板凳
楼主 |
发表于 2014-2-14 09:55:09
|
只看该作者
光立方按键中断调速
光立方按键中断调速。
视频地址:http://v.youku.com/v_show/id_XNjc4OTA2NDc2.html
这层楼,将介绍按键中断调速。调速!首先我们需要知道调哪个参数,可以改变动画速度,当然,第一个想到的就是变量speed,在很多的动画中我们都使用了这个变量,但是我们在显示每个动画的时候是不是都要检测speed的值?这样保证调速的实时性?主函数中,我们动画显示部分会不会很乱?好了,写了改变这个变量。我们就会对主函数动画部分进行大的改动。pass这个想法。
再看void Frame(u8 *a,u8 speed),因为我们知道,每个动画显示时都会调用此函数。
- void Frame(u8 *a,u8 speed)
- {
- u8 i,j,num;
- while(speed--)
- {
- num = 0x01;
- for(i = 0;i < 8;i++) //层数层控制,选通某一层,
- //使得第1层到第8层,依次点亮
- {
- num <<= i;
- RCK = 0;
- for(j = 0;j < 8;j++) //串行数据输入
- {
- SER = 0;
- delay_us(1);
- SCK= 0; //上升沿,输入到移位寄存器
- delay_us(1);
- SCK = 1;
- }
- for(j =0;j < 8;j++) //串行数据输入
- {
- if(num & 0x80)
- SER = 1; // SER串行输入端口
- else
- SER = 0;
- SCK = 0; //上升沿,输入到移位寄存器
- delay_us(1);
- SCK = 1;
- num <<= 1;
- }
- Storey(a+i*8);//层填充函数,控制某层灯点亮方式
- RCK = 1;
- num=0x01;
- <font color="#ff0000"> delay_ms(2); // 层显示时间</font>
- }
- }
- }
复制代码 是不是我们可以改变其它参数,间接的来改变动画速度,有的,请看红色字体那,层显示时间,我们改变它,也就间接的改变了每帧显示的时间,这样就达到了改变速度的目的。
在led.c函数中我们声明一个全局变量:u8 GEAR = 4。 将delay_ms(2)改为delay_us(500 + (8-GEAR) * 250)。
下面开始编写外部中断函数。
- #define KEY_DOWN PAin(6) //PA6 速度减
- #define KEY_UP PAin(7) //PA7 速度加
- void EXTIX_Init(void);//外部中断IO初始化
- //按键调速,共7个档位,调整光立方的运行数度
- //PA6,PA7外部中断输入端口,分别接驱动板的KEY1、KEY2
- //按下KEY1速度变慢,按下KEY2速度变快
- //外部中断服务函数
- void EXTI9_5_IRQHandler(void)
- {
- <font color="#ff0000"> delay_ms(1); //消抖</font>
- if(KEY_DOWN == 0) //按键1
- {
- if(GEAR > 1 && GEAR < 8)
- {
- -- GEAR;
- printf("%d\n",GEAR);
- }
- }
- else if(KEY_UP == 0)//按键2
- {
- if(GEAR > 0 && GEAR < 7)
- {
- ++ GEAR;
- printf("%d\n",GEAR);
- }
- }
- EXTI->PR = 1<<6; //清除LINE6上的中断标志位
- EXTI->PR = 1<<7; //清除LINE7上的中断标志位
- }
- //外部中断初始化程序
- //初始化PA6,PA7为中断输入.
- void EXTIX_Init(void)
- {
- RCC->APB2ENR |= 1<<2; //使能PORTA时钟
- JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD
- GPIOA->CRL &= 0X00FFFFFF;//PA6,PA7设置成输入
- GPIOA->CRL |= 0X88000000;
- GPIOA->ODR |= 1<<6; //PA6上拉
- GPIOA->ODR |= 1<<7; //PA7上拉
- Ex_NVIC_Config( GPIO_A, 6, FTIR);//下降沿触发
- Ex_NVIC_Config( GPIO_A, 7, FTIR);//下降沿触发
- MY_NVIC_Init( 2, 1, EXTI9_5_IRQChannel, 2);//抢占2,子优先级1,组2
- }
复制代码 通过上面的中断服务函数就可以实时改变GEAR的值了,需要注意的是消抖时间,这个时间不可很大,时间过长,按键中断时光立方就会出现“一闪”的现象。
|
|