void keyscan() { if(key1==0) { delay(5); if(key1==0) { s1num++; while(!key1); if(s1num==1) { turn(); } } if(s1num==2) { back(); } if(s1num==3) { qianhou(); } if(s1num==4) { dangshuang(); } if(s1num==5) s1num=1; } if(key2==0) { delay(5); while(~key2); play1(); } }
时间: 2024-04-07 17:28:41 浏览: 20
这段代码是用来检测按键输入的函数,其中包括两个按键,key1 和 key2。当 key1 被按下时,会通过判断 s1num 的值来调用不同的函数,如 turn()、back()、qianhou() 和 dangshuang()。当 s1num 的值为 5 时,会将其重新赋值为 1。当 key2 被按下时,会调用 play1() 函数。在函数中还有一些延时操作。
相关问题
#include<reg51.h> #define uint unsigned int #define uchar unsigned char sbit speaker=P1^4; uchar a,b,num1,s1num,n1,n2; char num; uchar code yinfu[]={ 0xfb,0xe9, 0xfc,0x5c, 0xfc,0xc1, 0xfc,0xef, 0xfd,0x45, 0xfd,0x92, 0xfd,0xd0, 0xfd,0xee, 0x00,0x00, }; void check_key(); void keyscan(); void turn(); void back(); void delay(uint z); void delay1(void); void main() { TMOD=0x01; TH0=a; TL0=b; ET0=1; TR0=1; while(1) { check_key(); keyscan(); } } void time0() interrupt 1 { TH0=a; TL0=b; speaker=~speaker; } void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void keyscan() { if(key1==0) { delay(5); if(key1==0) { s1num++; while(!key1); if(s1num==1) { turn(); } } if(s1num==2) { back(); } if(s1num==3) { qianhou(); } if(s1num==4) { dangshuang(); } if(s1num==5) s1num=1; } if(key2==0) { delay(5); while(~key2); play1(); } } void delay1(void) { uchar n=15; while(n--) { uchar i; for(i=0;i<125;i++); } }
这段代码使用了 8051 单片机来控制一个小型车辆的运动和声音输出。其中定义了一些常量和变量,如 speaker、a、b、num1、s1num、n1、n2 和 num。同时定义了一些函数,如 check_key()、keyscan()、turn()、back()、delay() 和 delay1()。
在 main() 函数中,初始化了定时器 TMOD 和中断服务函数 time0,并通过 while 循环不断调用 check_key() 和 keyscan() 函数。
在 time0() 中断服务函数中,通过修改 TH0 和 TL0 的值来控制定时器的计时,同时通过修改 speaker 的值来控制蜂鸣器的输出。
在 delay() 函数中,通过嵌套循环来实现一定时间的延时。
在 keyscan() 函数中,通过检测按键的输入来调用不同的函数,如 turn()、back()、qianhou() 和 dangshuang(),同时也可以触发 play1() 函数来输出声音。
在 delay1() 函数中,同样通过嵌套循环来实现一定时间的延时。
#include <reg51.h> unsigned char code seg_duan[] = {0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; unsigned char code seg_wei[] = {0xfe,0xfd,0xfb,0xf7}; unsigned char num=0; sbit key1=P3^0; sbit key2=P3^1; //sbit le=P2^0; void delay(unsigned int k) { unsigned int i,j; for(i=0;i<k;i++) { for(j=0;j<121;j++) {;} } } void keyscan() { if(key1==0) { delay(10); if(key1==0) { while(!key1); num++; if(num>99) { num=0; } } } if(key2==0) { delay(10); if(key2==0) { while(!key2); if(num==0) num=99; else num--; } } } void display(unsigned char i) { P2=seg_wei[0]; P0=seg_duan[i%10]; delay(5); P2=0xff; P2=seg_wei[1]; P0=seg_duan[i/10]; delay(5); } main() { while(1) { keyscan(); display(num); } }我需要在这段代码修改成以前设计的两位加减计数器,按键按下时,数码管上的数值不显示。现在要求按键按下时,不影响数码管上数值的显示。
要实现按键按下时,不影响数码管上数值的显示,可以使用一个变量flag来控制。当按键按下时,flag的值为1,此时不更新num的值,直到按键松开才更新num的值。
下面是修改后的代码:
```c
#include <reg51.h>
unsigned char code seg_duan[] = {0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char code seg_wei[] = {0xfe,0xfd,0xfb,0xf7};
unsigned char num=0, flag = 0; // 添加flag变量,初始值为0
sbit key1=P3^0;
sbit key2=P3^1;
//sbit le=P2^0;
void delay(unsigned int k) {
unsigned int i,j;
for(i=0;i<k;i++) {
for(j=0;j<121;j++) {
;
}
}
}
void keyscan() {
if(key1==0) {
delay(10);
if(key1==0) {
while(!key1);
flag = 1; // 按键按下时,将flag设为1
num++;
if(num>99) {
num=0;
}
}
}
if(key2==0) {
delay(10);
if(key2==0) {
while(!key2);
flag = 1; // 按键按下时,将flag设为1
if(num==0)
num=99;
else
num--;
}
}
}
void display(unsigned char i) {
P2=seg_wei[0];
P0=seg_duan[i%10];
delay(5);
P2=0xff;
P2=seg_wei[1];
P0=seg_duan[i/10];
delay(5);
}
main() {
while(1) {
keyscan();
if(!flag) // 如果flag为0,则更新数值
display(num);
flag = 0; // 每次循环结束时,将flag设为0
}
}
```