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

📄 hd7279_1.c

📁 hd7279对键盘和数码管矩阵扫描译码显示功能
💻 C
字号:

/* File Name:        	hd7279.c    */
/* Author:          	Huaming Liu */
/* Created:         	2007-4-28   */
/* Modified:   			no          */
/* Revision:         	V1.0     	*/
/************************************************************************************/
/*程序作用:测试hd7279键盘显示芯片是否能正常工作     */
/*程序功能:按下0号键点亮4个LED灯 ,按下1号键显示0、1、2、3,按下2号键显示c、d、e、f*/
/*    		按下3号键显示4、5、6、7,按下4号键显示8、9、a、b*/
/************************************************************************************/

#include <reg52.h> 					/*定义头文件*/				 
#define Set_Bit(BIT)    (BIT = 1) 	/*定义置1函数*/
#define Clear_Bit(BIT)  (BIT = 0) 	/*定义清0函数*/
typedef unsigned char BYTE; 		/*自定义字节类型*/
		  
BYTE Keyboard_Out; 		/*定义键值变量*/
bit Keyboard_Flag; 		/*定义按键标志*/
data char Wdt _at_ 	0xA6;/*定义看门狗SFR*/

sbit Hd7279_CS=P1^0;	/*定义HD7279片选信号连接*/
sbit Hd7279_Clk=P1^1; 	/*定义HD7279时钟硬件连接*/
sbit Hd7279_Data=P1^2; 	/*定义HD7279数据硬件连接*/
sbit Hd7279_Key=P1^3; 	/*定义HD7279中断硬件连接*/

/****** HD7279的指令 ******/
#define CMD_RESET 	0xa4
#define CMD_TEST 	0xbf  /*所有LED均亮,且闪烁*/
#define DECODE0 	0x80  /*0位LED按方式0译码,1-7位LED需在低三位改动(000-111)*/
#define DECODE1 	0xc8  /*0位LED按方式1译码,1-7位LED需在低三位改动(000-111)*/
						  /*都是按BCD译码,只是A-F译码方式不同*/
#define UNDE_CODE 	0x90  /*0位LED不译码,即是七段码(最高位DP,其次A,B…)*/
#define CMD_READ 	0x15  /*键盘读取*/
#define RL_CYCLE 	0xa3  /*左移,循环移位*/
#define RR_CYCLE 	0xa2  /*右移,循环移位*/
#define RL_UNCYL 	0xa1  /*左移,非循环移位*/
#define RR_UNCYL 	0xa0  /*右移,非循环移位*/
#define ACT_CTL 	0x98  /*消隐控制,被消隐的位不显示但数据被保存*/
#define SEG_ON 		0xe0  /*段点亮,段值范围0~3FH,LED位从0-7,段位从G-A-DP*/
#define SEG_OFF 	0xc0
#define BLINK_CTL 	0x88  /*闪烁控制*/

void Led_On(BYTE);			 	/*定义点亮LED灯函数*/
void Led_Off(BYTE); 			/*定义熄灭LED灯函数*/
void Write_Hd7279(BYTE,BYTE); 	/*定义HD7279写函数,先写命令再写控制信息*/
BYTE Read_Hd7279(BYTE); 		/*定义HD7279读函数,只需发出命令再读入数据*/
void Send_Byte(BYTE); 			/*定义HD7279发送字节函数*/
BYTE Receive_Byte(void); 		/*定义HD7279接收字节函数*/
void Short_Delay(void); 		/*定义短延时函数*/
void Long_Delay(void); 			/*定义长延时函数*/
void Mcu_Init(void); 			/*定义MCU初始化函数*/
void Delay_200_mS(void); 		/*定义200ms延时函数*/


/************************************************************************************/
void main(void) /*主函数*/
{
	Mcu_Init(); 		/*MCU初始化*/
	while(1)
	{
	if(Keyboard_Flag)  /*if1,有按键按下*/
		{
		Clear_Bit(Keyboard_Flag);
		if(Keyboard_Out==0)  /*0号键处理*/ 
			{/*按下0号键点亮4个LED灯*/
			Led_On(0x00);
			Led_On(0x01);
			Led_On(0x02);
			Led_On(0x03);
			}
		else if(Keyboard_Out==1) /*1号键处理*/
			{ /*显示0、1、2、3*/
			Write_Hd7279(0xc9,0x03);
			Write_Hd7279(0xca,0x02);
			Write_Hd7279(0xcb,0x01);
			Write_Hd7279(0xcc,0x00);                                                                                                                                                                                                                                 Led_Off(0x02);
			}
		else if(Keyboard_Out==2) /*2号键处理*/
			{ /*显示c、d、e、f*/
			Write_Hd7279(0xc9,0x0f);
			Write_Hd7279(0xca,0x0e);
			Write_Hd7279(0xcb,0x0d);
			Write_Hd7279(0xcc,0x0c);                                                                                                                                                                                                                                 Led_Off(0x02);
			} 
		else if(Keyboard_Out==3) /*3号键处理*/
			{ /*显示4、5、6、7*/
			Write_Hd7279(0xc9,0x07);
			Write_Hd7279(0xca,0x06);
			Write_Hd7279(0xcb,0x05);
			Write_Hd7279(0xcc,0x04);                                                                                                                                                                                                                                 Led_Off(0x02);
			}
		else  /*4号键处理*/
			{ /*显示8、9、a、b*/
			Write_Hd7279(0xc9,0x0b);
			Write_Hd7279(0xca,0x0a);
			Write_Hd7279(0xcb,0x09);
			Write_Hd7279(0xcc,0x08);                                                                                                                                                                                                                                 Led_Off(0x02);
			} 
		Delay_200_mS();
		}	   /*if1*/
	}	  /*while*/
}	   /*main*/


