打印
[匠人手记]

结贴!!问题解决一半

[复制链接]
3486|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
avocationA|  楼主 | 2009-3-10 15:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>



code unsigned char P09[2][4]=     
{
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 
  {0x01,0x02,0x03,0x04},//显示位数 
  {2,2,2,2}//最小
};


void DispInit()
{
    P2 = 0xFF;
    P0 = 0xFF;
    P1 = 0XFF;
}

void Menu_P(unsigned char(*P0X)[110])
{

  unsigned char i,j;
  P0 = 0xEF;
  P1=*(*(P0X+i)+j);//显示位数
  i++;
  P2=*(*(P0X+i)+j);//小数点
  i++;
  j++;

}

void main()
{
for(;;)
{
DispInit();
Menu_P(P09);
}

}

相关帖子

沙发
程序匠人| | 2009-3-11 11:02 | 只看该作者

还没来的及细看,楼主就把内容删除了

急性子啊

使用特权

评论回复
板凳
avocationA|  楼主 | 2009-3-13 22:51 | 只看该作者

不是的!是自己跳出问题来了!郁闷

按SHI功能 键的时候 5LED 其中1位 会丢失  但是循环一次有OK
然后偶尔有正确!!! 所以想改好在传上来 但是到现在还是没有OK

使用特权

评论回复
地板
avocationA|  楼主 | 2009-3-13 22:59 | 只看该作者

我写的是

5LED + 键盘 的程序
 特点是通过给下面的哪个结构体 附值 达到控制 5LED的个功能.

值为0代表功能无效!明天改下 改好后我在传上来  
改不好也传上来 
 

LED    LedDat=           //结构体定义及初始化
{
//位数|闪烁位|小数点|正负号|单位|缓存|闪烁计数器
    4,    6,     3,     0,    1,   0,   0
};








void Show_LedMumeral()
{   
 //备注下句临时变量可以优化/但会报警  类型   转换????
//可能MCU是16位的原因
 unsigned char Show_LedMumeral_temp1=LedDat.FlashBit;//临时变量

 if(LedDat.FlashBit)
 {
     if(LedDat.FlashTime>210)  //延时到
    {
      Show_Led_5(LedDat.ShowBit,LedDat.ShowBuff);//显示数据
      Show_LedRadix(LedDat.Radix);       //显示小数点
      Show_LedSign_P(LedDat.Sign_P);      //显示负号和P
       OnOFF_Led_Bit(LedDat.FlashBit);       //关闭显示位
       LedDat.FlashTime--;
    }                    
    else
    {
       Show_Led_5(LedDat.ShowBit,LedDat.ShowBuff);//显示数据
       Show_LedRadix(LedDat.Radix);       //显示小数点
       Show_LedSign_P(LedDat.Sign_P);      //显示负号和P
       OnOFF_Led_Bit(Show_LedMumeral_temp1+=6);      //显示位
       LedDat.FlashTime--;
     }
  }
  else
  {
       Show_Led_5(LedDat.ShowBit,LedDat.ShowBuff);//显示数据
      Show_LedRadix(LedDat.Radix);       //显示小数点
      Show_LedSign_P(LedDat.Sign_P);      //显示负号和P
  }
  Show_LedUnit(LedDat.Unit);            //显示单位
 }


使用特权

评论回复
5
avocationA|  楼主 | 2009-3-13 23:02 | 只看该作者

中断里调用

void TI2_OnInterrupt(void)
{
  /* Write your code here ... */
 KeyBoard();//键盘扫描
 Show_LedMumeral();//5LED
}

使用特权

评论回复
6
avocationA|  楼主 | 2009-3-13 23:21 | 只看该作者

【键盘部分】没有问题!


/*********************************************************************************
                           【键盘部分】
*********************************************************************************/
/*may*/
#include "Zled.h"
#include "Zkey.h"

#define  TK                8            //主程序执行时间8ms  //8
#define  timer20ms      (30/TK)        //延时时间20ms       //(30/TK)
#define  timer3S          (1000/TK)    //延时时间3S         //(1200/TK)
#define  timer100ms      (800/TK)    //延时时间100ms      //(1000/TK)
KEY        KeyDat;           //定义数据结构


