89c52单片机4*4矩阵键盘编程 20

用AT89C52单片机并行口91接4*4矩阵键盘。以p1.0~p1.3.作为输入线。p1.4~1.7作为输出线。求其程序(最好附仿真图)。。谢谢!重点:以p1.0~p1.... 用AT89C52单片机并行口91接4*4矩阵键盘。以p1.0~p1.3.作为输入线。p1.4~1.7作为输出线。
求其程序(最好附仿真图)。。谢谢!
重点:以p1.0~p1.3.作为输入线。p1.4~1.7作为输出线
展开
 我来答
lin1413969042
2012-05-30 · 超过18用户采纳过TA的回答
知道答主
回答量:101
采纳率:100%
帮助的人:20.3万
展开全部

#include <reg51.h> 

#include <intrins.h> 

#define uint unsigned int 

#define uchar unsigned char

//uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09}; 

uchar code table[10] = {0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; 

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

* 名称 : 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++); 

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

* 名称: 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*4 + j); //返回取得的按键值 

        temp <<= 1;           //判断的位,左移一位

    } }

    return 16;                //判断结束,没有键按下,返回16

}  

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

* 名称: Display(uchar k) 

* 功能: 将参数分成十位、个位分别显示

* 输入: k (键盘数值) 

* 输出: P0口输出七段码,P2口输出位选码

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

void Display(uchar k)

{

    P2 = 0;                    //消隐

    P0 = table[k / 10]; 

    P2 = 0x02; Delay_1ms(5);   //显示5ms十位

    P2 = 0;                    //消隐

    P0 = table[k % 10];     

    P2 = 0x01; Delay_1ms(5);   //显示5ms个位 

}

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

* 名称 : Main() 

* 功能 : 主函数 

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

void Main(void) 

    uchar Key_Value = 16, Key_Temp1, Key_Temp2;   //两次读出的键值 

    while(1) {

//---------以下读入按键、消抖、等待按键释放

      P1 = 0xff; 

      Key_Temp1 = Keyscan();       //先读入按键

      if(Key_Temp1 != 16) {        //如果有键按下

        //Delay_1ms(10);           //延时一下

        Display(Key_Value);        //可用显示代替延时

        Key_Temp2 = Keyscan();     //再读一次按键

        if (Key_Temp1 == Key_Temp2) {//必须是两次相等

          Key_Value = Key_Temp1;   //才保存下来,这就是消除抖动

          while(Keyscan() < 16)    //等待按键释放

            Display(Key_Value);    //等待期间显示键值

//---------以下是对按键的处理

          Display(Key_Value);      //显示键值

      }  }

      Display(Key_Value);          //没有按键按下,也显示键值

    } 

}

做而论道
高能答主

2012-05-31 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
呵呵,一楼的回答,是我两年多前,发表的博文。

搜:
做而论道 用扫描法读出4×4矩阵键盘,在数码管显示按键值
百度一下,即可。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
奕93494
2013-06-08
知道答主
回答量:1
采纳率:0%
帮助的人:1493
展开全部
怎么没答案
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
草原狼159522
2012-05-30 · TA获得超过530个赞
知道小有建树答主
回答量:332
采纳率:50%
帮助的人:392万
展开全部
邮箱给我,我发你;源程序和仿真图
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式