/***********************************************************************************************************************
*
* 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***********************************************************/
ct1642串转并芯片驱动(网摘未改动篇)
最新推荐文章于 2023-04-04 10:44:47 发布