摘要
HD7279A硬件電路圖HD7279A是一種管理鍵盤和LED顯示器的專用智能控制芯片。它能對8位共陰極LED顯示器或64個LED發(fā)光管進(jìn)行管理和驅(qū)動,同時能對多達(dá)8×8的鍵盤矩陣的按鍵情況進(jìn)行監(jiān)視,具有自動消除鍵抖動并識別按鍵代碼的功能,從而可以提高CPU工作的效率。HD7279A和微處理器之間采用串行接口,其接口電路和外圍電路簡單,占用口線少,加之它具有較高的性能價格比,因此,在微型控制器、智能儀表、控制面板和家用電器等領(lǐng)域中日益獲得廣泛的應(yīng)用。
關(guān)鍵詞: HD7279A 接口電路 接口程序
一.引腳說明與接口電路
要求: 了解即可(編程涉及)

RC引腳用于連接HD7279A的外接振蕩元件
RESET為復(fù)位端,該端由低電平變成高電平并保持25ms即復(fù)位結(jié)束
IG0~DIG7分別為8個LED管的位驅(qū)動輸出端
SA~SG分別為LED數(shù)碼管的A段~G段的輸出端
DP為小數(shù)點(diǎn)的驅(qū)動輸出端
DIG0~DIG7和SA~SG同時還分別是64鍵盤的列線和行線端口,完成對鍵盤的監(jiān)視、譯碼和鍵碼的識別。
在8×8陣列中每個鍵的鍵碼是用十六進(jìn)制表示的,可用讀鍵盤數(shù)據(jù)指令讀出,其范圍是00H~3FH。
HD7279與微處理器僅需4條接口線,其中CS為片選信號(低電平有效)。
當(dāng)微處理器訪問HD7279A(讀鍵號或?qū)懼噶睿r,應(yīng)將片選端置為低電平。
DATA為串行數(shù)據(jù)端,當(dāng)向HD7279A發(fā)送數(shù)據(jù)時,DATA為輸入端;
當(dāng)HD7279A輸出鍵盤代碼時,DATA為輸出端。
CLK為數(shù)據(jù)串行傳送的同步時鐘輸入端,時鐘的上升沿表示數(shù)據(jù)有效。
KEY為按鍵信號輸出端,在無鍵按下時為高電平;而有鍵按下時此引腳變?yōu)榈碗娖讲⑶乙恢北3值芥I釋放為止。
二.控制指令
要求: 了解皆可(編程涉及)
復(fù)位指令。指令代碼為A4H,其功能為清除所有顯示,包括字符消隱屬性和閃爍屬性。
測試指令。指令代碼為BFH,其功能為將所有的LED點(diǎn)亮并閃爍,可用于自檢。
左移指令。指令代碼為A1H,其功能為將所有的顯示左移1位,移位后,最右位空(無顯示),不改變消隱和閃爍屬性。
右移指令。指令代碼為A0H,其功能與左移指令相似,只是方向相反。
循環(huán)左移指令。指令代碼為A3H,其功能為將所有的顯示循環(huán)左移1位。移位后,最左位內(nèi)容移至最右位,不改變消隱和閃爍屬性。
循環(huán)右移指令。指令代碼為A2H,其功能與循環(huán)左移指令相似,只是方向相反。
三.時序
要求:會看更好(代碼涉及)
備注: 暫時可以只會第一種
1.純指令時序:微處理器發(fā)出8個CLK脈沖,向HD7279A傳送8位指令。DATA引腳為高阻狀態(tài)

帶數(shù)據(jù)指令時序:微處理器發(fā)出16個CLK脈沖,前8個向HD7279A傳送8位指令;后8個向HD7279A傳送8位數(shù)據(jù)。DATA引腳為高阻狀態(tài)

讀鍵盤指令時序:微處理器發(fā)出16個CLK脈沖,前8個向HD7279A傳送8位指令, DATA引腳為高阻狀態(tài);后8個由HD7279A向微處理器返回8位按鍵代碼,DATA引腳為輸出狀態(tài)。在最后1個CLK脈沖的下降沿DATA引腳恢復(fù)高阻狀態(tài)

