打印

求高手帮看下

[复制链接]
1320|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shiyan1532|  楼主 | 2012-7-29 13:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在做一个检测电池充电电压是否上升的充电器,充电电压如果上升,则显示测试通过。开机界面为 PS1400 CHARGER,开始键按下时,界面显示{"V=X.XXV A=X.XXA"}电压电流。结束键按下时,重新显示 PS1400 CHARGER。在写键盘检测与电压电流刷新这遇到问题。如下
void main(void)
{

init();
lcd_init();
ad_init();
init_lcd();//显示开机界面 PS1400 CHARGER
while(1)
{
  key_scan();
  }
   
}
键盘扫描如下  K1为开始键。K2为停止键盘,K3为3A-4A继电器切换键
void key_scan(void)
{
    static int bank2 a1,a2;

    if(K1==0)    //如果开始键被按下
    {

     write_cmd(0x01);  // 清屏

     write_cmd(0XC1);  //第二行
     for(k=0;k<14;k++)   //显示{"V=0.00V A=0.00A"};
     {
   
      write_dat(table1[k]);
     
      }

      dis_ad();    //获取电压电流并在XX处显示           这有个问题,这个电压电流怎么能变成实时刷新?如果像我这样写的话,下边有3S的延时判断电压是否上升,时间太长,实时性就没了。。。。。

     D2=1;        //继电器闭合,开始充电
     a1=get_ad(); //获取电压
     delay(3000);  //延时3S       3S延时!!
     a2=get_ad();//延时3S,再次获得电压
     if(a2-a1>1) //判断电压是否有上升,有上升,响铃,显示测试通过
     {
         LED=1;    //如果电压上升,点亮LED指示灯
         D2=0;     //测试通过,断开继电器,结束充电
         test_pass();//液晶1602显示TEST IS PASS!
      
      
     }
     else  //电压无上升,显示测试未通过
     {
      
          test_npass(); //液晶1602显示TEST IS NOT PASS!

     }
    }

    if(K2==0) //如果停止键K2被按下 则结束充电 回到开机界面   显示 PS1400 CHARGER
    {
         D2=0;  //关闭继电器
         write_cmd(0x01);  // 清屏
         delay(2);        
         init_lcd();//显示  PS1400 CHARGER
    }
    if(K3==0)
    {
                    D1=!D1;         
                        
    }

}

有的朋友说用定时器中断,我没有思路啊。不知该怎么在中断内实现。

相关帖子

沙发
sinonion| | 2012-7-29 13:28 | 只看该作者
看了下你的问题,首先说明一下:
1。按键服务程序只需要完成它应该做的事情,比如开始,结束,切换,没必要越俎代庖去做AD采样和LCD显示。
2.按键去抖动是必须要做的,如果不清楚可以参考匠人前辈的书。
意见如下:
1.用一个定时器,负责调度AD采样和LCD显示,例如每50ms执行一次LCD显示,每3S进行一次AD采样!

使用特权

评论回复
板凳
shiyan1532|  楼主 | 2012-7-29 13:48 | 只看该作者
多谢你的回答,我用的pic单片机,定时器中断与主程序不能共用 函数?不知别的单片机是不是也是这样,这个一般如何处理呢。如你所说,用定时器,每隔100ms进行一次LCD显示,如果显示部分正处在开始键被按下状态,{"V=X.XXV A=X.XXA"}这个显示阶段,我只要用定时器每隔100ms显示一下电压电流,如果是处在开机界面,我只要每隔100ms显示一下PS1400 CHARGER,这个处在哪个阶段,我该如何判断?比如 我在定时器里 每100ms显示一次电压电流,但是这个时候结束按键被按下了,界面变成了PS1400 CHARGER,如果这个时候还显示电压电流的话,界面就乱了。 2# sinonion

使用特权

评论回复
地板
sinonion| | 2012-7-29 14:12 | 只看该作者
兄弟你的思路需要缕一缕,不行了先画个流程图,跟你讨论太没技术含量了!

使用特权

评论回复
5
sinonion| | 2012-7-29 14:13 | 只看该作者
PIC的,把这个加在函数头上!

#pragma interrupt_level 1

使用特权

评论回复
6
shiyan1532|  楼主 | 2012-7-29 14:45 | 只看该作者
我是新手 哈哈 前辈说的是 4# sinonion

使用特权

评论回复
7
dlyt_test001| | 2012-7-30 10:37 | 只看该作者
多谢你的回答,我用的pic单片机,定时器中断与主程序不能共用 函数?不知别的单片机是不是也是这样,这个一般如何处理呢。如你所说,用定时器,每隔100ms进行一次LCD显示,如果显示部分正处在开始键被按下状态,{"V= ...
shiyan1532 发表于 2012-7-29 13:48

显示是一个程序,按键是一个程序,不要在中断里更改显示内容,可以做一个标志后,后在显示程序中统一更改。显示内容不会乱。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

1158

帖子

0

粉丝