历史上的今天
返回首页

历史上的今天

今天是:2025年05月08日(星期四)

正在发生

2018年05月08日 | 4×4矩阵键盘,控制数码管显示

2018-05-08 来源:eefocus

题目要求:
两个数码管显示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以内
    }
}


推荐阅读

史海拾趣

CTC [Compact Technology Corp.]公司的发展小趣事

为了进一步扩大市场份额,CTC公司开始寻求与其他行业的跨界合作。一次与汽车制造商的洽谈中,CTC公司提出将自身的电子技术应用于汽车制造中,以提升汽车的性能和智能化水平。双方经过深入交流,达成了合作意向。这一跨界合作不仅为CTC公司带来了新的业务领域,也推动了汽车行业的创新发展。

Component General Inc公司的发展小趣事

随着市场的不断发展和竞争的加剧,Component General Inc公司意识到只有不断创新才能在行业中立足。因此,公司加大了对研发的投入,积极引进先进的技术和设备。经过多年的努力,公司成功地推出了一系列具有创新性的产品,如衰减器、同轴端子等,这些产品不仅提高了公司的市场竞争力,也为客户提供了更优质的解决方案。

BAHCO公司的发展小趣事

随着市场的不断变化和消费者需求的多样化,BAHCO也在不断调整和优化产品线。除了传统的五金工具外,BAHCO还积极开发新的产品领域,如电动工具、测量仪器等。这些新产品的推出不仅丰富了公司的产品线,也满足了不同消费者的需求。同时,BAHCO还注重产品的环保性能和可持续性发展,致力于为消费者提供更加环保、高效的产品解决方案。

BERGQUIST公司的发展小趣事

为了进一步提升竞争力,BERGQUIST公司开始寻求产业链整合和战略合作。公司与上游原材料供应商建立了长期稳定的合作关系,确保原材料的质量和供应稳定性。同时,公司还与下游电子设备制造商开展深度合作,共同研发定制化的热管理解决方案。这些举措不仅降低了公司的运营成本,还提高了产品的市场竞争力。

Fuji Teminal Industry Co Ltd公司的发展小趣事

面对日益严峻的环境问题和可持续发展的挑战,BERGQUIST公司始终坚持绿色发展的理念。公司不断投入研发力量,开发环保型热管理材料和生产工艺。同时,公司还积极推广节能减排技术,努力降低生产过程中的能耗和排放。这些举措不仅符合社会发展趋势,也为公司的可持续发展提供了有力保障。

这五个故事从不同角度展示了BERGQUIST公司在电子行业中的发展历程和成就,体现了公司不断创新、追求卓越的精神。这些事实性的描述旨在客观呈现BERGQUIST公司的历史与现状,不含任何褒贬之意。

FREESCALE (NXP)公司的发展小趣事

面对日益严峻的环境问题和可持续发展的挑战,BERGQUIST公司始终坚持绿色发展的理念。公司不断投入研发力量,开发环保型热管理材料和生产工艺。同时,公司还积极推广节能减排技术,努力降低生产过程中的能耗和排放。这些举措不仅符合社会发展趋势,也为公司的可持续发展提供了有力保障。

这五个故事从不同角度展示了BERGQUIST公司在电子行业中的发展历程和成就,体现了公司不断创新、追求卓越的精神。这些事实性的描述旨在客观呈现BERGQUIST公司的历史与现状,不含任何褒贬之意。

问答坊 | AI 解惑

酷派(N900)上面怎么拦截短信啊?

搞了半天没搞定... 酷派的人不给文档,我又不知道怎么搞? 有一份旧的文档,上面说实现一个long MyFun(long,bool)的函数就行了...但是实现了之后,根本就没反应.... 哪位晓得达人,告知一下,谢谢了…

查看全部问答>

MEGA16 4位数码管动态显示实验 请教高手啊

SPI接口实险,动态LED数据管显示实验。 1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。 2、动态调度由片内定时器1中断产生,中断周期为5mS。 3、内部1 M晶振,程序采用单任务方式,软件延时。 程序采用模块化编程,下面为主 ...…

查看全部问答>

矩阵键盘代码分享

//这里将共阳数码管位选信号省略了 module mat_keyscan(clk,rst_n,col,val,seg_data); //接口设置input clk,rst_n;input [3:0] val; //4行output reg [3:0] col; //4列output reg [7:0] seg_data; //输出所按下键的编号wire [7:0] data;assign dat ...…

查看全部问答>

ARM脱机编程器1拖4

    ST的ARM应用越来越多,我们经过测试和准备,在6月份左右推出一款一拖四的编程器,请大家多多关注。mxchip@163.com…

查看全部问答>

2407编译时出错

各位大侠 我在编译时每次都出现 Cannot open source file \'D:\\DOCUME~1\\ADMINI~1\\LOCALS~1\\Temp\\include.if\' [try.c] 这是怎么回事啊?我该怎么改呢? 谢谢各位!…

查看全部问答>

吉时利2600B系列系统数字源表®源测量单元(SMU)仪器

主要特性如下: •高度集成的4象限电压/电流源,提供业界最佳性能,分辨率6位半 • 系列型号具有业界最宽的动态量程:10A脉冲到0.1fA和200V到100nV • 内置基于Java的测试软件,通过任何WEB浏览器支持真正的即插即用I/V特性分析 ...…

查看全部问答>

关于PWM驱动伺服电机

想知道单片机是通过什么芯片驱动的电机。…

查看全部问答>

瑞萨电子设计大赛-自动化控制盒三

R7F0C809点亮一个LED灯     拿到开发板这么久了,今天让我们来学习一下如何点亮一个LED灯吧。   大家可能都会发现,在安装CubeSuite+后会没有发现我们这R7F0C809的这个IC,那么这个方法应该如何解决呢,看了好多大神 ...…

查看全部问答>

求一份TI M4 的ADC 多通道的程序

如题!! 本人新手,自己写了一份ADC多通道的程序,结果跪了,只能读到一个通道的,而且始终只能读到那个通道的,所以求一份 TM4C123G  的ADC多通道的程序参考下。。。。。。。。。 …

查看全部问答>