keyled.c
上传用户:shyuanyi
上传日期:2008-05-24
资源大小:69k
文件大小:4k
源码类别:

RFID编程

开发平台:

C/C++

  1. #include  "my_head.h"
  2. //#include  "key.h"
  3. /*********************************************/
  4. #define   SPI_HEAD_CHAR    0X00
  5. #define   SPI_TAIL_CHAR    0xFF
  6. #define   KEYBORD_ORDOR    0x01
  7. #define   DIS_DAT_ORDOR    0X02
  8. #define   DIS_LED_ORDOR    0X03
  9. #define   FLASH_LED_ORDOR  0X04
  10. /*********************************************/
  11. #define   LEDKEY_CTL    P3_3   //int1
  12. bit   ledkey_dat_flag = FALSE;
  13. void  Key_Int1(void)interrupt 2 using 1 //for LED_KEY_SPI
  14. {
  15.   //IE1 = 0;
  16.   ledkey_dat_flag = TRUE;
  17.   //P2_7 ^= 1;    //BUZZER for test
  18. }
  19. #define   BUF_SIZE        22
  20. //================================
  21. extern unsigned char pdata  Rf_Buffer[];
  22. //BYTE  idata  spi_rbuf[BUF_SIZE-2];
  23. BYTE  spi_rbuf_count = 0;
  24. bit   spi_save_flag  = FALSE;
  25. bit   spi_fram_flag  = FALSE;
  26. void  SpiKeyReceive(BYTE  ch)
  27. {
  28.    if(ch==SPI_TAIL_CHAR)
  29.    {
  30.     spi_save_flag=FALSE;
  31. if(spi_rbuf_count>0)spi_fram_flag=TRUE;
  32.     return;
  33.    }
  34.    if(ch==SPI_HEAD_CHAR)
  35.    {
  36.     spi_fram_flag=FALSE;
  37.     spi_save_flag=TRUE;
  38. spi_rbuf_count=0;
  39. return;
  40.    }
  41.    if(spi_save_flag)
  42.    {
  43.     if(spi_rbuf_count<BUF_SIZE-2)Rf_Buffer[spi_rbuf_count++]=ch;
  44.    }
  45. }
  46. void  clear_spi_rbuf(void)
  47. {
  48.     spi_fram_flag=FALSE;
  49.     spi_save_flag=FALSE;
  50. spi_rbuf_count=0;
  51. }
  52. void Init_KeyLed(void)
  53. {
  54.    EA     = 0;
  55.    IP    &= ~0X04;  //优先级0
  56.    //IPH  &= ~0X04;
  57.    IT1    = 1;
  58.    EX1    = 1;
  59.    EA     = 1;
  60.    LEDKEY_CTL  =  1;
  61.    clear_spi_rbuf();
  62. }
  63. void  kbint_open(void)
  64. {
  65.   LEDKEY_CTL   =  1;
  66.   IE1  =  0;
  67.   EX1  =  1;
  68. }
  69. void  kbint_close(void)
  70. {
  71.   EX1   =  0;
  72. }
  73. BYTE  Get_SpiReceiveDat(BYTE  *buf)
  74. {
  75.    BYTE  ii;
  76.    if(spi_fram_flag==FALSE)return(0);
  77.    *buf++ = Rf_Buffer[0];
  78.    for(ii=1;ii<spi_rbuf_count;ii++,buf++)
  79.    {
  80.     *buf =(Rf_Buffer[ii]<<4);
  81. ii++;
  82. *buf |=(Rf_Buffer[ii]&0xf);
  83.    }
  84.    clear_spi_rbuf();
  85.    return(ii/2+1);
  86. }
  87. BYTE  Set_SpiSendDat(BYTE  *buf,BYTE  size,BYTE ordor,BYTE  *spi_sbuf)
  88. {
  89.   BYTE  ii=0;
  90.   if((size<1)||(size>9))return(ii);
  91.   spi_sbuf[ii++]=SPI_HEAD_CHAR;
  92.   spi_sbuf[ii++]=ordor;
  93.   for(;ii<size*2+2;buf++)
  94.   {
  95.    spi_sbuf[ii++]=0x30|(*buf>>4);
  96.    spi_sbuf[ii++]=0x30|(*buf&0xf);
  97.   }
  98.   spi_sbuf[ii++]=SPI_TAIL_CHAR;
  99.   return(ii);
  100. }
  101. void  SpiKey_SendStr(BYTE *ptr,BYTE count)
  102. {
  103.    BYTE  ii;
  104.    for(ii=0;ii<count;ii++)
  105.    {
  106.      SpiKeyReceive(KeySpiByte_SendReceive(ptr[ii]));
  107.    }
  108. }
  109. void  Display_str(BYTE  str[])
  110. {
  111.    BYTE  i;
  112.    BYTE  idata  spi_sbuf[BUF_SIZE+1];
  113.    i=Set_SpiSendDat(str,8,DIS_DAT_ORDOR,spi_sbuf);
  114.    kbint_close();
  115.    LEDKEY_CTL =0;
  116.    SpiKey_SendStr(spi_sbuf,i);
  117.    LEDKEY_CTL =1;
  118.    kbint_open();
  119. }
  120. void  Do_Led(BYTE  led_dat)
  121. {
  122.    BYTE  i;
  123.    BYTE  idata  spi_sbuf[10];
  124.    i=Set_SpiSendDat(&led_dat,1,DIS_LED_ORDOR,spi_sbuf);
  125.    kbint_close();
  126.    LEDKEY_CTL =0;
  127.    SpiKey_SendStr(spi_sbuf,i);
  128.    LEDKEY_CTL =1;
  129.    kbint_open();
  130. }
  131. void  Do_DisLed_Flash(BYTE  disflash,BYTE ledflash,BYTE  flashtime)
  132. {
  133.    BYTE  i,buf[3];
  134.    BYTE  idata  spi_sbuf[10];
  135.    buf[0]=disflash;
  136.    buf[1]=ledflash;
  137.    buf[2]=flashtime;
  138.    i=Set_SpiSendDat(buf,3,FLASH_LED_ORDOR,spi_sbuf);
  139.    kbint_close();
  140.    LEDKEY_CTL =0;
  141.    SpiKey_SendStr(spi_sbuf,i);
  142.    LEDKEY_CTL =1;
  143.    kbint_open();
  144. }
  145. BYTE  Check_Key_Event(void)
  146. {
  147.    BYTE i,buf[8];
  148.    if(!ledkey_dat_flag)return(1);
  149.    do_buzzer(BUZZER_WAIT);
  150.    kbint_close();
  151.    LEDKEY_CTL =0;
  152.    for(i=9;i--;)buf[i]=0xff;
  153.    clear_spi_rbuf();
  154.    Set_Timer20ms(2);
  155.    while(!spi_fram_flag)
  156.    {
  157.     SpiKey_SendStr(buf,1);
  158.     if(!Get_Timer20ms())break;
  159.    }
  160.    LEDKEY_CTL=1;
  161.    kbint_open();
  162.    ledkey_dat_flag = FALSE;
  163.    //----------------------
  164.    //do_buzzer(2);SendStr(spi_rbuf,BUF_SIZE-2); //for test.
  165.    if( !Get_SpiReceiveDat(buf) || (buf[0]!=KEYBORD_ORDOR) )return(2);
  166.    PostMessage(KEY_PRESS_EVENT,buf[1]);
  167.    return(0);
  168. }