汇编语言键盘扫描(键盘扫描程序)

2024-08-12 15:50:06 :24

汇编语言键盘扫描(键盘扫描程序)

各位老铁们,大家好,今天由我来为大家分享汇编语言键盘扫描,以及键盘扫描程序的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

本文目录

键盘扫描程序

我给你个键盘扫描程序 灯亮那个就很简单了!你自己改改吧 有问题再叫我哦!//-----------------------------返回码-----------------------------// P1.4P1.5P1.6P1.7// P1.00x110x210x410x81// P1.10x120x220x420x82// P1.20x140x240x440x84// P1.30x180x280x480x88//无按键返回0 //----------------------------------------------------------------//-----------------------------头文件-----------------------------#include 《reg51.h》//----------------------------------------------------------------//-----------------------------宏定义-----------------------------#define uchar unsigned char#define uint unsigned int#define KEYPORT P3 //键盘扫描端口//--------------------------------------------------------------------//-----------------------------延迟函数-----------------------------static void vDelay_uint(uint m){ for (;m》0;m--);}//-----------------------------按键扫描函数-----------------------------uchar ucKb4X4_Scan(void){ uint m;//用作连续按键的延时 uchar sccode,recode;//sccode表示行,recode表示列,ucKeyVal表示返回码 KEYPORT=0xf0;//付初值KEYPORT = 11110000 if ((KEYPORT&0xf0)!=0xf0)//判断是否有按键,有按键则不为初值 { vDelay_uint(200);//延时去抖动 if ((KEYPORT&0xf0)!=0xf0) { sccode=0xfe;//使sccode = 11111110 while ((sccode&0x10)!=0)//用于循环4次因为是4*4键盘 { KEYPORT=sccode; if ((KEYPORT&0xf0)!=0xf0)//判断按键是否在此行 { recode=(KEYPORT&0xf0)|0x0f;//确定列的位置 for (m=0;((KEYPORT&0xf0)!=0xf0)&&(m《10000);m++); //用m做一个10000次的延迟,(P1&0xf0)!=0xf0用于判定是否还在按着, //如果是延迟20000次返回一次值码 vDelay_uint(10000); //延时10000次,共20000次返回一次值码 return((~sccode)+(~recode));//返回按键码 } else sccode=(sccode《《1)|0x01;//不在此行下移一行 } } } return(0);//无按键返回0}

用汇编语言编写 80c51单片机 用定时中断延时方式键盘扫描并led灯显示

KEYVALEQU 30H

KEYTMEQU 31H

KEYSCANEQU 32H

DATEQU 33H

DCNTEQU 37H

T0LEQU 38H

T0HEQU 39H

SPEEDEQU 3AH

SCANLEDEQU 3BH

CHKCNTEQU 3CH

DLYCNTEQU 3DH

KEYCNTEQU 3EH

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

MOV SP,#5FH

MOV TMOD,#01H

MOV T0L,#0F0H

MOV T0H,#0D8H

MOV TH0,#0D8H

MOV TL0,#0F0H

MOV KEYVAL,#0

MOV P2,#00H

MOV DCNT,#0

MOV SCANLED,#0

MOV 33H,#10H

MOV 34H,#10H

MOV 35H,#10H

MOV 36H,#10H

MOV CHKCNT,#11H

MOV SPEED,#100

MOV DLYCNT,#0

MOV KEYCNT,#3

SETB EA

SETB ET0

SETB TR0

LOOP:

;LCALL KEYSEL

MOV A,KEYVAL

CJNE A,#0FFH,LOOP1

SJMP LOOP

LOOP1:

CJNE A,#10,LOOP2;“ON”启动LED测试

MOV DCNT,#0FFH

SJMP LOOP

LOOP2:

CJNE A,#11,LOOP3;“=”停止测试,接受数字键

MOV 33H,#10H

MOV 34H,#10H

MOV 35H,#10H

