📄 hd7279.c
字号:
#include "HD7279.h"
//长时延函数
void long_delay(void)
{
unsigned char i;
for(i=0;i<80;i++);
}
//短时延函数
void short_delay(void)
{
unsigned char i;
for(i=0;i<46;i++);
}
//10ms时延函数
void delay10ms(unsigned int count)
{
unsigned char i,j,k;
for (i=0;i<count;i++)
for(j=0;j<100;j++)
for(k=0;k<100;k++);
}
/*******************VARIABLE DEFIEN*********************/
unsigned char key_number,get_key;
/*****************************************************
Function name:HD7279初始化函数
功 能:初始化HD7279(管脚配置、HD7279复位)
输 入:无
返 回:无
备 注:使用先,选配置管脚的宏定义
******************************************************/
extern void init_7279(void)
{
unsigned int tmr;
DR7279 |= cs7279; //cs7279定义为输出
DR7279 |= clk7279; //clk7279定义为输出
DR7279 |= dat7279; //dat7279定义为输出
DR7279 &= ~(key7279); //key7279定义为输入
WR7279 |= cs7279; //cs7279初始化为1
WR7279 |= clk7279; //clk7279初始化为1
WR7279 |= dat7279; //dat7279初始化为1
WR7279 |= key7279; //key7279初始化为有弱上拉
for(tmr=0;tmr<0xff00;tmr++); //上电延时
send_byte(CMD_RESET); //复位HD7279
}
/****************** **********************
Function name:HD7279写入函数
功 能:对HD7279写数据
输 入:cmd为指令数据; dta为数据数据
返 回:无
备 注:HD7279的控制函数
******************************************/
extern void write7279(unsigned char cmd,unsigned char dta) //写入到HD7279
{
send_byte(cmd); //写指令
send_byte(dta); //定数据
}
/****************** **********************
Function name:HD7279读取函数
功 能:对HD7279读取原始键值
输 入:无
返 回:键盘原始键值
备 注:HD7279的控制函数
******************************************/
extern unsigned char read7279(void)
{
send_byte(0x15); //发送读取指令
return(receive_byte()); //返回键值
}
/****************** **********************
Function name:HD7279按键等待接收函数
功 能:当完成一次按键,返回键值
输 入:无
返 回:键盘键值
备 注:HD7279的控制函数
******************************************/
extern unsigned char get_key7279(void)
{
unsigned char KeyNum;
while( (RD7279&key7279) ); //等待有键按下
delay10ms(1); //时延100ms
get_key=read7279(); //读出键码
switch_number(); //键码转为十进制
delay10ms(1); //时延100ms
while( !(RD7279&key7279) ); //等待按键松开
return key_number; //返回键值
}
/****************** **********************
Function name:HD7279字节发送函数
功 能:HD7279发送一个字节
输 入:一个字节
返 回:无
备 注:HD7279硬件函数
******************************************/
extern void send_byte(unsigned char out_byte)
{
unsigned char i;
WR7279&=~clk7279; //clk7279=0;
WR7279&=~cs7279; //cs7279=0
long_delay();
for(i=0;i<8;i++)
{
if(out_byte&0x80)
{
WR7279|=dat7279; //dat7279=1;
}
else
{
WR7279&=~dat7279; //dat7279=0;
}
WR7279|=clk7279; //clk7279=1;
short_delay();
WR7279&=~clk7279; //clk7279=0;
short_delay();
out_byte=out_byte<<1;
}
WR7279|=dat7279; //dat7279=1;
}
/****************** **********************
Function name:HD7279字节接收函数
功 能:从HD7279接收一个字节
输 入:无
返 回:一个字节
备 注:HD7279硬件函数
******************************************/
extern unsigned char receive_byte(void)
{
unsigned char i,in_byte;
WR7279|=clk7279; //clk7279=1;
DR7279&=~dat7279; //改dat7279为输入
long_delay();
for(i=0;i<8;i++)
{
WR7279|=clk7279; //clk7279=1;
short_delay();
in_byte=in_byte<<1;
if(RD7279&dat7279)
{
in_byte=in_byte|0x01;
}
WR7279&=~clk7279; //clk7279=0;
short_delay();
}
DR7279|=dat7279; //dat7279还原为输出口
return(in_byte);
}
/****************** **********************
Function name:HD7279按键等待接收函数
功 能:当完成一次按键,返回键值
输 入:无
返 回:键盘键值
备 注:HD7279的控制函数
******************************************/
void switch_number()
{
switch(get_key)
{
case 0X1A:{key_number=0x0d;}break;
case 0X1B:{key_number=0x0c;}break;
case 0x10:{key_number=0x0b;}break;
case 0X11:{key_number=0x0a;}break;
case 0X19:{key_number=0x0e;}break;
case 0X13:{key_number=0x09;}break;
case 0X0A:{key_number=0x06;}break;
case 0X01:{key_number=0x03;}break;
case 0X12:{key_number=0x00;}break;
case 0X08:{key_number=0x08;}break;
case 0X0B:{key_number=0x05;}break;
case 0X02:{key_number=0x02;}break;
case 0X18:{key_number=0x0f;}break;
case 0x09:{key_number=0x07;}break;
case 0X00:{key_number=0x04;}break;
case 0X03:{key_number=0x01;}break;
default: break;
}
}
/****************** **********************
Function name:检测HD7279所得键值是否是参数提供的键值
功 能:对HD7279读取原始键值
输 入:无
返 回:键盘原始键值
备 注:HD7279的控制函数
******************************************/
void test_button(unsigned char button)
{
do
{
get_key=read7279();
switch_number();
while(RD7279&key7279);
}while(!(key_number==button));
}
/******************** HD7279 I/0 FUNCTION ******************************/
void cls_screen(void)
{
unsigned char i;
for( i = 0; i <= 7; i++ )
write7279 ( DECODE0 + i , 0x0F);
}
void dis_data ( unsigned char dig_start,unsigned char dig_end,signed long num)
{
unsigned char i,temp_char;
signed long tmpnum;
if(num < 0)
tmpnum = -num;
else
tmpnum = num;
for( i = dig_start; i <= dig_end; i++ )
{
temp_char = tmpnum % 10;
tmpnum -= temp_char;
tmpnum /= 10;
write7279 ( DECODE0 + i , temp_char);
}
if(num < 0)
write7279 ( DECODE0 + dig_end , 0x0a);
}
signed long get_data ( signed char dig_start,signed char dig_end )
{
signed long temp_long = 0;
signed char i,temp_char=0;
for( i = dig_start; i <= dig_end; i++ )
write7279(UNDECODE + i,0x08);
for( i = dig_end; i >= (dig_start-1) ; i-- )
{
temp_char = get_key7279();
if(i == (dig_start-1)) //最后一位为确认
{
if(temp_char == 0x0F) //受到确认信号则退出
break;
else if(temp_char == 0x0D) //退格键
{
temp_long = (signed long)(temp_long/10);
i++;
write7279 ( UNDECODE + i , 0x08);
i++;
}
else //其他键
i++;
}
else //正常数字位
{
if(temp_char == 0x0D) //退格键
{
if(i != dig_end) //
{
temp_long = (signed long)(temp_long /10);
i++;
write7279 ( UNDECODE + i , 0x08);
i++;
}
}
else //数字键
{
temp_long *= 10;
temp_long += temp_char;
write7279 ( DECODE0 + i , temp_char);
}
}
}
return temp_long;
}
void GetCommand ( unsigned char cmdArray[],unsigned char cmdNum )
{
signed char i;
unsigned char temp_char=0;
for( i = 0; i < cmdNum; i++ )
write7279(UNDECODE + i,0x08);
for( i = cmdNum; i >= 0 ; i-- )
{
temp_char = get_key7279();
if(temp_char == 0x0F)
{ //把未输入的位置输出空标志
while(i > 0)
{
cmdArray[cmdNum - i] = 0x0A;
i--;
write7279 ( DECODE0 + i , 0x0A);
}
break; //跳出循环,输入结束。
}
else if(temp_char == 0x0D)
{
if(i != cmdNum) //如果不是第一位则退格
{
write7279 ( UNDECODE + i , 0x08);
i++;
}
i++;
}
else
{
if(i == 0) //若最后一位已经输入完毕,并且仍然有输入的时候则忽略
i++;
else
{
cmdArray[cmdNum - i] = temp_char;
write7279 ( DECODE0 + i - 1 , temp_char);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -