4×4矩阵键盘,控制数码管显示

发布者:幸福自在最新更新时间:2018-05-08 来源: eefocus关键字:4×4  矩阵键盘  数码管显示 手机看文章 扫描二维码
随时随地手机看文章

题目要求:
两个数码管显示0-59秒的秒表。一矩阵键盘,输入0-F。
当A键按下后,进入修改时间状态,此时在分别按下0-9中的任意两个数,数码管时间更改。
如按下09,数码管此时显示09。
再按下A键,数码管从09继续跑。
写出C语言程序,端口随便接。
问题关键是如何实现A按下后,数码管秒数的改变。麻烦行家帮帮忙。非常感谢。
悬赏分:100 | 解决时间:2011-3-11 16:55
//=======================================
最佳答案:
下列程序已经调好,按键显示电路可见:
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/ef086222268d4f4eac34de59.html

4×4矩阵键盘,控制数码管显示 - 非著名博主 - 电子信息角落


//========================================
//单片机:使用51系列兼容的即可;
//4×4矩阵键盘:接在P1口;
//八位数码显示器: P0口输出七段码,P2口输出位选码。
//========================================
//C语言程序如下。
/************************************************************* 
* 文件名: KEY_LED.c 
* 功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。 
**************************************************************/ 
#include  
#include  
#define uint unsigned int 
#define uchar unsigned char

uchar  sec, t_50ms;
/************************************************************** 
* 名称 : Delay_1ms() 
* 功能 : 延时子程序,延时时间为 1ms * x 
* 输入 : x (延时一毫秒的个数) 
* 输出 : 无 
***************************************************************/ 
void Delay_1ms(uint x) 

    uint i; 
    uchar j; 
    for(i = 0; i < x; i++) for(j = 0; j <= 148; j++); 

/************************************************************** 
* 名称: Display(uchar k) 
* 功能: 将参数分成十位、个位分别显示
* 输入: k (键盘数值) 
* 输出: P0口输出七段码,P2口输出位选码
***************************************************************/ 
void Display(uchar k)
{
    uchar code table[10] = {0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; 
    P2 = 0;                    //消隐
    P0 = table[k / 10]; 
    P2 = 0x02; Delay_1ms(5);   //显示5ms十位
    P2 = 0;                    //消隐
    P0 = table[k % 10];     
    P2 = 0x01; Delay_1ms(5);   //显示5ms个位 
}
/************************************************************** 
* 名称: Keyscan() 
* 功能: P1外接4×4按键, 按照扫描法读出键值
* 输出: 按键值0~15/如无键按下, 返回16
***************************************************************/ 
uchar Keyscan(void) 

    uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f}; 
    for(j = 0; j < 4; j++) {  //循环四次
      P1 = Buffer[j];         //在P1高四位分别输出一个低电平
      temp = 0x01;            //计划先判断P1.0位
      for(i = 0; i < 4; i++) { //循环四次
        if(!(P1 & temp))      //从P1低四位,截取1位
          return (i + j * 4); //返回取得的按键值 
        temp <<= 1;           //判断的位,左移一位
    } }
    return 16;                //判断结束,没有键按下,返回16
}   //呵呵,实质性的语句不过8行,就是这么简练!
/************************************************************** 
* 名称: GetKey() 
* 功能: 读出按键、消抖、等待按键释放
* 输出: 按键值0~15/如无键按下, 返回16
***************************************************************/ 
uchar GetKey(void) 

    uchar  Key_Temp1, Key_Temp2; //两次读出的键值 
    P1 = 0xff; 
    Key_Temp1 = Keyscan();       //先读入按键
    if(Key_Temp1 == 16)  return 16; //没有键按下,返回16
    Display(sec);                //用显示代替延时
    Key_Temp2 = Keyscan();       //再读一次按键
    if(Key_Temp1 != Key_Temp2)  return 16; //不同,返回16
    while(Keyscan() < 16)    //等待按键释放
      Display(sec);          //等待期间显示
    return Key_Temp1;
}  
/************************************************************** 
* 名称 : Main() 
* 功能 : 主函数 
***************************************************************/ 
void Main(void) 

    uchar Key_Value;           //读出的键值
    TMOD = 0x01;
    TH1 = (65536-50000)/256;
    TL1 = (65536-50000)%256;
    TR0 = 1;
    ET0 = 1;
    EA = 1;
