📄 7279.txt
字号:
/*****************************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++) k="k" { for(j="0;j<100;j++)" 消隐指令测试 delay10ms(150); } delay10ms(50); 译码方式1,显示在第8位 write7279(DECODE1+7,j); 不循环左移指令 send_byte(RTR_UNCYL); 译码方式1及右移指令测试 send_byte(CMD_RESET); 译码方式0,显示在第1位 write7279(DECODE0,j); send_byte(RTL_UNCYL); 译码方式0及左移指令测试 delay10ms(12); 循环左移23次 send_byte(RTL_CYCLE); 循环右移23次 send_byte(RTR_CYCLE); 循环左右移测试,‘三’字向右移3次,再向左移3次。 delay10ms(80); 在第8位按不译码方式显示一个字符‘三’。 write7279(UNDECODE+7,0x49); 下载数据但不译码指令测试 清除显示 清除闪烁设置 write7279(BLINKCTL,0xff); 如果按键为?0?和超时则进入下一步演示 while(wait_cnter<1000); delay10ms(10); wait_cnter="0;" 等待按键放开 while(!(RD7279&key7279)); 在第1位显示键码低8位 write7279(DECODE1,key7279_number&0x0f); 位显示键码高8位 在第2 16); write7279(DECODE1+1,key7279_number key7279_number="0xff;" write7279(DECODE0+7,0x88); 如果有键按下 if(!(RD7279&key7279)) do 在第1?2位显示下划线?_? write7279(UNDECODE+1,0x08); write7279(UNDECODE,0x08); 第1?2两位设为闪烁显示 write7279(BLINKCTL,0xfc); 闪烁指令及键盘接口测试,将用户按键的键码显示出来,如果10秒内无按键或按S0键即进入下一步演示 delay10ms(200); write7279(DECODE0+7,0x87); write7279(DECODE0+6,0x86); write7279(DECODE0+5,0x85); write7279(DECODE0+4,0x84); write7279(DECODE0+3,0x83); write7279(DECODE0+2,0x82); write7279(DECODE0+1,0x81); write7279(DECODE0,0x80); delay10ms(100); 延时约3秒 send_byte(CMD_TEST); 测试指令演示 复位HD7279 上电延时 for(tmr="0;tmr<0xf000;tmr++);" while(1) init_7279(); key7279_number; char unsigned tmr,j,k; long wait_cnter; test_7279(void) void extern 作用:测试函数 HD7279测试函数************************* ****************** 0xFF; return : default 0x0F; FFFF case 0x0E; EEEE 0x0D; DDDD 0x0C; CCCC 0x0B; BBBB 0x0A; AAAA 0X00; ZERO 0X09; NINE 0X08; EIGHT 0X07; SEVEN 0X06; SIX 0X05; FIVE 0X04; FOUR 0X03; THREE 0X02; TWO 0X01; ONE (X) switch X) (unsigned num_change7279 ****************************************** 注:HD7279的控制函数 备 回:键盘键值 返 入:无 输 能:当完成一次按键,返回键值 功 函数名:HD7279按键等待接收函数 ********************** return(in_byte); dat7279还原为输出口 DR7279|="dat7279;" short_delay(); clk7279="0;" WR7279&="~clk7279;" in_byte="in_byte<<1;" if(RD7279&dat7279) WR7279|="dat7279;" for(i="0;i<8;i++)" long_delay(); 改dat7279为输入 DR7279&="~dat7279;" i,in_byte; receive_byte(void) 注:HD7279硬件函数 回:一个字节 能:从HD7279接收一个字节 函数名:HD7279字节接收函数 dat7279="1;" out_byte="out_byte<<1;" else if(out_byte&0x80) cs7279="0" i; out_byte) send_byte(unsigned 回:无 入:一个字节 能:HD7279发送一个字节 函数名:HD7279字节发送函数 for(k="0;k<100;k++);">>1;
write7279(ACTCTL,k); //每隔一秒钟增加一个消隐位
delay10ms(100);
}
write7279(ACTCTL,0xff); //恢复8位显示
delay10ms(100);
send_byte(CMD_RESET); //清除显示
//段点亮指令和段关闭指令
for(j=0;j<64;j++)
{
write7279(SEGON,j); //将64个显示段逐个点亮
write7279(SEGOFF,j-1); //同时将前一个显示段关闭
delay10ms(20);
}
}
}
*/
/********************************** HD7279输入输出函数 *******************************************/
void dis_data ( unsigned char dig_start,unsigned char dig_end,signed long num)
{
unsigned char i,temp_char;
for( i = dig_start; i <= dig_end; i++ )
{
temp_char = num % 10;
num -= temp_char;
num /= 10;
write7279 ( DECODE0 + i , 0x80 + temp_char);
}
}
signed long get_data ( signed char dig_start,signed char dig_end )
{
signed long temp_long = 0;
signed char i,temp_char;
for( i = dig_start; i <= dig_end; i++ )
write7279(UNDECODE + i,0x08);
for( i = dig_end; i >= dig_start ; i-- )
{
temp_char = get_key7279();
temp_long *= 16;
temp_long += temp_char;
write7279 ( DECODE1 + i , 0x80 + temp_char);
}
return temp_long;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -