EDN首页   博客首页

日志档案

发表于 2008-8-13 0:19:13

5

标签: 矩阵式键盘  

矩阵式键盘控制显示器

         在开关很多的情况下,一般采用矩阵式键盘,本程序使用4*4矩阵式键盘,共有16个按键,通过扫描方法控制显示器输出0~F  十六进制数。

       硬件电路如下:

           

             在单片机的P3端口接有4*4矩阵式键盘,矩阵式键盘有4条行线和4条列线组成,16个按键设置在行、列交点上.

               ASM程序:

                ORG 00H
START:   MOV   R4,  #00H
L1:      MOV   R3,  #0F7H
   MOV   R1,  #00H
L2:   MOV   A,   R3
   MOV   P3,  A
   MOV   A,   P3
   MOV   R4,  A
   SETB  C
   MOV   R5,  #04H
L3:   RLC   A
   JNC   KEY
   INC   R1
   DJNZ  R5,  L3
   MOV   A,   R3
   SETB  C
   RRC   A
   MOV   R3,  A
   JC    L2
   JMP   L1
KEY:  ACALL DELAY
D1:   MOV   A,   P3
   XRL   A,   R4
   JZ    D1
   MOV   A,   R1
   ACALL DISP
   JMP   L1
DISP:    MOV   DPTR,#TABLE
         MOVC  A,   @a+DPTR
   MOV   P0,A
   RET
DELAY:   MOV   R7,  #60
         MOV   R6, #248
DLY1:    DJNZ  R6,  $
         DJNZ  R7,  DLY1
   RET
TABLE:   DB    0C0H,0F9H,0A4H,0B0H
         DB     99H, 92H, 82H,0F8H
   DB     80H, 90H, 88H, 83H
   DB    0C6H,0A1H, 86H, 8EH

   END

   后记:

         把程序烧入单片机后,从左到右按下键盘可以看到LED显示器上显示0~F.

 

系统分类: 单片机   |   用户分类: 单片机   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(475)    回复(3)  

投一票您将和博主都有获奖机会!

  • xiyouliangzi

    2008-8-13 16:00:48

    有c程序就好了

  • zjw5000

    2008-8-13 23:31:11

    如下为c51代码,编译软件为keil c51 v808a版本. /******************************************************************************************** 文 件 名:test024.c 功 能:4*4行列式键盘驱动。 硬件条件:1.CPU型号:AT89S52 2.晶振:11.059200MHz *********************************************************************************************/ #include "reg52.h" // 包含头文件 /* 与编译器无关的数据类型定义 */ #define uchar unsigned char #define uint unsigned int /********************************************************************************************/ uchar code DISP_SEG7[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xA1,0x86,0x8E}; uchar code SKEY[16]={10,11,12,13,6,9,14,2,5,8,0,1,4,7,15}; uchar code act[4]={0xfe,0xfd,0xfb,0xf7}; sbit P1_0 = P1^0; /******************************************************************************************** * 函数名称:Delay() * 功 能:软件延时 * 入口参数:count 延时参数,值越大,延时越长 * 出口参数:无 *********************************************************************************************/ void delay(uint count) { uchar i; while(--count != 0) { for(i = 0; i < 121; i++); // ";" 表示空语句,CPU空转。 } // i 从0加到121,在11.0592M晶体下CPU大概耗时1毫秒 } /*************************************************************** scan_key(void) ****************************************************************/ uchar scan_key(void) { uchar i,j,in,ini,inj; bit find=0; for(i=0;i<4;i++) { P3=act[i]; delay(10); in=P3; in=in>>4; in=in|0xf0; for(j=0;j<4;j++) { if(act[j]==in) { find=1; inj=j; ini=i; } } } if(find==0)return -1; return(ini*4+inj); } /******************************************************************************************** * 函数名称:main() * 功 能:4*4行列式键盘驱动。当发现用户按下并释放键盘,则检测出相应键盘号,并控制蜂鸣器蜂鸣 * 相应次数。 *********************************************************************************************/ void main (void) { char c; uchar key_value; P1_0=0; while(1) // 死循环 { c=scan_key(); if(c!=-1)key_value=SKEY[c]; P0=DISP_SEG7[key_value]; delay(2); } }

  • liny1100

    2008-8-14 18:05:20

    还好啦!不过现在用C啦!