/***************************
【函数】:HC166_read(void)
【功能】:HC166驱动与硬件相关
【参数】:无
***************************/
unsigned char HC166_read(void)//HC166_read
{
  unsigned char i,set;
  
  Bits1_PutBit(2, FALSE);//L cp底电平
  Bits1_PutBit(1, FALSE);//L PCLK时钟低电平
  Bits1_PutBit(1, TRUE); //H PCLK//时钟高电平,上升沿有效
  Bits1_PutBit(2, TRUE); //H cp高电平

  for(i = 0, set = 0; i < 8;i ++)//依次读取锁存的8位数据
  {
    set <<= 1;
      if (!Bits3_GetBit(0))
    set ++;
    Bits1_PutBit(1, FALSE);//L PCLK时钟低电平
    Bits1_PutBit(1, TRUE);//H PCLK//时钟高电平,上升沿有效
  }
  switch(set) //读取扫描值 
  {
    case 0x00:      return 0x00;  break; //
    case K_Run:     return 0x01;  break; //GetRun
    case K_Stop:    return 0x02;  break; //GetStop
    case K_Down:    return 0x03;  break; //GetDown
    case K_Jog:     return 0x04;  break; //GetJog
    case K_Shif:    return 0x05;  break; //GetShif
    case K_Up:      return 0x06;  break; //GetUp
    case K_Enter:   return 0x07;  break; //GetEnter
    case K_Mode:    return 0x08;  break; //GetMode
    case K_Enter+K_Up:      return 0x09;  break; //组合键K_Enter+K_Up
    case K_Enter+K_Down:    return 0x10;  break; //组合键K_Enter+K_Down
    default:        return 0x00;  break; //点亮LED2
  }
}


/***************************
【函数】:GetKey(void)
【功能】:判断是否有按键
【参数】:无
***************************/
void GetKey(void)
{

  KeyDat.KeyTemp=HC166_read();
  if(KeyDat.KeyTemp!=0)       //有按键
  {
    KeyDat.KeyDog=timer20ms;
    KeyDat.KeyPower++;    
  }
}

/***************************
【函数】:KeyDog(void)
【功能】:按键延时
【参数】:无
***************************/
void Key_Dog(void)
{
  if(0==--KeyDat.KeyDog)        //按键松开
  {
    KeyDat.KeyData=HC166_read();//读键盘
    if(KeyDat.KeyData!=0)
    {
      KeyDat.KeyPower++;       //进入KeyOffShort(void)
      KeyDat.KeyDog=timer3S;   //计数器装载3S
    }
    else
    {
      KeyDat.KeyPower=0;
      KeyDat.KeyData=0;         //返回
    }    
  }
}

/***************************
【函数】:KeyOffShort(void)
【功能】:判断按键是否松开
【参数】:无
***************************/
void KeyOffShort(void)
{
  if(HC166_read()==0)       //判断按键松开
  {
    KeyDat.KeyPower=0;
    KeyDat.KeyData|=HaveKey;//定义短击标记
  }
  else
  {
      if(0==--KeyDat.KeyDog)  //3秒延时到否
      {
      KeyDat.KeyDog=timer100ms;//计数器装载100ms
      KeyDat.KeyPower++;       //进入KeyOffLong(void)
      }
  }
}


/***************************
【函数】:KeyOffLong(void)
【功能】:判断按键长击
【参数】:无
***************************/
void KeyOffLong(void)
{
  if(HC166_read()!=0)//判断长击按键弹起
  {
    if(0==--KeyDat.KeyDog)//3秒延时到
      {
        if(KeyDat.KeyTemp==HC166_read())//校验数据(判断组合键用)
        {
            KeyDat.KeyData|=DubClick;//DubClick|HaveKey;//长击标记
          KeyDat.KeyDog=timer100ms;
        }
        else     
      {
        KeyDat.KeyData=0;  //数据归0
        KeyDat.KeyPower=0; //长击按键弹起后返回
      }
      }
  }
  else     //长击按键弹起
  {
    KeyDat.KeyData=0;  //数据归0
    KeyDat.KeyPower=0; //长按键弹起后返回
  }

}
/***************************
【函数】:void(*SubKey[])()
【功能】:函数指针定义
【参数】:无
***************************/
void(*SubKey[4])()=
{
  GetKey,Key_Dog,KeyOffShort,KeyOffLong    
};

