矩阵键盘控制forMSP430

发布者:陈风102最新更新时间:2019-10-28 来源: eefocus关键字:矩阵键盘控制  MSP430  映射 手机看文章 扫描二维码
随时随地手机看文章


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

//文件名 :Keypad.c

//描述 :该文件定义与矩阵键盘有关的各种接口、函数,适用于MSP430F149

//编写人 :小邪@清水

//版本号 :1.01

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

 

#include 

#include "12864.h"

 

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

uchar keyval; //存放键值

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

 

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

//      1           2          3           13(enter)

//      4           5          6           14(up)

//      7           8          9           15(down)

//      11(.)       0          12(back)    16(clear)

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

 

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

//名称 : InitKeypad

//参数 : 延时的时间n

//返回值: 无

//功能 : 初始化矩阵键盘的IO口

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

void InitKeypad(void)

{     

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

    P1OUT |= 0xf0; // P1.4~P1.7输出高电平

    keyFlag = 0;       

    keyPressed = 0;   

    keyval = 0;

}

 

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

//名称 : CheckKey

//参数 : 无

//返回值: 无

//功能 : 扫描矩阵键盘,获取键值

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

void CheckKey(void)

{

    uchar row ,col,tmp1,tmp2;

    tmp1 = 0x80;

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

    {

        P1OUT = 0xf0; //P1.4~P1.7输出全1

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

        tmp1 >>=1;                              

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

        {                       

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

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

            {          

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

                {          

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

                    return; //退出循环

                }

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

            }

        }

    }      

}

 

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

//名称 : delay

//参数 : 无

//返回值: 无

//功能 : 延时 15 ms的时间,用于消抖

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

void delay()

{

    uint tmp;

     

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

}

 

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

//名称 : KeyEvent

//参数 : 无

//返回值: 无

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

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

void KeyEvent(void)

{     

    uchar tmp;

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

    tmp = P1IN; //获取 p1IN

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

    {                     

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

        delay(); //消除抖动

        CheckKey(); //调用checkKey(),获取键值 

    }     

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

    {                     

        keyPressed = 0; //清除keyPressed标识

        keyFlag    = 1; //设置keyFlag标识

    }

    else 

    {

        keyval = 17;

    }     

}

 

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

//名称 : KeyScan

//参数 : 储存矩阵键盘结果的数组的指针

//返回值: 无

//功能 : 将矩阵键盘扫描到的数据存储到数组中

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

void KeyScan(uchar *keyscan)

{

uchar i,n,flag;

i = 0;

flag = 0;

for(;;)

{

KeyEvent();

if(keyFlag == 1)keyFlag = 0;

if(keyval >= 0 && keyval <= 9)keyscan[i] = keyval + '0'; //按下数字键

if(keyval == 11)keyscan[i] = '.'; //按下小数点

if(keyval == 12) //按下退格键

{

keyscan[i-1]=' '; //清除前一位

i=i-2; //数组指针前移两位

flag=1; //小数点标志位置1

}

if(keyval == 13) //按下确定键

{

keyscan[i] = '';

break;

}

if(keyval == 16)

{

for(n = 0;n < i;n ++)keyscan[n] = ' ';

                        WriteStr(0x90,keyscan,(i+1)/2);

                        i = -1;

}

if(keyval == 17)i--; //无键按下

keyval = 17;

i++;

//在这里写入显示keyscan数组的语句,长度为i

                WriteStr(0x90,keyscan,(i+1)/2);

if(flag == 1) //有小数点键按下

{

//在这里写入在显示末尾写入空格的语句

                        Send(1,' ');

flag = 0;

}

  } 

}

 

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

//名称 : Str2Float

//参数 : 储存浮点数据result,储存键盘结果的数组指针

//返回值: result

//功能 : 将矩阵键盘扫描到的数据转化为浮点数

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

float Str2Float(uchar *keyscan)

