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

📄 key920.c

📁 使用单片机pic16f877 控制 周立功7289芯片的键盘驱动 已在自己设计的电路板上实验成功!
💻 C
字号:
#include  <pic.h>

#define PORTBIT(add,bit)  ((unsigned)(&add)*8+(bit))

static bit CS_7289	@	PORTBIT(PORTC,5); 
static bit CLK_7289	@	PORTBIT(PORTC,4);     
static bit SDA_7289	@       PORTBIT(PORTD,3);  
static bit KEY_7289	@	PORTBIT(PORTD,2);
static bit led2		@	PORTBIT(PORTC,1);
static bit led1		@	PORTBIT(PORTC,2);

long int i,sum;

void Port_Init_7289(void);
void CS_7289_Enable(void);
void CS_7289_Disable(void);
void CLK_7289_HI(void);
void CLK_7289_LO(void);
void delay_short(void);
void delay_long(void);

void KEY_Reset(void);
void KEY_cmd(char cmd);
void data_write_7289(char);
char read_key(void);
char KEY_value(void);


void Port_Init_7289(void)
{
      TRISC = 0X00;		//
      return;
}

void CS_7289_Enable(void)
{
    CS_7289 = 1;                  //cs(p6.4)口置1
    return;
}

void CS_7289_Disable(void)
{
    CS_7289 = 0;               //cs口置0
    return;
}

void CLK_7289_HI(void)
{
    CLK_7289 = 1;                 //时钟置高(1)
    return;
}

void CLK_7289_LO(void)
{
    CLK_7289 = 0;              //时钟置低(0)
    return;
}

void delay_short(void)
{
  int t;
  for(t=0;t<10;t++);
}

void delay_long(void)
{
  int t;
  for(t=0;t<80;t++);
}

/*复位(清除)函数 */
void KEY_Reset(void)
{
    KEY_cmd(0xA4);
}

/* 
函数:KEY_cmd() 
功能:执行ZLG7289纯指令
参数: 
 cmd:命令字 
*/ 
void KEY_cmd(char cmd)
{
    CS_7289_Disable();
    delay_long();
    data_write_7289(cmd);
    CS_7289_Enable();
    delay_long();
}

/*函数:data_write_7289() 
功能:向SPI总线写入1个字节的数据 
参数: 
 nVal:要写入的数据 
*/ 
void data_write_7289(char nVal)      //   写指令和写数据函数
{
  char j;
  char nTemp = nVal;
  char nSend;
  TRISD = 0X00;            // 设置SDA为输出管脚,KEY为输入
  NOP();
  NOP();
  NOP();
  NOP();
  for(j=0;j<8;j++)
  {
    nSend = (nTemp & 0x80);
    if(nSend == 0x80)
    {
        SDA_7289 = 1;
    }
    else
    {
        SDA_7289 = 0; 
    }
    nTemp<<=1;                        //左移一位
    CLK_7289_HI();
    delay_short();
    CLK_7289_LO();              
    delay_short();
  }
}

/* 
函数:read_key() 
功能:从SPI总线读取1个字节的数据 
返回: 
  读取到的数据 
*/ 
char read_key()
{
  char j;
  char nTemp = 0;
  TRISD = 0X08;            //设置SDA为输入管脚
  NOP();
  NOP();
  NOP();
  NOP();
  for(j=0;j<8;j++)
  {
    CLK_7289_HI();
    nTemp = nTemp<<1;            
    if(SDA_7289)
      nTemp = nTemp + 1;           
    delay_short();                  
    CLK_7289_LO();                
    delay_short();                 
    delay_short();               
  }                             
  return(nTemp);             
}

//读取键值
char KEY_value(void)
{   
    char keyvalue;
    CS_7289_Disable();
    delay_long();
    data_write_7289(0x15);
    delay_long();
    keyvalue = read_key();
    CS_7289_Enable();
    delay_short();
    return keyvalue;
}


void main( void )
{
//	WDTCTL = WDTPW + WDTHOLD;   //关看门狗
	unsigned char tst = 0xff;
	led2 = 0;
	led1 = 1;
 	Port_Init_7289();
  	KEY_Reset();
  
	while(1)
	{
		TRISD = 0X04;                //识别键值
		KEY_7289 = 1;
		delay_short();
		if(KEY_7289 == 0)
		{
			tst = KEY_value();
			switch(tst)
			{
				case 0:	led2 = 1;
				break;
				case 1:	led2 = 0;
				break;
				default:	break;
			}
			KEY_7289 = 1;	
		}
	}
}

⌨️ 快捷键说明

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