/***************************
【函数】:void KeyBoard(void)
【功能】:主循环或者定时中断调用
【参数】:无
***************************/
void KeyBoard(void)//扫描键盘
{
  (*SubKey[KeyDat.KeyPower])();    
}

/***************************
【函数】:unsigned char JB_KeyData(void)()
【功能】:用户功能函数调用
【参数】:无
***************************/
unsigned char JB_KeyData(void)
{
  unsigned char i=0;
  if(KeyDat.KeyData>DubClick)//DubClick=0x40
  {
    i=KeyDat.KeyData;
    KeyDat.KeyData=0;    
  } 
  return i;
}





使用特权

评论回复
7
avocationA|  楼主 | 2009-3-13 23:22 | 只看该作者

头H


#ifndef __Zkey_H
#define __Zkey_H



#define  HaveKey        0x80        //有键
#define  DubClick        0x40        //连击



#define  K_Run            0x01        //键值定义
#define  K_Stop            0x02
#define  K_Down            0x04
#define  K_Jog            0x08
#define  K_Shif            0x10
#define  K_Up            0x20
#define  K_Enter        0x40
#define  K_Mode            0x80

#define  Run_Key            (0x01+HaveKey)//短击定义
#define  Stop_Key            (0x02+HaveKey)
#define  Down_Key            (0x03+HaveKey)
#define  Jog_Key            (0x04+HaveKey)
#define  Shif_Key            (0x05+HaveKey)
#define  Up_Key                (0x06+HaveKey)
#define  Enter_Key            (0x07+HaveKey)
#define  Mode_Key            (0x08+HaveKey)


#define  Run_Key_Dub        (0x01+DubClick)//长击和组合定义
#define  Stop_Key_Dub        (0x02+DubClick)
#define  Down_Key_Dub        (0x03+DubClick)
#define  Jog_Key_Dub        (0x04+DubClick)
#define  Shif_Key_Dub        (0x05+DubClick)
#define  Up_Key_Dub            (0x06+DubClick)
#define  Enter_Key_Dub        (0x07+DubClick)
#define  Mode_Key_Dub        (0x08+DubClick)

#define  EnterUp_Key        (0x09+DubClick)
#define  EnterDown_Key        (0x10+DubClick)

//#define  RRKey_Dub            (DubClick|HaveKey)

unsigned char HC166_read(void);//HC166_read
unsigned char JB_KeyData(void);//读取键盘
void (*SubKey[])();             //键盘扫描指针
void KeyOffLong(void);         //短击按键处理
void KeyOffShort(void);        //长击和组合键盘处理
void Key_Dog(void);            //按键延时
void GetKey(void);             //获取键盘值
extern  void KeyBoard(void);           //扫描键盘

typedef struct                 //键盘扫描结构体
{
    unsigned char KeyPower;
    unsigned char KeyDog;
    unsigned char KeyData;
    unsigned char KeyTemp;
}KEY;


//extern  LED    LedDat;





#endif

使用特权

评论回复
8
avocationA|  楼主 | 2009-3-13 23:28 | 只看该作者

测试....

        switch(JB_KeyData()) //读取扫描值 
        {
          case Run_Key:   ledshow_buf=1;  break; //LED显示1
          case Stop_Key:  ledshow_buf=2;  break; //LED显示2
          case Down_Key:  ledshow_buf=3;  break; //LED显示3 
          case Jog_Key:   ledshow_buf=4;  break; //LED显示4
          case Shif_Key:  ledshow_buf=5;  break; //LED显示5
          case Up_Key:    ledshow_buf=6;  break; //LED显示6
          case Enter_Key: ledshow_buf=7;  break; //LED显示7
          case Mode_Key:  ledshow_buf=8;  break; //LED显示8 
          
          case Down_Key_Dub:  ledshow_buf=65535;  break; //长按键
          case Up_Key_Dub:    ledshow_buf=12345;  break; //长按键
           
          case EnterUp_Key: ledshow_buf=99;  break; //组合按键
          case EnterDown_Key:  ledshow_buf=100;  break; //组合按键

          
         // case 0X00: ledshow_buf=1000;
          default :    break; //
        }

使用特权

评论回复
9
avocationA|  楼主 | 2009-3-13 23:32 | 只看该作者

匠人能把我贴的代码变成彩色的吗?

用空帮我看看!看你博客里  贴的KEY感觉 全局变量多!
上次有个 卖芯片的跟我说 全局变量越少越好,

看了你的手记 也想冲动下,拿着你的书 在办公室里  可是宣传了一翻!  过年的时候 想带回家的 可是被人借去了上个星期才要回来.呵呵!

使用特权

评论回复
10
avocationA|  楼主 | 2009-3-14 11:00 | 只看该作者

/***************************
【函数】:HC166_read(void)
【功能】:HC166驱动与硬件相关
【参数】:无
***************************/
unsigned char HC166_read(void)//HC166_read
{
  unsigned char i,set,k;
  HC166_SL_Lo();        //cp底电平
  HC595_HC166_CLK_Lo(); //CLK底电平
  HC595_HC166_CLK_Hi(); //CLK高电平
  HC166_SL_Hi();        //cp高电平
  
  for(i = 0, set = 0; i < 8;i ++)//依次读取锁存的8位数据
  {
    set <<= 1;
    if ( GPIOPinRead(GPIO_PORTA_BASE , GPIO_PIN_4)  ==  0x00 )      //  如果PA4为低电平
    {
      set ++;
    }
    HC595_HC166_CLK_Lo(); //CLK底电平
    HC595_HC166_CLK_Hi(); //CLK高电平//第8个脉冲将SER发送出来
  }
  switch(set) //读取扫描值 
  {
    case 0x00:      k=0x00;  break; //
    case K_Run:     k=0x01;  break; //GetRun
    case K_Stop:    k=0x02;  break; //GetStop
    case K_Down:    k=0x03;  break; //GetDown
    case K_Jog:     k=0x04;  break; //GetJog
    case K_Shif:    k=0x05;  break; //GetShif
    case K_Up:      k=0x06;  break; //GetUp
    case K_Enter:   k=0x07;  break; //GetEnter
    case K_Mode:    k=0x08;  break; //GetMode
    case K_Enter+K_Up:      k=0x09;  break; //组合键K_Enter+K_Up
    case K_Enter+K_Down:    k=0x10;  break; //组合键K_Enter+K_Down
    default:        k=0x00;  break; //点亮LED2
  }
  return k;
}

使用特权

评论回复
11
avocationA|  楼主 | 2009-3-14 13:19 | 只看该作者

郁闷 问题是随机

/******************************************************************************

                              【显示部分程序】

******************************************************************************/



LED    LedDat=           //结构体定义及初始化
{
//位数|闪烁位|小数点|正负号|单位|缓存|闪烁计数器
    4,    1,     3,     1,    1,   123,   0
};                  //定义数据结构



/***************************
【函数】:DataOut(void)
【功能】:io设定
【参数】:无
***************************/
void DataOut(unsigned char nValue)
{
 int i;
 for(i = 0;i < 8;i++)
 {
    if ((nValue & 0x80) == 0x80)
    {
      HC595_DATA_Hi();//输出高电平
    }
    else
    {
      HC595_DATA_Lo();//输出低电平
    } 
  
  HC595_HC166_CLK_Hi();//时钟高电平,上升沿有效
  HC595_HC166_CLK_Lo();//时钟低电平
  nValue <<= 1;  
 }
 return;
}

 /***************************
【函数】:seg[16]
【功能】:显示段码
【参数】:无
***************************/

unsigned char seg[17+10]=
{
  SEG_0,SEG_1,  SEG_2,SEG_3,/* 0 1 2 3*/
  SEG_4,SEG_5, SEG_6,SEG_7, /* 4 5 6 7 */
  SEG_8,SEG_9, SEG_A,SEG_B, /* 8 9 A B */
  SEG_C,SEG_D_,SEG_E,SEG_F, /* C D E F */
  SEG_, SEG____,SEG_P,        /* .  -   P*/
  s_a,  s_b,   s_c,  s_d,
  s_e,  s_f,   s_g,  s_h
};

/***************************
【函数】:DigTab[6]
【功能】:LED位扫描
【参数】:无
***************************/
unsigned char DigTab[7] =  //  定义数码管位选数据
{
  0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00
};




/***************************
【函数】:Show_Led_Bit(void)
【功能】:io设定
【参数】:DigValue//显示位数, SegValue//显示值
***************************/
void  Show_Led_Bit(unsigned char DigValue,unsigned char SegValue)
{
  HC595_RCK_Lo();//清除锁存信号
  DataOut(DigTab[DigValue]);
  DataOut(~seg[SegValue]);
  HC595_RCK_Hi();//给锁存信号,共送了16位数据  高8位是 扫描数据 低8位是段码   
}

