搜索
bottom↓
回复: 7

发一个独立键盘加六个旋转按钮的例子

[复制链接]

出0入0汤圆

发表于 2015-2-1 13:15:20 | 显示全部楼层 |阅读模式
旋转按钮的程序仿照了机器人天空的帖子,普通按键就是很普通的做法延迟去抖,开始写简单的代码,大家多多指教(本程序已经在仪器上用气了)
/*********************************************************************************************************
** Function name:       uart0SendByte
** Descriptions:        从串口0发送数据
** input parameters:    data: 发送的数据
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void uart1SendByte (INT8U ucData)
{
    U1THR   = ucData;
    while ( (U1LSR & 0x20) == 0 );
}

/*********************************************************************************************************
** Function name:       uart1GetByte
** Descriptions:        从串口接收1字节数据,使用查询方式接收
** input parameters:    无
** output parameters:   无
** Returned value:      ucRcvData:   接收到的数据
*********************************************************************************************************/
INT8U uart1GetByte (void)
{
    INT8U ucRcvData;   
    while ((U1LSR & 0x01) == 0);                               /* 等待接收标志置位   */
    ucRcvData = U1RBR;                                         /* 读取数据           */
    return (ucRcvData);   
}
/*********************************************************************************************************
* Function Name:        uart1Isr
* Description:          UART1中断服务函数
* Input:                无
* Output:               无
* Return:               无
*********************************************************************************************************/
void uart1Isr (void)
{
//    GulNum = 0;
      
    while ((U1IIR & 0x01) == 0)
        {                                        /*  判断是否有中断挂起          */
        switch (U1IIR & 0x0E)
                {                                          /*  判断中断标志                */
        
            case 0x04:                                                  /*  接收数据中断                */
               {
                           GucRcvNew = 1;                                          /*  置接收新数据标志            */
//                for (GulNum = 0; GulNum < 8; GulNum++)                                         /*  连续接收8个字节             */
//                                        {                 
//                          GucRcvBuf[GulNum] = U1RBR;
                GucRcvBuf = U1RBR;  
//                         }               
                break;
            
            case 0x0C:                                                  /*  字符超时中断                */
                GucRcvNew = 1;
                while ((U1LSR & 0x01) == 0x01)                         /*  判断数据是否接收完毕      */
//                                {                        
//                  GucRcvBuf[GulNum] = U1RBR;
//                  GulNum++;
                                  GucRcvBuf = U1RBR;
//               }
                break;
               
            default:
                break;
        }
    }
        }
}
/*********************************************************************************************************
** Function name:       uart1GetStr
** Descriptions:        串口接收字符串
** input parameters:    pucStr:   指向接收数据数组的指针
**                      ulNum:   接收数据的个数
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void uart1GetStr (INT8U *pucStr, INT32U ulNum)
{
    for (; ulNum > 0; ulNum--){
        *pucStr++ =  uart1GetByte ();
    }  
}

/*********************************************************************************************************
** Function name:            uart1SendStr
** Descriptions:            向串口发送字符串
** input parameters:    puiStr:   要发送的字符串指针
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
//void uart1SendStr (INT8U  const *pucStr)
//{
//    while (1){
//        if (*pucStr == '\0') break;                                     /*  遇到结束符,退出            */
//        uart1SendByte (*pucStr++);
//    }
//}
/*********************************************************************************************************
** Function name:            uart1SendStr
** Descriptions:            向串口发送字符串
** input parameters:    pucStr:  要发送的字符串指针
**                      ulNum:   要发送的数据个数
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void uart1SendStr (INT8U const *pucStr, INT32U ulNum)
{
    INT32U i;
   
    for (i = 0; i < ulNum; i++)
        {                                        /* 发送指定个字节数据           */
        uart1SendByte (*pucStr++);
    }
}
/*********************************************************************************************************
** Function name:       uart0Init
** Descriptions:        按默认值初始化串口0的引脚和通讯参数。设置为8位数据位,1位停止位,无奇偶校验
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void uart1Init (void)
{
    INT16U usFdiv;
    U1LCR  = 0x83;                                                      /* 允许设置波特率               */
    usFdiv = (FPCLK / 16) / UART_BPS;                                   /* 设置波特率                   */
    U1DLM  = usFdiv / 256;
    U1DLL  = usFdiv % 256;
    U1LCR  = 0x03;                                                      /* 锁定波特率                   */
    U1FCR  = 0x07;
        U1IER  = 0x01;                                                      /* 使能接收中断                 */
}
/*********************************************************************************************************
** Function name:       Scan
** Descriptions:        独立键盘扫描
** input parameters:    无
** output parameters:   无
** Returned value:      键码编值
*********************************************************************************************************/
INT8U scan (void)
{
    INT32U temp;
        INT8U  keydata=0;
        temp=(FIO0PIN0&0xef)|((FIO0PIN1&0x8f)<<8)|((FIO0PIN2&0xff)<<16)|((FIO0PIN3&0x7f)<<24);
        if(temp!=0)
          {
                   switch(temp)
                   {
                    case 0x00200000:  keydata = 1;  break;                 /* SW1              */
                        case 0x00100000:  keydata = 2;  break;
                        case 0x00000200:  keydata = 3;  break;
                        case 0x00000800:  keydata = 4;  break;
                        case 0x00040000:  keydata = 5;  break;
                        case 0x00010000:  keydata = 6;  break;
                        case 0x00000400:  keydata = 7;  break;
                        case 0x00000008:  keydata = 8;  break;
                        case 0x00000100:  keydata = 9;  break;
                        case 0x00000080:  keydata = 10; break;
                        case 0x00000040:  keydata = 11; break;
                        case 0x00000020:  keydata = 12; break;
                        case 0x00000004:  keydata = 13; break;
                        case 0x00400000:  keydata = 14; break;
                        case 0x00080000:  keydata = 15; break;
                        case 0x00020000:  keydata = 16; break;
                        case 0x00008000:  keydata = 17; break;
                        case 0x00000001:  keydata = 18; break;
                        case 0x00000002:  keydata = 19; break;
                        case 0x10000000:  keydata = 20; break;
                        case 0x01000000:  keydata = 21; break;
                        case 0x02000000:  keydata = 22; break;
                        case 0x40000000:  keydata = 23; break;
                        case 0x20000000:  keydata = 24; break;
                        case 0x08000000:  keydata = 25; break;
                        case 0x00800000:  keydata = 26; break;
                        case 0x04000000:  keydata = 27; break;
                        default : break;
                        }
                  
     }
          return(keydata) ;
}
INT8U keyin(void)
{   
        INT8U t1,t2;
            t1=scan();
                myDelay(5);          //延时消抖
                t2=scan();
                if(t1=t2)
                   return(t1);
                else
                   return(0);
//                while(t1=t2);
}
/*********************************************************************************************************
** Function name:       knob_can
** Descriptions:        独立键盘扫描
** input parameters:    无
** output parameters:   无
** Returned value:      键码编值
*********************************************************************************************************/
INT8U knob_can (void)
{
//    INT32U knob_temp;
        INT8U  knob_data=0;
           if((knob_data=EncoderProcess(9,10,4))!=0)
                 return(knob_data) ;
           if((knob_data=EncoderProcess(16,17,8))!=0)
                 return(knob_data) ;
           if((knob_data=EncoderProcess(22,23,14))!=0)
                 return(knob_data) ;       
           if((knob_data=EncoderProcess(4,8,2))!=0)
              return(knob_data);
           if((knob_data=EncoderProcess(14,15,6))!=0)
              return(knob_data);
           if((knob_data=EncoderProcess(18,19,10))!=0)
              return(knob_data);
           if((knob_data=EncoderProcess(20,21,12))!=0)
              return(knob_data);
           if((knob_data=EncoderProcess(22,23,14))!=0)
              return(knob_data);
           if((knob_data=EncoderProcess(0,1,0))!=0)
              return(knob_data);
}
//========================================================================================
/*********************************************************************************************************
** Function name:       knob_can
** Descriptions:        独立键盘扫描
** input parameters:    无
** output parameters:   无
** Returned value:      返回键码值
*********************************************************************************************************/
     INT8U EncoderProcess(INT8U a,INT8U b,INT8U c)
      {
                  INT8U keytmp;
                  INT8U WheelNow=0x00;
                  INT16U tmpstate=((b<<8)|a);
                  switch(tmpstate)
                        {
                                 case 0x0100:
                                      WheelOld = wheelold_data[0];
                                          break;
                                case 0x0804:
                                      WheelOld = wheelold_data[1];
                                          break;
                                case 0x0A09:
                                      WheelOld = wheelold_data[2];
                                          break;
                                case 0x0F0E:
                                      WheelOld = wheelold_data[3];
                                          break;
                                case 0x1110:
                                      WheelOld = wheelold_data[4];
                                          break;
                                case 0x1312:
                                      WheelOld = wheelold_data[5];
                                          break;
                                case 0x1514:
                                      WheelOld = wheelold_data[6];
                                          break;
                                case 0x1716:
                                      WheelOld = wheelold_data[7];
                                          break;
                                 default: break;                                 
                                 }        
                         WheelNow=WheelNow<<1;
          if (GetPIN1(a)==1)
                      WheelNow=WheelNow+1;           // 读 PINA
              WheelNow=WheelNow<<1;
          if (GetPIN1(b)==1)                                  // 读 PINB
                     WheelNow=WheelNow+1;            
             WheelNow=WheelNow & 0x03;      // 将 WheelNow 的 2 - 7 位清零,保留 0- 1 两个位的状态.
          if (WheelNow==0x00)
                     return(NULL);                //当  PINA 和 PINB都为低电平时退出,低电平区不做处理
             keytmp=WheelNow;
             keytmp ^=WheelOld;          // 判断新读的数据同旧数据
          if (keytmp==0)
                     return(NULL);              // 新读的数据同旧数据一样时退出.
         
          if (WheelOld==0x01 && WheelNow==0x02)        // 是左旋转否
                      {
                              switch(tmpstate)
                        {
                                case 0x0100:
                                      wheelold_data[0]=WheelNow;
                                          break;
                                case 0x0804:
                                      wheelold_data[1]=WheelNow;
                                          break;
                                case 0x0A09:
                                      wheelold_data[2]=WheelNow;
                                          break;
                                case 0x0F0E:
                                      wheelold_data[3]=WheelNow;
                                          break;
                                case 0x1110:
                                      wheelold_data[4]=WheelNow;
                                          break;
                                case 0x1312:
                                      wheelold_data[5]=WheelNow;
                                          break;
                                case 0x1514:
                                      wheelold_data[6]=WheelNow;
                                          break;
                                case 0x1716:
                                      wheelold_data[7]=WheelNow;
                                          break;
                                 default: break;
                                 
                                 }
//                                  WheelOld=WheelNow;
//                  return(WheelLeft());         //左旋转
                                  return(knob_coding[c]);         //左旋转
              }
          else if (WheelOld==0x02 && WheelNow==0x01)  // 是右旋转否
                     {
                               switch(tmpstate)
                        {
                                case 0x0100:
                                      wheelold_data[0]=WheelNow;
                                          break;
                                case 0x0804:
                                      wheelold_data[1]=WheelNow;
                                          break;
                                case 0x0A09:
                                      wheelold_data[2]=WheelNow;
                                          break;
                                case 0x0F0E:
                                      wheelold_data[3]=WheelNow;
                                          break;
                                case 0x1110:
                                      wheelold_data[4]=WheelNow;
                                          break;
                                case 0x1312:
                                      wheelold_data[5]=WheelNow;
                                          break;
                                case 0x1514:
                                      wheelold_data[6]=WheelNow;
                                          break;
                                case 0x1716:
                                      wheelold_data[7]=WheelNow;
                                          break;
                                 default: break;
                                 
                                 }
//                                  WheelOld=WheelNow;
//                  return(WheelRight()); //右旋转
                                  return(knob_coding[c+1]);         //左旋转
             }
                  switch(tmpstate)
                {
                        case 0x0100:
                              wheelold_data[0]=WheelNow;
                                  break;
                        case 0x0804:
                              wheelold_data[1]=WheelNow;
                                  break;
                        case 0x0A09:
                              wheelold_data[2]=WheelNow;
                                  break;
                        case 0x0F0E:
                              wheelold_data[3]=WheelNow;
                                  break;
                        case 0x1110:
                              wheelold_data[4]=WheelNow;
                                  break;
                        case 0x1312:
                              wheelold_data[5]=WheelNow;
                                  break;
                        case 0x1514:
                              wheelold_data[6]=WheelNow;
                                  break;
                        case 0x1716:
                              wheelold_data[7]=WheelNow;
                                  break;
                         default: break;
                         
                         }
//                  WheelOld=WheelNow; // 保存当前值
          return(NULL); // 当  PINA 和 PINB 都为高电平时表示编码器没有动作,退出
      }

//========================================================================================
/*********************************************************************************************************
** Function name:       Key_LED
** Descriptions:        接收数据,相应的LED灯点亮
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void Key_LED (INT8U d)
{        INT8U led_data=0;
    led_data=d;
        FIO1SET3=0x03;
    FIO2SET =0xFFFF;
        if(led_data!=0)
           {
            switch(led_data)
                {
                        case 0x01:
                              FIO2CLR|=0x0004;
                                  break;
                        case 0x02:
                              FIO2CLR|=0x0008;
                                  break;
                        case 0x03:
                              FIO2CLR|=0x0010;
                                  break;
                        case 0x04:
                              FIO2CLR|=0x0020;
                                  break;
                        case 0x05:
                              FIO2CLR|=0x0040;
                                  break;
                        case 0x06:
                              FIO2CLR|=0x0080;
                                  break;
                        case 0x07:
                              FIO2CLR|=0x0100;
                                  break;
                        case 0x08:
                              FIO2CLR|=0x0200;
                                  break;
                        case 0x09:
                              FIO2CLR|=0x0400;
                                  break;
                        case 0x0a:
                              FIO2CLR|=0x0800;
                                  break;
                        case 0x0b:
                              FIO2CLR|=0x1000;
                                  break;
                        case 0x0c:
                              FIO2CLR|=0x2000;
                                  break;
                        case 0x0d:
                              FIO1CLR|=0x01000000;
                                  break;
                        case 0x0e:
                              FIO1CLR|=0x02000000;
                                  break;
                    case 0x10:
                              FIO1CLR|=0x04000000;
                                  break;
                         default:  break;
                         
                         }
           }
   
}
//========================================================================================

/*********************************************************************************************************
** Function name:       main
** Descriptions:        发送和接收数据
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
int main (void)
{       
//    rcvdata=0;
   
    targetInit();                                                       /* 初始化目标板,切勿删除       */
    pinInit();                                                                                                                   /* 引脚初始化                   */
        FIO0DIR0=0x00;
        FIO0DIR1=0x00;
        FIO0DIR2=0x00;
        FIO0DIR3=0x00;
    FIO1DIR0=0x00;
        FIO1DIR1=0x00;
        FIO1DIR2=0x00;
        FIO1DIR3=0x07;
        FIO1SET3=0x07;

        FIO2DIR =0xFFFF;
        FIO2SET =0xFFFF;
        GucRcvNew = 0;                           
        PCONP = PCONP | (1<<4);                                             /* 开启串口1功能模块            */
                                                                            
        uart1Init();
        zyIsrSet(NVIC_UART1,(unsigned long)uart1Isr,PRIO_ONE);        
    while (1)
        {
           data =keyin();          
           if(data!=0&&(data!=dlay_data))
              {
                  uart1SendByte(data);                  
                  }
           dlay_data=data;

           if (GucRcvNew == 1)
           {                                           /* 判断是否有新数据             */
              GucRcvNew = 0;                          /* 清除标志                     */
                 if(GucRcvBuf!=0)
              Key_LED(GucRcvBuf);
          uart1SendByte (GucRcvBuf);
       }
                  
           data1=knob_can();
           if(data1!=0)
              {
                  uart1SendByte(data1);
                  myDelay(1);
                  }
         
        }       
}

