今天打开自家的卫星接收天线,看到4个数码管1个led 6个按键用了一个芯片驱动,因此因为好奇吧,就查了一下CT1642的资料。在翻阅资料的时候发现有很多公司用CT1642替代74HC164
CT1642是16pin的芯片,下面贴出在网上找的资料,在此占用一下阿莫的空间存储一下 资料以备后用,希望阿莫不要删除哦
废话少说上图
- /***********************************************************************************************************************
- *
- * CT1642 Driver 2.2-----The C source file
- *
- * 本文件为CT1642的参考驱动程序。
- * 此驱动有9个函数组成,其中6个为接口函数,介绍如下:
- *
- * 1、fp_ct1642_manage()----此函数为面板管理函数,一般通过TASK来不断的调用它,完成LED的动态扫描和按键扫描。一般情况下,
- *4位数码管需要4ms调用一次,3位数码管需要5ms调用一次。如果显示效果不佳,可将调用间隔时间减小1ms.
- *
- * 2、fp_led_data_translate()----此函数是频道转换函数,将8位整型数据转换成相应的显示代码,一般在频道更新、重新显示频道
- *频道时调用,转换内容存取在全局变量v_LedCode[]当中,供函数fp_ct1642_manage()管理。
- *
- * 3、fp_led_string_translate()----此函数是字符转换函数,将预先定义的"字符显示编码"传送给该函数,函数根据显示代码的不同给
- *全局变量v_LedCode[]赋予相应的值,供函数fp_ct1642_manage()管理。
- *
- * 4、fp_led_display_off()----关闭面板显示函数。
- *
- * 5、fp_lock_led_on()----打开信号锁定灯函数。
- *
- * 6、fp_lock_led_off()----关闭信号锁定灯函数。
- *
- *
- * 修改参考步骤:
- * 1、修改"硬件资源操作定义"的常量LED_BIT_COUNT定义,确定LED数码管的位数。
- *
- * 2、完成"硬件资源操作定义"的宏GPIO_CLOCK_SET(val)、GPIO_DATA_SET(val)、GPIO_KEY_GET(val)。
- *
- * 3、修改"全局变量定义"的INT8U,确保INT8U为8位无符号整型。
- *
- * 4、确定调用函数fp_led_data_translate()位置,完成频道到显示代码的转换。
- *
- * 5、确定调用函数fp_led_string_translate()位置,完成显示字符到显示代码的转换。
- *
- * 6、制作一个TASK,按要求调用fp_ct1642_manage(),并将得到的按键值v_KeyValue传回给系统。
- *
- ***********************************************************************************************************************/
-
-
-
- /***********************************************************************************************************************
- * 数码管连接定义
- *
- * 此处定义数码管引脚(A、B、C、D、E、F、G、H)与CT1642引脚(Q2、Q3、Q4、Q5、Q6、Q7、Q8、Q9)的连接,需要根据不同的硬件电
- *路做相应的修改,主要修改0-7这8个数字的顺序。使用我们公司的DEMO板此处不需要修改。
- ***********************************************************************************************************************/
- #define BIT_A (1<<7) /* A Q2对应7, 此行表示Q2接数码管A*/
- #define BIT_B (1<<6) /* ------- Q3对应6, 此行表示Q3接数码管B*/
- #define BIT_C (1<<5) /* | | Q4对应6, 此行表示Q4接数码管C*/
- #define BIT_D (1<<4) /* F | | B Q5对应4, 此行表示Q5接数码管D*/
- #define BIT_E (1<<3) /* ---G--- Q6对应3, 此行表示Q6接数码管E*/
- #define BIT_F (1<<2) /* | | C Q7对应2, 此行表示Q7接数码管F*/
- #define BIT_G (1<<1) /* E | | Q8对应1, 此行表示Q8接数码管G*/
- #define BIT_P (1<<0) /* ---D--- P Q9对应0, 此行表示Q9接数码管P*/
-
-
-
- /***********************************************************************************************************************
- * 数码管显示代码定义
- *
- * 此处定义LED数码管显示代码,适用于共阴极数码管,不需要修改。
- ***********************************************************************************************************************/
- #define DATA_0 BIT_A|BIT_B|BIT_C|BIT_D|BIT_E|BIT_F
- #define DATA_1 BIT_B|BIT_C
- #define DATA_2 BIT_A|BIT_B|BIT_D|BIT_E|BIT_G
- #define DATA_3 BIT_A|BIT_B|BIT_C|BIT_D|BIT_G
- #define DATA_4 BIT_B|BIT_C|BIT_F|BIT_G
- #define DATA_5 BIT_A|BIT_C|BIT_D|BIT_F|BIT_G
- #define DATA_6 BIT_A|BIT_C|BIT_D|BIT_E|BIT_F|BIT_G
- #define DATA_7 BIT_A|BIT_B|BIT_C
- #define DATA_8 BIT_A|BIT_B|BIT_C|BIT_D|BIT_E|BIT_F|BIT_G
- #define DATA_9 BIT_A|BIT_B|BIT_C|BIT_D|BIT_F|BIT_G
- #define DATA_A BIT_A|BIT_B|BIT_C|BIT_E|BIT_F|BIT_G
- #define DATA_b BIT_C|BIT_D|BIT_E|BIT_F|BIT_G
- #define DATA_C BIT_A|BIT_D|BIT_E|BIT_F
- #define DATA_F BIT_A|BIT_E|BIT_F|BIT_G
- #define DATA_I BIT_E|BIT_F
- #define DATA_i BIT_E
- #define DATA_n BIT_A|BIT_B|BIT_C|BIT_E|BIT_F
- #define DATA_o BIT_C|BIT_D|BIT_E|BIT_G
- #define DATA_t BIT_D|BIT_E|BIT_F|BIT_G
- #define DATA_e BIT_A|BIT_D|BIT_E|BIT_F|BIT_G
- #define DATA_u BIT_B|BIT_C|BIT_D|BIT_E|BIT_F
- #define DATA_DARK 0x00
- #define DATA_E BIT_A|BIT_D|BIT_E|BIT_F|BIT_G
- #define DATA_P BIT_A|BIT_B|BIT_E|BIT_F|BIT_G
-
-
-
- /***********************************************************************************************************************
- * 字符显示编码定义
- *
- * 此处定义LED数码管字符显示编码,可根据需要增加相应内容,并在函数fp_led_string_translate()增加相应实现。
- ***********************************************************************************************************************/
- /*定义字符串显示字符编码*/
- #define LED_ON 0x01
- #define LED_OFF 0x02
- #define LED_BOOT 0x04
- #define PANEL_OFF 0x08
-
-
-
- /***********************************************************************************************************************
- * 硬件资源操作定义
- *
- * 此处定义CT1642使用的资源操作,需根据不同平台做相应修改
- ***********************************************************************************************************************/
- /*定义LED 数码管的位数,本驱动只实现3位和4位的操作,所以LED_BIT_COUNT的值只能是3或4*/
- #define LED_BIT_COUNT 4
-
- /*定义端口CLOCK操作,当val为TRUE时,CLOCK端口置1;当val为FALSE时,CLOCK端口置0*/
- #define GPIO_CLOCK_SET(val)
-
- /*定义端口DATA操作,当val为TRUE时,DATA端口置1;当val为FALSE时,DATA端口置0*/
- #define GPIO_DATA_SET(val)
-
- /*定义获取端口KEY电平操作,当端口KEY为高电平时,val=1;当端口KEY为低电平时,val=0*/
- #define GPIO_KEY_GET(val)
-
-
-
-
- /***********************************************************************************************************************
- * 全局变量定义
- ***********************************************************************************************************************/
- typedef unsigned char INT8U; /*类型定义,请根据平台进行修改,确保INT8U为无符号8位整型数据*/
- static INT8U v_lock=0; /*信号锁定指示灯控制标志,1打开,0关闭*/
- static INT8U v_LedCode[LED_BIT_COUNT]; /*存储LED显示显示代码*/
- static const INT8U fp_LedCode[10]= /*LED显示编码,用于查表*/
- {
- (DATA_0), /*0*/
- (DATA_1), /*1*/
- (DATA_2), /*2*/
- (DATA_3), /*3*/
- (DATA_4), /*4*/
- (DATA_5), /*5*/
- (DATA_6), /*6*/
- (DATA_7), /*7*/
- (DATA_8), /*8*/
- (DATA_9) /*9*/
- };
-
-
-
- /***********************************************************************************************************************
- * 按键值定义
- *
- * 此处定义按键的值,可根据不同平台需要修改此值。
- ***********************************************************************************************************************/
- #define STB_KEY_MENU 0x01
- #define STB_KEY_OK 0x02
- #define STB_KEY_UP 0x04
- #define STB_KEY_DOWN 0x08
- #define STB_KEY_LEFT 0x10
- #define STB_KEY_RIGHT 0x20
- #define STB_KEY_EXIT 0x40
- #define STB_KEY_NULL 0x00
-
-
-
- /***********************************************************************************************************************
- * 函数声明
- ***********************************************************************************************************************/
- /*接口函数*/
- void fp_ct1642_manage(void); /*面板管理函数*/
- void fp_led_data_translate(INT8U LedNum); /*频道号码转换函数*/
- void fp_led_string_translate(INT8U LedString); /*显示字符转换函数*/
- void fp_led_display_off(void); /*关闭显示函数*/
- void fp_lock_led_on(void); /*打开信号锁定灯*/
- void fp_lock_led_off(void); /*关闭信号锁定灯*/
-
- /*内部函数*/
- static void fp_led_scan(INT8U v_position); /*LED扫描管理函数*/
- static void fp_send_bit_data(INT8U v_character, INT8U v_position); /*发送1位LED数码管数据函数*/
- static INT8U fp_key_scan(void); /*键盘扫描管理函数*/
- /***********************************************************************************************************************
- *函数名称:fp_ct1642_manage()
- *功能说明:CT1642方案面板管理函数
- *输入参数:NULL
- *返回参数:NULL
- *函数功能:该函数为CT1642方案前面板驱动程序接口函数,定义其为系统定时调用的函数,来实现LED数码管的动态显示和按键扫描。
- * 3位数码管5ms调用一次;4位数码管4ms调用一次,还需将fp_key_scan()返回的按键值v_KeyValue回传给系统。
- ***********************************************************************************************************************/
- void fp_ct1642_manage(void)
- {
- static INT8U v_led_position = 0; /*面板管理控制变量*/
- INT8U v_KeyValue;
- if(LED_BIT_COUNT==v_led_position) /*按键扫描*/
- {
- v_KeyValue = fp_key_scan();
- v_led_position=0;
- }
- else /*LED扫描*/
- {
- fp_led_scan(v_led_position);
- v_led_position++;
- }
- return;
- }
-
-
-
- /***********************************************************************************************************************
- *函数名称:fp_led_data_translate()
- *功能说明:频道号码转换函数
- *输入参数:ChannelNumber
- *返回参数:NULL
- *函数功能:该函数为CT1642方案前面板驱动程序接口函数,当频道号码有变化时,由系统调用该函数来进行更新。ChannelNumber为传入
- * 的频道号码,经过转换后把相应的显示代码存储在数组v_LedCode[]当中。
- ***********************************************************************************************************************/
- void fp_led_data_translate(INT8U ChannelNumber)
- {
- INT8U v_LedData[LED_BIT_COUNT];
-
- #if(LED_BIT_COUNT==3) /*显示000*/
- if(ChannelNumber>999)
- ChannelNumber=999;
- v_LedData[0]=ChannelNumber/100; /*百位数据*/
- v_LedData[1]=(ChannelNumber/10)%10; /*十位数据*/
- v_LedData[2]=ChannelNumber%10; /*个位数据*/
- v_LedCode[0]=fp_LedCode[v_LedData[0]];
- v_LedCode[1]=fp_LedCode[v_LedData[1]];
- v_LedCode[2]=fp_LedCode[v_LedData[2]];
- #else /*显示C000*/
- if(ChannelNumber>999)
- ChannelNumber=999;
- v_LedData[1]=(ChannelNumber/100); /*百位数据*/
- v_LedData[2]=(ChannelNumber/10)%10; /*十位数据*/
- v_LedData[3]=ChannelNumber%10; /*个位数据*/
- v_LedCode[0]=(INT8U)DATA_C;
- v_LedCode[1]=fp_LedCode[v_LedData[1]];
- v_LedCode[2]=fp_LedCode[v_LedData[2]];
- v_LedCode[3]=fp_LedCode[v_LedData[3]];
- #endif
- return;
- }
-
-
-
- /***********************************************************************************************************************
- *函数名称:fp_led_string_translate()
- *功能说明:字符串转换函数
- *输入参数:LedString
- *返回参数:NULL
- *函数功能:该函数为CT1642方案前面板驱动程序接口函数,当需要显示字符时,由系统调用该函数修改数组v_LedCode[]内容,然后通
- * 过fp_ct1642_manage()来实现字符显示。
- ***********************************************************************************************************************/
- void fp_led_string_translate(INT8U LedString)
- {
- switch(LedString)
- {
- case LED_ON:
- {
- v_LedCode[0]=(INT8U)(DATA_DARK);
- v_LedCode[1]=(INT8U)(DATA_0);
- v_LedCode[2]=(INT8U)(DATA_n);
- #if(LED_BIT_COUNT==4)
- v_LedCode[3]=(INT8U)(DATA_DARK);
- #endif
- break;
- }
-
- case LED_OFF:
- {
- v_LedCode[0]=(INT8U)(DATA_0);
- v_LedCode[1]=(INT8U)(DATA_F);
- v_LedCode[2]=(INT8U)(DATA_F);
- #if(LED_BIT_COUNT==4)
- v_LedCode[3]=(INT8U)(DATA_DARK);
- #endif
- break;
- }
-
- #if(LED_BIT_COUNT==4)
- case LED_BOOT:
- {
- v_LedCode[0]=(INT8U)(DATA_b);
- v_LedCode[1]=(INT8U)(DATA_o);
- v_LedCode[2]=(INT8U)(DATA_o);
- v_LedCode[3]=(INT8U)(DATA_t);
- break;
- }
- #endif
-
- case PANEL_OFF:
- {
- v_LedCode[0]=(INT8U)(DATA_DARK);
- v_LedCode[1]=(INT8U)(DATA_DARK);
- v_LedCode[2]=(INT8U)(DATA_DARK);
- #if(LED_BIT_COUNT==4)
- v_LedCode[3]=(INT8U)(DATA_DARK);
- #endif
- }
-
- default:
- {
- v_LedCode[0]=(INT8U)(DATA_DARK);
- v_LedCode[1]=(INT8U)(DATA_DARK);
- v_LedCode[2]=(INT8U)(DATA_DARK);
- v_LedCode[3]=(INT8U)(DATA_DARK);
- break;
- }
- }
- return;
- }
-
-
-
- /***********************************************************************************************************************
- *函数名称:fp_led_scan()
- *功能说明:LED显示管理函数
- *输入参数:v_position
- *返回参数:NULL
- *函数功能:该函数实现LED数码管的扫描管理,当前的工作只是简单的传值给fp_send_bit_data()来实现动态扫描显示,也可以修改这个
- * 函数来实现更多的功能,比如把频道号转换函数和字符串转换函数放在这个函数中来调用等,举例如下:
- * INT8U v_DisValue=0;
- * INT8U v_DisControl=0;
- * static void fp_led_scan(INT8U v_position)
- * {
- * if(v_DisControl==0)
- * {
- * fp_led_data_translate(v_DisValue);
- * }
- * else
- * {
- * fp_led_string_translate(v_DisValue);
- * }
- * fp_send_bit_data(v_LedCode[v_position],v_position);
- * return;
- * }
- ***********************************************************************************************************************/
- static void fp_led_scan(INT8U v_position)
- {
- fp_send_bit_data(v_LedCode[v_position],v_position);
- return;
- }
-
-
-
- /***********************************************************************************************************************
- *函数名称:fp_led_display_off()
- *功能说明:关闭LED数码管显示函数
- *输入参数:NULL
- *返回参数:NULL
- *函数功能:该函数为CT1642方案前面板驱动程序接口函数,用来实现LED数码管的熄灭。
- ***********************************************************************************************************************/
- static void fp_led_display_off(void)
- {
- fp_led_string_translate((INT8U)PANEL_OFF);
- fp_send_bit_data(0x00, 0x04);
- return;
- }
-
-
-
- /***********************************************************************************************************************
- *函数名称:fp_send_bit_data()
- *功能说明:CT1642数据发送函数
- *输入参数:v_character, v_position
- *返回参数:NULL
- *函数功能:该函数负责把1位LED数码管显示代码发送到CT1642当中,并显示出来,也即串并转换。
- ***********************************************************************************************************************/
- static void fp_send_bit_data(INT8U v_character, INT8U v_position)
- {
- INT8U BitPosition ; /*存储数码管位置编码*/
- INT8U BitCharacter = v_character; /*存储数码管显示编码*/
- INT8U i;
- switch(v_position)
- {
- case 0: {BitPosition=0xef; BitCharacter|=0x01; break;} /*显示第千位数据,BitCharacter|=0x01是点亮 */
- /*电源指示灯D1,有一个缺点是要等系统从Flash */
- /*拷贝到内存当中,才会点亮,而不是一按下电 */
- /*源开关就点亮,对维修可能造成影响 */
- case 1: {BitPosition=0xdf; if(v_lock==1){BitCharacter|=0x01;} break;} /*显示第百位数据,v_lock是信号锁定标志位,为*/
- /*1时信号灯D2点亮,为0时信号灯不亮 */
- case 2: {BitPosition=0xbf; break;} /*显示第十位数据 */
- case 3: {BitPosition=0x7f; break;} /*显示第个位数据 */
- case 4: {BitPosition=0xff; break;} /*关闭显示,用于键盘扫描 */
- default:{BitPosition=0xff; BitCharacter=0x00;} /*默认不显示 */
- }
-
- for(i=0;i<8;i++) /*发送8位地址*/
- {
- GPIO_CLOCK_SET(FALSE);
- if( (BitPosition<<i)&0x80)
- {
- GPIO_DATA_SET(TRUE);
- }
- else
- {
- GPIO_DATA_SET(FALSE);
- }
- GPIO_CLOCK_SET(TRUE);
- }
-
- GPIO_DATA_SET(FALSE); /*发送两个空位*/
- GPIO_CLOCK_SET(FALSE);
- GPIO_CLOCK_SET(TRUE);
-
- GPIO_DATA_SET(FALSE);
- GPIO_CLOCK_SET(FALSE);
- GPIO_CLOCK_SET(TRUE);
-
- for(i=0;i<8;i++) /*发送8位数据*/
- {
- GPIO_CLOCK_SET(FALSE);
- if( (BitCharacter<<i) & 0x80)
- {
- GPIO_DATA_SET(TRUE);
- }
- else
- {
- GPIO_DATA_SET(FALSE);
- }
- GPIO_CLOCK_SET(TRUE);
- }
-
- GPIO_CLOCK_SET(TRUE); /*输出数据*/
- GPIO_DATA_SET(FALSE);
- GPIO_DATA_SET(TRUE);
-
- GPIO_CLOCK_SET(FALSE);
- GPIO_DATA_SET(FALSE);
- GPIO_DATA_SET(TRUE);
- return;
- }
-
-
-
- /***********************************************************************************************************************
- *函数名称:fp_key_scan()
- *功能说明:按键管理函数
- *输入参数:NULL
- *返回参数:nKeyPress
- *函数功能:该函数负责实现按键扫描,当有键按下时,返回按键值,否则返回STB_KEY_NULL。
- ***********************************************************************************************************************/
- static INT8U fp_key_scan(void)
- {
- INT8U i;
- INT8U nKeyPress = 0; /*当前按键状态值*/
- static INT8U pKeyPress = 0; /*前一按键状态值*/
- static INT8U KeyCount = 0; /*循环按键值*/
- INT8U const v_KeyCode[9] = /*定义按键顺序*/
- {
- /*与Q9连接的按键*/ STB_KEY_MENU,
- /*与Q8连接的按键*/ STB_KEY_OK,
- /*与Q7连接的按键*/ STB_KEY_UP,
- /*与Q6连接的按键*/ STB_KEY_DOWN,
- /*与Q5连接的按键*/ STB_KEY_LEFT,
- /*与Q4连接的按键*/ STB_KEY_RIGHT,
- /*与Q3连接的按键*/ STB_KEY_LEFT,
- /*与Q2连接的按键*/ STB_KEY_EXIT,
- /*查询不到的按键*/ STB_KEY_NULL
- };
-
- fp_send_bit_data(0xff,0x04);
- GPIO_KEY_GET(nKeyPress); /*读取引脚KEY的电平值*/
-
- if((1==nKeyPress)&&(0==pKeyPress)) /*有按键按下*/
- {
- for(i=0;i<8;i++) /*查询按键值*/
- {
- fp_send_bit_data(1<<i,0x04);
- GPIO_KEY_GET(nKeyPress);
- if(1==nKeyPress)
- {
- pKeyPress=1;
- nKeyPress=v_KeyCode[i];
- return nKeyPress;
- }
- }
- return (INT8U)STB_KEY_NULL;
- }
-
- else if((1==nKeyPress)&&(1==pKeyPress)) /*有按键长按不放*/
- {
- KeyCount++; /*长按住不放时,做连续按键处理*/
- if(KeyCount==0x10) /*首次按下延时较长,KeyCount从0加到0x10,再从0x90加到0xaf*/
- {
- KeyCount=0x90;
- }
- else if(KeyCount==0xaf) /*以后每次较短,KeyCount从0x90加到0xaf*/
- {
- KeyCount=0x90;
- pKeyPress=0;
- }
- return (INT8U)STB_KEY_NULL;
- }
-
- else if((0==nKeyPress)&&(1==pKeyPress)) /*有按键松开*/
- {
- pKeyPress=0;
- KeyCount=0;
- return (INT8U)STB_KEY_NULL;
- }
-
- else /*没有按键按下*/
- {
- return (INT8U)STB_KEY_NULL;
- }
- }
-
-
-
- /***********************************************************************************************************************
- *函数名称:fp_lock_led_on()
- *功能说明:打开信号锁定灯函数
- *输入参数:NULL
- *返回参数:NULL
- *函数功能:该函数负责打开信号锁定灯
- ***********************************************************************************************************************/
- void fp_lock_led_on(void)
- {
- v_lock=1;
- return;
- }
-
-
-
- /***********************************************************************************************************************
- *函数名称:fp_lock_led_off()
- *功能说明:关闭信号锁定灯函数
- *输入参数:NULL
- *返回参数:NULL
- *函数功能:该函数负责实现关闭信号锁定灯
- ***********************************************************************************************************************/
- void fp_lock_led_off(void)
- {
- v_lock=0;
- return;
- }
- /*********************************************************END***********************************************************/
复制代码注:以上转载于网络,如有侵权请告知
一周热门 更多>