写一程序,要求按什么键就在数码管上显示其键值

用汇编语言,0对应00h,1 对应01h,。。。a对应0ah

;*********************************************************************************

;Copyright(c)2010, GUILIN UNIVERSITY OF ELECTRONIC TECHNOLOGY

;All rights reserved

;

;实验任务:用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作列输入线,以P1.4-P1.7作行输出线.

;         在数码管上显示每个按键的"0-F"序号,使用使共阳码管显示对应的键值.

;

;********************************************************************************

;********************************************************************************

;程序初始化

;********************************************************************************         

          LEDOUT    EQU       P2

          KEYMATRIX EQU       P1

          

          SCANCODE  EQU       R2

          KEYCODE   EQU       R3

          COUNT     EQU       R4

          KEYCOUNT  EQU       R5

          

          ROWCOUNT  DATA      30H

          LINECOUNT DATA      31H

          

          KEYFLAG   EQU       F0

          

          ORG       0000H

          AJMP      START

          ORG       0030H

;********************************************************************************

;主程序

;********************************************************************************

START:    MOV       LEDOUT,#0FFH

          MOV       SCANCODE,#0EFH

          MOV       KEYCODE,#0

          MOV       COUNT,#0

          MOV       KEYCOUNT,#0

          MOV       ROWCOUNT,#0

          CLR       KEYFLAG

          

LOOP:     MOV       KEYMATRIX,SCANCODE

          MOV       KEYCODE,KEYMATRIX

          MOV       A,KEYCODE

          ANL       A,#0FH

          CJNE      A,#0FH,REMOVESHAKE

          AJMP      ROWSCAN                       ;如果没有按键按下,则不停的行扫描

REMOVESHAKE:

          ACALL     DEL10MS                       ;按键消抖

          MOV       KEYMATRIX,SCANCODE

          MOV       KEYCODE,KEYMATRIX

          MOV       A,KEYCODE

          ANL       A,#0FH

          CJNE      A,#0FH,KEYPRESSED

          AJMP      ROWSCAN       

KEYPRESSED:

          MOV       LINECOUNT,#0                 

          MOV       COUNT,#4

          MOV       A,KEYCODE

LINESCAN: RRC       A

          INC       LINECOUNT

          JNC       KEYIN

          DJNZ      COUNT,LINESCAN                ;列扫描

          

ROWSCAN:  MOV       A,SCANCODE

          RL        A

          INC       ROWCOUNT

          MOV       SCANCODE,A

          CJNE      SCANCODE,#0FEH,LOOP

          AJMP      OUTPUT                        ;行扫描

             

KEYIN:    SETB      KEYFLAG 

          MOV       A,ROWCOUNT

          MOV       B,#4

          MUL       AB

          ADD       A,LINECOUNT

          DEC       A

          MOV       KEYCOUNT,A  

          AJMP      OUTPUT                        ;有按键按下则处理相应得键值存入KEYCOUNT=ROWCOUNT*4+LINCOUNT-1;

          

OUTPUT:   JB        KEYFLAG,NEXT

          MOV       LEDOUT,#0FFH                  ;无按键按下则输出黑屏

          AJMP      START

NEXT:     MOV       DPTR,#DIGITALTABLE       

          MOV       A,KEYCOUNT

          MOVC      A,@A+DPTR

          MOV       LEDOUT,A                      ;有按键按下输出对应的键值

          

KEYRELESE:MOV       KEYMATRIX,SCANCODE

          MOV       KEYCODE,KEYMATRIX

          MOV       A,KEYCODE

          ANL       A,#0FH

          CJNE      A,#0FH,KEYRELESE

          AJMP      START           

          

;********************************************************************************

;子程序介绍:10ms的延时,用于按键消抖

;********************************************************************************          

DEL10MS:  MOV       R7,#20

AA:       MOV       R6,#248

          DJNZ      R6,$

          DJNZ      R7,AA

          RET 

          

DIGITALTABLE:       DB        0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H

                    DB        80H, 90H, 88H, 83H, 0C6H, 0A1H, 86H, 8EH         

          END

温馨提示:内容为网友见解,仅供参考
第1个回答  2010-04-22
直接去下个键盘记录器就行了,不过一般带病毒,杀软得关闭,至于程序,你看着办,键盘记录器中就有相关程序

