MSP430学习笔记7-4*4键盘的对应数码管显示

发布者:binggege最新更新时间:2020-02-03 来源: eefocus关键字:MSP430  4*4键盘  数码管显示 手机看文章 扫描二维码
随时随地手机看文章

这个例程也是开发板上面的一个经典例程,我对程序的框架进行了修改,更适合以后的调用。具体的4*4键盘扫描原理较为基础这里不再赘述,这里我认为比较重要的是要养成一个良好的写程序的习惯,想4*4键盘扫描这样的函数可以写成一个固定的C或者H文件,便于以后调用。先看看主程序:

/***********************************************

程序功能:扫描4X4键盘并将键值在数码管上显示


------------------------------------------------

测试说明:按动K1~K16按键,观察数码管显示

************************************************/

#include

#include "Keypad.C"


//数码管7位段码:0--f

unsigned char scandata[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

                              0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

//记录显示位数的全局变量

unsigned char cnt = 0;

//显示缓存

unsigned char Dispbuf[2];


//引用外部变量的声明

extern unsigned char key_Pressed;      

extern unsigned char key_val;         

extern unsigned char key_Flag; 



/********************主函数********************/

void main(void)

{

    /*下面六行程序关闭所有的IO口*/

    P1DIR = 0XFF;P1OUT = 0XFF;

    P2DIR = 0XFF;P2OUT = 0XFF;

    P3DIR = 0XFF;P3OUT = 0XFF;

    P4DIR = 0XFF;P4OUT = 0XFF;

    P5DIR = 0XFF;P5OUT = 0XFF;

    P6DIR = 0XFF;P6OUT = 0XFF;

  

    P6DIR |= BIT2;P6OUT |= BIT2;  //关闭电平转换      

    WDTCTL = WDT_ADLY_1_9;        //设置内部看门狗工作在定时器模式,1.9ms中断一次

    IE1 |= WDTIE;                 //使能看门狗中断

  

    _EINT();                      //打开全局中断

    Init_Keypad();

    while(1)

    {

        Key_Event();

    

        if(key_Flag == 1)

        {

            key_Flag = 0;

            Dispbuf[1] = key_val / 10;

            Dispbuf[0] = key_val % 10;

            

        }

    }

}

/*******************************************

函数名称:watchdog_timer

功    能:看门狗中断服务函数,在这里输出数码管的

          段选和位选信号

参    数:无

返回值  :无

********************************************/

#pragma vector=WDT_VECTOR

__interrupt void watchdog_timer(void)

    P4OUT = 0xff;

    P5OUT = scandata[Dispbuf[cnt]];         //输出段选信号

    P4OUT &= ~(1 << (cnt+2));               //输出位选信号

  

    cnt++;                                  //位计数变量在0~1之间循环

    if(cnt == 2) cnt = 0;

}


主程序较为简单,具体的原理参见上一个笔记,在主程序中与键盘扫描相关的函数被击中在Keypad.C中,需要说明的是在主函数中需要对Keypad.C的部分变量做声明,这样才能使用Keypad.C中的变量。Keypad.C代码如下:

/********************************************************

4*4键盘扫描函数

作者:孙浩

修改时间:2010.8.2

程序说明:

此程序以开发板的例程做部分修改,更方便程序调用。

在调用之前需要注意需要在主函数中对程序中使用的变量做外部变量声明

需要在主函数中声明的变量如下:

//引用外部变量的声明

extern unsigned char key_Pressed; //按键是否被按下:1--是,0--否     

extern unsigned char key_val;     //存放键值    

extern unsigned char key_Flag;    //按键是否已放开:1--是,0--否

另外对应的键值可以在本文件的全局变量中修改,只需要对应修改

数组uchar key_Map[]的对应的值即可。

调用示例如下:

Init_Keypad();        //先进行初始化

    while(1)

    {

        Key_Event();  //在死循环中进行键值扫描

    

        if(key_Flag == 1)//用来判断有无按键按下,从而读取键值进行操作

        {

            key_Flag = 0;//key_Flag需要手动清零

        }

    }

**********************************************************/

#include 

//相应的函数声明

void Init_Keypad(void);//键盘初始化

void Check_Key(void);

void delay();

void Key_Event(void);//读取键盘函数,在使用时通过此函数进行键盘扫描


//选择对应的端口

#define KEYOUT P1OUT

#define KEYIN P1IN

#define KEYDIR P1DIR


typedef unsigned char uchar;

typedef unsigned int  uint;


/***************全局变量***************/

uchar key_Pressed;      //按键是否被按下:1--是,0--否

uchar key_val;          //存放键值

uchar key_Flag;         //按键是否已放开:1--是,0--否

//设置键盘逻辑键值与程序计算键值的映射

uchar key_Map[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};


/*******************************************

函数名称:Init_Keypad

功    能:初始化扫描键盘的IO端口

参    数:无

返回值  :无

********************************************/

void Init_Keypad(void)

