发新帖我要提问
12
返回列表
打印

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

[复制链接]
楼主: xzhenggen
手机看帖
扫描二维码
随时随地手机跟帖
21
Tim_yao| | 2007-6-29 17:14 | 只看该作者 回帖奖励 |倒序浏览

学习中

哈,编程快一年了
还没遇到过这么复杂的问题,是不是你们吧问题给复杂化了啊 

使用特权

评论回复
22
gyt| | 2007-6-29 19:21 | 只看该作者

闪烁

这里说的闪烁是指移到的那一位闪烁,其他位都静止。
所谓闪烁,就是这一位交替显示为数字和空白。

使用特权

评论回复
23
jimoom| | 2007-6-30 08:10 | 只看该作者

楼上说的对。

只要显示数字和 空白(即不显示数字)之间切换就可以了。
程序实现也容易。

但直观性来说,还是加 减 直观多了。

使用特权

评论回复
24
dzn| | 2007-7-1 22:06 | 只看该作者

我有个想法

LZ可以把常用的几个电流值设定成快捷键的形式,利用按压增加 减少键进行设定值的快速选择,当显示屏显示某个设定值时连续两次按压确认键即可把电流值输出。

使用特权

评论回复
25
xzhenggen|  楼主 | 2007-7-2 11:21 | 只看该作者

我只有5个按键可用,如何分配分时复用?

实现以下功能,请高手出来说一下.
LCD12232分上下,两页显示:操作按键要能分别显示出以下功能.
display_Pi(); //显示输入功率
display_Po();//显示输出功率
作一屏显示.
display_amp();//显示ADC读取的电流.
display_Temp();//显示温度.
作另一屏显示
display_I(); //反馈电流显示函数
display_amp();//显示ADC读取的电流.
另显一屏.
我总觉得少了一个按键功能,没有办法实现以下功能要求:
1,如果使用四个按键,实现滚轮编码器功能(左移键,加键,减键,确认键)调节DAC功能控制恒流源,但是另一个按键又如何实现上面的三屏显示?
2,我的四键功能(左移键,加键,减键,确认键)现在思路还没理清楚,有谁能出来帮我一下?













































使用特权

评论回复
26
xzhenggen|  楼主 | 2007-7-2 11:24 | 只看该作者

display_I(); //反馈电流显示函数

上面的反馈电流显示函数,就是方便调节四键功能(左移键,加键,减键,确认键)显示我需输入多少电流的子程序.

使用特权

评论回复
27
xzhenggen|  楼主 | 2007-7-3 08:27 | 只看该作者

为什么我的按键值会乱跳,就是单步执行(按键)也一样。

uchar data shuzu[4];
uchar status;
uchar temp,f;

void key_s1(void)
{
    P2=0xff;
    if(P2==0xfe)
    {
        if(temp>50)temp=0;
        if(temp==0)f++;
        if(f>9)f=0;
        temp++;
        delay_1ms();
    }
}
void key_s2(void)
{
    P2=0xff;
    if(P2==0xfd)
    {
        if(temp>50)temp=0;
        if(temp==0)f--;
        if(f<0)f=0;
        temp++;
        delay_1ms();
    }
}
void key_s3(void)
{
    P2=0xff;
    if(P2==0xfb)
    {
        switch(status)
        {
            case 0: shuzu[0]=f;break;
            case 1: shuzu[1]=f;break;
            case 2: shuzu[2]=f;break;
            case 3: shuzu[3]=f;break;
            default: break;
        }
    }
}
void key_s4(void)
{
    P2=0xff;
    if(P2==0xf7)
    {
        if(temp>50)temp=0;
        if(temp==0)status++;
        if(status>4)status=0;
        temp++;
        delay_1ms();
    }
}

使用特权

评论回复
28
lws| | 2007-7-3 09:01 | 只看该作者

注意按键消抖

1,如果使用四个按键,实现滚轮编码器功能(左移键,加键,减键,确认键)调节DAC功能控制恒流源,但是另一个按键又如何实现上面的三屏显示?
     按键检测,循环显示单屏
2,我的四键功能(左移键,加键,减键,确认键)现在思路还没理清楚,有谁能出来帮我一下?
     左移键,加键,减键,确认键,这些不就是思路吗。至于按键后的处理操作,正是你需要实现的功能。静下心来,把流程图画一下就一目了然了。
反白:就是把字模数据取反显示,液晶没有这个功能可以自己实现。

使用特权

评论回复
29
原野之狼| | 2007-7-3 09:17 | 只看该作者

楼主不要激动

