1. 单片机的独立按键
#include<reg51.h> // 4*4 按键+数码管仿真,可以参考。
#define uchar unsigned char
uchar temp;
int key1,key,disbuf;// 此表为 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f
unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char ledx[8];
bit s0,s1;
void delay(uchar z)
{
uchar i,j;
for(i=0;i<120;i++)
for(j=0;j<z;j++);
}
void scan() //要是按键了,扫描键盘编码值
{
P1=0xF0;
delay(1);
temp=P1;
switch(temp)
{
case 0xe0: key1=0;
break;
case 0xd0: key1=1;
break;
case 0xb0: key1=2;
break;
case 0x70: key1=3;
break;
}
P1=0x0f;
delay(1);
temp=P1;
switch(temp)
{
case 0x0E: key=key1+0;
break;
case 0x0D: key=key1+4;
break;
case 0x0B: key=key1+8;
break;
case 0x07: key=key1+12;
break;
default : key=-1;
}
if((key1+1)&&(key+1)) disbuf=key;
}
void ejjc() //判断是否按键
{
P1=0xF0;
if(P1!=0xF0) { scan();s0=1;}
else { s0=0; s1=1;}
}
void main()
{
uchar i;
while(1)
{
ejjc();
if(s0==1 && s1==1)
{
s0=0;s1=0;
for(i=0;i<8;i++)
{ ledx[i]=ledx[i+1]; ledx[8]=disbuf; }
}
P0=0xff;
P2=LED7Code[ledx[0]];
P0=0xfe;
delay(5);
P0=0xff;
P2=LED7Code[ledx[1]];
P0=0xfd;
delay(5);
P0=0xff;
P2=LED7Code[ledx[2]];
P0=0xfb;
delay(5);
P0=0xff;
P2=LED7Code[ledx[3]];
P0=0xf7;
delay(5);
P0=0xff;
P2=LED7Code[ledx[4]];
P0=0xef;
delay(5);
P0=0xff;
P2=LED7Code[ledx[5]];
P0=0xdf;
delay(5);
P0=0xff;
P2=LED7Code[ledx[6]];
P0=0xbf;
delay(5);
P0=0xff;
P2=LED7Code[ledx[7]];
P0=0x7f;
delay(5);
}
}
2. 51单片机独立按键问题
#include "reg51.h"
//P0口外接6个LED,led1至led6
//sbit led1=P0^1;
//sbit led2=P0^2;
//sbit led3=P0^3;
//sbit led4=P0^4;
//sbit led5=P0^5;
//sbit led6=P0^6;
//定义7个按键key1至key7
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
sbit key4=P1^4;
sbit key5=P1^5;
sbit key6=P1^6;
sbit key7=P1^7;
unsigned char keyval; //全局变量,储存按键键值
void KeyScan(void);
void Timer0Init(void);
void delayms(unsigned char ms);
void delayms(unsigned int ms);
{
unsigned int i;
while(ms--)
for(i=0;i<600;i++);
}
void main(void)
{
while(1)
{
switch(keyval)
{
case 1: P0=0xfd; break; //led0亮
case 2: P0=0xfb; break;
case 3: P0=0xf7; break;
case 4: P0=0xfe; break;
case 5: P0=0xfd; break;
case 6: P0=0xfb; break; //led6亮
case 7: P0=0xff; break; //全部led熄灭
}
}
}
void Timer0Init(void) //每10ms进入中断一次
{
TMOD=0x01; //16位定时器模式
TH0=0xdb;
TL0=0xff;//定时10ms,赋初值
TR0=1; //启动定时器0
ET0=1; //开定时器0分支中断
EA=1; //开总中断
}
void Timer0ISR(void)interrupt 1 using 1 //定时中断,按键扫描获取键值
{
if((P1&0xfe)!=0xfe) //判断key1至key7是否有按键按下
{
delayms(20); //延时20ms,软件消抖
if(key1==0) keyval=1; //按键1按下
if(key2==0) keyval=2;
if(key3==0) keyval=3;
if(key4==0) keyval=4;
if(key5==0) keyval=5;
if(key6==0) keyval=6;
if(key7==0) keyval=7; //按键7按下
}
TH0=0xdb;
TL0=0xff;//定时10ms,重新赋值
}
3. 51单片机汇编语言编程独立按键
四个按键,定义如下:
KEY1 BIT P3.0
KEY2 BIT P3.1
KEY3 BIT P3.2
KEY4 BIT P3.3
按键处理程序:
;-----------------------------------
READ_KEY:
JB KEY1, K2
CALL DELAY
JB KEY1, K2
JNB KEY1, $
PUSH ACC
INC 75H
MOV A, 75H
CJNE A, #10, ZINT01
MOV 75H, #0
ZINT01:
POP ACC
JMP K_EXIT
;---------------
K2: JB KEY2, K3
CALL DELAY
JB KEY2, K3
JNB KEY2, $
PUSH ACC
INC 76H
MOV A, 76H
CJNE A, #10, ZINT01
MOV 76H, #0
ZINT01:
POP ACC
JMP K_EXIT
;---------------
K3: JB KEY3, K4
CALL DELAY
JB KEY3, K4
JNB KEY3, $
PUSH ACC
DEC 75H
MOV A, 75H
CJNE A, #255, ZINT03
MOV 75H, #9
ZINT03:
POP ACC
JMP K_EXIT
;---------------
K4: JB KEY4, K_EXIT
CALL DELAY
JB KEY4, K_EXIT
JNB KEY4, $
PUSH ACC
DEC 76H
MOV A, 76H
CJNE A, #255, ZINT04
MOV 76H, #9
ZINT04:
POP ACC
K_EXIT:
RET
;---------------
DELAY:
DJNZ R7, $
DJNZ R7, $
RET
;-----------------------------------
4. 单片机独立按键的连接问题
认对角,一个接地,一个通过上拉电阻接到电源和接IO口,保证错不了。
5. 51单片机独立按键中,按一下和一直按的区别
按一下松开这个LED一直亮:
if(key==0)
{
while(key==0);
led=0;
}
按一下松开就亮一下:
if(key==0)
{
led=0;
while(key==0);
led=1;
}
6. 单片机独立按键的电路图
可以,原理图不是PCB布板,不是非得把器件用线连上才算连接的。原理图上只要有同样的网络编号原理上就是连通的。同样的道理,这些电阻你都可以放到一边,只要打上对应管脚一样的网络标号就行
7. 51单片机独立式按键程序
#include<reg52.h>
unsignedcharID;
sbitk1=P3^7;//定义按键端口
voiddelay()
{
TMOD=0x10;//定时器的工作方式
TH1=0xd8;
TL1=0xf0;
TR1=1;
while(!TF1);//这里错了,是定时器1
TF1=0;
}
voidmain()
{
while(1)
{
if(k1==0)
{
delay();//去抖动
if(k1==0)//检测按键确实按下,进行按键处理
{
ID++;
if(ID==0)
{
ID=0;
}
while(!k1);//这里错了,多余的加了==0
}
}
switch(ID)
{
case0:P1=0x3f;break;
case1:P1=0x06;break;
case2:P1=0x5b;break;
case3:P1=0x4f;break;
case4:P1=0x66;break;
case5:P1=0x6d;break;
case6:P1=0x7d;break;
case7:P1=0x07;break;
case8:P1=0x7f;break;
case9:P1=0x6f;break;
default:break;
}
}
}
8. 单片机独立按键
这个东西好几年前学过一点,忘得差不多了。我觉得可以这样
void main() {
int press = 0;
while(1) {
if(isPressed()) {
while(isPressed());
press++;
press == 1?pause():(continue();press=0);
}
}
}
你原来的逻辑是有问题的,因为只要第一次按下了,他就会给press变量清零,永远不会进入else if。另外,我加入了松手检测while(isPressed())
9. 51单片机独立按键,怎么组合实现某个功能
配合显示器选择不同的功能。
如:
按键启动选择功能,显示器依次显示1,2,3。。。。表示功能,每个数字显示10秒,等待按键确认,进入下一个菜单。
循环显示2次,没有接收到确认按键,自动退出此模块,返回上一层菜单。