{     

    KEYDIR = 0xf0;       //KEY.0~KEY.3设置为输入状态, KEY.4~KEY.7设置为输出状态

    KEYOUT |= 0xf0;      // KEY.4~KEY.7输出高电平

    key_Flag = 0;       

    key_Pressed = 0;   

    key_val = 0;

}

/*********************************************

* Check_Key(),检查按键,确认键值

*********************************************/

/*******************************************

函数名称:Check_Key

功    能:扫描键盘的IO端口,获得键值

参    数:无

返回值  :无

********************************************/

void Check_Key(void)

{

    uchar row ,col,tmp1,tmp2;

    

    tmp1 = 0x80;

    for(row = 0;row < 4;row++)              //行扫描

    {

        KEYOUT = 0xf0;                      //KEY.4~KEY.7输出全1

        KEYOUT -= tmp1;                      //KEY.4~p1.7输出四位中有一个为0

        tmp1 >>=1;                              

        if ((KEYIN & 0x0f) < 0x0f)           //是否KEYIN的KEY.0~KEY.3中有一位为0

        {                       

            tmp2 = 0x01;                         // tmp2用于检测出那一位为0  

            for(col = 0;col < 4;col++)              // 列检测 

            {          

                if((KEYIN & tmp2) == 0x00)           // 是否是该列,等于0为是

                {          

                    key_val = key_Map[row * 4 + col];  // 获取键值

                    return;                         // 退出循环

                }

                tmp2 <<= 1;                        // tmp2右移1位 

            }

        }

    }      

}

/*******************************************

函数名称:delay

功    能:延时约15ms,完成消抖功能

参    数:无

返回值  :无

********************************************/

void delay()

{

    uint tmp;

     

    for(tmp = 12000;tmp > 0;tmp--);

}

/*******************************************

函数名称:Key_Event

功    能:检测按键,并获取键值

参    数:无

返回值  :无

********************************************/

void Key_Event(void)

{     

    uchar tmp;

     

    KEYOUT &= 0x00;              // 设置KEYOUT全为0,等待按键输入

    tmp = KEYIN;                 // 获取 p1IN

    if ((key_Pressed == 0x00)&&((tmp & 0x0f) < 0x0f)) //如果有键按下

    {                     

        key_Pressed = 1;        // 如果有按键按下,设置key_Pressed标识

        delay();                //消除抖动

        Check_Key();            // 调用check_Key(),获取键值 

    }     

    else if ((key_Pressed == 1)&&((tmp & 0x0f) == 0x0f)) //如果按键已经释放

    {                     

        key_Pressed = 0;        // 清除key_Pressed标识

        key_Flag    = 1;        // 设置key_Flag标识

    }

    else 

    {

        _NOP();

    }     

}


具体的注意提防都已经在注释中做了说明,在原来的程序中这个文件是分为Keypad.C和Keypad.h两个文件,键盘扫描函数的声明单独为一个头文件,我觉得并不是特别需要。源程序中全局变量是单独列为一个头文件gdata.h的。这样在全局变量比较多的情况下可以使程序更有条理可以参考。

关键字:MSP430  4*4键盘  数码管显示 引用地址:MSP430学习笔记7-4*4键盘的对应数码管显示

上一篇:MSP430学习笔记3-PWM的产生
下一篇:在msp430上使用S-100

推荐阅读最新更新时间:2024-11-16 21:30

