?? 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 PORTC
#define RD7279 PINC
#define DR7279 DDRC
#define cs7279 BIT(1) //cs7279定義為PC^5
#define clk7279 BIT(2) //clk7279定義為PC^4
#define dat7279 BIT(3) //dat7279定義為PC^3
#define key7279 BIT(4) //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 + -