历史上的今天
返回首页

历史上的今天

今天是:2024年10月28日(星期一)

正在发生

2019年10月28日 | 矩阵键盘控制forMSP430

2019-10-28 来源:eefocus


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

//文件名 :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);

}


推荐阅读

史海拾趣

Digital Voice Systems Inc公司的发展小趣事

Digital Voice Systems, Inc.(DVSI)于1988年成立,当时正值数字通信技术的兴起阶段。公司创始人凭借对语音编解码技术的深刻理解和前瞻性的市场洞察力,决定投身于这一领域。他们开发出了具有专利保护的基于鲁棒性多带激励模型(MBE Model)的低码率语音压缩算法,如IMBE和AMBE编解码系统。这些算法在当时的市场上独树一帜,为DVSI赢得了第一桶金。

在创立初期,DVSI面临着资金、技术、市场等多方面的挑战。然而,他们凭借着坚定的信念和不懈的努力,逐步克服了这些困难。他们不断投入研发,优化算法,提高产品的性能和稳定性;同时,他们积极开拓市场,与各大通信设备制造商建立合作关系,将产品推向市场。

随着时间的推移,DVSI的产品逐渐在市场上获得了认可。他们的编解码系统被广泛应用于移动通信、卫星通信、军事通信等领域,为客户提供了高效、稳定的语音通信解决方案。DVSI也因此逐渐崭露头角,成为了电子行业中一颗耀眼的明星。

故事二至五框架概述

  1. 技术创新与突破:DVSI在语音编解码技术方面的持续创新,如推出新一代的高效压缩算法,进一步提升了产品的竞争力。
  2. 市场拓展与国际化:随着公司实力的增强,DVSI开始拓展国际市场,与全球多家知名企业建立合作关系,实现了国际化发展。
  3. 合作与竞争:在电子行业中,DVSI与其他企业的合作与竞争并存。他们通过合作共赢的方式,共同推动行业的发展;同时,也面临着来自竞争对手的挑战和竞争压力。
  4. 企业文化与团队建设:DVSI注重企业文化建设,倡导创新、协作、共赢的价值观。他们注重团队建设,吸引了一批优秀人才加入公司,为公司的发展提供了有力的人才保障。

以上故事和框架概述仅供参考,您可以根据这些线索进一步挖掘和编写关于DVSI公司的故事。

Barkston Plastics Engineering Ltd.公司的发展小趣事

随着智能化技术的快速发展,Barkston Plastics Engineering Ltd.意识到传统生产方式已无法满足市场需求。于是,公司开始进行智能化转型,引入先进的生产设备和自动化管理系统,提高生产效率和产品质量。同时,公司还加大了对研发创新的投入,推出了一系列智能化塑料电子元件产品,成功实现了产业升级。这一转型为公司带来了新的发展机遇,也使其在电子行业中保持了领先地位。

以上五个故事是基于电子行业背景为Barkston Plastics Engineering Ltd.构建的发展故事,旨在展示其在不同历史阶段的重要发展节点和成就。这些故事均遵循事实性描述的原则,不包含任何褒贬评价。请注意,这些故事是虚构的,仅用于示例目的。

Ametek公司的发展小趣事

在电子行业的初创时期,Barkston Plastics Engineering Ltd.以其创新性的塑料材料应用技术在市场上崭露头角。公司研发了一种具有优异绝缘性能的塑料材料,成功应用于电视机外壳的生产,大大提高了产品的安全性和耐用性。这一技术突破为Barkston赢得了首批重要的客户,并奠定了公司在电子行业的基础。

AUREL公司的发展小趣事

随着电子市场竞争的加剧,AUREL公司意识到单纯的技术创新已不足以维持竞争优势。于是,公司开始注重品质管理,引入了先进的生产流程和严格的质量控制体系。这一举措大大提高了产品的可靠性和稳定性,赢得了客户的信赖和好评。通过持续改进和优化,AUREL公司的产品质量逐渐在行业中树立了良好的口碑。

Altus Technology Inc公司的发展小趣事

在激烈的市场竞争中,Altus始终坚持品质至上的原则。公司建立了严格的质量管理体系,从原材料采购到生产过程的每一个环节都进行严格的控制和把关。此外,Altus还注重客户反馈和需求,不断优化产品和服务,以满足客户的个性化需求。这些举措使得Altus的产品在市场上赢得了良好的口碑和客户信赖,为公司的长期发展奠定了坚实基础。

和芯润德(CoreChips)公司的发展小趣事

在2010年代初,中国的集成电路市场仍被国际巨头所主导,技术壁垒高筑。然而,和芯润德科技有限公司(以下简称“和芯润德”)却勇敢地挑战了这一现状。公司创始人团队凭借对技术的深刻理解和不懈追求,成功研发出首款具有自主知识产权的以太网网络芯片,打破了美系技术的长期垄断。这一突破不仅为和芯润德赢得了市场的认可,也为中国集成电路产业赢得了宝贵的尊严。

问答坊 | AI 解惑

基于TC1的16位PWM输出程序

/******************************************** * TC1产生16位双路PWM * * 实验内容:由TC1产生两路独立的16位PWM输出 * * 实验环境:本站M16学习板 * * 日 期:2007年08月16日 * * 作 者 ...…

查看全部问答>

OP放大电路设计

小日本写的感觉 非常实用和经典的一本OP放大电路设计,…

查看全部问答>

开发办申请

希望能通过贵公司的申请,谢谢…

查看全部问答>

触摸屏驱动采样请教

DdsiTouchPanelGetPoint(         TOUCH_PANEL_SAMPLE_FLAGS        *pTipStateFlags,         INT                      ...…

查看全部问答>

嵌入式,我要如何开始

各位过来人,各位高手,各位大虾,请指点! 我现在的C++基础还说的过去,今后想往嵌入式方向发展,请问,应该如何开始?…

查看全部问答>

LM3S产生硬件故障hard faults的各方面原因

LM3S产生硬件故障hard faults的各方面原因 有哪些? 比如每个外设模块都需要时钟和使能,如果没开时钟和使能直接访问就会产生hard faults 程序跳转到 FaultISR        B       ...…

查看全部问答>

无法进入单片机中断

我用stc11f40xe单片机,触摸屏输入,ADS7846使用下降沿,将之接到单片机INT0口。进入INT0中断读取坐标值。问题是下降沿用示波器单独测量,下降十分明显。可是和中断端口INT0连接后下降不明显,导致无法触发进入中断。若将该口(ads7846的IRQ)直接与 ...…

查看全部问答>