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

📄 hd7279.c

📁 AVR单片机控制码盘程序
💻 C
字号:

/*****************************readme.txt***********************************************************
HD7279.C是AVR Mega16,8MHz的配置文件

使用前必须先进行宏定义的“管脚配置”、”键值转换配置“

外部调用主要有四个函数

#:init_7279()为7279初始化函数,在使用HD7279前必须先调用此文件

#:void write7279(unsigned char cmd,unsigned char dta);
	前一个cmd为指令,可直接调用宏义中“HD7279指令集”
	后一个dat为数据,输入0x80+i,i为显示的数字
	
#:unsigned char read7279(void):数据读取函数
	返回是键盘的原始值,没有进行任何转换
	
#:unsigned char get_key7279(void):读取一个键值

	调用函数后,等待按键,直到有按键按下并松开,
	返回一个与键值对应的键值,经过数值转换
	
内部函数,不对用户开发;用户只须调用以上上四个函数就可以完成HD7279的基本操作

*****************************************************************************************************/


/********************************管脚配置*****************************/
#define WR7279 PORTB												   
#define RD7279 PINB
#define DR7279 DDRB

#define cs7279 BIT(4)	//cs7279定义为PC^5
#define clk7279 BIT(5) 	//clk7279定义为PC^4
#define dat7279 BIT(6)	//dat7279定义为PC^3
#define key7279 BIT(7)	//key7279定义为PC^2

/******************************键值转换配置********************************/
#define ONE 0X03
#define TWO 0X02
#define THREE 0X01
#define FOUR 0X00
#define FIVE 0X0B
#define SIX 0X0A
#define SEVEN 0x09
#define EIGHT 0X08
#define NINE 0X13
#define ZERO 0X12
#define AAAA 0X11     
#define BBBB 0x10     
#define CCCC 0X1B       
#define DDDD 0X1A		
#define EEEE 0X19    
#define FFFF 0X18     

/********************************HD7279指令集***************************/
#define CMD_RESET 0xa4		//复位(清除)指令
#define CMD_TEST 0xbf		//测试指令
#define DECODE0 0x80		//方式0译码
#define DECODE1 0xc8		//方式1译码
#define CMD_READ 0x15		//读取键盘数据指令
#define UNDECODE 0x90		//不带小数点显示
#define RTL_CYCLE 0xa3		//循环左移指令
#define RTR_CYCLE 0xa2		//循环右移指令
#define RTL_UNCYL 0xa1		//左移指令
#define RTR_UNCYL 0xa0		//右移指令
#define ACTCTL 0x98		//消隐控制
#define SEGON 0xe0		//段点亮指令	
#define SEGOFF 0xc0		//段关闭指令
#define BLINKCTL 0x88		//闪烁控制


/******************************************外部调用函数申明*********************************************/

/*****************************************************
函数名:HD7279初始化函数	
功  能:初始化HD7279(管脚配置、HD7279复位)
输  入:无
返  回:无
备  注:使用HD7279之前调用此函数,并配置管脚的宏定义
******************************************************/	
extern void init_7279(void);	  	 

/****************** **********************
函数名:HD7279写入函数	
功  能:对HD7279写数据
输  入:cmd为指令数据;	dta为数据数据
返  回:无
备  注:HD7279的控制函数
******************************************/
extern void write7279(unsigned char cmd,unsigned char dta);	//写入到HD7279

/****************** **********************
函数名:HD7279读取函数	
功  能:对HD7279读取原始键值
输  入:无
返  回:键盘原始键值
备  注:HD7279的控制函数
******************************************/
extern unsigned char read7279(void);

/****************** **********************
函数名:HD7279按键等待接收函数	
功  能:当完成一次按键,返回键值
输  入:无
返  回:键盘键值
备  注:HD7279的控制函数
******************************************/
extern unsigned char get_key7279(void);

/****************** **********************
函数名:HD7279测试函数	
功  能:对HD7279功能测试
输  入:无
返  回:无
备  注:
******************************************/
extern void test_7279(void);



/*******************************************内部函数申明***********************************************/
//长时延函数
extern void long_delay(void);	
//短时延函数					
extern void short_delay(void);					
//10ms时延函数
extern void delay10ms(unsigned int);			
//发送一个字节

