ct1642串转并芯片驱动(网摘未改动篇)

/***********************************************************************************************************************
*
*                                  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***********************************************************/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值