四.7279數(shù)碼管顯示案例
要求:都要看懂哦
#include "stm32f4xx.h"
#define CMD_RESET 0xA4 // 7279的復(fù)位命令
#define CMD_TEST 0xBF // 7279的測試命令
#define CMD_LEFT 0xA1 // 7279的左移位命令
#define CMD_READ 0x15 // 7279的讀緩沖命令
#define DECODE1 0xC8 // 7279的譯碼顯示命令
// 硬件資源引腳定義
// HD7279CS PC12
// HD7279CLK PA3
// HD7279DATA PA5
// HD7279INT PA0
// HD7279CS PC12
#define HD7279CS_L GPIO_ResetBits(GPIOC, GPIO_Pin_12) //PC12輸出0
#define HD7279CS_H GPIO_SetBits(GPIOC, GPIO_Pin_12) //PC12輸出1
// HD7279CLK PA3
#define HD7279CLK_L GPIO_ResetBits(GPIOA, GPIO_Pin_3) //PA3輸出0
#define HD7279CLK_H GPIO_SetBits(GPIOA, GPIO_Pin_3) //PA3輸出1
// HD7279DATA PA5
#define HD7279DATA_L GPIO_ResetBits(GPIOA, GPIO_Pin_5) //PA5輸出0
#define HD7279DATA_H GPIO_SetBits(GPIOA, GPIO_Pin_5) //PA5輸出1
// 函數(shù)名稱:GPIO配置函數(shù)
// 輸入?yún)?shù):無
// 輸出參數(shù):無
// HD7279CS PC12
// HD7279CLK PA3
// HD7279DATA PA5
void HD7279_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// HD7279CS PC12
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// HD7279CLK PA3、HD7279DATA PA5
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
HD7279CS_H;
HD7279CLK_H;
HD7279DATA_H;
}
// 函數(shù)名稱:發(fā)送1字節(jié)數(shù)據(jù)函數(shù)
// 輸入?yún)?shù):數(shù)據(jù)
// 輸出參數(shù):無
void send_byte(unsigned char out_byte )
{
unsigned short i; // 設(shè)置循環(huán)變量
HD7279CS_L; // 置低片選信號
delay_us(50);
for (i = 0; i < 8; i++) // 寫入8 bit數(shù)據(jù)
{
if (out_byte & 0x80) // 最高位為1
{
HD7279DATA_H; // 數(shù)據(jù)線輸出高電平
}
else
{
HD7279DATA_L; // 否則輸出低電平
}
HD7279CLK_H; // 置高時鐘位
delay_us(50);
HD7279CLK_L; // 置低時鐘位
delay_us(50);
out_byte <<= 1; // 輸出參數(shù)變量右移一位
}
}
// 函數(shù)名稱:寫數(shù)據(jù)和命令函數(shù)
// 輸入?yún)?shù):命令、數(shù)據(jù)
// 輸出參數(shù):無
void write7279(unsigned char cmd, unsigned char dat) // 向LED寫顯示數(shù)據(jù)和命令
{
if (cmd != 255)
{
send_byte(cmd); // 寫命令
}
// delay_ms(10);
if (dat != 255)
{
send_byte(dat&15); // 寫顯示數(shù)據(jù)
}
}
// 小案例
unsigned char Int_flag = 0;
int main(void)
{
unsigned char i = 0;
unsigned char j = 0;
SysTick_Init(); // 系統(tǒng)滴答定時器初始化
? ? HD7279_GPIO_Configuration();
send_byte(CMD_RESET); // 復(fù)位7279
delay_ms(1000);
test7279(); // 7279運(yùn)行測試程序
while(1)
{
write7279(DECODE1 + i, j);
i++;
j++;
if (i > 7)
{
i = 0;
}
if (j > 9)
{
j = 0;
}
delay_ms(1000);
}
}
五.7279鍵盤案例
要求:都要會哦文章來源:http://www.zghlxwxcb.cn/news/detail-780312.html
// 函數(shù)名稱:DATA設(shè)置為輸入模式
// 輸入?yún)?shù):無
// 輸出參數(shù):無
// HD7279DATA PA5
void DATA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//HD7279DATA PA5
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
// 函數(shù)名稱:DATA設(shè)置為輸出模式
// 輸入?yún)?shù):無
// 輸出參數(shù):無
// HD7279DATA PA5
void DATA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//HD7279DATA PA5
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
// 函數(shù)名稱:中斷配置函數(shù)
// 輸入?yún)?shù):無
// 輸出參數(shù):無
// HD7279INT PA0
void INT_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 使能IO時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); // 使能SYSCFG時鐘
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 輸入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 設(shè)置上接
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // IO口為0
GPIO_Init(GPIOA, &GPIO_InitStructure);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); // 初始化中斷線0
EXTI_InitStructure.EXTI_Line = EXTI_Line0; // 配置中斷線為中斷線0
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 配置中斷模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 配置為下降沿觸發(fā)
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 配置中斷線使能
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
// 函數(shù)名稱:接收1字節(jié)數(shù)據(jù)函數(shù)
// 輸入?yún)?shù):數(shù)據(jù)
// 輸出參數(shù):無
unsigned char receive_byte (void)
{
unsigned char i, in_byte = 0;
unsigned char temp = 0;
HD7279DATA_H;
Delay_us(15);
for (i = 0; i < 8; i++) // 讀出8 bit數(shù)據(jù)
{
HD7279CLK_H; // 置高時鐘位
Delay_us(10);
in_byte <<= 1; // 已收到的數(shù)據(jù)移位
DATA_IN();
temp = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);
if (temp == 1)
{
in_byte |= 1; // 向數(shù)據(jù)中增加一位
}
HD7279CLK_L; // 置低時鐘位
Delay_us(10);
}
DATA_OUT();
HD7279DATA_L; // 數(shù)據(jù)線輸出低電平
Delay_us(10);
return(in_byte); // 返回接收到的數(shù)據(jù)
}
// 函數(shù)名稱:讀7279
// 輸入?yún)?shù):無
// 輸出參數(shù):無
unsigned char read7279(void) // 讀鍵值
{
unsigned char temp = 0;
send_byte(CMD_READ); // 發(fā)送讀鍵值命令
temp = receive_byte();
return temp; // 返回鍵值
}
// 測試
void test7279(void) // 顯示測試程序
{
send_byte(CMD_TEST); // 發(fā)送測試命令
Delay_ms(1000); // 等待以便觀察
send_byte(CMD_RESET); // 發(fā)送復(fù)位命令
}
int main(void)
{
unsigned char temp = 0;
char buf[5] = {0};
SysTick_Init(); // 系統(tǒng)滴答定時器初始化
lcd_init(); // 液晶初始化
lcd_clear(Black); // 設(shè)置液晶背景
LCD_DrawRectangle(0,0, 479, 271, Green);
LCD_DrawRectangle(5,5, 474, 266, Green);
LCD_ShowString(10, 60, "由于IO口復(fù)用,所以請打開所有模塊的電源開關(guān)", Red, Black);
LCD_ShowString(10, 100, "現(xiàn)象:", Red, Black);
LCD_ShowString(10, 120, "1.按下按鍵,觀察數(shù)碼管和液晶上顯示的數(shù)據(jù)", Red, Black);
HD7279_GPIO_Configuration();
INT_Configuration(); // 7279中斷引腳配置
send_byte(CMD_RESET); // 復(fù)位7279
Delay_ms(1000);
test7279(); // 7279測試
while(1)
{
if (Int_flag == 1)
{
Int_flag = 0;
temp = read7279();
write7279(CMD_LEFT, 0xff);
sprintf(buf, "%2X", temp);
LCD_ShowString(200, 180, (unsigned char*)buf, White, Black);
write7279(DECODE1, temp);
}
}
}
六.球球關(guān)注
關(guān)注b站 : Chasbaby bili_24795983555文章來源地址http://www.zghlxwxcb.cn/news/detail-780312.html
到了這里,關(guān)于嵌入式開發(fā)7279A數(shù)碼管 鍵盤的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!