MSP430:AD10
使用的MSP430G2553,为AD10,正常有8路输出,P1.0-P1.7为A0-A7 有七个寄存器, 参考电压可以是VCC或者内部参考电压1.5V或者2.5V 参考时钟可以是内部ADC10OSC 最高转换速率达200ksps 转换方式四种:单通道单次,序列通道单次,单通道多次,序列通道多次。多次转换时候会用到DTC功能防止数据还没被取出就被覆盖 单通道的实例程序,开启的为通道5,也就是P1.5 1 void AD_Channel5_Config(void) 2 { 3 /* Configure ADC Channel */ 4 ADC10CTL1 = INCH_5 + ADC10DIV_0
[单片机]
<font color='red'>MSP430</font>:AD10
用于MSP430单片机的温度测量实验设计
  随着时代的发展,科学技术也不断进步,新的科学技术在各个领域里广泛应用。高等教育是培养高水平人才的重要途径,但目前某些教学内容还比较落后,并没有跟上现代科技的发展。在高等教育的课程中引入更多的现代技术,有利于对人才的培养。本文介绍一种应用MSP4 30单片机 测量温度的方法,来代替传统教学中相对落后的热敏电阻结合电流表的实验方法。   1 温度测量部分   用于测量温度的温度敏感元件有很多种,比如热电偶、热敏电阻、集成温度传感器、数字温度传感器等等。本系统采用的是热敏电阻。热敏电阻由对温度非常敏感的半导体陶瓷质工作体构成。与一般常用的金属电阻相比,它有较大的电阻温度系数,可以获得较高的温度分辨率。不同材料制成的热敏电阻适用
[单片机]
用于<font color='red'>MSP430</font>单片机的温度测量实验设计
MSP430FF529实现跑马灯(中断方法)
功能: 使用端口的中断功能实现以下功能:按下按键S1,跑马灯正向运行;按下按键S2,跑马灯反向运行。 原理: MSP430F5529单片机内端口模块共有11个端口P11~P11。其中只有P1、P2端口具有中断功能。跟中断功能相关寄存器有:PxIFG, PxIE, PxIES。 PxIE为中断使能寄存器 0:禁止中断 1:允许中断 eg:P1IE = 0x10 //P1.4引脚中断使能 PxIES 为中断触发沿选择寄存器 0:上升沿中断标志置位 1:下降沿中断标志置位 eg:P1IEs = 0x10 //P1.4引脚中断使能 【改变PxIES可能使相应的中断标志置位】 PxIFG中断标志寄存器 相应的引脚有中断请求,会使
[单片机]
采用AT89S51的并行口P1接4×4矩阵键盘程序
1.实验任务 如图4.14.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。对应的按键的序号排列如图4.14.1所示   图4.14.1 2.硬件 电路 设计原理图   图4.14.2 3.系统板上硬件连线设计 (1. 把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上; (2. 把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任
[单片机]
采用AT89S51的并行口P1接<font color='red'>4</font>×<font color='red'>4</font>矩阵<font color='red'>键盘</font>程序
MSP430F5529 (六)定时器Timer_A-2
6.4 捕获比较模块 这是在以上介绍的基础上正式讲TA的重要功能。 先看一个寄存器TACCTL0-TACCTL6:(TA中最复杂的寄存器,用到的时候查表啦) CMx:捕获模式设定 00 不捕获 01 上升沿捕获 10 下降沿捕获 11上升和下降沿都捕获 CCISx:捕获源的选择 00 CCIxA 01 CCIxB 10 GND 11 VCC SCS:同步捕获源,设定是否与时钟同步 0 异步捕获 1 同步捕获 SCCI:选择的CCI输入信号由EQUx信号锁存,并可通过该位读取。 CAP: 0-比较模式 1-捕获模式 OUTMOD:
[单片机]
<font color='red'>MSP430</font>F5529 (六)定时器Timer_A-2
MSP430系列单片机的加密熔断器是怎样炼成的?
MSP430 系列单片机是德州仪器(TI)公司推出的一款16位超低功耗单片机。它能够在1.8~3.6 V电压、1 MHz频率的条件下运行,耗电电流在0.1~400μA。在运算速度上,MSP430系列单片机能在8 MHz晶振的驱动下,实现125 ns的指令周期。16位的数据宽度、125 ns的指令周期以及多功能的硬件乘法器相配合,能实现数字信号处理的某些算法(如FFT等)。 在整合方面,MSP430系列单片机将大量的CPU外围模块集成在片内,有如下一些模块:看门狗(WDT)、模拟比较器、串口、硬件乘法器、液晶驱动器、 10位/12位/14位ADC、端口0~6、基本定时器。其中定时器A、B均带有多个捕获/比较寄存器,同时可实现多路
[单片机]
<font color='red'>MSP430</font>系列单片机的加密熔断器是怎样炼成的?
msp430程序升级方法
最近在搞430的FLASH的自定义法(利用串口)程序烧写,烧写完成后断电复位,reset按键就可以运行新的程序。但是和学长交流了一下,这种方法不够好,希望有一种软复位的方式。于是百度了一下,都是些对看门狗进行写入特殊值使得430的cpu复位。反正个人是没有采用。 因为在搞程序的烧写下载,所以看了一下430的BSL。看到里面有一段话,关于从C代码中启动BSL的方法。如下: 从一个外部应用中启动BSL 将程序计数器设定到内存为位置0x1000 来启动BSL。堆栈一直被复位,而RAM 被清空。应该注意的是,GIE 位未被禁用,所以如果不需要中断的话,这一步应该通过调用应用来完成,并且如果它们被使用的话,这一步应该从“返回BSL
[单片机]
基于MSP430的无线传感器网络设计
引言   传感测试技术正朝着多功能化、微型化、智能化、网络化、无线化的方向发展。自组织无线传感器网络(Self Organizing Wireless Sensor Networks)作为新兴技术,是目前国外研究的热点,其在军事、环境、健康、家庭、商业、空间探索和灾难拯救等领域展现出广阔的应用前景。早在2003年美国自然科学基金委员会已经斥巨资来支持这方面的研究,并且出现了一些致力于无线传感器网络的公司,其中Crossbow公司已推出了Mica系列传感器网络产品。国内很多大学现已经开展相关领域的研究,但大部分工作仍处在自组织无线网络协议性能仿真和硬件节点小规模实验设计阶段。本文就国防科技大学传感器教研室开展可应用于环境监测方面无
[工业控制]
基于<font color='red'>MSP430</font>的无线传感器网络设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved