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

📄 hd7279.c

📁 键盘、数码管显示专用芯片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 + -