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矩阵键盘,控制数码管显示 - 非著名博主 - 电子信息角落

//图片链接:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/f2005aed8e04396063d09f24.html
//========================================
//单片机:使用51系列兼容的即可;
//4×4矩阵键盘:接在P1口;
//八位数码显示器: P0口输出七段码,P2口输出位选码。
//========================================
//C语言程序如下。
/*************************************************************
* 文件名: KEY_LED.c
* 功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。
**************************************************************/
#include <reg51.h>
#include <intrins.h>
#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以内
    }
}
/**************************************************************
回答时间:2011-3-11 00:07
回答者: 做而论道 | 十四级
提问者对于答案的评价:谢谢
原题网址:http://zhidao.baidu.com/question/235395309.html
***************************************************************/

  • 9
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4*4矩阵键盘是常用的输入设备,它通过按键的位置和按键在一定的时间内持续的状态来识别输入的字符。数码管是一种数字显示装置,常用于计数器、电子时钟、温度计等电子产品中。VHDL是一种硬件描述语言,可以用来描述数字电路的结构和行为,是数字系统设计的重要工具。 当使用4*4矩阵键盘控制数码管时,需要通过VHDL设计出相应的电路实现。具体实现方法如下: 1. 4*4矩阵键盘扫描电路 在设计矩阵键盘扫描电路时,需要采用逐行扫描的方式。具体实现方法如下: 将4行分别接入4个输入引脚,将4列分别接入4个输出引脚。通过在每一行按键按下时输出脉冲信号,根据脉冲信号在每一列检测是否有按键按下。当检测到按键按下时,记录按键的位置,将其转化为对应的ASCII码,并将其发送给数码管显示器。 2. 数码管显示电路设计 数码管是一种七段显示器,每个数字由7个发光二极管组成。通过不同的电压信号来控制发光二极管的导通和断开,从而实现数码管的数字显示。 在设计数码管显示电路时,需要采用数字电路中的时序控制策略。当有输入信号时,数码管显示器需要接收到相应的控制信号,控制具体数字在七段显示器上的显示位置和时间。例如,在显示一个数字时,需要将这个数字的7个发光二极管同时导通,持续一段时间,然后再关闭。 因此,根据以上设计思路,可以使用VHDL进行编程设计,实现4*4矩阵键盘数码管控制。这样的数字系统广泛应用于各种计数器、电子时钟、温度计等电子产品中,为我们的生活提供了便利。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值