|
#include
#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
程序编译没问题,只是读不出按键值。希望大家帮我解决这个问题,是配置的问题?还是其他的问题
|
|