/****************** **********************
函数名:HD7279字节发送函数	
功  能:HD7279发送一个字节
输  入:无
返  回:无
备  注:HD7279硬件函数
******************************************/
extern void send_byte(unsigned char);	

/****************** **********************
函数名:HD7279字节接收函数	
功  能:从HD7279接收一个字节
输  入:无
返  回:一个字节
备  注:HD7279硬件函数
******************************************/
extern unsigned char receive_byte(void);			

/****************** **********************
函数名:HD7279按键等待接收函数	
功  能:当完成一次按键,返回键值
输  入:无
返  回:键盘键值
备  注:HD7279的控制函数
******************************************/
extern unsigned char  num_change7279 (unsigned char X);



/******************************************外部调用函数*********************************************/

/*****************************************************
函数名: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<0xf000;tmr++);	//上电延时
 		
	send_byte(CMD_RESET);		//复位HD7279
 		 	 		
}  	 

/****************** **********************
函数名:HD7279写入函数	
功  能:对HD7279写数据
输  入:cmd为指令数据;	dta为数据数据
返  回:无
备  注:HD7279的控制函数
******************************************/
extern void write7279(unsigned char cmd,unsigned char dta)	//写入到HD7279
{	
	send_byte(cmd);		//写指令
	send_byte(dta);		//定数据
}

/****************** **********************
函数名:HD7279读取函数	
功  能:对HD7279读取原始键值
输  入:无
返  回:键盘原始键值
备  注:HD7279的控制函数
******************************************/
extern unsigned char read7279(void)
{
	send_byte(0x15);	//发送读取指令
	return(receive_byte());	//返回键值
	
}

/****************** **********************
函数名:HD7279按键等待接收函数	
功  能:当完成一次按键,返回键值
输  入:无
返  回:键盘键值
备  注:HD7279的控制函数
******************************************/
extern unsigned char get_key7279(void)
{
	unsigned char KeyNum;
	while( (RD7279&key7279) );		//等待有键按下
	
	delay10ms(1);				//时延100ms
	
	KeyNum=read7279();			//读出键码	
	
	KeyNum=num_change7279(KeyNum);   	//键码转为十进制
	
	delay10ms(1);				//时延100ms
	
	while( !(RD7279&key7279) );			//等待按键松开
	
	return KeyNum;				//返回键值
}

/*****************************************内部函数*****************************************/

//长时延函数
extern void long_delay(void)
{
	unsigned char i;
	for(i=0;i<80;i++);
}	

//短时延函数					
extern 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++);
}	
	
/****************** **********************
函数名: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; 	 
}
	
/****************** **********************
函数名: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);
}

/****************** **********************
函数名:HD7279按键等待接收函数	
功  能:当完成一次按键,返回键值
输  入:无
返  回:键盘键值
备  注:HD7279的控制函数
******************************************/
extern unsigned char  num_change7279 (unsigned char 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测试函数*************************

//	作用:测试函数
extern void test_7279(void)
{
	unsigned long wait_cnter;
	unsigned long tmr,j,k;
	unsigned char key7279_number;
	init_7279();
	while(1)
	{
		for(tmr=0;tmr<0xf000;tmr++);	//上电延时
		send_byte(CMD_RESET);		//复位HD7279

		//测试指令演示

		send_byte(CMD_TEST);
		for(j=0;j<3;j++)		//延时约3秒
		{	
			delay10ms(100);
		}
		send_byte(CMD_RESET);		//清除显示
		
	
		{	
		 write7279(DECODE0,0x80);
		 write7279(DECODE0+1,0x81);
		 write7279(DECODE0+2,0x82);
		 write7279(DECODE0+3,0x83);
		 write7279(DECODE0+4,0x84);
		 write7279(DECODE0+5,0x85);
		 write7279(DECODE0+6,0x86);
		 write7279(DECODE0+7,0x87);
		 }
		 
		delay10ms(200);

//闪烁指令及键盘接口测试,将用户按键的键码显示出来,如果10秒内无按键或按S0键即进入下一步演示
		wait_cnter=0;
		key7279_number=0xff;
		write7279(BLINKCTL,0xfc);			//第1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -