原创 矩阵键盘

2008-11-1 20:59 967 0 分类: MCU/ 嵌入式
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 参考程序:


1 ASM程序:


 


        ORG     0000H


        AJMP    <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />MAIN


        ORG     0030H


MAIN:   MOV     SP,#6FH


        MOV     R2,#4


        MOV     R0,#30H


        MOV  A,#1DH


LOP1:   MOV     @R0,A


        INC     R0


        DJNZ    R2,LOP1


LOOP:   ACALL   DISP


        ACALL     KEY


      MOV     A,#0FFH


      XRL       A,R3


      JZ   LOOP


      ACALL SX


      MOV     33H,R3


      SJMP     LOOP


SX:     MOV     R0,#31H


      MOV     R1,#30H


        MOV     R2,#3      


LOP2:   MOV  A,@R0


      MOV     @R1,A


      INC       R0


      INC       R1  


        DJNZ    R2,LOP2


        RET


KEY:    MOV     P1,#0F0H


      MOV     A,P1


      XRL       A,#0F0H


      JZ   NONE


      ACALL DE10


      MOV     P1,#0F0H


      MOV     A,P1


      XRL       A,#0F0H


      JZ   NONE


      MOV     A,P1


      MOV     P1,#0FH


      ORL      A,P1


      MOV     R4,A


      MOV     P1,#0F0H


LK1:     MOV     A,P1


      XRL       A,#0F0H


      JNZ       LK1


      ACALL DE10


      MOV     R5,#10H


      MOV     R3,#0


      MOV     DPTR,#TABK


LK2:     CLR       A


      MOVC  A,@A+DPTR


      XRL       A,R4


      JZ   FHK


      INC       R3


      INC       DPTR


      DJNZ     R5,LK2


NONE: MOV     R3,#0FFH


FHK:    RET


TABK:  DB  077H,0E7H,0EBH,0EDH


      DB  0D7H,0DBH,0DDH,0B7H


      DB  0BBH,0BDH,07BH,07DH


      DB  07EH,0BEH,0DEH,0EEH 


DE10:   MOV     R5,#20


      JMP       LPD1                        


DELAY:  MOV     R5,#2


LPD1:   MOV     R6,#2


LPD2:   MOV     R7,#250


        DJNZ    R7,$


        DJNZ    R6,LPD2


        DJNZ    R5,LPD1


        RET


DISP:   MOV     R2,#4


        MOV     R0,#30H


        MOV     R3,#08H


        MOV     DPTR,#TABD


LDP:    MOV     A,@R0


        MOVC    A,@A+DPTR


        MOV     P0,A


        MOV     P2,R3


        MOV     A,R3


        RL      A


        MOV     R3,A


        INC     R0


      ACALL DELAY


        DJNZ    R2,LDP


        RET


TABD:   DB      5FH,44H,3DH,6DH


        DB      66H,6BH,7BH,45H


        DB      7FH,6FH,77H,7AH


        DB      1BH,7CH,3BH,33H


        DB      0DFH,0C4H,0BDH,0EDH


        DB      0E6H,0EBH,0FBH,0C5H


        DB      0FFH,0EFH,76H,1AH


        DB      37H,00H,20H,6EH      


        END


 


2 C程序:


   


#include <AT89X51.h>


#define uchar unsigned char


uchar data dispbit,dispbuf[4];


void delay (unsigned int count);


void display(void);


uchar key (void);


 


void main(void)


{


       uchar k,n;


       for (k=0;k<4;k++)


              {


              dispbuf[k]=0x1D;


              }


       do


       {


              display();


              n=key();


              if(n!=0xFF)


              {


                     for(k=0;k<3;k++)


                     {


                     dispbuf[k]=dispbuf[k+1];


                     }


                     dispbuf[3]=n;


              }


       }while(1);


}


 


void display(void)


{


       const uchar design[32]={0x5F,0x44,0x3D,0x6D,0x66,0x6B,0x7B,0x45,


                                   0x7F,0x6F,0x77,0x7A,0x1B,0x7C,0x3B,0x33,


                                         0xDF,0xC4,0xBD,0xED,0xE6,0xEB,0xFB,0xC5,


                                         0xFF,0xEF,0x76,0x1A,0x37,0x00,0x20,0x6E};


       uchar i;


       dispbit=0x08;


 


       for(i=0;i<4;i++)


       {


              P0=design[dispbuf];


              P2=dispbit;


              dispbit=dispbit+dispbit;


              delay (2);


       }


}


 


void delay (unsigned int count)


{


       unsigned int i,j;


       for (i=0;i<count;i++)


              for (j=0;j<120;j++);


}


 


uchar key(void)


{


       uchar m,key1,keyin;


       const uchar keycode[16]={0x77,0xE7,0xEB,0xED,


                                             0xD7,0xDB,0xDD,0xB7,


                                                  0xBB,0xBD,0x7B,0x7D,


                                                  0x7E,0xBE,0xDE,0xEE};


 


       keyin=0xFF;


       P1=0xF0;


       key1=P1;


       if(key1!=0xF0)


       {


       delay(10);


       P1=0xF0;


       key1=P1;


       if(key1!=0xF0)


              {


              key1=P1;


              P1=0x0F;


              key1=key1|P1;


              do


              {


              m=P1;


              }


              while(m!=0x0F);


              delay(10);


              keyin=0x00;


              while(keycode[keyin]!=key1)


                     {


                     keyin++;


                     }


              }


        }


       return(keyin);


}


   


四、 任务改进:


1  每次按键操作时,蜂鸣器响一声,作为指示;


2  在发光二极管显示屏上显示出每次按下的按键的二进制键值;


3  改变键值在数码管显示屏上的显示方式,得到不同的显示效果;


4  会分别用汇编语言和C语言编写程序。


 


 

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
0
关闭 站长推荐上一条 /2 下一条