导航:首页 > 操作系统 > 基于单片机的按键

基于单片机的按键

发布时间:2022-12-09 21:48:10

单片机的独立按键

#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.输入原理



在单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据的。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能,键信息输入是与软件结构密切相关的过程。

对于一组键或一个键盘,总有一个接口电路与CPU相连。CPU可以采用查询或中断方式了解有无将键输入,并检查是哪一个键按下,将该键号送入累加器ACC,然后通过跳转指令转入执行该键的功能程序,执行完后再返回主程序

⑶ 51单片机 按键原理~

p2口A1 A2 A3 A4输出4位供154译码,译码后Yx有效输出低,相应三极管导通,Cx相应输出高。当C1为高时,KEY检测到高即C1对应键按下,其余同理。

⑷ 基于单片机的单按键实现电机正反转控制,如何实现最好有C语言程序代码,主要是Main函数 谢谢

/*基于双转镜片的步进电机控制的程序说明*/

/*FP20、FP21、FP22、FP23分别接步进电机的A、B、C、D四相*/
/*FP10、FP11、FP12分别接主机控制的ON/OFF(0/1)、方向(0正转/1反转)、循环变速(0有效)*/
/*变量定义*/
unsigned int motorenb=0;
unsigned int ccw=0;
unsigned int su_keyenb=0;
unsigned int su=2;
unsigned int su_cv=0;
unsigned int su_num=26;
unsigned int wfa=0;
/*变量定义结束*/
/*中断函数*/
__interrupt ints (void) //中断入口 ;1ms
{
unsigned int a,b,c,d;
FGIE=0;//关闭总中断
if(FTC0IRQ) //一次定时1mS
{
FTC0IEN=0;//禁止TC1中断
FTC0IRQ=0;//清中断请求标志位
FTC0IEN=1;//开TC1中断
if(motorenb==1)
{
su_cv++;
if(su_cv>=su_num)
{
su_cv=0;
if(ccw==1) //正转
{
a=wfa;
a++;
if(a>7) a=0;
wfa=a;
}
else if(ccw==0)//反转
{
a=wfa;
if(a==0) a=8;
a-=1;
wfa=a;
}
switch(a)
{
case 0: FP23=0;
FP22=0;
FP21=1;
FP20=1;
break;
case 1: FP23=0;
FP22=0;
FP21=1;
FP20=0;
break;
case 2: FP23=0;
FP22=1;
FP21=1;
FP20=0;
break;
case 3: FP23=0;
FP22=1;
FP21=0;
FP20=0;
break;
case 4: FP23=1;
FP22=1;
FP21=0;
FP20=0;
break;
case 5: FP23=1;
FP22=0;
FP21=0;
FP20=0;
break;
case 6: FP23=1;
FP22=0;
FP21=0;
FP20=1;
break;
case 7: FP23=0;
FP22=0;
FP21=0;
FP20=1;
break;
}
}
}
else P2=0X00;
}
}
/*主函数*/
void main(void)
{
FP20M=1;
FP21M=1;
FP22M=1;
FP23M=1;
FP10M=0;
FP12M=0;
P2UR=0XFF;
P1UR=0XFF;
/*TC0作为计时器*/
FTC0IEN=0;//禁止TC0中断
FTC0ENB=0;//禁止TC0
FPWM0OUT=0;//禁止PWM1
FTC0OUT=0;//禁止TC0输出
FALOAD0=1;//TC0自动重装
FTC0CKS=0;//选用内部时钟
FTC0RATE0=1;//设置TC0分频为Fcpu/32
FTC0RATE1=1;
FTC0RATE2=0;
TC0C=0xF3;//给TC0赋初值,TC0C=256-(1mS*16M/4/32)
TC0R=0xF3;//给TC0赋自动重装值
FTC0IRQ=0;//清TC0中断标志位
FTC0IEN=1;//使能TC0中断
FGIE=1;//开总中断
FTC0ENB=1;//开TC0
while(1)
{
WDTR=0x5A;
if(FP10==0) motorenb=1;
else motorenb=0;
if(FP12==0)ccw=1;
else ccw=0;
if(FP11==1) su_keyenb=1;
if(su_keyenb==1)
{
if(FP11==0)
{
su_keyenb=0;
su++;
if(su>2) su=0;
switch(su)
{
case 0 : su_num=26;
break;
case 1 : su_num=14;
break;
case 2 : su_num=6;
break;
}
}
}
}
}
给你做个参考,我自己用的,试过了,你把IO口改下,定时器也改成你的型号的

⑸ 想做一个基于51单片机按键计数用LCD1602显示的编程0-99

加上这些东西,将显示语句换成1602_display(i)即可,
当然你可以将其改为只显示2个数字
sbit rw=P1^4;
sbit rs=P1^3;
sbit lcden=P1^5;
#define db P2

void write_com(uchar com)//液晶屏写命令

