|
我要做的是一个按键调节LED灯光的,程序如下:
#include <iom16v.h>
#include <macros.h>
unsigned int key_stime1_counter;
int time_10ms_ok,time_1ms_ok=1;
unsigned char key_time,key_temp;
/******************比较定时器0比较向量入口地址***************/
#pragma interrupt_handler TIMER0_COMP:20
void TIMER0_COMP(void)
{
time_1ms_ok=1;
if(++key_stime1_counter>=10)
{
time_10ms_ok=1;
}
}
/******************按键函数***********************************************/
#define key_input PINC // 按键输入口
#define key_mask 0b00110000 // 按键输入屏蔽码
#define key_no 0
#define key_k1 1
#define key_k2 3
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
#define key_state_3 3
#define key_state_4 4
unsigned char read_key(void)
{
static unsigned char key_state = 0,key_old;
unsigned char key_press, key_return=key_no;
key_press = key_input & key_mask; // 读按键I/O电平
switch (key_state)
{
case key_state_0: // 按键初始态
if (key_press != key_mask)
{
key_old = key_press; // 记录原电平
key_state = key_state_1; // 键被按下,状态转换到键确认态
}
break;
case key_state_1: // 按键确认态
if (key_press == key_old) // 与原电平比较(消抖处理)
{
if (key_press == 0b00100000)
{
key_state = key_state_2; // 状态转换到键释放态
key_time=0;
}
else if (key_press == 0b00010000)
{
key_state = key_state_4; // 状态转换到键释放态
key_return = key_k2;
}
}
else
key_state = key_state_0; // 按键已抬起,转换到按键初始态
break;
case key_state_2:
if(key_press ==key_mask)
{
key_state = key_state_0;
key_return=key_k1;
}
else if(++key_time>=100)
{
key_state=key_state_3;
key_time=0;
key_return=2;//输出为2时产生连_发功能
}
break;
case key_state_3:
if (key_press == key_mask) key_state = key_state_0; //按键已释放,转换到按键初始态
else
{
if(++key_time>=50)//按键计数时间
{
key_time=0; //清按键计时
key_return=2; //输出为1时产生连_发功能
}
}
break;
case key_state_4:
if (key_press == key_mask) key_state = key_state_0;
break;
}
return key_return;
}
/***************************/
void Timer1_init(void)
{
TCCR1A=0xA2;//快速PWM
TCCR1B=0X19;
ICR1=0XFFFF;//上限值
}
void main(void)
{
unsigned int a=65535;
PORTD|=0X20;
Timer1_init();
MCUCR = 0x00;
GICR = 0x00;
DDRD=0x20;
OCR1A=a;
TCCR0=0x0B; // 内部时钟,64分频(8M/64=125KHz),CTC模式
TCNT0=0x00;
OCR0=0x7C; // OCR0 = 0x7C(124),(124+1)/125=1ms
TIMSK=0x02; // 允许T/C0比较匹配中断
SEI(); //开所有中断
while(1)
{
if(time_10ms_ok==1)//10毫秒到
{
time_10ms_ok=0;
key_temp=read_key();//调用按键函数
if(key_temp!=key_no)
{
switch(key_temp)
{
case 1: a-=100;//单一按键,改变占空比的值
break;
case 2: a-=500;//按键连_发,改变占空比
break;
}
if(a<=500)
{
a=0; //占空比为0
OCR1A=a;
break;
}
OCR1A=a;
}
}
}
}
现在出现一个问题,就是我在万用板上搭的电路,有时,LED不用按键控制,灯也会慢慢的亮起来,直到最亮,按键也可以控制LED灯慢慢亮起来,我就搞不明白,为什么有时不用按键灯也会慢慢亮起来,不知是程序问题还是电路问题,麻烦老师帮我看看好吗,谢谢, 我已经困惑几天了,想不通,在次感谢了,
电路如下:
![](http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_296934.jpg)
(原文件名:ourdev_294974.jpg)
A端接PB5 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|