//----------------------以上启动了T0进行50ms定时
    sec = 0;
    while(1) {                 //主循环
      Display(sec);            //不停的显示
      if (GetKey() == 10) {    //如果按下了'A'键
        TR0 = 0;               //停止计时
        while (TR0 == 0) {
          Key_Value = GetKey();//再次输入键值
          if (Key_Value < 10) {//如果按下了0~9
            sec %= 10;
            sec = sec * 10 + Key_Value;//修改秒数
          }
          Display(sec);        //然后显示
          if (Key_Value == 10)  TR0 = 1;//如果按下了'A',重新启动TO计时
    } } } 
}
/************************************************************** 
* 名称 : T0_INT() 
* 功能 : T0中断函数
***************************************************************/ 
void T0_INT() interrupt 1
{
    TH1 = (65536-50000)/256;
    TL1 = (65536-50000)%256;    //50ms中断一次
    t_50ms++;
    if(t_50ms >= 20)  {         //如果中断了20次
      t_50ms = 0;
      sec++;                    //秒数加一
      sec %= 60;                //限定在60以内
    }
}


关键字:4×4  矩阵键盘  数码管显示 引用地址:4×4矩阵键盘,控制数码管显示

上一篇:51单片机的中断控制
下一篇:LCD1602 的4线接法

推荐阅读最新更新时间:2024-03-16 16:02

4寸屏幕手机 成主流机种
    NPD DisplaySearch表示,第1季4寸至4.9寸面板出货量1.55亿片,年增率241.3%,其中800480和854480屏幕分辨率的产品出货量7,964万片,年增率196.8%,并替代3.5寸,成为智能手机主流的屏幕。 随着中国移动补贴,人民币千元以内、4寸以上与480分辨率的双核智能机,有机会成为中国市场合约机主流方向。此外,苹果iPhone5的4寸屏幕(1136640),以及三星Galaxy S3 的4.8寸屏幕(1280720),均推升4至4.9寸产品成长,市占率亦达到28.8%。 2013年第1季5寸以上产品出货量3,292万片,年增率425.5%。手机品牌纷纷推出5寸以上四核心旗舰产品,并有部分品牌发
[手机便携]
中兴计划推30款4G手机 与联通合作首款999元
     3月20日消息,在与中国联通(11.74, -0.24, -2.00%)联合发布包括中兴“大Q ”在内的首批4G终端时,中兴通讯透露,2014年,中兴通讯计划推出30款左右的LTE手机,并将发力自研芯片产品的推广。目标为占据国内4G终端市场份额前两名的国产品牌。   中兴首款联通版4G手机亮相   中国联通于3月18日宣布4G正式商用,这标志着目前国内三大运营商已全部跨入4G时代。同时首批联通4G手机的上市也预示着4G市场的终端比拼正在逐渐升级。   3月19日,中兴通讯宣布,将推出中兴“大Q ”Q801U手机、便携MiFi MF90U等首批联通千元4G智能终端。中兴通讯总裁兼执行董事史立荣亲临现场,巧合的是,早在三年前,
[手机便携]
STM32CUBEMX开发GD32F303(4)----GPIO输出模式
概述 以STM32CUBEMX创建STM32F103工程,同时移植在GD32F303中,同时通过GD32303C_START开发板内进行验证。 需要样片的可以加Qun申请:615061293。 硬件准备 这里准备了2块开发板进行验证,分别是GD32303C_START开发板。 开发板管脚配置 在GD32303C_START中的LED管脚配置如下所示。 不同速率对应的波形 以PC3为例,在推挽输出无上下拉情况下,输出速率主要有4种,一般的低端MCU只有3种,没有Very High。 下面是ST的配置图。 在固件库中,定义如下所示。 LOW速率 Medium速率 High速率 Very High速率 可以看
[单片机]
STM32CUBEMX开发GD32F303(<font color='red'>4</font>)----GPIO输出模式
STM32 4 path PWM output
  STM32的普通定时器有四路输出:TIMx_CH1、TIMx_CH2、TIMx_CH3和TIMx_CH4,可以使用输出比较的方法产生不同频率的方波输出,简单的方法是:   1)设置计数器为向上计数模式,将自动重装载寄存器设置为0xFFFF;这样计数器会循环计数。   2)每个定时器通道设置为输出比较模式,并设置比较匹配时对应的输出管脚翻转输出。   3)按照输出波形的半波周期计算出一个数值称作Half_Cyc。例如:定时器的时钟频率是72MHz,需要产生3456Hz的方波,则Half_Cyc = 72M/(3456*2) = 41667;如需要产生200kHz的方波,则Half_Cyc = 72M/(200k*2)
[单片机]
美国认输,白宫内部期望4年后再封杀华为
美国去年通过的总额达7160亿美元2019 年度国防授权法(NDAA)当中,以安全疑虑为由,广泛禁止美国政府机关和承包商购买与使用华为设备。 美国白宫管理及预算局(OMB) 代理局长Russell Vought 在给美国副总统Mike Pence 和9 名国会议员的一封信中指出,目前对华为实施禁令的时程,很可能会导致供应政府需求的公司数量大幅减少,同时也会对那些依赖政府拨款的美国公司产生不小的影响,另外,农村联邦补助金受助人也可能受到禁令造成的不成比例影响。 Vought要求,对承包商以及联邦贷款和拨款受益者的限制在法律通过后四年生效,而不是在当前的两年内生效,以便让受影响的公司有时间作出调整并提供反馈。同时,政府也能有更多时间来
[手机便携]
长电科技面向更多客户提供4D毫米波雷达先进封装量产解决方案
长电科技近日宣布,面向更多客户提供4D 毫米波雷达 先进 封装 量产解决方案,满足汽车电子客户日益多元化的定制化开发与技术服务需求。 高精度车载毫米波雷达广泛应用于自适应巡航控制、盲点检测、自动紧急制动系统等领域,是为汽车提供安全保障的感知层的重要组成部分。可靠的高精度毫米波雷达先进封装解决方案,在保证 芯片 微系统的功能性和可靠性方面不可或缺。据罗兰贝格(Roland Berger)公司的预测显示,至2025年全球46%的车辆将具备L2级或更高功能。在汽车智能化发展的趋势下,Yole市场研究预测车载毫米波雷达市场规模2025年将达到105亿美元,年复合增长率将达11%。 目前业界应用于毫米波雷达产品的先进封装方案有倒装型
[汽车电子]
长电科技面向更多客户提供<font color='red'>4</font>D毫米波雷达先进封装量产解决方案
东亚LTE设备需求强劲 FPGA喜迎4G商机
东亚地区长程演进计画(LTE)设备需求,驱动现场可编程闸阵列(FPGA)业者营收攀升。2014年中国大陆及台湾陆续启动LTE商转,带动庞大的LTE设备购置及基础建设投资潮,深耕通讯领域有成的FPGA业者也趁着这波潮流搭上顺风车,大发LTE财。 赛灵思(Xilinx)亚太区销售与市场副总裁杨飞表示,中国大陆于2013年底发放LTE营运牌照后,业界都在引颈期盼这个全球最大的内需市场将为LTE供应链带来一波新气象;果不其然,2014年中国大陆三大电信营运商陆续启动LTE商转,加上台湾LTE网路也随后开通,两岸的LTE设备投资、采购潮更发挥了加乘效应。 杨飞进一步指出,两岸的LTE网路陆续启动商转后,基地台设备、基础建设的
[嵌入式]
Molex的4路LC适配器可增加光纤数量
Molex公司日前为网络设计人员开发出一种四路LC适配器,可满足高密度应用中日趋增加的光纤数量。 这种四路LC适配器利用一个适配器提供了多种连接方式,可用于集线器、服务器、路由器以及其它电信设备等高密度应用,也可用于光学DVI和存储及LAN等应用。 该适配器提供咬合安装或螺纹安装两种类型,比采用多路单独或双路LC适配器提供了更高的安装密度,并在用户端可选配独立防护门,使适配器在没有完全安装时保护人的眼睛。 该适配器提供磷青铜或氧化锆陶瓷定位套筒,支持单模、多模及角度磨光连接器,连接选项包括4路单一的LC连接器、2路单一和1路双LC连接器以及2路双LC连接器。
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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