原创 矩阵式键盘控制显示器

2008-8-13 00:19 2994 11 14 分类: MCU/ 嵌入式

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


       硬件电路如下:


            f6022cb8-587d-4646-b16f-19d7e6466185.gif


             在单片机的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.


 

PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户158894 2008-8-14 18:05

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

用户925035 2008-8-13 23:31

如下为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); } }

用户101789 2008-8-13 16:00

有c程序就好了
相关推荐阅读
用户925035 2009-11-15 00:44
通用按键消抖函数 -- 数据与过程分离
AUTO:  nicksean 不务正业          项目里经常处理按键消抖, 本来这个消抖的过程是与具体按下的键无关的, 可以前的代码总是在消抖的同时处理具体的按键值, 再加上长按 短按 组合...
用户925035 2009-11-13 13:16
液晶ST7920串行显示
液晶显示128*64以7920为主控制器,采用3线制,比较经济简单。代码如下.....
用户925035 2009-11-13 13:11
DS18B20 C51完整版
使用WINBOND W78C516单片机,11.0592MHZ晶振,用共阳LED数码管P0口输出段码,P1口扫描/*******************************************...
用户925035 2009-11-12 13:19
74HC164驱动数码管
          74HC164是串行输入,并行输出接口器件,可用在单向的并行输出/并行地址锁存等. 74HC164因为价格便宜,容易使用特别适合使用在在需要用到数码管显示IO口又比较紧张的电子产品...
用户925035 2009-11-10 20:13
at24c512多字节读写函数 欢迎测试
刚写的at24c512多字节读写函数,欢迎测试。/********************************************************************函数功能:EE...
用户925035 2009-11-10 19:59
旋转编码器
    很好的旋转编码器的读码程序,设旋转编码器的输出波形如下                 ______        ______        ______        ______正转时:...
EE直播间
更多
我要评论
3
11
关闭 站长推荐上一条 /3 下一条