{
db=com;
rs=0;
rw = 0;
lcden=0;
Delay1ms(12);
lcden=1;
Delay1ms(12);
lcden=0;
}

void write_date(uchar date)//液晶屏写数据
{
db=date;
rs=1;
rw = 0;
lcden=0;
Delay1ms(12);
lcden=1;
Delay1ms(12);
lcden=0;
}
void init2()//液晶屏初始化
{

rw=0;
write_com(0x38);
Delay1ms(12);
write_com(0x0f);
Delay1ms(12);
write_com(0x06);
Delay1ms(12);
write_com(0x01);
Delay1ms(12);
}

void 1602_display(uchar temp) //液晶显示一个8 位二进制数
{
uchar A1,A2,A3;
A1=temp/100;//分离百位、十位、个位
A2=temp/10%10;
A3=A2t%10;
write_com(0x80);//第1行,第1字
write_date(A1+0x30);
Delay1ms(1);
write_date( A2+0x30);
Delay1ms(1);
write_date(A3+0x30);
Delay1ms(1);
}

⑹ 请帮我写一个基于51单片机按键指示程序 c语言!!!!

;程序如下:
ORG 0000H
MOV C, P1.7
ANL C, P1.6
ANL C, P1.5
ANL C, P1.4
MOV P1.0, C
SJMP 0000H
-----------------------------
#include <reg51.h>
main()
{
unsigned int aaa;
while(1) {
aaa = P1;
aaa = aaa / 16;
if (aaa < 15) P1 = 0xfe;
else P1 = 0xff;
}
}
;完

⑺ 单片机按键怎么实现长按和短按和组合键功能

是在实物开发板上实现吗?
长按和短按很好实现,当检测到有按键按下了,就开始计时,用定时器,检测到按键松开了,停止计时,然后根据计时的时间长短,确定是长按还是短按,比如,时间小于0.5秒为短按,超过3秒为长按,其余时间为无效,不够长按时间,就为无效按键,也不算是短按的。这样可以排除是随意按键的可能。
组合键就好办了,检测到同时按两个,三个,就为组合键,至于是什么功能,那由你自己定义了。

⑻ 单片机实现按键功能函数

#include<reg51.h>
#defineucharunsignedchar
uchardat;
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
main()
{
bitflag=0;
while(1)
{
if(key1==0)
{
while(key1==0);
flag=~flag;
}
if(key2==0)
{
while(key2==0);
if(flag)dat++;
}
if(key3==0)
{
while(key3==0);
if(flag(dat--);
}
P0=dat;
}
}

⑼ 单片机按键进行菜单选择的编程思想

有以下几种情况:
1.循环查询按键。当按键按第一次时间,进入第一层循环查询语句内部,执行恢复。不跳出该层循环,继续查询按键。当第二次按下时间,进入第二层循环查询语句内部,执行暂停。循环结束。若想反复暂停和恢复,就在外面再加一层while(1)类似的死循环,反复执行其内部的两层循环查询语句。
2.用一个标志变量,记住按键的状态。初始化为个值,如“暂停”,按键之后检查标志变量,是“暂停”就执行“恢复”,再让它变为“恢复”说明当前已经执行了恢复。反之亦然。
3.掉电暂停。这样需要按键能触发cpu工作。所以,需要按键接到外部中断上面。中断后可以恢复cpu工作。在中断中再判断是否要让cpu掉电与否。
不知道这种方法你能接受不?还是用外部中断。此按键触发中断后,关掉所有其他的中断,也即ea=0(最好先用个变量记住ea,方便恢复),然后就一直在中断中等待该按键第二次按下再恢复ea,最后退出中断。

⑽ 基于51单片机的按键计数设计,4位,0到9999

数码管有四位一体的,只用一个就行了,你这用两个二位一体的数码管,电路就显得有些乱。
还有,你那数码管的段控端少接一条导线,就是数码管的G端也要连线哪。
更重要的是,共阳数码管位控端用三极管驱动,当写程序扫描时,数码管不亮。

阅读全文

与基于单片机的按键相关的资料

热点内容
dvd光盘存储汉子算法 浏览:757
苹果邮件无法连接服务器地址 浏览:962
phpffmpeg转码 浏览:671
长沙好玩的解压项目 浏览:142
专属学情分析报告是什么app 浏览:564
php工程部署 浏览:833
android全屏透明 浏览:732
阿里云服务器已开通怎么办 浏览:803
光遇为什么登录时服务器已满 浏览:302
PDF分析 浏览:484
h3c光纤全工半全工设置命令 浏览:141
公司法pdf下载 浏览:381
linuxmarkdown 浏览:350
华为手机怎么多选文件夹 浏览:683
如何取消命令方块指令 浏览:349
风翼app为什么进不去了 浏览:778
im4java压缩图片 浏览:362
数据查询网站源码 浏览:150
伊克塞尔文档怎么进行加密 浏览:892
app转账是什么 浏览:163