写一程序,要求按什么键就在数码管上显示其键值
MOV KEYCOUNT,A AJMP OUTPUT ;有按键按下则处理相应得键值存入KEYCOUNT=ROWCOUNT*4+LINCOUNT-1;OUTPUT: JB KEYFLAG,NEXT MOV LEDOUT,#0FFH ;无按键按下则输出黑屏 AJMP START NEXT: MOV DPTR,#DIGITALTABLE MOV A,KEYCOUNT MOVC A,@A+DPTR MOV LEDOUT...

c语言怎么编写子程序?
从0到F,按下相应的键会在数码管上显示相应的数字,\\x0d\\x0a * 其中K0到K15是采用4*4的方式连接的\\x0d\\x0a *\/\\x0d\\x0a ;***\\x0d\\x0a ; 0 1 2 3 ---P20\\x0d\\x0a ; 4 5 6 7 ---P21\\x0d\\x0a ; 8 9 A B ---P...

单片机4*4行列式键盘程序! 动态显示,开始时,显示“——”,按键后...
根据扫描键盘返回的键值编码查键值编码表,从而得到键值并送数码管显示。开机时,数码管显示“-”。当键按下时,数码管显示按下键的键值,蜂鸣器响一声。*\/ include <reg52.h> include <intrins.h> define uchar unsigned char define uint unsigned int sbit BEEP = P3^6; \/\/蜂鸣器驱动线 u...

...4*4矩阵键盘的程序,简单易懂的,数码管显示键值
key_tran();\/***按键扫描动态显示***\/ P2=0Xc0; \/\/位选锁存器开

求51单片机红外摇控接收c程序,并在数码管上显示键值出来?
bit IR_E; \/\/表示有新的遥控键控下就更新扫描数据 bit b3msint;void SendDataToDispDevice();void Ir_process();void display();void beeping();\/*** 晶振为12 MHZ***\/ \/**定时器1,12 MHZ最大定时为65.53ms***\/ \/\/--- void init(){ IP=0x09; \/\/定时器1,外部中断0优先...

...管,按下相应的键,数码管显示相应的数值。(键值0~F)
void delay(uint i); \/\/演示程序 void main() { uchar key; while(1) { key=keyscan(); \/\/调用键盘扫描, switch(key) { case 0x7e:P0=dofly[0];break;\/\/0 按下相应的键显示相对应的码值 case 0x7d:P0=dofly[1];break;\/\/1 case 0x7b:P0=dofly[2];break;\/\/2 case 0x77:P0=dofly[3];...

我的矩阵键盘要求按照其对应健值,4位数码管,滚动显示其健值,我要怎么...
把列的IO属性配成弱上拉,读取键值时首先将第1行通过IO口输出低电平,按顺序读取4列返回的状态,如果有一列被拉低了那就锁定那个键按下了,键值你可以这样定义一个字节高半字节代表行,低半字节代表列。一对应就OK了 至于你要翻译成1-16个LED 靠你的软件实现就行了,你可以随便关联。

矩阵键盘数码管显示键值
高4位为低电平,当低4位有键按下行,即对应低4位中的1位变低如P1=0000 1101B,并且temp记录此时P!的值再经过逻辑操作temp=temp&0x0F;temp=~(temp|0xF0);,temp = 0000 0010 \/temp = 2;另外,去抖延时delay(1)通常为10ms,如果else if 如果较多可选用switch case 优化一下 ...

用89C51单片机设计多功能低频函数信号发生器,能产生方波、正弦波、三角...
1)上电后,系统初始化,数码显示6个‘-’,等待输入设置命令。 2)按钮分别控制“幅值”、“频率”、“方波”、“正弦波”、“锯齿波”。 3)“幅值“键初始值是1V,随后再次按下依次增长1V,到达5V后在按就回到1V。 4)“频率“键初始值是10HZ,随后在按下依次为20HZ、50HZ、100HZ、200HZ、500HZ、1000HZ循环...

...程序,要求:每一个按键(共16个)对应数码管0~F显示出来
P2=h;return(cord);\/\/键盘最后组合码值 } }return(0xff); \/\/返回该值 } 如果有按键,就会返回按键值, 如果没按键则返回 0XFF, 通过读取返回值可以判断是否有按键, 在程序开头可以加上全局变量的断码表, 这就看你用的是共阴的还是共阳的数码管了~~祝您的问题早日得到解决. 谢谢 ...

相似回答