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