设计一个2×2行列(同在p1.0)式键盘电路并用汇编语言编写键扫描子程序

核心提示2*2矩阵键盘是不是接P1.0~P1.3,程序如下:KEYS:MOV P1,#0FHKEYS1:CLR P1.0SETB P1.1JB P1.2,KEYS11MOV A,#1RETKEYS11:JB P1.3,KEYS2MOV A,#2RE

2*2矩阵键盘是不是接P1.0~P1.3,程序如下:

KEYS:

MOV P1,#0FH

KEYS1:

CLR P1.0

SETB P1.1

JB P1.2,KEYS11

MOV A,#1

RET

KEYS11:

JB P1.3,KEYS2

MOV A,#2

RET

KEYS2:

SETB P1.0

CLR P1.1

JB P1.2,KEY21

MOV A,#3

RET

KEY21:

JB P1.3,KEYN

MOV A,#4

RET

KEYN:

MOV A,#0

RET

4*4矩阵键盘控制四位数码管显示单片机C语言程序

#define uint unsigned int

#define uchar unsigned char

#define Key_Scanf P1 //4X4按键显示;

#define Print_Out P0 //显示数字P0;

#define PORT P2 //数码选择;

#define SYSLED P0^7; //系统指示灯;

uchar code table[]={0xff,0x4f,0x12,0x06,0x4c,0x24,0x20,0x0f,0x00,0x0c,0x01}; //0~9数字

void display(uchar); //显示

void delay_50us(uint t); //延时50微秒,防抖动

uchar keyscan(void); //键盘

void SYS_LED(void); //指示灯

uchar a=0;

uchar keynum;

void delay_50us(uint t)

{

uchar j;

for(;t>0;t--)

for(j=19;j>0;j--);

}

void SYS_LED()

{

SYSLED = 0;

delay_50us(100);

SYSLED = 1;

}

void display( uchar keynum) //根据keynum返回值显示数字

{

PORT=0xfe;

Print_Out=table[keynum];

}

uchar keyscan()

{

Key_Scanf=0xbf; // 扫描第一横行,后四位为1,前四位线与,然后跟原来数值比较,如果不等,则把对应的数字赋给keynum

if((Key_Scanf&0xbf)!=0xbf)

{

delay_50us(100);

if((Key_Scanf&0xbf)!=0xbf)//消抖

{

SYS_LED();

a=Key_Scanf&0xbf;

switch(a)

{

case 0x77:keynum=1;break;

case 0x7b:keynum=2;break;

case 0x7d:keynum=3;break;

default:break;

}

}

}

Key_Scanf=0xdf; //扫描第二横行,后四位为1,前四位线与;

if((Key_Scanf&0xdf)!=0xdf)

{

delay_50us(100);

if((Key_Scanf&0xdf)!=0xdf)

{

a=Key_Scanf&0xdf;

switch(a)

{

case 0x7e:keynum=4;break;

case 0xb7:keynum=5;break;

case 0xbb:keynum=6;break;

default: break;

}

}

}

Key_Scanf=0xef; //扫描第三横行,后四位为1,前四位线与;

if((Key_Scanf&0xef)!=0xef)

{

delay_50us(100);

if((Key_Scanf&0xef)!=0xef)

{

a=Key_Scanf&0xef;

switch(a)

{

case 0xbd:keynum=7;break;

case 0xbe:keynum=8;break;

case 0xe7:keynum=9;break;

default: break;

}

}

}

Key_Scanf=0xf7; //扫描第四横行,后四位为1,前四位线与;

if((Key_Scanf&0xf7)!=0xf7)

{

delay_50us(100);

if((Key_Scanf&0xf7)!=0xf7)

{

a=Key_Scanf&0xf7;

switch(a)

{

case 0xeb:keynum=10;break;

default: break;

}

}

}

return keynum;

}

void main(void)

{

while(1)

{

keyscan();

display(keynum);

}

}

#include <intrins.h>

#define uchar unsigned char

#define ROWP P3

#define LINP P2

void Delay(uchar i) {

uchar j;

for(;i>0;i--)

for(j=0;j<112;j++)

_nop_();

}

uchar Keyscan(){

uchar i,j,RLP,num;

for(i=0;i<4;i++){

LINP=(LINP|0xf0)&(~(0x10<<i));

Delay(1);

for(j=0;j<5;j++){

RLP=(ROWP|0x1f)&(~(0x10>>j));

if(ROWP==RLP){

Delay(2);

if(ROWP==RLP)

num=i*5+j+1;

}

}

}

return num;

}

5*4的,稍微修改,就是4*4的

 
友情链接
鄂ICP备19019357号-22