#include"HD7279.h"
/******************************************外部调用函数
开电就可以使用了!不用重新复位!
dis_data(x,y,num);
可以显示负数!!!其中负号也占用一个显示位,故负数比正数能显示的少一位数!!!!
get_data(x,y);
获取键盘输入值,在获取之后就不再显示了!!!*********************************************/
/*****************************************************
函数名:HD7279初始化函数
功 能:初始化HD7279(管脚配置、HD7279复位)
输 入:无
返 回:无
备 注:使用先,选配置管脚的宏定义
******************************************************/
void init_7279(void)
{
delay10ms(3); //上电延时
PINSEL2 =0x00000000; //管脚连接到GPIO
DR7279 |= cs7279; //cs7279定义为输出
DR7279 |= clk7279; //clk7279定义为输出
DR7279 |= dat7279; //dat7279定义为输出
DR7279 &= ~(key7279); //key7279定义为输入
WRH7279 |= cs7279; //cs7279初始化为1
WRH7279 |= clk7279; //clk7279初始化为1
WRH7279 |= dat7279; //dat7279初始化为1
WRH7279 |= key7279; //key7279初始化为有弱上拉
long_delay(); //上电延时
send_byte(CMD_RESET); //复位HD7279
}
/****************** **********************
函数名:HD7279写入函数
功 能:对HD7279写数据
输 入:cmd为指令数据; dta为数据数据
返 回:无
备 注:HD7279的控制函数
******************************************/
void write7279(uint8 cmd,uint8 dta) //写入到HD7279
{
send_byte(cmd); //写指令
send_byte(dta); //定数据
}
/****************** **********************
函数名:HD7279读取函数
功 能:对HD7279读取原始键值
输 入:无
返 回:键盘原始键值
备 注:HD7279的控制函数
******************************************/
uint8 read7279(void)
{
send_byte(0x15); //发送读取指令
return(receive_byte()); //返回键值
}
/****************** **********************
函数名:HD7279按键等待接收函数
功 能:当完成一次按键,返回键值
输 入:无
返 回:键盘键值
备 注:HD7279的控制函数
******************************************/
uint8 get_key7279(void)
{
uint8 KeyNum;
while( (RD7279&key7279) ); //等待有键按下,无时为高电平
delay10ms(1); //时延100ms
KeyNum=read7279(); //读出键码
KeyNum=num_change7279(KeyNum); //键码转为十进制
delay10ms(1); //时延100ms
while( !(RD7279&key7279) ); //等待按键松开
return KeyNum; //返回键值
}
/*****************************************内部函数*****************************************/
//长时延函数 57us
void long_delay(void)
{
uint32 i;
for(i=0;i<500;i++);
}
//短时延函数 11us
void short_delay(void)
{
uint32 i;
for(i=0;i<100;i++);
}
//10.173ms时延函数
void delay10ms(uint16 count)
{
uint16 i;
uint32 j;
for (i=0;i<count;i++)
for(j=0;j<75000;j++) ;
}
/****************** **********************
函数名:HD7279字节发送函数
功 能:HD7279发送一个字节
输 入:一个字节
返 回:无
备 注:HD7279硬件函数
******************************************/
void send_byte(uint8 out_byte)
{
uint8 i;
WRL7279 |= clk7279; //clk=0;
WRL7279 |= cs7279; //cs=0
long_delay();
for(i=0;i<8;i++)
{
if(out_byte&0x80)
{
WRH7279|=dat7279; //dat7279=1;
}
else
{
WRL7279|=dat7279; //dat7279=0;
}
WRH7279|=clk7279; //clk7279=1;
short_delay();
WRL7279|=clk7279; //clk7279=0;
short_delay();
out_byte=out_byte<<1;
}
WRH7279|=dat7279; //dat7279=1;
}
/****************** **********************
函数名:HD7279字节接收函数
功 能:从HD7279接收一个字节
输 入:无
返 回:一个字节
备 注:HD7279硬件函数
******************************************/
uint8 receive_byte(void)
{
uint8 i,in_byte;
WRH7279|=clk7279; //clk7279=1;
DR7279&=~dat7279; //改dat7279为输入
long_delay();
for(i=0;i<8;i++)
{
WRH7279|=clk7279; //clk7279=1;
short_delay();
in_byte=in_byte<<1;
if(RD7279&dat7279)
{
in_byte=in_byte|0x01;
}
WRL7279|=clk7279; //clk7279=0;
short_delay();
}
DR7279|=dat7279; //dat7279还原为输出口
return(in_byte);
}
/****************** **********************
函数名:HD7279按键等待接收函数
功 能:当完成一次按键,返回键值
输 入:无
返 回:键盘键值
备 注:HD7279的控制函数
******************************************/
uint8 num_change7279 (uint8 X)
{
switch (X)
{
case ONE : return 0X01;
case TWO : return 0X02;
case THREE : return 0X03;
case FOUR : return 0X04;
case FIVE : return 0X05;
case SIX : return 0X06;
case SEVEN : return 0X07;
case EIGHT : return 0X08;
case NINE : return 0X09;
case ZERO : return 0X00;
case AAAA : return 0x0A;
case BBBB : return 0x0B;
case CCCC : return 0x0C;
case DDDD : return 0x0D;
case EEEE : return 0x0E;
case FFFF : return 0x0F;
default : return 0xFF;
}
}
/********************************** HD7279输入输出函数 *******************************************/
void dis_data ( uint8 dig_start,uint8 dig_end,int32 num)
{
uint8 i,temp_char,temp_end;
int32 temp_num;
temp_num = num;
temp_end = dig_end;
if (num < 0)
{
temp_num = - num;
temp_end = temp_end - 1;
}
for( i = dig_start; i <= temp_end; i++ )
{
temp_char = temp_num % 10;
temp_num -= temp_char;
temp_num /= 10;
write7279 ( DECODE0 + i , 0x80 + temp_char );//不加点显示
}
if (num < 0)
write7279 ( DECODE0 + dig_end , 0x0a );
}
int32 get_data ( int8 dig_start,int8 dig_end )
{
int32 temp_long = 0;
int8 i,temp_char;
for( i = dig_start; i <= dig_end; i++ )
write7279(UNDECODE + i,0x08); //显示为'_'
for( i = dig_end; i >= dig_start ; i-- )
{
temp_char = get_key7279();
temp_long *= 10;
temp_long += temp_char;
write7279 ( DECODE1 + i , 0x80 + temp_char); //1译码可以显示字母
}
short_delay(); //延时
send_byte(CMD_RESET); //复位HD7279
return temp_long;
}