汇编语言键盘扫描(用汇编语言编写独立式键盘的扫描程序)
本文目录
- 用汇编语言编写独立式键盘的扫描程序
- 用汇编语言 用独立式键盘扫描 消抖
- 键盘扫描程序
- 用汇编语言写一个用8255扩展的8051单片机4*6键盘扫描程序
- 用汇编语言编写 80c51单片机 用定时中断延时方式键盘扫描并led灯显示
- 4*4矩阵键盘扫描汇编程序 怎么写,求大神!
- 请教关于单片机按键扫描的汇编语言
- 单片机用汇编语言的按键检测问题
用汇编语言编写独立式键盘的扫描程序
这个简单,我来好了: 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
用汇编语言 用独立式键盘扫描 消抖
原理图是错的,理解你的意思,有按键时高,无按键时低。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
键盘扫描程序
我给你个键盘扫描程序 灯亮那个就很简单了!你自己改改吧 有问题再叫我哦!//-----------------------------返回码-----------------------------// 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}
用汇编语言写一个用8255扩展的8051单片机4*6键盘扫描程序
P1口接4根线作为检测时输出,p2口接6跟线作为检测输入,键盘接上拉电阻,首先往p1口上送数据,检测p2口,无变化则检测下行,有变化直接读取键值表(键值表自设),送入内存变量,大概就是这个样子,很简单的
用汇编语言编写 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; //数码管赋值}}
请教关于单片机按键扫描的汇编语言
这是一个典型的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有按键 至于消抖,这一般的做法就是多采样几次
单片机用汇编语言的按键检测问题
JNB P3.7 REL 是如果p3.7是0就跳到rel ,的却应该改为JB P3.7 REL 如果没建按下 就跳到本行等待 有键按下就往下执行。
更多文章:
office2003官方下载免费版(请问在哪个网站下载Microsoft Office 2003免费版比较好,安全)
2024年6月28日 17:10
f100 s(金立手机F100s为什么改不了语言点击语言后没有反应)
2024年3月22日 22:15
百度站长中站点logo怎么无法提交?谁能提供一下【婆家娘家 华茹】和【候车室的故事 站长】的照片
2024年6月1日 09:28