出0入0汤圆

发表于 2015-2-1 13:29:41 | 显示全部楼层
什么东东,读键吗?

出0入0汤圆

发表于 2015-2-1 14:22:18 | 显示全部楼层
  1. /*********************************************************************************************************
  2. ** Function name:       uart0SendByte
  3. ** Descriptions:        从串口0发送数据
  4. ** input parameters:    data: 发送的数据
  5. ** output parameters:   无
  6. ** Returned value:      无
  7. *********************************************************************************************************/
  8. void uart1SendByte (INT8U ucData)
  9. {
  10.     U1THR   = ucData;
  11.     while ( (U1LSR & 0x20) == 0 );
  12. }

  13. /*********************************************************************************************************
  14. ** Function name:       uart1GetByte
  15. ** Descriptions:        从串口接收1字节数据,使用查询方式接收
  16. ** input parameters:    无
  17. ** output parameters:   无
  18. ** Returned value:      ucRcvData:   接收到的数据
  19. *********************************************************************************************************/
  20. INT8U uart1GetByte (void)
  21. {
  22.     INT8U ucRcvData;   
  23.     while ((U1LSR & 0x01) == 0);                               /* 等待接收标志置位   */
  24.     ucRcvData = U1RBR;                                         /* 读取数据           */
  25.     return (ucRcvData);   
  26. }
  27. /*********************************************************************************************************
  28. * Function Name:        uart1Isr
  29. * Description:          UART1中断服务函数
  30. * Input:                无
  31. * Output:               无
  32. * Return:               无
  33. *********************************************************************************************************/
  34. void uart1Isr (void)
  35. {
  36. //    GulNum = 0;
  37.       
  38.     while ((U1IIR & 0x01) == 0)
  39.         {                                        /*  判断是否有中断挂起          */
  40.         switch (U1IIR & 0x0E)
  41.                 {                                          /*  判断中断标志                */
  42.         
  43.             case 0x04:                                                  /*  接收数据中断                */
  44.                {
  45.                            GucRcvNew = 1;                                          /*  置接收新数据标志            */
  46. //                for (GulNum = 0; GulNum < 8; GulNum++)                                         /*  连续接收8个字节             */
  47. //                                        {                 
  48. //                          GucRcvBuf[GulNum] = U1RBR;
  49.                 GucRcvBuf = U1RBR;  
  50. //                         }               
  51.                 break;
  52.             
  53.             case 0x0C:                                                  /*  字符超时中断                */
  54.                 GucRcvNew = 1;
  55.                 while ((U1LSR & 0x01) == 0x01)                         /*  判断数据是否接收完毕      */
  56. //                                {                        
  57. //                  GucRcvBuf[GulNum] = U1RBR;
  58. //                  GulNum++;
  59.                                   GucRcvBuf = U1RBR;
  60. //               }
  61.                 break;
  62.                
  63.             default:
  64.                 break;
  65.         }
  66.     }
  67.         }
  68. }
  69. /*********************************************************************************************************
  70. ** Function name:       uart1GetStr
  71. ** Descriptions:        串口接收字符串
  72. ** input parameters:    pucStr:   指向接收数据数组的指针
  73. **                      ulNum:   接收数据的个数
  74. ** output parameters:   无
  75. ** Returned value:      无
  76. *********************************************************************************************************/
  77. void uart1GetStr (INT8U *pucStr, INT32U ulNum)
  78. {
  79.     for (; ulNum > 0; ulNum--){
  80.         *pucStr++ =  uart1GetByte ();
  81.     }  
  82. }

  83. /*********************************************************************************************************
  84. ** Function name:            uart1SendStr
  85. ** Descriptions:            向串口发送字符串
  86. ** input parameters:    puiStr:   要发送的字符串指针
  87. ** output parameters:   无
  88. ** Returned value:      无
  89. *********************************************************************************************************/
  90. //void uart1SendStr (INT8U  const *pucStr)
  91. //{
  92. //    while (1){
  93. //        if (*pucStr == '\0') break;                                     /*  遇到结束符,退出            */
  94. //        uart1SendByte (*pucStr++);
  95. //    }
  96. //}
  97. /*********************************************************************************************************
  98. ** Function name:            uart1SendStr
  99. ** Descriptions:            向串口发送字符串
  100. ** input parameters:    pucStr:  要发送的字符串指针
  101. **                      ulNum:   要发送的数据个数
  102. ** output parameters:   无
  103. ** Returned value:      无
  104. *********************************************************************************************************/
  105. void uart1SendStr (INT8U const *pucStr, INT32U ulNum)
  106. {
  107.     INT32U i;
  108.    
  109.     for (i = 0; i < ulNum; i++)
  110.         {                                        /* 发送指定个字节数据           */
  111.         uart1SendByte (*pucStr++);
  112.     }
  113. }
  114. /*********************************************************************************************************
  115. ** Function name:       uart0Init
  116. ** Descriptions:        按默认值初始化串口0的引脚和通讯参数。设置为8位数据位,1位停止位,无奇偶校验
  117. ** input parameters:    无
  118. ** output parameters:   无
  119. ** Returned value:      无
  120. *********************************************************************************************************/
  121. void uart1Init (void)
  122. {
  123.     INT16U usFdiv;
  124.     U1LCR  = 0x83;                                                      /* 允许设置波特率               */
  125.     usFdiv = (FPCLK / 16) / UART_BPS;                                   /* 设置波特率                   */
  126.     U1DLM  = usFdiv / 256;
  127.     U1DLL  = usFdiv % 256;
  128.     U1LCR  = 0x03;                                                      /* 锁定波特率                   */
  129.     U1FCR  = 0x07;
  130.         U1IER  = 0x01;                                                      /* 使能接收中断                 */
  131. }
  132. /*********************************************************************************************************
  133. ** Function name:       Scan
  134. ** Descriptions:        独立键盘扫描
  135. ** input parameters:    无
  136. ** output parameters:   无
  137. ** Returned value:      键码编值
  138. *********************************************************************************************************/
  139. INT8U scan (void)
  140. {
  141.     INT32U temp;
  142.         INT8U  keydata=0;
  143.         temp=(FIO0PIN0&0xef)|((FIO0PIN1&0x8f)<<8)|((FIO0PIN2&0xff)<<16)|((FIO0PIN3&0x7f)<<24);
  144.         if(temp!=0)
  145.           {
  146.                    switch(temp)
  147.                    {
  148.                     case 0x00200000:  keydata = 1;  break;                 /* SW1              */
  149.                         case 0x00100000:  keydata = 2;  break;
  150.                         case 0x00000200:  keydata = 3;  break;
  151.                         case 0x00000800:  keydata = 4;  break;
  152.                         case 0x00040000:  keydata = 5;  break;
  153.                         case 0x00010000:  keydata = 6;  break;
  154.                         case 0x00000400:  keydata = 7;  break;
  155.                         case 0x00000008:  keydata = 8;  break;
  156.                         case 0x00000100:  keydata = 9;  break;
  157.                         case 0x00000080:  keydata = 10; break;
  158.                         case 0x00000040:  keydata = 11; break;
  159.                         case 0x00000020:  keydata = 12; break;
  160.                         case 0x00000004:  keydata = 13; break;
  161.                         case 0x00400000:  keydata = 14; break;
  162.                         case 0x00080000:  keydata = 15; break;
  163.                         case 0x00020000:  keydata = 16; break;
  164.                         case 0x00008000:  keydata = 17; break;
  165.                         case 0x00000001:  keydata = 18; break;
  166.                         case 0x00000002:  keydata = 19; break;
  167.                         case 0x10000000:  keydata = 20; break;
  168.                         case 0x01000000:  keydata = 21; break;
  169.                         case 0x02000000:  keydata = 22; break;
  170.                         case 0x40000000:  keydata = 23; break;
  171.                         case 0x20000000:  keydata = 24; break;
  172.                         case 0x08000000:  keydata = 25; break;
  173.                         case 0x00800000:  keydata = 26; break;
  174.                         case 0x04000000:  keydata = 27; break;
  175.                         default : break;
  176.                         }
  177.                   
  178.      }
  179.           return(keydata) ;
  180. }
  181. INT8U keyin(void)
  182. {   
  183.         INT8U t1,t2;
  184.             t1=scan();
  185.                 myDelay(5);          //延时消抖
  186.                 t2=scan();
  187.                 if(t1=t2)
  188.                    return(t1);
  189.                 else
  190.                    return(0);
  191. //                while(t1=t2);
  192. }
  193. /*********************************************************************************************************
  194. ** Function name:       knob_can
  195. ** Descriptions:        独立键盘扫描
  196. ** input parameters:    无
  197. ** output parameters:   无
  198. ** Returned value:      键码编值
  199. *********************************************************************************************************/
  200. INT8U knob_can (void)
  201. {
  202. //    INT32U knob_temp;
  203.         INT8U  knob_data=0;
  204.            if((knob_data=EncoderProcess(9,10,4))!=0)
  205.                  return(knob_data) ;
  206.            if((knob_data=EncoderProcess(16,17,8))!=0)
  207.                  return(knob_data) ;
  208.            if((knob_data=EncoderProcess(22,23,14))!=0)
  209.                  return(knob_data) ;        
  210.            if((knob_data=EncoderProcess(4,8,2))!=0)
  211.               return(knob_data);
  212.            if((knob_data=EncoderProcess(14,15,6))!=0)
  213.               return(knob_data);
  214.            if((knob_data=EncoderProcess(18,19,10))!=0)
  215.               return(knob_data);
  216.            if((knob_data=EncoderProcess(20,21,12))!=0)
  217.               return(knob_data);
  218.            if((knob_data=EncoderProcess(22,23,14))!=0)
  219.               return(knob_data);
  220.            if((knob_data=EncoderProcess(0,1,0))!=0)
  221.               return(knob_data);
  222. }
  223. //========================================================================================
  224. /*********************************************************************************************************
  225. ** Function name:       knob_can
  226. ** Descriptions:        独立键盘扫描
  227. ** input parameters:    无
  228. ** output parameters:   无
  229. ** Returned value:      返回键码值
  230. *********************************************************************************************************/
  231.      INT8U EncoderProcess(INT8U a,INT8U b,INT8U c)
  232.       {
  233.                   INT8U keytmp;
  234.                   INT8U WheelNow=0x00;
  235.                   INT16U tmpstate=((b<<8)|a);
  236.                   switch(tmpstate)
  237.                         {
  238.                                  case 0x0100:
  239.                                       WheelOld = wheelold_data[0];
  240.                                           break;
  241.                                 case 0x0804:
  242.                                       WheelOld = wheelold_data[1];
  243.                                           break;
  244.                                 case 0x0A09:
  245.                                       WheelOld = wheelold_data[2];
  246.                                           break;
  247.                                 case 0x0F0E:
  248.                                       WheelOld = wheelold_data[3];
  249.                                           break;
  250.                                 case 0x1110:
  251.                                       WheelOld = wheelold_data[4];
  252.                                           break;
  253.                                 case 0x1312:
  254.                                       WheelOld = wheelold_data[5];
  255.                                           break;
  256.                                 case 0x1514:
  257.                                       WheelOld = wheelold_data[6];
  258.                                           break;
  259.                                 case 0x1716:
  260.                                       WheelOld = wheelold_data[7];
  261.                                           break;
  262.                                  default: break;                                 
  263.                                  }        
  264.                          WheelNow=WheelNow<<1;
  265.           if (GetPIN1(a)==1)
  266.                       WheelNow=WheelNow+1;           // 读 PINA
  267.               WheelNow=WheelNow<<1;
  268.           if (GetPIN1(b)==1)                                  // 读 PINB
  269.                      WheelNow=WheelNow+1;            
  270.              WheelNow=WheelNow & 0x03;      // 将 WheelNow 的 2 - 7 位清零,保留 0- 1 两个位的状态.
  271.           if (WheelNow==0x00)
  272.                      return(NULL);                //当  PINA 和 PINB都为低电平时退出,低电平区不做处理
  273.              keytmp=WheelNow;
  274.              keytmp ^=WheelOld;          // 判断新读的数据同旧数据
  275.           if (keytmp==0)
  276.                      return(NULL);              // 新读的数据同旧数据一样时退出.
  277.          
  278.           if (WheelOld==0x01 && WheelNow==0x02)        // 是左旋转否
  279.                       {
  280.                               switch(tmpstate)
  281.                         {
  282.                                 case 0x0100:
  283.                                       wheelold_data[0]=WheelNow;
  284.                                           break;
  285.                                 case 0x0804:
  286.                                       wheelold_data[1]=WheelNow;
  287.                                           break;
  288.                                 case 0x0A09:
  289.                                       wheelold_data[2]=WheelNow;
  290.                                           break;
  291.                                 case 0x0F0E:
  292.                                       wheelold_data[3]=WheelNow;
  293.                                           break;
  294.                                 case 0x1110:
  295.                                       wheelold_data[4]=WheelNow;
  296.                                           break;
  297.                                 case 0x1312:
  298.                                       wheelold_data[5]=WheelNow;
  299.                                           break;
  300.                                 case 0x1514:
  301.                                       wheelold_data[6]=WheelNow;
  302.                                           break;
  303.                                 case 0x1716:
  304.                                       wheelold_data[7]=WheelNow;
  305.                                           break;
  306.                                  default: break;
  307.                                  
  308.                                  }
  309. //                                  WheelOld=WheelNow;
  310. //                  return(WheelLeft());         //左旋转
  311.                                   return(knob_coding[c]);         //左旋转
  312.               }
  313.           else if (WheelOld==0x02 && WheelNow==0x01)  // 是右旋转否
  314.                      {
  315.                                switch(tmpstate)
  316.                         {
  317.                                 case 0x0100:
  318.                                       wheelold_data[0]=WheelNow;
  319.                                           break;
  320.                                 case 0x0804:
  321.                                       wheelold_data[1]=WheelNow;
  322.                                           break;
  323.                                 case 0x0A09:
  324.                                       wheelold_data[2]=WheelNow;
  325.                                           break;
  326.                                 case 0x0F0E:
  327.                                       wheelold_data[3]=WheelNow;
  328.                                           break;
  329.                                 case 0x1110:
  330.                                       wheelold_data[4]=WheelNow;
  331.                                           break;
  332.                                 case 0x1312:
  333.                                       wheelold_data[5]=WheelNow;
  334.                                           break;
  335.                                 case 0x1514:
  336.                                       wheelold_data[6]=WheelNow;
  337.                                           break;
  338.                                 case 0x1716:
  339.                                       wheelold_data[7]=WheelNow;
  340.                                           break;
  341.                                  default: break;
  342.                                  
  343.                                  }
  344. //                                  WheelOld=WheelNow;
  345. //                  return(WheelRight()); //右旋转
  346.                                   return(knob_coding[c+1]);         //左旋转
  347.              }
  348.                   switch(tmpstate)
  349.                 {
  350.                         case 0x0100:
  351.                               wheelold_data[0]=WheelNow;
  352.                                   break;
  353.                         case 0x0804:
  354.                               wheelold_data[1]=WheelNow;
  355.                                   break;
  356.                         case 0x0A09:
  357.                               wheelold_data[2]=WheelNow;
  358.                                   break;
  359.                         case 0x0F0E:
  360.                               wheelold_data[3]=WheelNow;
  361.                                   break;
  362.                         case 0x1110:
  363.                               wheelold_data[4]=WheelNow;
  364.                                   break;
  365.                         case 0x1312:
  366.                               wheelold_data[5]=WheelNow;
  367.                                   break;
  368.                         case 0x1514:
  369.                               wheelold_data[6]=WheelNow;
  370.                                   break;
  371.                         case 0x1716:
  372.                               wheelold_data[7]=WheelNow;
  373.                                   break;
  374.                          default: break;
  375.                         
  376.                          }
  377. //                  WheelOld=WheelNow; // 保存当前值
  378.           return(NULL); // 当  PINA 和 PINB 都为高电平时表示编码器没有动作,退出
  379.       }

  380. //========================================================================================
  381. /*********************************************************************************************************
  382. ** Function name:       Key_LED
  383. ** Descriptions:        接收数据,相应的LED灯点亮
  384. ** input parameters:    无
  385. ** output parameters:   无
  386. ** Returned value:      无
  387. *********************************************************************************************************/
  388. void Key_LED (INT8U d)
  389. {        INT8U led_data=0;
  390.     led_data=d;
  391.         FIO1SET3=0x03;
  392.     FIO2SET =0xFFFF;
  393.         if(led_data!=0)
  394.            {
  395.             switch(led_data)
  396.                 {
  397.                         case 0x01:
  398.                               FIO2CLR|=0x0004;
  399.                                   break;
  400.                         case 0x02:
  401.                               FIO2CLR|=0x0008;
  402.                                   break;
  403.                         case 0x03:
  404.                               FIO2CLR|=0x0010;
  405.                                   break;
  406.                         case 0x04:
  407.                               FIO2CLR|=0x0020;
  408.                                   break;
  409.                         case 0x05:
  410.                               FIO2CLR|=0x0040;
  411.                                   break;
  412.                         case 0x06:
  413.                               FIO2CLR|=0x0080;
  414.                                   break;
  415.                         case 0x07:
  416.                               FIO2CLR|=0x0100;
  417.                                   break;
  418.                         case 0x08:
  419.                               FIO2CLR|=0x0200;
  420.                                   break;
  421.                         case 0x09:
  422.                               FIO2CLR|=0x0400;
  423.                                   break;
  424.                         case 0x0a:
  425.                               FIO2CLR|=0x0800;
  426.                                   break;
  427.                         case 0x0b:
  428.                               FIO2CLR|=0x1000;
  429.                                   break;
  430.                         case 0x0c:
  431.                               FIO2CLR|=0x2000;
  432.                                   break;
  433.                         case 0x0d:
  434.                               FIO1CLR|=0x01000000;
  435.                                   break;
  436.                         case 0x0e:
  437.                               FIO1CLR|=0x02000000;
  438.                                   break;
  439.                     case 0x10:
  440.                               FIO1CLR|=0x04000000;
  441.                                   break;
  442.                          default:  break;
  443.                         
  444.                          }
  445.            }
  446.    
  447. }
  448. //========================================================================================

  449. /*********************************************************************************************************
  450. ** Function name:       main
  451. ** Descriptions:        发送和接收数据
  452. ** input parameters:    无
  453. ** output parameters:   无
  454. ** Returned value:      无
  455. *********************************************************************************************************/
  456. int main (void)
  457. {        
  458. //    rcvdata=0;
  459.    
  460.     targetInit();                                                       /* 初始化目标板,切勿删除       */
  461.     pinInit();                                                                                                                   /* 引脚初始化                   */
  462.         FIO0DIR0=0x00;
  463.         FIO0DIR1=0x00;
  464.         FIO0DIR2=0x00;
  465.         FIO0DIR3=0x00;
  466.     FIO1DIR0=0x00;
  467.         FIO1DIR1=0x00;
  468.         FIO1DIR2=0x00;
  469.         FIO1DIR3=0x07;
  470.         FIO1SET3=0x07;

  471.         FIO2DIR =0xFFFF;
  472.         FIO2SET =0xFFFF;
  473.         GucRcvNew = 0;                           
  474.         PCONP = PCONP | (1<<4);                                             /* 开启串口1功能模块            */
  475.                                                                            
  476.         uart1Init();
  477.         zyIsrSet(NVIC_UART1,(unsigned long)uart1Isr,PRIO_ONE);         
  478.     while (1)
  479.         {
  480.            data =keyin();         
  481.            if(data!=0&&(data!=dlay_data))
  482.               {
  483.                   uart1SendByte(data);                  
  484.                   }
  485.            dlay_data=data;

  486.            if (GucRcvNew == 1)
  487.            {                                           /* 判断是否有新数据             */
  488.               GucRcvNew = 0;                          /* 清除标志                     */
  489.                  if(GucRcvBuf!=0)
  490.               Key_LED(GucRcvBuf);
  491.           uart1SendByte (GucRcvBuf);
  492.        }
  493.                   
  494.            data1=knob_can();
  495.            if(data1!=0)
  496.               {
  497.                   uart1SendByte(data1);
  498.                   myDelay(1);
  499.                   }
  500.          
  501.         }        
  502. }
复制代码

出0入0汤圆

发表于 2015-2-1 18:34:28 | 显示全部楼层
啥东东 看上去就一堆代码

出0入0汤圆

发表于 2015-2-2 08:33:57 | 显示全部楼层
一个独立键盘加六个旋转按钮

出0入0汤圆

发表于 2015-5-10 18:15:14 | 显示全部楼层
很牛的资料啊,谢谢分享给大家,点赞一个

出0入0汤圆

发表于 2015-6-26 13:12:59 | 显示全部楼层
最好有原理图,有详细讲解。否则,没人有时间看代码

出0入0汤圆

发表于 2015-7-8 09:39:33 | 显示全部楼层
楼主你的代码是不是有问题啊???NT8U keyin(void)
{   
        INT8U t1,t2;
            t1=scan();
                myDelay(5);          //延时消抖
                t2=scan();
                if(t1=t2)
                   return(t1);
                else
                   return(0);
//                while(t1=t2);
}这块明显有问题啊!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-19 07:47

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

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