⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wtc6506d32接口程序范例.txt

📁 触摸按键驱动程序及其芯片手册和设计电路图
💻 TXT
字号:
8051与WTC6506D32接口的典型操作程序

/*
项目描述:  
触摸与LED显示一体化的控制芯片WTC6506 4*8LED的DEMO板配套程序    
DEMO板功能:  
检测触摸芯片输出的信息,并向触摸芯片的显示缓冲区写入数据完成相应的显示
  MCU:	       AT89C51
  晶振频率:      12MHz          
  版本信息:      V1.0
*/                                         

#include		<reg51.h>
#include     <INTRINS.H>
#define		uchar 	unsigned char
#define		uint		unsigned int

#define		TIMER1_H	   0xFC		//1ms定时器初值				
#define		TIMER1_L	   0x17				

//--------------------------------主机和触摸芯片的接口---------------------------------------------
sbit		SDA	=	P1^1; 	   //数据线
sbit		SCLK	=	P1^0;      //时钟信号 
//------------------------------------the funtion define-------------------------------------
void 	init(void);			//89C51的初始化程序
void		delay_24us(void);		//延时程序(延时24us)

uchar	read_key_data(void);			 //读触摸按键信息
void		write_disp_buff(uchar ComDa,uchar SegDa);//向触摸芯片的显示缓冲区写入数据

void    disp_key_led(uchar KeyValue);
//------------------------------------the register define -----------------------------------                 

uchar		i,j;			//程序中使用的中间变量

uint		Counter1ms;		//timer1 每1ms中断一次对Counter1ms加1
uchar	KeyValue;		//从触摸芯片读取的按键信息
                        		//显示缓冲区
uchar		Com0DispData;		//需要COM0 显示的数据
uchar		Com1DispData;      //需要COM1 显示的数据
uchar		Com2DispData;      //需要COM2 显示的数据
uchar		Com3DispData;      //需要COM3 显示的数据
   
//------------------------------------------------------------------------------------------
// 主程序
//------------------------------------------------------------------------------------------
void main(void)
{
  init();           
  Counter1ms = 0;		                   
  do
  {
  } while(Counter1ms <= 100);	    //等待触摸芯片完成复位
  
  Com0DispData = 0xff;      		//关闭COM0的所有显示   
  Com1DispData = 0xff;          //关闭COM1的所有显示   
  Com2DispData = 0xff;          //关闭COM2的所有显示   
  Com3DispData = 0xff;          //关闭COM3的所有显示                   
  
  write_disp_buff(0,Com0DispData);	//
  write_disp_buff(1,Com1DispData);	//
  write_disp_buff(2,Com2DispData);	//
  write_disp_buff(3,Com3DispData);	//                           
    
  while(1)
  {   
        while(Counter1ms >= 15)	    //每15ms读一次键值,并完成显示 
        {
           Counter1ms = 0;			//15ms计数器归零
           
           KeyValue = read_key_data();	//读触摸按键的按键信息
           
           disp_key_led(KeyValue);		//操作触摸芯片显示相应的LED
  	    } 	
  }
}	

//------------------------------------------------------------------------------------------  
//功能:向触摸芯片的显示缓冲区写入要显示的内容    
//入口:1:ComDa 要写入的缓冲区地址
//      2:  SegDa 要写入的缓冲区数据 
//返值:无  
//------------------------------------------------------------------------------------------  
void	write_disp_buff(uchar ComDa,uchar SegDa)
{
   TR1 =0;
   i = 0;

   //-----------------------//发送SDA总线写数据的起始位----------  	
   SDA =0;			//起始位置0,表示要向触摸芯片的显示缓冲区写入数据
   SCLK = 0;		//产生串行时钟的下降延信号         
   delay_24us();   
   SCLK = 1;        //产生串行时钟的上升延信号        
   delay_24us();  

   //----------------------选择触摸芯片的显示缓冲区 COM口地址--------     
   i = 0;
   do
   {
   	   if((ComDa & 0x01) == 0) {SDA = 0;} //准备设置缓冲区地址
   	   else					  {SDA = 1;}   	
   	   SCLK = 0;				//产生串行时钟的下降延信号         
   	   delay_24us();   
   	   SCLK = 1;         		//产生串行时钟的上升延信号     
   	   delay_24us();  	
   	   ComDa >>= 1;
   	   i++;
   } 
   while(i <2); 				//设置两位缓冲区地址   
   
   //----------------------向触摸芯片的显示缓冲区的暂存buff写入数据 SEG-------     
   i = 0;
   do
   {
   	   if((SegDa & 0x01) == 0) {SDA = 0;} //准备写入SEG的数据
   	   else					 {SDA = 1;}   	
   	   SCLK = 0;				//产生串行时钟的下降延信号         
       delay_24us();   
   	   SCLK = 1;         		//产生串行时钟的上升延信号     
   	   delay_24us();  	
       SegDa >>= 1;
   	   i++;
   } 
   while(i <8); 		//写入8位数据
   //-------------产生结束脉冲,将串入暂存buff的内容送入显示缓冲区开始显示写入的数据      
    SDA = 1;			    //将SDA置为输入状态
SCLK = 0;				//产生串行时钟的下降延信号         
   delay_24us();   
   SCLK = 1;         		//产生串行时钟的上升延信号     
   delay_24us();  
   TR1 =1;
}

//------------------------------------------------------------------------------------------  
//功能:从触摸芯片读取触摸按键的信息    
//入口:无
//返值:从触摸芯片读取触摸按键的信息    
//------------------------------------------------------------------------------------------  
uchar	read_key_data(void)
{
   uchar  KeyValue;
   TR1 =0;
   i = 0;

   //-----------------------//发送SDA总线读数据的起始位----------  	
   SDA =1;	//SDA设置为输入状态,上拉电阻将SDA拉高置1,表示要从触摸芯片//读出触摸按键的按键信息
   SCLK = 0;				//产生串行时钟的下降延信号         
   delay_24us();   
   SCLK = 1;         		//产生串行时钟的上升延信号  
   delay_24us();  
   do
   {	
       
       KeyValue >>= 1;
       SCLK = 0;		//产生串行时钟的下降延信号
       delay_24us();
       if(SDA == 1)		//读取SDA上的数据
       {
          KeyValue |= 0x80;
       }
       else
       { 
       	  KeyValue &= 0x7F;
       }
       SCLK = 1;         	//产生串行时钟的上升延信号   
       delay_24us();   
       i++;
   }
   while(i < 8);		//读8bit数据
   //-----------------------//发送SDA总线恢复时钟脉冲   	
   SCLK = 0;			//产生串行时钟的下降延信号         
   delay_24us();   
   SCLK = 1;         		//产生串行时钟的上升延信号  
   delay_24us();  
   TR1 =1;
   return(KeyValue);			//返回读取的触摸按键信息
}

//------------------------------------------------------------------------------------------  
//功能:手指触摸按键时点亮被触摸按键上方的指示LED,手指从触摸按键上移开后熄灭相应按键上方的指示LED    
//入口:从触摸芯片读取到的按键信息
//返值:无
//------------------------------------------------------------------------------------------  
void	disp_key_led(uchar KeyValue)
{
      if((KeyValue & 0x01) != 0){Com0DispData &= 0xfe;}  //KEY0被按下用低电平点												//亮相应的LED      
      else			{Com0DispData |= 0x01;} 	//KEY0弹起	
      if((KeyValue & 0x02) != 0){Com0DispData &= 0xfd;} 	//KEY1被按下                                
      else			{Com0DispData |= 0x02;} 				//KEY1弹起	                         	           
      if((KeyValue & 0x04) != 0){Com0DispData &= 0xfb;} 	//KEY2被按下                                
      else			{Com0DispData |= 0x04;} 				//KEY2弹起	                         	           
      if((KeyValue & 0x08) != 0){Com0DispData &= 0xf7;} 	//KEY3被按下                              
      else			{Com0DispData |= 0x08;} 				//KEY3弹起	                         	           
      if((KeyValue & 0x10) != 0){Com0DispData &= 0xef;} 	//KEY4被按下                                  
      else			{Com0DispData |= 0x10;} 				//KEY4弹起	                         	           
      if((KeyValue & 0x20) != 0){Com0DispData &= 0xdf;} 	//KEY5被按下                                 
      else			{Com0DispData |= 0x20;} 				//KEY5弹起	                         	           

      write_disp_buff(0,Com0DispData);          		//指示LED用COM0显示
}                      
           
//------------------------------------------------------------------------------------------
void 	init(void)
{                                                                                            
  EA  = 1; 					//open the gloabe interrupt enable          
  EX0 = 0;					//disable expend 0 interrupt                
  EX1=1;                    //enable expend 1 interrupt for remote                                                                   
  ET0 = 1;                                                                                   
  ET1 = 1;                                                                                   
  ES =  0;                                                                                   
  //IT0 = 0;					//level tigger                              
  //IT1 = 0;					//level tigger                              
  IT0 = 1;					//edge tigger                               
  IT1 = 1;					//edge tigger                               
  //TMOD  &= 0xF0;                                                                           
  TMOD	= 0x11;				//timer0, timer1 work as 16 bit timer        
  TH0 = 0x00;                                                                                
  TL0 = 0x00;                                                                                
  TH1 = TIMER1_H;                                                                            
  TL1 = TIMER1_L;                                                                            
  TR0 = 0;                                                                                   
  TR1 = 1;    	               			//timer1 start work
                                                     	
}                                          

//------------------------------------------------------------------------------------------
void	delay_24us(void)
{
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();   
   _nop_();
   _nop_();
   _nop_();
   _nop_();      
   _nop_();
   _nop_();      
} 

//------------------------------------------------------------------------------------------
void   timer1(void) interrupt 3 using 0		//8051 的timer1中断服务程序
{
	TH1 = 0xFC;		//1ms定时器重新设置初值
  	TL1 = 0x17;
  	TR1 = 1;
  	Counter1ms++;		//1ms计数器加一
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -