关于stm32驱动7279键盘的问题

2019-03-23 20:20发布

#include <stm32f10x_lib.h>
#include "sys.h"
#include "delay.h"
#include "7279.h"
unsigned char Keynum;
/******************************************************************************
函数名:7279_WriteByte
输  入:dat:一个字节的数据
输  出:void
功  能:7279写入一个字节的数据
******************************************************************************/
static void HD7279_WriteByte(unsigned char dat)
{
unsigned char i;

HD7279_CS=0;   //7279片选开
HD7279_DAT_OUT;   //数据口设置为输出模式
delay_us(10);

for(i=0;i<8;i++)
{
  if(dat&0x80)
  {
   HD7279_DAT=1;
  }
  else
  {
   HD7279_DAT=0;
  }
  HD7279_CLK=1;
  dat = dat<<1;
  delay_us(10);
  HD7279_CLK=0;
  delay_us(10);
}
HD7279_DAT=0;
}

/******************************************************************************
函数名:7279_ReadByte
输  入:void
输  出:dat:读出的一个字节数据
功  能:从7279读出一个字节数据
******************************************************************************/
static unsigned char HD7279_ReadByte(void)
{
unsigned char dat=0,i;

HD7279_WriteByte(HD7279_CMD_READKEY);
HD7279_DAT=1;
HD7279_DAT_IN;   //数据口改为输入模式
HD7279_CLK=0;
delay_us(10);
for(i=0;i<8;i++)
{
  HD7279_CLK=1;
  delay_us(10);
  dat = dat << 1;
  if(HD7279_DAT_R)
  {
   dat = dat + 1;
  }
  HD7279_CLK=0;
  delay_us(10);
}
return dat;
}

/******************************************************************************
函数名:7279_Reset
输  入:void
输  出:void
功  能:复位7279
******************************************************************************/
void HD7279_Reset(void)
{
HD7279_WriteByte(HD7279_CMD_RESET);//复位指令
HD7279_CS=1;        
}
/******************************************************************************
函数名:7279_Init
输  入:void
输  出:void
功  能:7279初始化
******************************************************************************/
void HD7279_Init(void)
{
RCC->APB2ENR=1<<4;//使能时钟PORTC
GPIOC->CRH&=0XFF0000FF; //推挽输出PC10,11,12
GPIOC->CRH|=0X00433300; //PC13浮空输入
GPIOC->ODR=0X3C00;
Ex_NVIC_Config(GPIO_C,13,FTIR);//下降沿触发
MY_NVIC_Init(2,2,EXTI15_10_IRQChannel,2);//抢占2,子优先级2,组2
HD7279_CS=0;//使能HD7279
}
/******************************************************************************
函数名:7279_GetKeyVal
输  入:void
输  出:KeyValue:读出的键盘编号
功  能:从7279读出按键值
******************************************************************************/
unsigned char HD7279_GetKeyVal(void)
{
    unsigned char KeyValue;
    KeyValue = HD7279_ReadByte();
    HD7279_CS=1;
    return KeyValue;
}

void EXTI15_10_IRQHandler(void)
{
Keynum = HD7279_GetKeyVal();
EXTI->PR = 1<<13;  //清除LINE13上的中断标志位
}

7279的点H文件
#ifndef __7279_H
#define __7279_H

//7279 控制命令字
#define HD7279_CMD_READKEY 0x15  //读取键值
#define HD7279_CMD_RESET   0xa4  //复位

#define HD7279_DAT   PCout(10)
#define HD7279_CS    PCout(11)
#define HD7279_CLK  PCout(12)

//7279的IO口配置
#define HD7279_DAT_R     GPIOC->IDR&=1<<10

#define HD7279_DAT_OUT {GPIOC->CRH&=0XFFFFF0FF;GPIOC->CRH|=0X00000300;} //推挽输出
#define HD7279_DAT_IN    {GPIOC->CRH&=0XFFFFF0FF;GPIOC->CRH|=0X00000400;} //浮空输入

u8 HD7279_GetKeyVal(void);
void HD7279_Init(void);

#endif
程序编译没问题,只是读不出按键值。希望大家帮我解决这个问题,是配置的问题?还是其他的问题 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。