MOV 36H,#10H

MOV DCNT,#0

SJMP LOOP

LOOP3:

CJNE A,#10,LOOP4;数字键

LOOP4:

JC LOOP5

LJMP LOOP

LOOP5:

MOV 33H,34H

MOV 34H,35H

MOV 35H,36H

MOV 36H,KEYVAL

LJMP LOOP

;------------------

KEYSEL:

MOVKEYVAL,#0

MOVKEYSCAN,#0EFH

LCALLGETKEY

MOVA,KEYTM

JZKEYS1

MOVKEYVAL,A

SJMPKEYRTN

KEYS1:

MOVKEYSCAN,#0DFH

LCALLGETKEY

MOVA,KEYTM

JZKEYS2

CLRC

ADDA,#4

MOVKEYVAL,A

SJMPKEYRTN

KEYS2:

MOVKEYSCAN,#0BFH

LCALLGETKEY

MOVA,KEYTM

JZKEYS3

CLRC

ADDA,#8

MOVKEYVAL,A

SJMPKEYRTN

KEYS3:

MOVKEYSCAN,#7FH

LCALLGETKEY

MOVA,KEYTM

JZKEYRTN

CLRC

ADDA,#12

MOVKEYVAL,A

KEYRTN:

LCALL CHGKEY

RET

;--------------------

GETKEY:

MOV KEYTM,#0

MOVA,KEYSCAN

MOVP3,A

NOP

MOVA,P3

ANLA,#0FH

XRLA,#0FH

JZNOKEY

DJNZ KEYCNT,NOKEY

MOV KEYCNT,#3

MOVA,P3

ANLA,#0FH

CJNEA,#0EH,NK1

MOVKEYTM,#1

SJMPNOKEY

NK1:

CJNEA,#0DH,NK2

MOVKEYTM,#2

SJMPNOKEY

NK2:

CJNEA,#0BH,NK3

MOVKEYTM,#3

SJMPNOKEY

NK3:

CJNEA,#07H,NOKEY

MOVKEYTM,#4

NOKEY:RET

;--------------------

T0ISR:

PUSH ACC

CLR TR0

MOV TH0,T0H

MOV TL0,T0L

SETB TR0

LCALL KEYSEL;扫描键盘

MOV DPTR,#LEDTAB

MOV A,DCNT;段显示

JZ T000

MOV A,CHKCNT

MOVC A,@A+DPTR

MOV P2,#0FH

CPL A 

MOV P0,A

INC DLYCNT

MOV A,DLYCNT

CJNE A,SPEED,T021

MOV DLYCNT,#0

INC CHKCNT

MOV A,CHKCNT

CJNE A,#1AH,T020

T020:

JC T021

MOV CHKCNT,#11H

T021:

POP ACC

RETI

T000:;数字显示

MOV R0,#DAT

MOV A,SCANLED

ADD A,R0

MOV R0,A

MOV A,SCANLED

JNZ T001

MOV P2,#01H

SJMP T0DIS

T001:

DEC A

JNZ T002

MOV P2,#02H

SJMP T0DIS

T002:

DEC A

JNZ T003

MOV P2,#04H

SJMP T0DIS

T003:

MOV P2,#08H

T0DIS:

MOV A,@R0

MOVC A,@A+DPTR

CPL A

MOV P0,A

INC SCANLED

MOV A,SCANLED

ANL A,#03H

MOV SCANLED,A

POP ACC

RETI

;--------------------

CHGKEY:

MOV A,KEYVAL

JZ KV16

DEC A

JNZ KV01

MOV KEYVAL,#7

RET

KV01:

DEC A

JNZ KV02

MOV KEYVAL,#4

RET

KV02:

DEC A

JNZ KV03

MOV KEYVAL,#1

RET

KV03:

DEC A

JNZ KV04

MOV KEYVAL,#10

RET

KV04:

DEC A

JNZ KV05