void Delay_200_mS(void)  /*200ms延时函数*/
	{
   	BYTE i,j;
   	i=200;
   	while (i--)
     	{
        j=228;
        while(j--);
     	} 
	} 


void Mcu_Init(void) /*MCU初始化函数*/
	{
	Set_Bit(EX0); 	/*外部中断0使能*/
	Set_Bit(IT0); 	/*外部中断0下降沿触发*/
	Set_Bit(EA); 	/*中断使能*/
	Wdt=0x1e;
	Wdt=0xe1;		/*启动看门狗*/
	Send_Byte(0xa4); /*HD7279复位*/
	Write_Hd7279(ACT_CTL,0x1f); /*HD7279启动消隐功能,能提高灯的亮度*/
	Write_Hd7279(0xc9,0x03); 	/*上电显示6、5、4、3*/
	Write_Hd7279(0xca,0x04);
	Write_Hd7279(0xcb,0x05);
	Write_Hd7279(0xcc,0x06);
	}


void int1_Hd7279key(void) interrupt 0 /*外部中断0函数*/
	{         
	Keyboard_Out=Read_Hd7279(0x15); /*读取键值*/ 
	switch(Keyboard_Out) 
		{/*键盘设置*/
		case 16:Keyboard_Out=0;
			Set_Bit(Keyboard_Flag); break;/*设置键标志*/
		case 27:Keyboard_Out=1;
			Set_Bit(Keyboard_Flag); break;
		case 19:Keyboard_Out=2;
			Set_Bit(Keyboard_Flag); break;
		case 11:Keyboard_Out=3;
			Set_Bit(Keyboard_Flag); break;
		case 26:Keyboard_Out=4;
			Set_Bit(Keyboard_Flag); break;
		case 18:Keyboard_Out=5;
			Set_Bit(Keyboard_Flag); break;
		case 10:Keyboard_Out=6;
			Set_Bit(Keyboard_Flag); break;
		case 25:Keyboard_Out=7;
			Set_Bit(Keyboard_Flag); break;
		case 17:Keyboard_Out=8;
			Set_Bit(Keyboard_Flag); break;
		case 9:Keyboard_Out=9;
			Set_Bit(Keyboard_Flag); break;
		case 3:Keyboard_Out=10;
			Set_Bit(Keyboard_Flag); break;
		case 2:Keyboard_Out=11;
			Set_Bit(Keyboard_Flag); break;
		case 1:Keyboard_Out=12;
			Set_Bit(Keyboard_Flag); break;
		case 0:Keyboard_Out=13;
			Set_Bit(Keyboard_Flag); break;
		case 24:Keyboard_Out=14;		   /* "*"号键 */
			Set_Bit(Keyboard_Flag); break;
		case 8:Keyboard_Out=15;			  /* "#"号键 */
			Set_Bit(Keyboard_Flag); break;
		default:break;
		}
	} 

void Short_Delay(void) /*短延时函数*/
	{ 
	BYTE i;
  	for(i=0;i<0x08;i++);
	}

void Long_Delay(void) /*长延时函数*/
	{
	BYTE i;
  	for(i=0;i<0x30;i++);
	}

void Led_On(BYTE Led_Num) /*点亮LED灯函数*/
	{
	Write_Hd7279(SEG_ON,Led_Num);  /*让Led_Num个数码管亮*/
	}

void Led_Off(BYTE Led_Num) /*熄灭LED灯函数*/
	{
	Write_Hd7279(SEG_OFF,Led_Num);
	}

void Write_Hd7279(BYTE Command,BYTE Data) /*HD7279写函数*/
	{ 
	Send_Byte(Command);	 /*先发送命令*/
   	Send_Byte(Data);	 /*再接收字节*/
	}

BYTE Read_Hd7279(BYTE Command) /*HD7279读函数*/
	{ 
	Send_Byte(Command);	 	/*先发送命令*/
   	return(Receive_Byte());	/*再接收字节*/
 	}


void Send_Byte(BYTE Data_Out) /*向HD7279发送字节函数*/
	{ 
	BYTE i;
   	Long_Delay();
   	for(i=0;i<8;i++)
   		{ 
   		if(Data_Out&0x80) 
			Set_Bit(Hd7279_Data);
     	else 
			Clear_Bit(Hd7279_Data);
     	Set_Bit(Hd7279_Clk);
     	Short_Delay();
     	Clear_Bit(Hd7279_Clk);/*下降沿发出数据*/
     	Short_Delay();		  
     	Data_Out=Data_Out<<1;
    	}
    Clear_Bit(Hd7279_Data);
 	}


BYTE Receive_Byte(void)  /*从HD7279接收字节函数*/
	{ 
	BYTE i,Data_In;
  	Set_Bit(Hd7279_Data);
  	Long_Delay();
  	for(i=0;i<8;i++)
   		{
   		Set_Bit(Hd7279_Clk);
    	Short_Delay();
    	Data_In=Data_In<<1;
    	if(Hd7279_Data)  /*数据线上为1时*/
			Data_In=Data_In|0x01;
    	Clear_Bit(Hd7279_Clk);
    	Short_Delay();
    	}
    Clear_Bit(Hd7279_Data);
    return(Data_In);
	}
/*END*/	

⌨️ 快捷键说明

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