找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

关于3*4矩阵键盘控制灯亮时间控制 附单片机源程序

查看数: 2835 | 评论数: 2 | 收藏 2
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-1-17 15:56

正文摘要:

本帖最后由 Hajime_S 于 2020-1-17 16:32 编辑 单片机为89c52,矩阵键盘接p10-12为列,p13-16为行,灯接p20-21。第89行我用计算器算出11110011的值确实为0xf3,但按下星号键的时候灯亮都不亮,但是按下1,4,7键都 ...

回复

ID:213173 发表于 2020-1-18 10:59
Hajime_S 发表于 2020-1-17 16:48
我后来又用keil的debug模拟了一下, 在节点到73行的时候把P1的值改成0xF3,结果直接跳到return0去了;但改 ...

给你改了一下,P1.0~1.6   3*4矩阵按键,P2 LED显示键值,P1.7可另作它用,不影响按键。
  1. #include "reg52.h"

  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. uchar key=0xff;                                //定义键值全局变量

  5. void keyscan()                                        //按键扫描程序
  6. {
  7.         static bit sign=0;                //按键自锁标志
  8.         static uchar count=0;        //消抖计数变量                       
  9.         uchar num=0;                                //临时变量
  10.         P1&=0x80;                                        //清P1低7位1000 0000 最高位保持原状
  11.         P1|=0x78;                                        //赋值P1 x111 1000 最高位保持原状
  12.         num=P1&0x78;                                //保存P1低7位0xxx x000,x为0或1
  13.         if(num!=0x78)                                //检测有按键按下
  14.         {
  15.                 if(++count>=100 && sign==0)//消抖与自锁识别
  16.                 {                       
  17.                         sign=1;                                //按键自锁标志置1
  18.                         P1&=0x80;                        //清P1低7位1000 0000
  19.                         P1|=0x87;                        //赋值P1 x000 0111
  20.                         num=(P1&0x07)|num;  //读P1低3位+num xxxx xxxx                               
  21.                         switch(num)
  22.                         {
  23.                                 case 0x76: key= 0;/*key='1';*/ break;
  24.                                 case 0x75: key= 1;/*key='2';*/ break;
  25.                                 case 0x73: key= 2;/*key='3';*/ break;
  26.                                 case 0x6e: key= 3;/*key='4';*/ break;
  27.                                 case 0x6d: key= 4;/*key='5';*/ break;
  28.                                 case 0x6b: key= 5;/*key='6';*/ break;
  29.                                 case 0x5e: key= 6;/*key='7';*/ break;
  30.                                 case 0x5d: key= 7;/*key='8';*/ break;
  31.                                 case 0x5b: key= 8;/*key='9';*/ break;
  32.                                 case 0x3e: key= 9;/*key='#';*/ break;
  33.                                 case 0x3d: key=10;/*key='0';*/ break;
  34.                                 case 0x3b: key=11;/*key='*';*/ break;
  35.                         }
  36.                 }
  37.         }
  38.         else                                                //键抬起
  39.         {
  40.                 sign=0;                                //按键自锁标志清0
  41.                 count=0;                                //消抖计数清0
  42.         }
  43. }

  44. void main()                                                //主函数
  45. {
  46.         while(1)
  47.         {
  48.                 keyscan();//按键扫描程序
  49.                 P2=key;//LED显示键值
  50.         }
  51. }
复制代码





ID:643607 发表于 2020-1-17 16:48
我后来又用keil的debug模拟了一下, 在节点到73行的时候把P1的值改成0xF3,结果直接跳到return0去了;但改成0xEB的时候,却能跳到delay函数去。。。实在不知道哪里错了

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表