wozhoujue 发表于 2012-2-24 15:40:31

矩阵键盘的扫描

下面是自己写的矩阵键盘的检测是程序哪里出来问题一直不知道,还是这中思路不行,求交流一下是程序的一部分,当检测到有按键时,亮一个灯
        #include<reg52.h>
                #define uchar unsigned char
                #define uint unsigned int
                void delay (uchar ms) ;
                uchar ms;
                void main()
                {
                        uchar temp;
                        P3=0xfe;
                        temp=P3;
                        temp&=0xf0;
                        if(temp!=0xf0)
                        {        delay(50);
                                temp=P3;
                              temp&=0xf0;
                                if(temp!=0xf0)
                                {
                                        temp=P3;
                                        switch(temp)
                                        {
                                        case 0xee:
                                        case 0xde:
                                        case 0xbe:
                                        case 0x7e:
                                             P1=0xfe;
                                             break;
                                        }
                                }
                        }

byd396558 发表于 2012-2-24 23:26:51

回复【楼主位】wozhoujue
-----------------------------------------------------------------------

我是新手,最近自己用汇编编了个程序调试成功。没自信看你的,不会C51
;********************************************************************************
;本程序实现扫描按键显示功能.                                                    *   
;分别按16个键盘显示分别显示数字0123456789ABCDEF                                 *
;键盘口P1,数码管显示一位, 数码管段位p0口                                 *
;********************************************************************************
   org        0000h
   ajmp main
   org        0080h
main:
   mov 30h,#00h;键盘码缓存
          mov p1,#0fh;输出扫描码
          lcall delay2;仿抖处理
          mov a,p1
          mov r3,a
          cjne a,#0fh,loop1;有输入,则输出下一个扫描码
          ajmp main
loop1:
   mov p1,#0f0h;输出扫描码
          mov r0,p1
          mov a,r0
          cjne a,#0f0h,loop2
          ajmp main
loop2:
   mov a,r3
          xrl a,r0
          mov 30h,a;暂存键盘码
          lcall chek;调用查询键盘码程序
   lcall display;调用显示程序段
          ajmp main;循环扫描
;#########查询键盘码
chek:
    mov r1,#00h
       mov        dptr,#tab1        ;键盘码首地址
ck1:
    mov a,r1
       inc r1
    movc a,@a+dptr;取键盘码
    jz ck2;取到00h,则说明键盘误动作,退出
       cjne a,30h,ck1
ck2:
    dec r1
    mov a,r1;取出相对地址
    ret
;#########获取显示码并显示
display:
    mov dptr,#tab2
       movc a,@a+dptr;取显示码
       mov p2,#0efh
       mov p0,a
ret                  
;#########延时
delay2:                                  ;延时去抖动子程序
      MOV R5,#10
L7:   MOV R6,#10
L8:   DJNZ R6,L8
      DJNZ R5,L7
      RET
tab1:
      db77h,0b7h,0d7h,0e7h,7bh,0bbh,0dbh,0ebh,7dh,0bdh,0ddh,0edh,7eh,0beh,0deh,0eeh,00h        ;键盘码表
tab2:
      db28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h,30h,25h,0a9h,26h,0a1h,0b1h,0ffh        ;数码管0123456789ABCDEF
                end
页: [1]
查看完整版本: 矩阵键盘的扫描