嵌入式开发7279A数码管 键盘

这篇具有很好参考价值的文章主要介绍了嵌入式开发7279A数码管 键盘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

摘要

HD7279A硬件电路图HD7279A是一种管理键盘和LED显示器的专用智能控制芯片。它能对8位共阴极LED显示器或64个LED发光管进行管理和驱动,同时能对多达8×8的键盘矩阵的按键情况进行监视,具有自动消除键抖动并识别按键代码的功能,从而可以提高CPU工作的效率。HD7279A和微处理器之间采用串行接口,其接口电路和外围电路简单,占用口线少,加之它具有较高的性能价格比,因此,在微型控制器、智能仪表、控制面板和家用电器等领域中日益获得广泛的应用。

关键词: HD7279A 接口电路 接口程序

一.引脚说明与接口电路

要求: 了解即可(编程涉及)

7279a,江苏海洋大学,ARM,期末复习,单片机,嵌入式硬件,arm开发,stm32,学习方法,Powered by 金山文档
  1. RC引脚用于连接HD7279A的外接振荡元件

  1. RESET为复位端,该端由低电平变成高电平并保持25ms即复位结束

  1. IG0~DIG7分别为8个LED管的位驱动输出端

  1. SA~SG分别为LED数码管的A段~G段的输出端

  1. DP为小数点的驱动输出端

  1. DIG0~DIG7和SA~SG同时还分别是64键盘的列线和行线端口,完成对键盘的监视、译码和键码的识别。

  1. 在8×8阵列中每个键的键码是用十六进制表示的,可用读键盘数据指令读出,其范围是00H~3FH。

  1. HD7279与微处理器仅需4条接口线,其中CS为片选信号(低电平有效)。

  1. 当微处理器访问HD7279A(读键号或写指令)时,应将片选端置为低电平。

  1. DATA为串行数据端,当向HD7279A发送数据时,DATA为输入端;

  1. 当HD7279A输出键盘代码时,DATA为输出端。

  1. CLK为数据串行传送的同步时钟输入端,时钟的上升沿表示数据有效。

  1. KEY为按键信号输出端,在无键按下时为高电平;而有键按下时此引脚变为低电平并且一直保持到键释放为止。

二.控制指令

要求: 了解皆可(编程涉及)

  1. 复位指令。指令代码为A4H,其功能为清除所有显示,包括字符消隐属性和闪烁属性。

  1. 测试指令。指令代码为BFH,其功能为将所有的LED点亮并闪烁,可用于自检。

  1. 左移指令。指令代码为A1H,其功能为将所有的显示左移1位,移位后,最右位空(无显示),不改变消隐和闪烁属性。

  1. 右移指令。指令代码为A0H,其功能与左移指令相似,只是方向相反。

  1. 循环左移指令。指令代码为A3H,其功能为将所有的显示循环左移1位。移位后,最左位内容移至最右位,不改变消隐和闪烁属性。

  1. 循环右移指令。指令代码为A2H,其功能与循环左移指令相似,只是方向相反。

三.时序

要求:会看更好(代码涉及)

备注: 暂时可以只会第一种

1.纯指令时序:微处理器发出8个CLK脉冲,向HD7279A传送8位指令。DATA引脚为高阻状态

7279a,江苏海洋大学,ARM,期末复习,单片机,嵌入式硬件,arm开发,stm32,学习方法,Powered by 金山文档

带数据指令时序:微处理器发出16个CLK脉冲,前8个向HD7279A传送8位指令;后8个向HD7279A传送8位数据。DATA引脚为高阻状态

7279a,江苏海洋大学,ARM,期末复习,单片机,嵌入式硬件,arm开发,stm32,学习方法,Powered by 金山文档

读键盘指令时序:微处理器发出16个CLK脉冲,前8个向HD7279A传送8位指令, DATA引脚为高阻状态;后8个由HD7279A向微处理器返回8位按键代码,DATA引脚为输出状态。在最后1个CLK脉冲的下降沿DATA引脚恢复高阻状态

7279a,江苏海洋大学,ARM,期末复习,单片机,嵌入式硬件,arm开发,stm32,学习方法,Powered by 金山文档

四.7279数码管显示案例

要求:都要看懂哦

#include "stm32f4xx.h"

#define      CMD_RESET         0xA4    //  7279的复位命令
#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

// 函数名称:GPIO配置函数
// 输入参数:无
// 输出参数:无
// 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;
}

// 函数名称:发送1字节数据函数
// 输入参数:数据
// 输出参数:无

void send_byte(unsigned char out_byte )
{
    unsigned short  i;                   //    设置循环变量
    HD7279CS_L;                          //    置低片选信号
    delay_us(50);
    for (i = 0; i < 8; i++)             //    写入8 bit数据
    {   
         if (out_byte & 0x80)           //    最高位为1
        {
            HD7279DATA_H;               //    数据线输出高电平
         }
        else
        {
            HD7279DATA_L;               //    否则输出低电平
        }
        HD7279CLK_H;                    //    置高时钟位
        delay_us(50);
        HD7279CLK_L;                    //    置低时钟位
        delay_us(50);
        out_byte <<= 1;                //    输出参数变量右移一位
    }
}

// 函数名称:写数据和命令函数
// 输入参数:命令、数据
// 输出参数:无

void write7279(unsigned char cmd, unsigned char dat)  //    向LED写显示数据和命令
{    
    if (cmd != 255) 
    {  
        send_byte(cmd);                              //    写命令
    }
//    delay_ms(10);
    if (dat != 255) 
    {
        send_byte(dat&15);                           //    写显示数据
    } 
}
// 小案例
unsigned char Int_flag = 0;
int main(void)
{ 
    unsigned char i = 0;
    unsigned char j = 0;
    SysTick_Init();                    //  系统滴答定时器初始化
    HD7279_GPIO_Configuration();
    send_byte(CMD_RESET);              //    复位7279 
    delay_ms(1000);
    test7279();                        //    7279运行测试程序
    while(1)
    {
        write7279(DECODE1 + i, j);                                        
        i++;   
        j++;        
        if (i > 7) 
        {
            i = 0;
        }
        if (j > 9) 
        {
            j = 0;
        }
        delay_ms(1000);
    }
}

五.7279键盘案例

要求:都要会哦


// 函数名称:DATA设置为输入模式
// 输入参数:无
// 输出参数:无
// 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);  
}

// 函数名称:DATA设置为输出模式
// 输入参数:无
// 输出参数:无
// 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);
}

// 函数名称:中断配置函数
// 输入参数:无
// 输出参数:无
// 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;                        //  设置上接
    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;             //  配置为下降沿触发
    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);
}

// 函数名称:接收1字节数据函数
// 输入参数:数据
// 输出参数:无
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数据
    {
        HD7279CLK_H;                                    //    置高时钟位
        Delay_us(10);
        in_byte <<= 1;                                 //    已收到的数据移位
        DATA_IN();  
        temp = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);
        if (temp == 1)  
        {
            in_byte |= 1;                               //    向数据中增加一位
        }
        HD7279CLK_L;                                    //    置低时钟位
        Delay_us(10);
    }
    DATA_OUT();
    HD7279DATA_L;                                        //    数据线输出低电平
    Delay_us(10); 
    return(in_byte);                                    //    返回接收到的数据
}

// 函数名称:读7279
// 输入参数:无
// 输出参数:无

unsigned char read7279(void)                              //    读键值
{
    unsigned char temp = 0;
    send_byte(CMD_READ);                                 //    发送读键值命令
    temp = receive_byte();
    return temp;                                         //    返回键值
}
// 测试
void test7279(void)                                                   //    显示测试程序
{
     send_byte(CMD_TEST);                                            //    发送测试命令
     Delay_ms(1000);                                                 //    等待以便观察
     send_byte(CMD_RESET);                                           //    发送复位命令
}

int main(void)
{     
    unsigned char temp = 0;
    char buf[5] = {0};
    SysTick_Init();                                                     //  系统滴答定时器初始化
    lcd_init();                                                         //  液晶初始化
    lcd_clear(Black);                                                   //  设置液晶背景
    LCD_DrawRectangle(0,0, 479, 271, Green);
    LCD_DrawRectangle(5,5, 474, 266, Green);
    LCD_ShowString(10, 60, "由于IO口复用,所以请打开所有模块的电源开关", Red, Black); 
    LCD_ShowString(10, 100, "现象:", Red, Black); 
    LCD_ShowString(10, 120, "1.按下按键,观察数码管和液晶上显示的数据", Red, Black); 
    HD7279_GPIO_Configuration();  
    INT_Configuration();                                                 //  7279中断引脚配置
    send_byte(CMD_RESET);                                                //    复位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);
        }
    }
}

六.球球关注

关注b站 : Chasbaby bili_24795983555文章来源地址https://www.toymoban.com/news/detail-780312.html

到了这里,关于嵌入式开发7279A数码管 键盘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA设计开发(基础课题):七段数码管设计

    一、设计目的 FPGA驱动七段数码管实现十六进制计数显示。 二、设计原理 七段数码管分共阳极与共阴极两种。共阳极数码管其工作特点是,当笔段电极接低电平,公共阳极接高电平时,相应笔段可以发光。共阴极数码管则与之相反,它是将发光二极管的阴极短接后作为公共阴

    2024年02月07日
    浏览(54)
  • 学习笔记|小数点控制原理|数码管动态显示|段码跟位码|STC32G单片机视频开发教程(冲哥)|第十集:数码管动态显示

    上述图片引用自:51单片机初学2-数码管动态扫描 用一排端口来控制段码,需要显示哪几个就点亮哪几个段,和看电影一样,一个一个的打开,关闭,一个个的画面,组成动画。 具体的控制的流程如图所示,N表示有几个数码管! 其中需要注意每个延时不能太短,我们这边程

    2024年02月07日
    浏览(44)
  • 数码管移位循环显示数字verilog代码ego1开发板

    名称:数码管移位循环显示数字verilog代码ego1开发板 软件:VIVADO 语言:Verilog 代码功能: 采用EGO1中的两组数码管,让该8个数码管循环显示:01234567,12345678,23456789.... 电路的输入信号en进行启动或暂停;用按键控制循环,按一下显示下一组数。 FPGA代码Verilog/VHDL代码资源下载

    2024年02月03日
    浏览(41)
  • arm学习stm32之spi总线数码管倒计时,裸机开发,soc

    由于时间没有用时间计时器操作,有些误差,后续有空会翻新计时器版本 main.c spi.c spi.h

    2024年02月16日
    浏览(49)
  • 【STC8A8K64D4开发板】第2-12讲:数码管显示

    学习目的 了解数码管分类、工作原理及驱动电路的设计。 掌握STC8A8K64D4系列单片机驱动8位共阴数码管的动态显示的软件设计。 数码管概述 数码管是一种常用的显示设备,他有着价格便宜、使用简单的特点,在各个领域被广泛的应用,如空调、电子万年历、冰箱等等。学习数

    2024年02月20日
    浏览(40)
  • ARM开发,stm32mp157a-A7核SPI总线实验(实现数码管的显示)

            a.数码管显示相同的值 0000 1111 ......9999;         b.数码管显示不同的值 1234; ---spi.h头文件--- ---spi.c函数文件--- ---main.c测试文件--- a.数码管显示相同的值 0000 1111 ......9999; b.数码管显示不同的值 1234;

    2024年02月11日
    浏览(44)
  • 【单片机】【数码管】数码管显示

      1. 数码管的显示器及其接口 单片机系统中 常用的显示器有: 发光二极管LED显示器、液晶LCD显示器、TFT液晶显示器。本文主要是关于LED显示器的说明。 LED显示器有两种显示结构:段显示(7段、米字型等)和点阵显示(5x8、8x8点阵等)。 LED数码管根据接法可以分为共阴和共

    2024年02月08日
    浏览(54)
  • 【两周学会FPGA】从0到1学习紫光同创FPGA开发|盘古PGL22G开发板学习之数码管静态显示(四)

      本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 适用于板卡型号: 紫光同创PGL22G开发平台(盘古22K) 一:盘古22K开发板(紫光同创PGL22G开发平台)简介 盘古22K开发板是基于紫光同创Logos系列PGL22G芯片设计的一款FPGA开发板

    2024年02月10日
    浏览(52)
  • 51单片机(四)静态数码管和动态数码管显示

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包