📄 hd7279_1.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 + -