单片机加入扫码功能_单片机端口扫描程序

hacker|
53

单片机端口位循环扫描

这里的R0,R1,R2,R3...是在恒定以里面已经定义好的,也就是说PORTDbits.R4是一个固定的硬件地址,所以不能这么写,不过像你这个函数,可以使用更简单的代码来代替,

if(PORTD0XF0)goto DE1;//这个语句就表示了,只要RD4~RD7任何一位为高电平就跳转到DE1处,跟你上面代码希望实现的功能是一摸一样的

"单片机如何读入扫描码"p0端口取码,p2端口取码什么意思

"p0端口取码,p2端口取码“应该是指从端口读入数据,也就是把单片机P0、P2引脚的状态输入到单片机内部以供CPU按程序指令要求进行相应处理。

求MSP430单片机4X4矩阵键盘的中断扫描程序?

//msp430F149

4*4矩阵键盘P1口中断扫描

#includemsp430x14x.h

#define

KEY_DIR

P1DIR

#define

KEY_OUT

P1OUT

#define

KEY_IN

P1IN

#define

KEY_IE

P1IE

#define

KEY_IES

P1IES

#define

KEY_IFG

P1IFG

/***************全局变量***************/

unsigned

char

Key_Val;

//存放键值

void

CtrlKey(unsigned

char

sw);

//控制键盘开关//sw=0关

sw=1开

/*******************************************

函数名称:Init_Keypad

能:初始化扫描键盘的IO端口

数:无

返回值

:无

********************************************/

void

Init_Keypad(void)

{

KEY_DIR

=

0x0f;

//P1.0~P1.3设置为输出状态,P1.4~P1.7输入

状态(上拉H)

KEY_OUT=0;

KEY_IES

=0xf0;

//P1.4~P1.7允许中断

KEY_IE

=0xf0;

//P1.4~P1.7下降沿触发中断

KEY_IFG=0;

//中断标志清0

Key_Val

=

0;

}

/*******************************************

函数名称:Check_Key

能:扫描键盘的IO端口,获得键值

数:无

返回值

:无

********************************************/

//p14\5\6\7

接上拉电阻

/***************************************

key_Val

对应键值

列:[p14]

[p15]

[p16]

[p17]

行:

[p13]→

1

2

3

4

[p12]→

5

6

7

8

[p11]→

9

10

11

12

[p10]→

13

14

15

16

***************************************/

void

Check_Key(void)

{

unsigned

char

row

,col,tmp1,tmp2;

unsigned

char

keymap[]

=

{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};//设置键盘逻辑键值

与程序计算键值的映射

tmp1

=

0x08;

for(row

=

0;row

4;row++)

//行扫描

{

KEY_OUT

=

0x0f;

//P1.4~P1.7输出全1

KEY_OUT

-=

tmp1;

//P1.4~p1.7输出四位中有一个为0

tmp1

=1;

if((KEY_IN

0xf0)0xf0)

//是否P1IN的P1.0~P1.3中有一位为0

{

tmp2

=

0x10;

//

tmp2用于检测出哪一位为0

for(col

=

0;col

4;col++)

//

列检测

{

if((KEY_IN

tmp2)

==

0x00)

//

是否是该列,等于0为是

{

Key_Val

=

keymap[row*4

+

col];

//

获取键值

return;

//

退出循环

}

tmp2

=

1;

//

tmp2右移1位

}

}

}

}

/*******************************************

函数名称:delay

能:延时约15ms,完成消抖功能

数:无

返回值

:t=

tmp*5*clk

根据使用时钟调整tmp值

********************************************/

void

delay(void)

{

unsigned

int

tmp;

for(tmp

=

12000;tmp

0;tmp--);

}

/*******************************************

函数名称:Key_Event

能:检测按键,并获取键值

数:无

返回值

:无

********************************************/

void

Key_Event(void)

{

unsigned

char

tmp;

KEY_OUT

=0;

//

设置P1OUT全为0,等待按键输入

tmp

=

KEY_IN;

//

获取

p1IN

if((tmp

0xf0)

0xf0)

//如果有键按下

{

delay();

//消除抖动

Check_Key();

//

调用check_Key(),获取键值

}

}

/*********************************************************************

控制打开或者关闭键盘中断

SW=

0:关闭;

ELSE:打开

*********************************************************************/

void

CtrlKey(unsigned

char

sw)

{

if(sw==0)

KEY_IE

=0;

//关闭端口中断

else

KEY_IE

=0xf0;

//打开端口中断

}

/*端口1按键中断*/

#pragma

vector=PORT1_VECTOR

__interrupt

void

Port(void)

{

if((KEY_IFG0xf0)!=0)

{

Key_Event();

if(Key_Val!=0)

//键值!=0有键按下

{

CtrlKey(0);

//关键盘中断

}

}

KEY_IFG=0;KEY_OUT=0;

//清中断标志

}

单片机键盘扫描程序

2*3的键盘,太简单了,不值得用循环,特别是双重循环。

最简明、高效的程序如下:

sbit P10 = P1^0;

sbit P11 = P1^1;

sbit P12 = P1^2;

sbit P13 = P1^3;

sbit P14 = P1^4;

char scan_key(void)

{

P13 = 0;

if (!P10) return 0;

if (!P11) return 1;

if (!P12) return 2;

P13 = 1;

P14 = 0;

if (!P10) return 3;

if (!P11) return 4;

if (!P12) return 5;

}

本程序,使用的变量最少,也不涉及其它接口。

代码最少,执行效率最高。

求51单片机,io口按键防抖,中间插入一个时间,按键扫描的程序。

#include “reg51.h”

sbit KEY1=P3^3; //定义按键输入端口

sbit KEY2=P3^4; //定义按键输入端口

sbit LED=P1^2; //定义led输出端口

/*------------------------------------------------

uS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

长度如下 T=tx2+5 uS

------------------------------------------------*/

void DelayUs2x(unsigned char t)

{

while(--t);

}

/*------------------------------------------------

mS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编

------------------------------------------------*/

void DelayMs(unsigned char t)

{

while(t--)

{

//大致延时1mS

DelayUs2x(245);

DelayUs2x(245);

}

}

void main()

{

while(1)

{

if(!KEY1)

{

DelayMs(10); //延时去抖,一般10-20ms

if(!KEY1) //再次确认按键是否按下,没有按下则退出

{

while(!KEY1);//如果确认按下按键等待按键释放,没有释放则一直等待

LED = 0; //亮

}

}

if(!KEY2)

{

DelayMs(10); //延时去抖,一般10-20ms

if(!KEY2) //再次确认按键是否按下,没有按下则退出

{

while(!KEY2);//如果确认按下按键等待按键释放,没有释放则一直等待

LED = 1; //灭

}

}

}

}

0条大神的评论

发表评论