MOV KEYVAL,#8

RET

KV05:

DEC A

JNZ KV06

MOV KEYVAL,#5

RET

KV06:

DEC A

JNZ KV07

MOV KEYVAL,#2

RET

KV07:

DEC A

JNZ KV08

MOV KEYVAL,#0

RET

KV08:

DEC A

JNZ KV09

MOV KEYVAL,#9

RET

KV09:

DEC A

JNZ KV10

MOV KEYVAL,#6

RET

KV10:

DEC A

JNZ KV11

MOV KEYVAL,#3

RET

KV11:

DEC A

JNZ KV12

MOV KEYVAL,#11

RET

KV12:

DEC A

JNZ KV13

MOV KEYVAL,#12

RET

KV13:

DEC A

JNZ KV14

MOV KEYVAL,#13

RET

KV14:

DEC A

JNZ KV15

MOV KEYVAL,#14

RET

KV15:

DEC A

JNZ KV16

MOV KEYVAL,#15

RET

KV16:

MOV KEYVAL,#0FFH

RET

;--------------------

LEDTAB:DB 0FCH;"0"00H

DB 60H;"1"01H

DB 0DAH;"2"02H

DB 0F2H;"3"03H

DB 66H;"4"04H

DB 0B6H;"5"05H

DB 0BEH;"6"06H

DB 0E0H;"7"07H

DB 0FEH;"8"08H

DB 0F6H;"9"09H

DB 0EEH;"A"0AH

DB 3EH;"B"0BH

DB 9CH;"C"0CH

DB 7AH;"D"0DH

DB 9EH;"E"0EH

DB 8EH;"F"0FH

DB 00H;" "10H

DB 80H

DB 40H

DB 20H

DB 10H

DB 08H

DB 04H

DB 02H

DB 01H

DB 0FFH

;--------------------

END

4*4矩阵键盘扫描汇编程序 怎么写,求大神!

因为不知道你的单片机板子的电路图,我用我自己的板子写的代码发给你,你可以参考我的矩阵键盘扫描的方法,仿照着写。(这个不难的,用心看看就能懂的)/********************************************************************* 文件名 : 矩阵键盘.c* 描述 : 该文件实现了 4 * 4 键盘的试验。通过数码管的最后一位来显示当前的按键值。 * 创建人 : 东流,2012年2月7日*********************************************************************/#include《reg51.h》#include《intrins.h》#define uint unsigned int#define uchar unsigned charuchar code table = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/********************************************************************* 名称 : Delay_1ms()* 功能 : 延时子程序,延时时间为 1ms * x* 输入 : x (延时一毫秒的个数)* 输出 : 无***********************************************************************/void Delay_1ms(uint i)//1ms延时{uchar x,j;for(j=0;j《i;j++)for(x=0;x《=148;x++);}/********************************************************************* 名称 : Keyscan()* 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。* 输入 : 无* 输出 : 按键值***********************************************************************/uchar Keyscan(void){uchar i,j, temp, Buffer = {0xfe, 0xfd, 0xfb, 0xf7};//让矩阵键盘的每行分别为低电平for(j=0; j《4; j++){P1 = Buffer;temp = 0x10; for(i=0; i《4; i++){if(!(P1 & temp)) //判断P1口高4位某一行为低电平{return (i+j*4);//返回键码}temp 《《= 1;}}}/********************************************************************* 名称 : Main()* 功能 : 主函数* 输入 : 无* 输出 : 无***********************************************************************/void Main(void){uchar Key_Value; //读出的键值P2 = 7;while(1){P1 = 0xf0;if(P1 != 0xf0)//判断有无按键按下{Delay_1ms(20);//按键消抖if(P1 != 0xf0)//第二次判断有无按键按下{Delay_1ms(20); //按键消抖if(P1 != 0xf0)//第三次判断有无按键按下{Key_Value = Keyscan();}}}P0 = table; //数码管赋值}}

单片机用汇编语言的按键检测问题

JNB P3.7 REL 是如果p3.7是0就跳到rel ,的却应该改为JB P3.7 REL 如果没建按下 就跳到本行等待 有键按下就往下执行。

请教关于单片机按键扫描的汇编语言

这是一个典型的T扫电路,具体代码我就不说了,我现在来说一下它的原理扫描是一次把一个IO置0,其它的IO均为输入状态(51是准双向IO,没有输入输出概念,把输出高当输入即可)。比如说,现在是扫描P00,那么把P00写0,其它的IO写1,然后把所有的IO读取回来,把值赋给一个临时变量用来判断,eg key_buffer_temp =P0; 把扫描(写0的相应)位强制性写上1, 即key_buffer_temp=key_buffer_temp|0x01;这时看这个key_buffer_temp的值,有没有位是0的,即这个值是不是0xff,如果是0xff,则和P00接的按键都没有按键。如果不是0xff,则有几位是0就有几个按键。这样循环下去,一直扫到P06(不用扫P07)。程序的注意点:1扫描P00时,只看读回来key_buffer_temp的位1--位7,扫描P01时,只看读回来key_buffer_temp的位2--位7,……扫描P06时,只看读回来key_buffer_temp的位7,不用扫描P072每扫描一个就判断一次key_buffer_temp的值,一个个位来判断,同时把计数加1,如果有按键则把计数的值赋给key_value0,key_value1……3扫描结束后看key_value0,key_value1……里面的值,有几个就几个按键4比如说key_value0为1,key_value为10,那么就是S1,和S10有按键 至于消抖,这一般的做法就是多采样几次

用汇编语言 用独立式键盘扫描 消抖

原理图是错的,理解你的意思,有按键时高,无按键时低。ORG 0000HLJMP MAINORG 0030HMAIN: MOV A,P0 JZ MAIN MOV B,A LCALL DELAY MOV A,P0 CJNE A,B,MAINNEXT: MOV A,P0 CJNE A,B,NEXT1 SJMP NEXTNEXT1: MOV A,B............;现在A里面就是键值,你可以按要求转移到想去的位置。DELAY: MOV R2,#20DELAY1: MOV R3,#250 DJNZ R3,$ DJNZ R2,DELAY1 RET END

用汇编语言编写独立式键盘的扫描程序

这个简单,我来好了: ORG 0000H AJMP MAIN ORG 0010HMAIN:MOV P0,#0FFH ;给按键接口赋高电平 MOV A,P0 ;假设P1.0是开,P1.1是关开关 SUBB A,#FE ACALL DELAY ;去抖 JZ RUN SUBB A,#FD ACALL DELAY ;去抖10MS JZ STOP SJMP MAINRUN: MOV P2,#0FEH ;假设P2.0是控制口,低电平开 SJMP MAINSTOP: MOV P2,#0FEH ;假设P2.0是控制口,高电平关 SJMP MAINDELAY: MOV R7,#08HDELAY1:MOV R6,#0FFHDELAY2:DJNZ R6,DELAY2 DJNZ R7,DELAY1 RET END

用汇编语言写一个用8255扩展的8051单片机4*6键盘扫描程序

P1口接4根线作为检测时输出,p2口接6跟线作为检测输入,键盘接上拉电阻,首先往p1口上送数据,检测p2口,无变化则检测下行,有变化直接读取键值表(键值表自设),送入内存变量,大概就是这个样子,很简单的

以上就是我们为大家找到的有关“汇编语言键盘扫描(键盘扫描程序)”的所有内容了,希望可以帮助到你。如果对我们网站的其他内容感兴趣请持续关注本站。

汇编语言键盘扫描(键盘扫描程序)

本文编辑:admin
Copyright © 2022 All Rights Reserved 威海上格软件有限公司 版权所有

鲁ICP备20007704号

Thanks for visiting my site.