/***************************
【函数】:unsigned int Dec_Bcd()//
【功能】:十进制转BCD
【参数】:*p_DecValue十进制地址  *p_BcdValue BCD地址
***************************/
void Dec_Bcd(unsigned int *p_DecValue,unsigned char *p_BcdValue)
{
  *p_BcdValue = *p_DecValue / 10000;
  p_BcdValue++;
  *p_BcdValue = *p_DecValue % 10000 / 1000;
  p_BcdValue++;
  *p_BcdValue = *p_DecValue % 1000 / 100;
  p_BcdValue++;       
  *p_BcdValue = *p_DecValue % 100 / 10;
  p_BcdValue++;
  *p_BcdValue = *p_DecValue % 10;    
}

/***************************
【函数】:Show_Led_5(void)//5位数码管
【功能】:显示LED_BUFF的数据
【参数】:根据SegValue 显示位数,显示数据
***************************/
void  Show_Led_5(unsigned char Led_Bit,unsigned int Led_Value)

  unsigned char DispBuf[5];
  //unsigned char i,j,k=0;
  
   HC595_G_Lo();//L PCLK时钟低电平开595显示
  
  Dec_Bcd(&Led_Value,DispBuf);//转换成BCD码
  
  /*
  for(i=0,j=0,k=0;i<5;i++)//检测数码管位数
  {
      if(DispBuf>0x00)
      {
        j++;    
      }
      if(j>0)//如果高位大于0则后面0有效
      {
        k++;    
      }
          
  }
  */
  
  
  switch(Led_Bit) 
  {
    case 0: Show_Led_Bit(6,DispBuf[0]);break; //close show
    
    case 1: Show_Led_Bit(4,DispBuf[4]);break; //show1个LED
            
    case 2: Show_Led_Bit(3,DispBuf[3]);
            Show_Led_Bit(4,DispBuf[4]);break; //show2个LED
            
    case 3: Show_Led_Bit(2,DispBuf[2]);
            Show_Led_Bit(3,DispBuf[3]);
            Show_Led_Bit(4,DispBuf[4]);break; //show3个LED
            
    case 4: Show_Led_Bit(1,DispBuf[1]);
            Show_Led_Bit(2,DispBuf[2]);
            Show_Led_Bit(3,DispBuf[3]);
            Show_Led_Bit(4,DispBuf[4]);break; //show4个LED
            
    case 5: Show_Led_Bit(0,DispBuf[0]);
            Show_Led_Bit(1,DispBuf[1]);
            Show_Led_Bit(2,DispBuf[2]);
            Show_Led_Bit(3,DispBuf[3]);
            Show_Led_Bit(4,DispBuf[4]);break; //show5个LED
         
    default : break;
  }
  HC595_G_Hi();//H PCLK时钟高电平关595显示 
  
}


/***************************
【函数】:OnOFF_Led_Bit(void)
【功能】:关显示位数
【参数】:根据SegValue 关显示位数
***************************/
void  OnOFF_Led_Bit(unsigned char LedBit_Value)

  switch(LedBit_Value)
  { 
    case 0: break;
    case 1: DigTab[4]=0x00;break; //close数码管1
    case 2: DigTab[3]=0x00;break; //close数码管2    
    case 3: DigTab[2]=0x00;break; //close数码管3    
    case 4: DigTab[1]=0x00;break; //close数码管4  
    case 5: DigTab[0]=0x00;break; //close数码管5
   
    case 6: DigTab[0]=0x00;      
            DigTab[1]=0x00;
            DigTab[2]=0x00;
            DigTab[3]=0x00;
            DigTab[4]=0x00;break;  //close 5数码管
            
    case 7: DigTab[4]=0x10;break; //open数码管1  
    case 8: DigTab[3]=0x08;break; //open数码管2    
    case 9: DigTab[2]=0x04;break; //open数码管3     
    case 10: DigTab[1]=0x02;break; //open数码管4    
    case 11: DigTab[0]=0x01;break; //open数码管5  
    
    case 12: DigTab[4]=0x10;     
             DigTab[3]=0x08;
             DigTab[2]=0x04;
             DigTab[1]=0x02;
             DigTab[0]=0x01;break; //open5数码管
    default : break;
  }
}