{

        float result;

uchar i;

uint dot;

i = 0;

dot = 0;

for(i = 0;;i ++)

{

if(keyscan[i] == '.')

{

                        if(keyscan[i + 2] == '')keyscan[i + 2] = '0';

if(i == 1)result = (keyscan[0] - '0') + (keyscan[2] - '0') * 0.1 + (keyscan[3] - '0') * 0.01;

if(i == 2)result = (keyscan[0] - '0') * 10 + (keyscan[1] - '0') + (keyscan[3] - '0') * 0.1 + (keyscan[4] - '0') * 0.01;

break;

}

if(keyscan[i] == '' && dot == 0)

{

if(i == 1)result = keyscan[0] - '0';

if(i == 2)result = (keyscan[0] - '0') * 10 + keyscan[1] - '0';

break;

}

return(result);

}


关键字:矩阵键盘控制  MSP430  映射 引用地址:矩阵键盘控制forMSP430

上一篇:msp430学习笔记2——堆栈指针寄存器 SP详解
下一篇:MSP430学习笔记(3)时钟模块

推荐阅读最新更新时间:2024-11-10 14:53

MSP430单片机中的WDT研究
  引 言   软件的可靠性一直是一个关键问题。任何使用软件的人都可能会经历计算机死机或程序跑飞的问题,这种情况在嵌入式系统中也同样存在。由于单片机的抗干扰能力有限,在工业现场的仪器仪表中,常会由于电压不稳、电弧干扰等造成死机。在水表、电表等无人看守的情况下,也会因系统遭受干扰而无法重启。为了保证系统在干扰后能自动恢复正常,看门狗定时器(Watchdog TI mer)的利用是很有价值的。   1 看门狗的作用   看门狗定时器是一个计数器,基本功能是在发生软件问题和程序跑飞后使系统重新启动。看门狗计数器正常工作时自动计数,程序流程定期将其复位清零,如果系统在某处卡死或跑飞,该定时器将溢出,并将进入中断。在定时器中断中执行一些
[单片机]
<font color='red'>MSP430</font>单片机中的WDT研究
STM32F030C6 IAP功能APP中断向量表重映射
1、IAP中断向量表重映射 1.1、Coretext-M3与Coretext-M4: SCB- VTOR = 0X08000000|0X20000; __set_PRIMASK(0); 在System Control Block中存在一个向量表偏移量寄存器 VTOR(0xE000ED08),系统产生中断后,内核通过这个寄存器的值来找到中断向量表的地址,进而执行中断例程代码, M3/M4的这个VTOR寄存器一开始时它的值也是为默认值0,只不过在程序运行到SystemInit()函数后,在代码中明确对其进行了修改 1.2、Coretext-M0: __enable_irq(); memcpy((void*)
[单片机]
MSP430F5529 工作时钟提升到25MHZ
使用 void main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer initClock(); while(1); } #include sys.h void SetVcoreUp(unsigned int level) { // Open PMM registers for write PMMCTL0_H = PMMPW_H; // Set SVS/SVM high side new level SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 *
[单片机]
MSP430和CC3000的智能手机控制系统
1 系统结构及总体设计 本系统的结构框图如图1所示。系统总共分为5部分,分别是:无线路由器、智能手机、CC3000 Wi—Fi模块、MSP430单片机电路和直流电机驱动电路。首先,智能手机将Wi-Fi连接到无线路由器;接着打开智能手机中的SmartConfig的APP,配置CC3000 Wi—Fi模块,这样CC3000即可连接到无线路由器;然后打开电机控制APP,建立智能手机和CC3000 Wi—Fi模块的连接。其中,CC3000 Wi—Fi模块与MSP430单片机是通过SPI总线进行通信的。最后,可以通过智能手机中的电机控制APP对电机进行无线控制。 2 硬件设计 2.1 CC3000 Wi-Fi模块 系统无线通信部分采
[单片机]
<font color='red'>MSP430</font>和CC3000的智能手机<font color='red'>控制</font>系统
TI MSP430系列单片机串口通信波特率计算方法
TI MSP430系列单片机,usart模块的波特率值设定是通过以下三个寄存器决定的:UxBR0,UxBR1,UxMCTL 波特率=BRCLK/N ,主要是计算出N。 BRCLK:时钟源,可以通过寄存器设定何为时钟源; 通过寄存器UCAxCTL1的SSEL两位选择,01:ACLK,02:SMCLK N:波特率产生的分频因子。N=UxBR1+UxBR0+UxMCTL,其中UxBR1+UxBR0为整数部分,UxMCTL为设定小数部分,其中 UxBR1为高位,UxBR0为低位,两者结合起来为一个16位的字。 举例说明:波特率=115200,时钟源=8MHz ,为外部晶体振荡器 N=8000000/115200=69.44
[单片机]
超低功耗温度测量与显示方案
摘要 温度测量系统应用广泛,被大量应用于电厂、建材、煤化工、冶金、供热、工程机械热处理、煤质化验等温度测控领域。实现高精度、低功耗温度监测成为多种行业的需求,本文介绍了一种超低功耗温度测量显示系统的实现方法,给出了其硬件连接方式及软件工作流程,对超低功耗设计方法给出具体思路。 硬件连接 谈到低功耗方案设计,有过单片机开发经历的工程师基本都会想到欧美知名芯片厂商的MSP430超低功耗MCU,MSP430在功耗控制方面处在行业领先水平,但片内资源有限,在进行高精度温度测量时需要采集温度传感器的微弱信号,12位的片内ADC就不能满足要求,需要外加仪表放大器和高精度ADC,以满足温度传感器信号的高精度测量,通常选择AD7794或ADS
[单片机]
超低功耗温度测量与显示方案
MSP430单片机为控制运算核心的CCD可选调光电控系统设计
1.引言 自我国研制出第一台大型经纬仪以来,摄影一直是电影经纬仪用于对飞行器(导弹,火箭,宇宙飞船)的主要测量记录手段。摄影胶片记录的内容在判读时能否被发现,与目标相对背景的对比度有极重要的关系。调光的目的在于使胶片的曝光量保持在胶片感光特性曲线的直线段所规定的范围之内: (r为底片反差系数),而不受外界背景亮度变化的影响。以前经纬仪传统的摄影调光是采用变换平衡电桥参数的方法来控制像面照度,检测元件为光敏电阻。为了适应胶片感光度、摄影频率和天空背景亮度等各种摄影条件。就要由操作人员来装定数种不同,并按一定关系排列的背景照度值。每次摄影时,预先用照度计测出天空背景照度值,还要查曝光列表,选择合适的电阻装定在检测电桥的一个臂上,用
[单片机]
以<font color='red'>MSP430</font>单片机为<font color='red'>控制</font>运算核心的CCD可选调光电控系统设计
基于MSP430的智能自适应间断光控系统
0 引言 传统的温室大棚光照系统,在光照强度不够的情况下就进行补光,补光的时间不能调节,是一直亮着的,而且补光的程度都一致,不能调节。这样在有些情况下,不仅会浪费多余的光照,浪费了宝贵的电能,不利于节能减排,而且如果外界环境中的光照强度加上补光产生 的光照强度的总和超过了植物的光饱和点,这样对于植物的生长不但没有帮助,还会由于光照强度过强对植物的光合作用产生抑制作用。传统补光灯通常为白光,白光中大部分光谱能量都不能被光合作用利用。传统补光灯的成本,以满足1 mx1 mx1 m空间补光,电费以0.6元/度,一个月以30天计算,一盏普通功率40 W,持续照射1个月耗能28.8度,需要5盏,合计电费86元,5盏灯售价约400元,支架
[单片机]
基于<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