?? 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 + -