/***************************
【函数】:Show_LedRadix(void)//5位数码管
【功能】:显示小数点
【参数】:根据Led_Radix显示小数点
***************************/
void  Show_LedRadix(unsigned char Led_Radix)

 HC595_G_Lo();//L PCLK时钟低电平开595显示
  switch(Led_Radix)
  {
    case 0: break;                    //去功能
    case 1: Show_Led_Bit(4,16);break; //show1小数点   
    case 2: Show_Led_Bit(3,16);break; //show2小数点     
    case 3: Show_Led_Bit(2,16);break; //show3小数点       
    case 4: Show_Led_Bit(1,16);break; //show4小数点 
    case 5: Show_Led_Bit(0,16);break; //show5小数点 
    default : break;
  }
  HC595_G_Hi();//H PCLK时钟高电平关595显示 
}

/***************************
【函数】:Show_LedSign_P(void)
【功能】:显示P/负号
【参数】:根据Led_Sign_P 显示
***************************/
void  Show_LedSign_P(unsigned char Led_Sign_P)

  HC595_G_Lo();//L PCLK时钟低电平开595显示
  switch(Led_Sign_P)     
  {
    case 0: break;                    //去功能
    case 1: Show_Led_Bit(0,17);break; //show  - 
    case 2: Show_Led_Bit(0,18);break; //show  p  
    default : break;
  }
  HC595_G_Hi();//H PCLK时钟高电平关595显示 
}

/***************************
【函数】:Show_LedUnit(void)
【功能】:显示单位
【参数】:根据Led_Unit 显示
***************************/
void  Show_LedUnit(unsigned char Led_Unit)

   HC595_G_Lo();//L PCLK时钟低电平开595显示
  switch(Led_Unit)       
  {
    case 0: break;                    //去功能
    case 4: Show_Led_Bit(5,19);break; //V
    case 3: Show_Led_Bit(5,20);break; //A 
    case 2: Show_Led_Bit(5,21);break; //Hz 
    case 5: Show_Led_Bit(5,22);break; //正反
    case 6: Show_Led_Bit(5,23);break; //POWER   
    case 1: Show_Led_Bit(5,24);break; //RUN 
    default : break;
  }
  HC595_G_Hi();//H PCLK时钟高电平关595显示 
}
/***************************
【函数】:void Show_LedMumeral(void)
【功能】:主循环或者定时中断调用
【参数】:flash_led//显示闪烁标志位
【备注】://LedDat.FlashTime为Char型最大为255
          //则0--  =255;
***************************/
void Show_LedMumeral()
{   
 unsigned char Show_LedMumeral_temp1=LedDat.FlashBit;//临时变量
 if(LedDat.FlashBit)
 {
    if(LedDat.FlashTime>210)  //延时到
    {
      Show_Led_5(LedDat.ShowBit,LedDat.ShowBuff);//显示数据
      Show_LedRadix(LedDat.Radix);               //显示小数点
      Show_LedSign_P(LedDat.Sign_P);             //显示负号和P
      OnOFF_Led_Bit(LedDat.FlashBit);            //关闭显示位
      LedDat.FlashTime--;
    }                    
    else
    {
       Show_Led_5(LedDat.ShowBit,LedDat.ShowBuff);//显示数据
       Show_LedRadix(LedDat.Radix);               //显示小数点
       Show_LedSign_P(LedDat.Sign_P);             //显示负号或P
       OnOFF_Led_Bit(Show_LedMumeral_temp1+=6);   //开显示位
       LedDat.FlashTime--;
     }
  }
  else
  {
      Show_Led_5(LedDat.ShowBit,LedDat.ShowBuff);//显示数据
      Show_LedRadix(LedDat.Radix);               //显示小数点
      Show_LedSign_P(LedDat.Sign_P);             //显示负号或P
  }
  
  Show_LedUnit(LedDat.Unit);                     //显示单位
 }




使用特权

评论回复
12
avocationA|  楼主 | 2009-3-14 13:23 | 只看该作者

中断服务函数

/*  TimerB的中断服务函数  */
void  Timer0B_ISR(void)
{
 TimerIntClear(T0_B_INT_TIMEOUT);                    /*  清除TimerB超时中断,重要! */
 KeyBoard();//键盘扫描
 Show_LedMumeral();//LED显示
}

使用特权

评论回复
13
avocationA|  楼主 | 2009-3-14 13:29 | 只看该作者

按SHIF后 前选定位会丢失(即无显)

/***************************
【函数】:Shif(void)
【功能】:右移选定位
【参数】:无
***************************/
void Menushif(void)
{    
  LedDat.FlashBit--;
  if(LedDat.FlashBit<1)      
  {
    LedDat.FlashBit=LedDat.ShowBit;
  }

}



int  main(void)
{
    jtagWait();                                         /*  防止JTAG失效,重要!        */
    IoInit();        //  IO始化           
    timer0Init();                                       /*  定时器初始化                */
    for(;;)
    {
       

      //Show_Led_5(3,4321);
      /**/
         switch(JB_KeyData()) //读取扫描值 
        {

          case Shif_Key:  Menushif(); break; //右移选定位




          case Up_Key:    LedDat.ShowBuff=6;  break; //点亮LED1

          
          case Down_Key_Dub:  LedDat.ShowBuff=65535;  break; //点亮LED1 
          case Up_Key_Dub:    LedDat.ShowBuff=12345;  break; //点亮LED1
           
          case EnterUp_Key: LedDat.ShowBuff=99;  break; //点亮LED1 
          case EnterDown_Key:  LedDat.ShowBuff=100;  break; //点亮LED1
          
          
         // case 0X00: ledshow_buf=1000;
          default :    break; //点亮LED2
        }
         
       
    
    }

使用特权

评论回复
14
avocationA|  楼主 | 2009-3-14 13:32 | 只看该作者

用IAR MCU LM3S1138

使用特权

评论回复
15
avocationA|  楼主 | 2009-3-14 14:22 | 只看该作者

庆祝下问题解决了!

OnOFF_Led_Bit(12);   //开显示位

使用特权

评论回复
16
avocationA|  楼主 | 2009-3-14 15:04 | 只看该作者

上次 写个菜单很头痛500多个参数!

每个参数 的单位  不同 
位数不同,
小数点位不同

排头有 正负号字母号

而且 参数 与 参数 间  有相关性
还有排斥性
还有隐蔽参数!

程序写到后来自己都犯晕了,,,,,,

NND 所以俺这次.......显示写成类似填表  格

匠人 有空可要帮帮俺啊!!!!!




LED    LedDat=           //结构体定义及初始化
{
//位数|闪烁位|小数点|正负号|单位|缓存|闪烁计数器
    3,    1,     3,     1,    1,   123,   0
};    

使用特权

评论回复
17
kbgyzp| | 2009-3-14 19:57 | 只看该作者

才500多个就头大啊?

    我的10000多个参数,可读写的,只读的,只写的,存FLASH的,存E2PROM的,内存的,无符号的,有符号的,浮点的,还有单位,有时显示一组数据还要照应前后的,因为要保证单位一致。

    还有上电恢复的,掉电保存的,看门狗复位不能清零的,要清零的,改变时还要判断大小的,还要整组判断大小的,比如时间设置,不能让设2月31号吧。

    还有双备份的,很重要的不能丢失,且要万无一失,这就牵扯哪个是对的问题。


    显示页很复杂,一般情况就不说了,设置参数时也很复杂,不能给用户犯错误的机会,单个数字闪动了,多个数字闪动了,大小是否符合了。。。。

    功能实现我只用了一个星期,光这些数据处理就用了好几个月,因为要保证可以合理调用,累啊。。。

使用特权

评论回复
18
avocationA|  楼主 | 2009-3-14 20:14 | 只看该作者

LS能不能讲讲思路!!!

LS能不能讲讲思路啊!!!
俺写着写着就变成一个乱的毛线团了!!!!!!!!!!!!!!!!!!!! 

使用特权

评论回复
19
xwj| | 2009-3-14 20:24 | 只看该作者

呵呵,LZ那情况,只能说你自己没规划好:-)

使用特权

评论回复
20
avocationA|  楼主 | 2009-3-15 00:13 | 只看该作者

是啊 当时赶时间 只 能先完成任务先 !!现在不同时间很充裕

是啊 当时赶时间 只 能先完成任务先 !!现在不同时间很充裕

使用特权

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

本版积分规则

123

主题

935

帖子

0

粉丝