/*********************************************************************
    Description:显示区域反转
    
    Input:
        x0:左上角x坐标
        x1:右下角x坐标
        y0:左上角y坐标
        y1:右下角y坐标
    Output:

    Return:

    Gloable:    
        Number_X_Pixel:字符的X方向上的像素
        Number_Y_Pixel:字符在Y方向上的像素
        DisBuffer[]:图形缓冲
    Calls:
        

    Called By:
        
    Others:

    Modify Record:
    
*********************************************************************/
void GUI_InvertRect(UINT8 x0,UINT8 x1,UINT8 y0,UINT8 y1)
{
    UINT8 i,j,Location_Bit;
    UINT16 Location_Byte;

    for(i=x0;i<=x1;i++)
        for(j=y0;j<=y1;j++)
        {
            Location_Byte=(j/8)*122+i;
            Location_Bit=j%8;
            if((DisBuffer[Location_Byte]>>Location_Bit)&0x01)
                DisBuffer[Location_Byte]&=(~(0x01<<Location_Bit));
            else
                DisBuffer[Location_Byte]|=(0x01<<Location_Bit);
        }
}

使用特权

评论回复
30
xzhenggen|  楼主 | 2007-7-3 11:14 | 只看该作者

我现在的显示函数可以正常换屏显示了,

但是调节按键不能随意更改某个位置数值。
void chain()
{
  
       
       //serial_buff_I[1]=10;  //小数点
       serial_buff_I[1]=z[1];
       serial_buff_I[2]=z[2];
       serial_buff_I[3]=z[3];
       serial_buff_I[4]=z[4];
}

void display_I() //反馈电流显示函数
{
    unsigned char i,row=0;
        //显示读数
      chain();
      for(i = 1; i <5; i++)
       {
            draw_bmp(56+row*8,1,8,num[serial_buff_I]]);
            row++;
            if(i==1)//设置小数点
            {
                draw_bmp(56+row*8,1,8,num[10]);
                row++;
           }
      }
       draw_bmp(104,1,8,num[12]);//显示" "
       draw_bmp(112,1,8,ELAPHT[2]);//显示"A"      
        draw_bmp(0,1,8,ELAPHT[1]);//显示"I"
        draw_bmp(8,1,8,num[15]);//显示":"
}

使用特权

评论回复
31
xzhenggen|  楼主 | 2007-7-3 11:15 | 只看该作者

按键程序如下:

void key_s1(void)
{
    
    if(!upon)//P1.6
    {
        if(temp>5)temp=0;
        if(temp==0)f++;
        if(f>9)f=9;
        temp++;
        delay_1ms();
    }
}

void key_s2(void)
{
    
    if(!download)//P1.7
    {
        
        if(temp>5)temp=0;
        if(temp==0)f--;
        if(f<0)f=0;
        temp++;
        delay_1ms();
    }
}
void key_s3(void)
{
    
    if(!Ack)//P3.7
    {
        switch(At)
        {
            case 0: z[1]=f;break;
            case 1: z[2]=f;break;
            case 2: z[3]=f;break;
            case 3: z[4]=f;break;
            //case 5: shuzu[4]=f;break;
            default: break;
        }
        
    }
}
void key_s5 (void)
{
    
    if(!nAck)//P3.6
    {
        if(temp>5)temp=0;
        if(temp==0)At++;
        if(At>4)At=0;
        temp++;
        delay_1ms();
    }
}

void zd_int0() interrupt 0
{
    
    delay(1);
    if(!Setup)status++;
    if(status>=3)status=0;
    //if(Setup==1)Iflag=0x55;
    //PCON=0x00;
    again:if(Setup==0) goto again;
    
}

使用特权

评论回复
32
xzhenggen|  楼主 | 2007-7-3 12:01 | 只看该作者

一定是我上面的子程序没有加反白显示函数

所以修改某一位数值时,能修改,但是不知修改在哪位,只能按P3.7按键显示出来.所以须加一个反白显示函数,请教如何加这个函数?
还有一问:我现在假如输入的是2.5A,实际上是2500.然而我送给DAC的数值是送2500,还是送2500*0.4096.即是2500*4096/10000?
如果直接送2500给DAC,这样很方便但是这样做正确吗?
是否我直接送2500给DAC时,只要调节DAC输出控制的比例放大电路控制恒流源?
这样会不会改变了线性放大,到时读数误差很大,不准确了.

使用特权

评论回复
33
xzhenggen|  楼主 | 2007-7-3 16:50 | 只看该作者

如何实现对某一位数值单独调整输入显示?

使用特权

评论回复
34
原野之狼| | 2007-7-3 21:38 | 只看该作者

我给你发的就是反显函数,你都没看,真是郁闷。。。

使用特权

评论回复
35
xzhenggen|  楼主 | 2007-7-4 09:44 | 只看该作者

不好意思,我看了,但是不会用,所以我还是想找一个例程

使用特权

评论回复
36
laowu219| | 2007-8-22 18:52 | 只看该作者

我有四个键,如何实现分时复用???

  

使用特权

评论回复
37
ayb_ice| | 2007-8-23 07:39 | 只看该作者

有4个按键实现这样的功能不是小菜一碟...

使用特权

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

本版积分规则