CT1642 4位数码管驱动IC

2020-01-01 17:33发布

今天打开自家的卫星接收天线,看到4个数码管1个led 6个按键用了一个芯片驱动,因此因为好奇吧,就查了一下CT1642的资料。在翻阅资料的时候发现有很多公司用CT1642替代74HC164
CT1642是16pin的芯片,下面贴出在网上找的资料,在此占用一下阿莫的空间存储一下 资料以备后用,希望阿莫不要删除哦
废话少说上图
  1. /***********************************************************************************************************************
  2. *
  3. *                                  CT1642 Driver  2.2-----The C source file
  4. *
  5. *    本文件为CT1642的参考驱动程序。
  6. *    此驱动有9个函数组成,其中6个为接口函数,介绍如下:
  7. *
  8. *    1、fp_ct1642_manage()----此函数为面板管理函数,一般通过TASK来不断的调用它,完成LED的动态扫描和按键扫描。一般情况下,
  9. *4位数码管需要4ms调用一次,3位数码管需要5ms调用一次。如果显示效果不佳,可将调用间隔时间减小1ms.
  10. *
  11. *    2、fp_led_data_translate()----此函数是频道转换函数,将8位整型数据转换成相应的显示代码,一般在频道更新、重新显示频道
  12. *频道时调用,转换内容存取在全局变量v_LedCode[]当中,供函数fp_ct1642_manage()管理。
  13. *
  14. *    3、fp_led_string_translate()----此函数是字符转换函数,将预先定义的"字符显示编码"传送给该函数,函数根据显示代码的不同给
  15. *全局变量v_LedCode[]赋予相应的值,供函数fp_ct1642_manage()管理。
  16. *
  17. *    4、fp_led_display_off()----关闭面板显示函数。
  18. *
  19. *    5、fp_lock_led_on()----打开信号锁定灯函数。
  20. *
  21. *    6、fp_lock_led_off()----关闭信号锁定灯函数。
  22. *
  23. *
  24. *    修改参考步骤:
  25. *    1、修改"硬件资源操作定义"的常量LED_BIT_COUNT定义,确定LED数码管的位数。
  26. *
  27. *  2、完成"硬件资源操作定义"的宏GPIO_CLOCK_SET(val)、GPIO_DATA_SET(val)、GPIO_KEY_GET(val)。
  28. *
  29. *  3、修改"全局变量定义"的INT8U,确保INT8U为8位无符号整型。
  30. *
  31. *  4、确定调用函数fp_led_data_translate()位置,完成频道到显示代码的转换。
  32. *
  33. *  5、确定调用函数fp_led_string_translate()位置,完成显示字符到显示代码的转换。
  34. *
  35. *  6、制作一个TASK,按要求调用fp_ct1642_manage(),并将得到的按键值v_KeyValue传回给系统。
  36. *
  37. ***********************************************************************************************************************/  
  38.   
  39.   
  40.   
  41. /***********************************************************************************************************************
  42. *                                     数码管连接定义                                                                    
  43. *                                                                                                                       
  44. *   此处定义数码管引脚(A、B、C、D、E、F、G、H)与CT1642引脚(Q2、Q3、Q4、Q5、Q6、Q7、Q8、Q9)的连接,需要根据不同的硬件电
  45. *路做相应的修改,主要修改0-7这8个数字的顺序。使用我们公司的DEMO板此处不需要修改。
  46. ***********************************************************************************************************************/  
  47. #define BIT_A (1<<7)    /*          A           Q2对应7, 此行表示Q2接数码管A*/  
  48. #define BIT_B (1<<6)    /*       -------        Q3对应6, 此行表示Q3接数码管B*/  
  49. #define BIT_C (1<<5)    /*      |       |       Q4对应6, 此行表示Q4接数码管C*/  
  50. #define BIT_D (1<<4)    /*    F |       |  B    Q5对应4, 此行表示Q5接数码管D*/  
  51. #define BIT_E (1<<3)    /*       ---G---        Q6对应3, 此行表示Q6接数码管E*/  
  52. #define BIT_F (1<<2)    /*      |       |  C   Q7对应2, 此行表示Q7接数码管F*/  
  53. #define BIT_G (1<<1)    /*    E |       |      Q8对应1, 此行表示Q8接数码管G*/  
  54. #define BIT_P (1<<0)    /*       ---D---   P    Q9对应0, 此行表示Q9接数码管P*/  
  55.   
  56.   
  57.   
  58. /***********************************************************************************************************************
  59. *                                     数码管显示代码定义                                                      
  60. *                                                                                                                       
  61. * 此处定义LED数码管显示代码,适用于共阴极数码管,不需要修改。
  62. ***********************************************************************************************************************/  
  63. #define DATA_0  BIT_A|BIT_B|BIT_C|BIT_D|BIT_E|BIT_F  
  64. #define DATA_1  BIT_B|BIT_C  
  65. #define DATA_2  BIT_A|BIT_B|BIT_D|BIT_E|BIT_G  
  66. #define DATA_3  BIT_A|BIT_B|BIT_C|BIT_D|BIT_G  
  67. #define DATA_4  BIT_B|BIT_C|BIT_F|BIT_G  
  68. #define DATA_5  BIT_A|BIT_C|BIT_D|BIT_F|BIT_G  
  69. #define DATA_6  BIT_A|BIT_C|BIT_D|BIT_E|BIT_F|BIT_G  
  70. #define DATA_7  BIT_A|BIT_B|BIT_C  
  71. #define DATA_8  BIT_A|BIT_B|BIT_C|BIT_D|BIT_E|BIT_F|BIT_G  
  72. #define DATA_9  BIT_A|BIT_B|BIT_C|BIT_D|BIT_F|BIT_G  
  73. #define DATA_A  BIT_A|BIT_B|BIT_C|BIT_E|BIT_F|BIT_G   
  74. #define DATA_b  BIT_C|BIT_D|BIT_E|BIT_F|BIT_G  
  75. #define DATA_C  BIT_A|BIT_D|BIT_E|BIT_F  
  76. #define DATA_F  BIT_A|BIT_E|BIT_F|BIT_G   
  77. #define DATA_I  BIT_E|BIT_F  
  78. #define DATA_i  BIT_E  
  79. #define DATA_n  BIT_A|BIT_B|BIT_C|BIT_E|BIT_F   
  80. #define DATA_o  BIT_C|BIT_D|BIT_E|BIT_G  
  81. #define DATA_t  BIT_D|BIT_E|BIT_F|BIT_G  
  82. #define DATA_e  BIT_A|BIT_D|BIT_E|BIT_F|BIT_G  
  83. #define DATA_u  BIT_B|BIT_C|BIT_D|BIT_E|BIT_F  
  84. #define DATA_DARK 0x00  
  85. #define DATA_E  BIT_A|BIT_D|BIT_E|BIT_F|BIT_G  
  86. #define DATA_P  BIT_A|BIT_B|BIT_E|BIT_F|BIT_G  
  87.   
  88.   
  89.   
  90. /***********************************************************************************************************************
  91. *                                     字符显示编码定义                                                      
  92. *                                                                                                                       
  93. * 此处定义LED数码管字符显示编码,可根据需要增加相应内容,并在函数fp_led_string_translate()增加相应实现。
  94. ***********************************************************************************************************************/  
  95. /*定义字符串显示字符编码*/  
  96. #define LED_ON        0x01  
  97. #define LED_OFF      0x02  
  98. #define LED_BOOT    0x04  
  99. #define PANEL_OFF  0x08  
  100.   
  101.   
  102.   
  103. /***********************************************************************************************************************
  104. *                                     硬件资源操作定义                                                      
  105. *                                                                                                                       
  106. * 此处定义CT1642使用的资源操作,需根据不同平台做相应修改
  107. ***********************************************************************************************************************/  
  108. /*定义LED 数码管的位数,本驱动只实现3位和4位的操作,所以LED_BIT_COUNT的值只能是3或4*/  
  109. #define  LED_BIT_COUNT        4   
  110.   
  111. /*定义端口CLOCK操作,当val为TRUE时,CLOCK端口置1;当val为FALSE时,CLOCK端口置0*/  
  112. #define  GPIO_CLOCK_SET(val)   
  113.   
  114. /*定义端口DATA操作,当val为TRUE时,DATA端口置1;当val为FALSE时,DATA端口置0*/  
  115. #define  GPIO_DATA_SET(val)   
  116.   
  117. /*定义获取端口KEY电平操作,当端口KEY为高电平时,val=1;当端口KEY为低电平时,val=0*/  
  118. #define  GPIO_KEY_GET(val)   
  119.   
  120.   
  121.   
  122.   
  123. /***********************************************************************************************************************
  124. *                                     全局变量定义  
  125. ***********************************************************************************************************************/  
  126. typedef unsigned char  INT8U;               /*类型定义,请根据平台进行修改,确保INT8U为无符号8位整型数据*/   
  127. static  INT8U  v_lock=0;                          /*信号锁定指示灯控制标志,1打开,0关闭*/  
  128. static  INT8U  v_LedCode[LED_BIT_COUNT];    /*存储LED显示显示代码*/  
  129. static  const  INT8U fp_LedCode[10]=              /*LED显示编码,用于查表*/  
  130.                             {  
  131.                                 (DATA_0), /*0*/  
  132.                                 (DATA_1), /*1*/  
  133.                                 (DATA_2), /*2*/  
  134.                                 (DATA_3), /*3*/  
  135.                                 (DATA_4), /*4*/  
  136.                                 (DATA_5), /*5*/  
  137.                                 (DATA_6), /*6*/  
  138.                                 (DATA_7), /*7*/  
  139.                                 (DATA_8), /*8*/  
  140.                                 (DATA_9)  /*9*/  
  141.                             };  
  142.   
  143.   
  144.   
  145. /***********************************************************************************************************************
  146. *                                     按键值定义                                                      
  147. *
  148. *    此处定义按键的值,可根据不同平台需要修改此值。
  149. ***********************************************************************************************************************/  
  150. #define STB_KEY_MENU    0x01   
  151. #define STB_KEY_OK         0x02   
  152. #define STB_KEY_UP         0x04   
  153. #define STB_KEY_DOWN   0x08   
  154. #define STB_KEY_LEFT     0x10   
  155. #define STB_KEY_RIGHT   0x20   
  156. #define STB_KEY_EXIT     0x40   
  157. #define STB_KEY_NULL     0x00   
  158.   
  159.   
  160.   
  161. /***********************************************************************************************************************
  162. *                                    函数声明
  163. ***********************************************************************************************************************/  
  164. /*接口函数*/  
  165. void    fp_ct1642_manage(void);                                           /*面板管理函数*/  
  166. void    fp_led_data_translate(INT8U LedNum);                            /*频道号码转换函数*/  
  167. void    fp_led_string_translate(INT8U LedString);                          /*显示字符转换函数*/  
  168. void    fp_led_display_off(void);                                             /*关闭显示函数*/  
  169. void    fp_lock_led_on(void);                                                                      /*打开信号锁定灯*/  
  170. void    fp_lock_led_off(void);                                                                      /*关闭信号锁定灯*/  
  171.   
  172. /*内部函数*/  
  173. static void     fp_led_scan(INT8U v_position);                             /*LED扫描管理函数*/  
  174. static void     fp_send_bit_data(INT8U v_character, INT8U v_position);  /*发送1位LED数码管数据函数*/  
  175. static INT8U  fp_key_scan(void);                                           /*键盘扫描管理函数*/  

  176. /***********************************************************************************************************************
  177. *函数名称:fp_ct1642_manage()
  178. *功能说明:CT1642方案面板管理函数
  179. *输入参数:NULL
  180. *返回参数:NULL
  181. *函数功能:该函数为CT1642方案前面板驱动程序接口函数,定义其为系统定时调用的函数,来实现LED数码管的动态显示和按键扫描。
  182. *          3位数码管5ms调用一次;4位数码管4ms调用一次,还需将fp_key_scan()返回的按键值v_KeyValue回传给系统。         
  183. ***********************************************************************************************************************/  
  184. void  fp_ct1642_manage(void)  
  185. {  
  186.        static  INT8U  v_led_position = 0;      /*面板管理控制变量*/  
  187.     INT8U v_KeyValue;  
  188.     if(LED_BIT_COUNT==v_led_position)    /*按键扫描*/  
  189.       {  
  190.           v_KeyValue = fp_key_scan();  
  191.           v_led_position=0;  
  192.       }  
  193.     else                                                    /*LED扫描*/  
  194.      {  
  195.           fp_led_scan(v_led_position);  
  196.           v_led_position++;  
  197.      }  
  198.     return;  
  199. }  
  200.   
  201.   
  202.   
  203. /***********************************************************************************************************************
  204. *函数名称:fp_led_data_translate()
  205. *功能说明:频道号码转换函数
  206. *输入参数:ChannelNumber
  207. *返回参数:NULL
  208. *函数功能:该函数为CT1642方案前面板驱动程序接口函数,当频道号码有变化时,由系统调用该函数来进行更新。ChannelNumber为传入
  209. *          的频道号码,经过转换后把相应的显示代码存储在数组v_LedCode[]当中。
  210. ***********************************************************************************************************************/  
  211. void fp_led_data_translate(INT8U ChannelNumber)  
  212. {  
  213.     INT8U v_LedData[LED_BIT_COUNT];  
  214.       
  215.     #if(LED_BIT_COUNT==3)                                     /*显示000*/  
  216.         if(ChannelNumber>999)  
  217.             ChannelNumber=999;  
  218.         v_LedData[0]=ChannelNumber/100;             /*百位数据*/  
  219.         v_LedData[1]=(ChannelNumber/10)%10;      /*十位数据*/  
  220.         v_LedData[2]=ChannelNumber%10;              /*个位数据*/  
  221.         v_LedCode[0]=fp_LedCode[v_LedData[0]];  
  222.         v_LedCode[1]=fp_LedCode[v_LedData[1]];  
  223.         v_LedCode[2]=fp_LedCode[v_LedData[2]];   
  224.     #else                                                                   /*显示C000*/  
  225.         if(ChannelNumber>999)  
  226.             ChannelNumber=999;        
  227.         v_LedData[1]=(ChannelNumber/100);           /*百位数据*/  
  228.         v_LedData[2]=(ChannelNumber/10)%10;      /*十位数据*/  
  229.         v_LedData[3]=ChannelNumber%10;              /*个位数据*/  
  230.         v_LedCode[0]=(INT8U)DATA_C;  
  231.         v_LedCode[1]=fp_LedCode[v_LedData[1]];  
  232.         v_LedCode[2]=fp_LedCode[v_LedData[2]];  
  233.         v_LedCode[3]=fp_LedCode[v_LedData[3]];   
  234.     #endif  
  235.     return;  
  236. }  
  237.   
  238.   
  239.   
  240. /***********************************************************************************************************************
  241. *函数名称:fp_led_string_translate()
  242. *功能说明:字符串转换函数
  243. *输入参数:LedString
  244. *返回参数:NULL
  245. *函数功能:该函数为CT1642方案前面板驱动程序接口函数,当需要显示字符时,由系统调用该函数修改数组v_LedCode[]内容,然后通
  246. *          过fp_ct1642_manage()来实现字符显示。
  247. ***********************************************************************************************************************/  
  248. void fp_led_string_translate(INT8U LedString)  
  249. {  
  250.     switch(LedString)  
  251.         {  
  252.             case LED_ON:  
  253.                     {  
  254.                         v_LedCode[0]=(INT8U)(DATA_DARK);  
  255.                         v_LedCode[1]=(INT8U)(DATA_0);  
  256.                         v_LedCode[2]=(INT8U)(DATA_n);  
  257.                         #if(LED_BIT_COUNT==4)  
  258.                             v_LedCode[3]=(INT8U)(DATA_DARK);  
  259.                         #endif                        
  260.                         break;  
  261.                     }  
  262.               
  263.             case LED_OFF:  
  264.                     {                        
  265.                         v_LedCode[0]=(INT8U)(DATA_0);  
  266.                         v_LedCode[1]=(INT8U)(DATA_F);  
  267.                         v_LedCode[2]=(INT8U)(DATA_F);  
  268.                         #if(LED_BIT_COUNT==4)  
  269.                             v_LedCode[3]=(INT8U)(DATA_DARK);  
  270.                         #endif                        
  271.                         break;  
  272.                     }  
  273.               
  274.             #if(LED_BIT_COUNT==4)  
  275.             case LED_BOOT:  
  276.                     {  
  277.                         v_LedCode[0]=(INT8U)(DATA_b);                        
  278.                         v_LedCode[1]=(INT8U)(DATA_o);  
  279.                         v_LedCode[2]=(INT8U)(DATA_o);  
  280.                         v_LedCode[3]=(INT8U)(DATA_t);  
  281.                         break;  
  282.                     }  
  283.             #endif  
  284.   
  285.             case PANEL_OFF:  
  286.                        {  
  287.                         v_LedCode[0]=(INT8U)(DATA_DARK);                          
  288.                         v_LedCode[1]=(INT8U)(DATA_DARK);  
  289.                         v_LedCode[2]=(INT8U)(DATA_DARK);  
  290.                         #if(LED_BIT_COUNT==4)  
  291.                             v_LedCode[3]=(INT8U)(DATA_DARK);  
  292.                         #endif  
  293.                        }  
  294.               
  295.             default:  
  296.                     {  
  297.                         v_LedCode[0]=(INT8U)(DATA_DARK);  
  298.                         v_LedCode[1]=(INT8U)(DATA_DARK);  
  299.                         v_LedCode[2]=(INT8U)(DATA_DARK);  
  300.                         v_LedCode[3]=(INT8U)(DATA_DARK);  
  301.                         break;  
  302.                     }  
  303.         }  
  304.         return;  
  305. }  
  306.   
  307.   
  308.   
  309. /***********************************************************************************************************************
  310. *函数名称:fp_led_scan()
  311. *功能说明:LED显示管理函数
  312. *输入参数:v_position
  313. *返回参数:NULL
  314. *函数功能:该函数实现LED数码管的扫描管理,当前的工作只是简单的传值给fp_send_bit_data()来实现动态扫描显示,也可以修改这个
  315. *          函数来实现更多的功能,比如把频道号转换函数和字符串转换函数放在这个函数中来调用等,举例如下:
  316. *          INT8U v_DisValue=0;
  317. *          INT8U v_DisControl=0;
  318. *          static void fp_led_scan(INT8U v_position)
  319. *          {
  320. *             if(v_DisControl==0)
  321. *               {
  322. *                  fp_led_data_translate(v_DisValue);
  323. *               }
  324. *              else
  325. *               {
  326. *                 fp_led_string_translate(v_DisValue);
  327. *               }
  328. *              fp_send_bit_data(v_LedCode[v_position],v_position);
  329. *              return;
  330. *          }
  331. ***********************************************************************************************************************/  
  332. static void fp_led_scan(INT8U v_position)  
  333. {  
  334.     fp_send_bit_data(v_LedCode[v_position],v_position);  
  335.     return;  
  336. }  
  337.   
  338.   
  339.   
  340. /***********************************************************************************************************************
  341. *函数名称:fp_led_display_off()
  342. *功能说明:关闭LED数码管显示函数
  343. *输入参数:NULL
  344. *返回参数:NULL
  345. *函数功能:该函数为CT1642方案前面板驱动程序接口函数,用来实现LED数码管的熄灭。
  346. ***********************************************************************************************************************/  
  347. static void fp_led_display_off(void)  
  348. {  
  349.        fp_led_string_translate((INT8U)PANEL_OFF);  
  350.     fp_send_bit_data(0x00, 0x04);  
  351.     return;  
  352. }  
  353.   
  354.   
  355.   
  356. /***********************************************************************************************************************
  357. *函数名称:fp_send_bit_data()
  358. *功能说明:CT1642数据发送函数
  359. *输入参数:v_character, v_position
  360. *返回参数:NULL
  361. *函数功能:该函数负责把1位LED数码管显示代码发送到CT1642当中,并显示出来,也即串并转换。
  362. ***********************************************************************************************************************/  
  363. static void fp_send_bit_data(INT8U v_character, INT8U v_position)  
  364. {  
  365.     INT8U BitPosition ;                               /*存储数码管位置编码*/  
  366.     INT8U BitCharacter = v_character;     /*存储数码管显示编码*/  
  367.     INT8U i;  
  368.     switch(v_position)  
  369.         {  
  370.             case 0: {BitPosition=0xef; BitCharacter|=0x01; break;}                         /*显示第千位数据,BitCharacter|=0x01是点亮  */  
  371.                                                                              /*电源指示灯D1,有一个缺点是要等系统从Flash */  
  372.                                                                              /*拷贝到内存当中,才会点亮,而不是一按下电 */  
  373.                                                                              /*源开关就点亮,对维修可能造成影响         */  
  374.             case 1: {BitPosition=0xdf; if(v_lock==1){BitCharacter|=0x01;} break;} /*显示第百位数据,v_lock是信号锁定标志位,为*/  
  375.                                                                              /*1时信号灯D2点亮,为0时信号灯不亮     */  
  376.             case 2: {BitPosition=0xbf; break;}                                                         /*显示第十位数据                           */  
  377.             case 3: {BitPosition=0x7f; break;}                                                         /*显示第个位数据                           */  
  378.             case 4: {BitPosition=0xff; break;}                                                         /*关闭显示,用于键盘扫描                   */  
  379.             default:{BitPosition=0xff; BitCharacter=0x00;}                                       /*默认不显示                               */  
  380.         }  
  381.   
  382.     for(i=0;i<8;i++)                   /*发送8位地址*/  
  383.         {  
  384.             GPIO_CLOCK_SET(FALSE);  
  385.             if( (BitPosition<<i)&0x80)  
  386.                 {  
  387.                     GPIO_DATA_SET(TRUE);  
  388.                 }  
  389.             else  
  390.                 {  
  391.                     GPIO_DATA_SET(FALSE);  
  392.                 }  
  393.             GPIO_CLOCK_SET(TRUE);  
  394.         }     
  395.       
  396.     GPIO_DATA_SET(FALSE);      /*发送两个空位*/  
  397.     GPIO_CLOCK_SET(FALSE);  
  398.     GPIO_CLOCK_SET(TRUE);  
  399.       
  400.     GPIO_DATA_SET(FALSE);  
  401.     GPIO_CLOCK_SET(FALSE);  
  402.     GPIO_CLOCK_SET(TRUE);  
  403.       
  404.     for(i=0;i<8;i++)                    /*发送8位数据*/  
  405.         {  
  406.             GPIO_CLOCK_SET(FALSE);  
  407.             if( (BitCharacter<<i) & 0x80)  
  408.                 {  
  409.                     GPIO_DATA_SET(TRUE);  
  410.                 }  
  411.             else  
  412.                 {  
  413.                     GPIO_DATA_SET(FALSE);  
  414.                 }  
  415.             GPIO_CLOCK_SET(TRUE);  
  416.         }  
  417.   
  418.     GPIO_CLOCK_SET(TRUE);            /*输出数据*/  
  419.     GPIO_DATA_SET(FALSE);  
  420.     GPIO_DATA_SET(TRUE);  
  421.       
  422.     GPIO_CLOCK_SET(FALSE);  
  423.     GPIO_DATA_SET(FALSE);  
  424.     GPIO_DATA_SET(TRUE);  
  425.     return;  
  426. }  
  427.   
  428.   
  429.   
  430. /***********************************************************************************************************************
  431. *函数名称:fp_key_scan()
  432. *功能说明:按键管理函数
  433. *输入参数:NULL
  434. *返回参数:nKeyPress
  435. *函数功能:该函数负责实现按键扫描,当有键按下时,返回按键值,否则返回STB_KEY_NULL。
  436. ***********************************************************************************************************************/  
  437. static INT8U fp_key_scan(void)  
  438. {  
  439.     INT8U i;  
  440.     INT8U nKeyPress = 0;                     /*当前按键状态值*/  
  441.     static INT8U pKeyPress = 0;          /*前一按键状态值*/  
  442.     static INT8U KeyCount = 0;               /*循环按键值*/  
  443.     INT8U const v_KeyCode[9] =                    /*定义按键顺序*/  
  444.                                 {   
  445.             /*与Q9连接的按键*/    STB_KEY_MENU,     
  446.             /*与Q8连接的按键*/    STB_KEY_OK,        
  447.             /*与Q7连接的按键*/    STB_KEY_UP,         
  448.             /*与Q6连接的按键*/    STB_KEY_DOWN,   
  449.             /*与Q5连接的按键*/    STB_KEY_LEFT,      
  450.             /*与Q4连接的按键*/    STB_KEY_RIGHT,   
  451.             /*与Q3连接的按键*/    STB_KEY_LEFT,      
  452.             /*与Q2连接的按键*/    STB_KEY_EXIT,      
  453.             /*查询不到的按键*/ STB_KEY_NULL      
  454.                              };  
  455.       
  456.     fp_send_bit_data(0xff,0x04);   
  457.     GPIO_KEY_GET(nKeyPress);                                 /*读取引脚KEY的电平值*/  
  458.       
  459.     if((1==nKeyPress)&&(0==pKeyPress))                       /*有按键按下*/  
  460.         {  
  461.             for(i=0;i<8;i++)                                              /*查询按键值*/  
  462.                 {  
  463.                     fp_send_bit_data(1<<i,0x04);  
  464.                     GPIO_KEY_GET(nKeyPress);   
  465.                     if(1==nKeyPress)  
  466.                         {  
  467.                             pKeyPress=1;  
  468.                             nKeyPress=v_KeyCode[i];  
  469.                             return nKeyPress;  
  470.                         }            
  471.                 }  
  472.             return (INT8U)STB_KEY_NULL;  
  473.         }  
  474.       
  475.     else if((1==nKeyPress)&&(1==pKeyPress))                       /*有按键长按不放*/  
  476.         {  
  477.                KeyCount++;                                       /*长按住不放时,做连续按键处理*/  
  478.             if(KeyCount==0x10)                               /*首次按下延时较长,KeyCount从0加到0x10,再从0x90加到0xaf*/  
  479.                 {  
  480.                     KeyCount=0x90;  
  481.                 }  
  482.             else if(KeyCount==0xaf)                          /*以后每次较短,KeyCount从0x90加到0xaf*/  
  483.                 {  
  484.                     KeyCount=0x90;  
  485.                     pKeyPress=0;  
  486.                 }  
  487.             return (INT8U)STB_KEY_NULL;  
  488.         }  
  489.       
  490.     else if((0==nKeyPress)&&(1==pKeyPress))                   /*有按键松开*/  
  491.         {  
  492.             pKeyPress=0;  
  493.             KeyCount=0;  
  494.             return (INT8U)STB_KEY_NULL;  
  495.         }  
  496.       
  497.     else                                                         /*没有按键按下*/  
  498.         {  
  499.             return (INT8U)STB_KEY_NULL;  
  500.         }  
  501. }  
  502.   
  503.   
  504.   
  505. /***********************************************************************************************************************
  506. *函数名称:fp_lock_led_on()
  507. *功能说明:打开信号锁定灯函数
  508. *输入参数:NULL
  509. *返回参数:NULL
  510. *函数功能:该函数负责打开信号锁定灯
  511. ***********************************************************************************************************************/  
  512. void    fp_lock_led_on(void)  
  513. {  
  514.     v_lock=1;  
  515.     return;  
  516. }  
  517.   
  518.   
  519.   
  520. /***********************************************************************************************************************
  521. *函数名称:fp_lock_led_off()
  522. *功能说明:关闭信号锁定灯函数
  523. *输入参数:NULL
  524. *返回参数:NULL
  525. *函数功能:该函数负责实现关闭信号锁定灯
  526. ***********************************************************************************************************************/  
  527. void    fp_lock_led_off(void)  
  528. {  
  529.     v_lock=0;  
  530.     return;  
  531. }   
  532. /*********************************************************END***********************************************************/
复制代码注:以上转载于网络,如有侵权请告知
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。