打印

四个单独轻触开关,如何实现以下功能?请高手支招......

[复制链接]
3377|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xzhenggen|  楼主 | 2007-6-28 14:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
sbit upon=P1^6;//S1
sbit download=P1^7;//S3
sbit nAck=P3^6;//S2
sbit Setup=P3^7;//S4
我这个项目的功能要求是,使用上面四个轻触开关实现一个旋转编码器功能.
因为我有一个串行12位的DAC器件(IC),通过CPU控制使DAC输出0--4.095V的电压.
而我的DAC输出经过一个比例放大电路实现一个恒流源输出.输出电流为0---10A.
所以我必须使用比例系数0.002442乘以(0---4096)获得0---10A的电流显示在12232LCD上。
但是,如果我使用四个按键调节时,是如使自如地实现我所需要的电流值,当然,送给串行12位的DAC器件(IC)数据变量只能是(0---4095);同时送给LCD乘以以比例系数0.002442显示出来。
我现在还不知如何组合这四个按键很快地实现0A-9.999A以及9.999A-0A,单步调是1mA或10mA都可以,如果采用长按功能实现加,减,但按某键时间太长不合理。如果采用短按,则如何组合?

相关帖子

来自 2楼
maychang| | 2007-6-28 14:35 | 只看该作者

你就说四个键如何组合起来输入数据就是了。
一个加一键,一个减一键,第三个键是回车,第四个键与加一减一键组合后作加速键,加一减一速度增加到10倍。你看如何?

使用特权

评论回复
板凳
xzhenggen|  楼主 | 2007-6-28 16:35 | 只看该作者

如何做加速键啊?

第四个键与加一减一键组合后作加速键,加一减一速度增加到10倍。这个子程序如何做?

使用特权

评论回复
地板
ayb_ice| | 2007-6-28 16:50 | 只看该作者

随便说说

我见过这样做的:
长按+超过一秒开始自动加1,连续加10次后自动加10,连续加10次后自动加100...
这样要加很多也很快...
这是在一个进口设备上见到的.

使用特权

评论回复
5
xzhenggen|  楼主 | 2007-6-28 17:11 | 只看该作者

呵呵,上面思路好

使用特权

评论回复
6
xzhenggen|  楼主 | 2007-6-28 17:12 | 只看该作者

但是,这样实现功能合理吗?

使用特权

评论回复
7
lsqdesign| | 2007-6-28 20:14 | 只看该作者

谁愿意用这么复杂的操作方法

谁愿意用这么复杂的操作方法?

使用特权

评论回复
8
gyt| | 2007-6-28 20:30 | 只看该作者

最简单

就用最简单的方法:移位、增量,操作起来也是够快的:)

使用特权

评论回复
9
faiwong| | 2007-6-28 23:32 | 只看该作者

对,楼上的最简单.

使用特权

评论回复
10
xzhenggen|  楼主 | 2007-6-29 08:24 | 只看该作者

问题是我需输入的数值必须乘以比例系数0.002442

比如我需要送给DAC的数值控制比例放大电路控制恒流源输出为2.5A的电流,同时送给LCD显示的电流也必须是2.5A,经运算2.5A/0.002442=1023.75。因此我必须送数为1023或者1024.我想用此四个按键做四个功能:一个加键,一个减键,一个设置键,一个左移键.而如果我此时可能输入显示出来的是2.7A,应该怎样做修改使它变为2.5A.否则,不作修改送数给DAC就可能使恒流电路损坏激光二极管.
也许我现在输入是2.458A的电流,这样操作起左移键和加,减键来是不是好麻烦!
同时在输入显示正确的情况下,我还比必寻找一个按键(确认键)送数给DAC?
只有在正确显示电流数值的情况下,才允许送数值给DAC.否则,不能送数.
我的显示电流子程序如下:(参照电脑圈圈提供的例程)

void chain(unsigned long Atemp)
{
   unsigned char i;
       serial_buff_I[4]=10;  //小数点
       for(i=1;i<8;i++)
       {
        if(i==4)continue; //跳过小数点的位置
        if(Atemp!=0)
        {
            serial_buff_I[8-i]=Atemp%10;
            Atemp/=10;
        }
        else 
        {
            serial_buff_I[8-i]=0;
        }
       } 
       if(serial_buff_I[1]==0)
       {        
        serial_buff_I[1]=12;    //空格
        if(serial_buff_I[2]==0);
        {
            serial_buff_I[2]=12;    //空格
        }
   }
}

void display_I() //反馈电流显示函数
{
    
    //unsigned int It;
    float Iow;
    unsigned char i;
    //It=read7896();
    //delay(60);
     //Iow=c*AD_Loop_PickVol_IPER;//AD采集数值
    Iow=100*AD_Loop_PickVol_IPER;//AD采集数值//模拟电流
    if(Iow>=1)
         {
             chain(Iow*1e3);
             draw_bmp(104,1,8,num[12]);//显示" "
             draw_bmp(112,1,8,ELAPHT[2]);//显示"A" 
        }
        else if(Iow>=1e-3)
        {
            chain(Iow*1e6);
            //将前面的3位结果放到后面
            serial_buff_I[7]=serial_buff_I[3];
            serial_buff_I[6]=serial_buff_I[2];
            serial_buff_I[5]=serial_buff_I[1];
            //前面4位改为空格
            for(i=1;i<5;i++)serial_buff_I=12;
            draw_bmp(104,1,8,ELAPHT[11]);//显示"m"
            draw_bmp(112,1,8,ELAPHT[2]);//显示"A" 
        }
         else
         {
           chain(0);
         for(i=1;i<7;i++)serial_buff_I=12;
         draw_bmp(104,1,8,ELAPHT[11]);//显示"m"
         draw_bmp(112,1,8,ELAPHT[2]);//显示"A"      
             
         }
        //显示读数
      for(i = 1; i <8; i++)
       {
         draw_bmp(32+i*8,1,8,num[serial_buff_I]]);
      }
        draw_bmp(0,1,8,ELAPHT[1]);//显示"I"
        draw_bmp(8,1,8,num[15]);//显示":"
}

使用特权

评论回复
11
xzhenggen|  楼主 | 2007-6-29 08:29 | 只看该作者

修改一下上面的显示子程序:C是全局变量.

AD_Loop_PickVol_IPER是比例系数.

void display_I() //反馈电流显示函数
{
    
    
    float Iow;
    unsigned char i;

    Iow=C*AD_Loop_PickVol_IPER;//AD采集数值//模拟电流
    
    if(Iow>=1)
         {
             chain(Iow*1e3);
             draw_bmp(104,1,8,num[12]);//显示" "
             draw_bmp(112,1,8,ELAPHT[2]);//显示"A" 
        }
        else if(Iow>=1e-3)
        {
            chain(Iow*1e6);
            //将前面的3位结果放到后面
            serial_buff_I[7]=serial_buff_I[3];
            serial_buff_I[6]=serial_buff_I[2];
            serial_buff_I[5]=serial_buff_I[1];
            //前面4位改为空格
            for(i=1;i<5;i++)serial_buff_I=12;
            draw_bmp(104,1,8,ELAPHT[11]);//显示"m"
            draw_bmp(112,1,8,ELAPHT[2]);//显示"A" 
        }
         else
         {
           chain(0);
         for(i=1;i<7;i++)serial_buff_I=12;
         draw_bmp(104,1,8,ELAPHT[11]);//显示"m"
         draw_bmp(112,1,8,ELAPHT[2]);//显示"A"      
             
         }
        //显示读数
      for(i = 1; i <8; i++)
       {
         draw_bmp(32+i*8,1,8,num[serial_buff_I]]);
      }
        draw_bmp(0,1,8,ELAPHT[1]);//显示"I"
        draw_bmp(8,1,8,num[15]);//显示":"
}

使用特权

评论回复
12
gyt| | 2007-6-29 10:39 | 只看该作者

一般都只用加键,不用减键,你试一下就会知道,置数很快的。

而且,这样也就解决了你键不够的问题。

使用特权

评论回复
13
xzhenggen|  楼主 | 2007-6-29 11:09 | 只看该作者

也许我的项目要求有些特殊要求:

比如我现在调节显示的电流是2.35A,为了检测功率,有可能我需马上调节电流为2.7A或者有可能只要1.8A,所以有必要使用加,减键来组合一下.
而我的LCD12232没有光标显示功能,如果用左移键如何定位显示?也就是这个显示子函数如何做才能准确,快速地定位设置我所需要的数值?
当然最重要的一个原因是我的数值分两路送出去;一路送DAC,另一路送LCD(送LCD时,必须乘以比例系数0.002442).所以调节改变的数值显示看起来好像很麻烦.
只有显示正确达到要求才可以把数值送DAC(送DAC的数值是不能乘以比例系数的)

使用特权

评论回复
14
孤独泪| | 2007-6-29 11:19 | 只看该作者

这么麻烦阿

加减,确认,左移键实现,当前设置的数字闪烁,确认键后数字送DAC

使用特权

评论回复
15
lsqdesign| | 2007-6-29 11:34 | 只看该作者

轮编码器更方便

不如用滚轮编码器。

使用特权

评论回复
16
xzhenggen|  楼主 | 2007-6-29 12:08 | 只看该作者

我也想用滚轮编码器,没买到.也是非常贵.但是还要保留按键

孤独泪:加减,确认,左移键实现 是不错!!

设置的数字闪烁的子程序如何做啊?比例我现在的读数显示:2.350A,现在需修改为1.095A.闪烁的子程序是四位数字一起闪烁,还是左移到某一位时,设置这一位数字闪烁,其它的静止不动显示?我现在想做这方面的功能,但不知子程序如何写.

使用特权

评论回复
17
xzhenggen|  楼主 | 2007-6-29 12:30 | 只看该作者

来回切换显示子程序,是如何做啊?!能否提供例程?

使用特权

评论回复
18
faiwong| | 2007-6-29 12:54 | 只看该作者

字符闪烁程序比较难处理

LCD12232虽然没有光标显示功能,但是选中字符可以反白显示.在显示屏直接
设定电流值,将该值转换为DAC数值送DAC器件.

使用特权

评论回复
19
xzhenggen|  楼主 | 2007-6-29 15:46 | 只看该作者

如何反白,如何设定电流值??请给一个例程啊!!多谢了

使用特权

评论回复
20
xzhenggen|  楼主 | 2007-6-29 16:21 | 只看该作者

我的12232LCD既没有反白功能,也没有光标功能。

使用特权

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

本版积分规则

55

主题

529

帖子

1

粉丝