搜索
bottom↓
回复: 5

马老师,你好,帮我看看我的程序错在哪里,谢谢!!!

[复制链接]

出0入0汤圆

发表于 2008-5-30 09:14:58 | 显示全部楼层 |阅读模式
我要做的是一个按键调节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灯慢慢亮起来,我就搞不明白,为什么有时不用按键灯也会慢慢亮起来,不知是程序问题还是电路问题,麻烦老师帮我看看好吗,谢谢, 我已经困惑几天了,想不通,在次感谢了,
电路如下:

(原文件名:ourdev_294974.jpg)

A端接PB5

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2008-5-30 18:28:45 | 显示全部楼层
我的书中有一个使用PWM产生正弦波的例子,把PWM频率减低,其输出就可以实现调节LED的亮度了.你先试试,掌握基本的原理后,在结合到你的系统中.

出0入0汤圆

 楼主| 发表于 2008-5-31 08:31:30 | 显示全部楼层
谢谢马老师,我昨天检查了程序,是初始化没搞对.

出0入0汤圆

发表于 2011-1-6 21:00:14 | 显示全部楼层
MARK
头像被屏蔽

出0入0汤圆

发表于 2011-12-14 23:00:19 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

出0入0汤圆

发表于 2011-12-14 23:11:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 14:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表