#include <reg51.h> sbit K1=P3^1; unsigned char cnt; void key_proc(); void disp_proc(); unsigned char code disp_code[]={0x3f,0x06,0x5b,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F}; unsigned int j; unsigned char disp_buf[8]; unsigned char i,tmp; void delay(unsigned char n) { for(i=0;i<n;i++) { for(j=0;j<100;j++); } } void main(void) { while(1) { key_proc(); disp_proc(); } } void key_proc(void) { if(K1==0) { delay(10); if(K1==0) { cnt++; cnt=cnt%10; } while(K1==0); } } void disp_proc(void) { P2=0X1C; P0=disp_code[cnt]; delay(1); P2=0X18; P0=disp_code[cnt]; delay(1); P2=0X14; P0=disp_code[cnt]; delay(1); P2=0X10; P0=disp_code[cnt]; delay(1); } 如何同时亮
时间: 2023-12-03 19:05:10 浏览: 34
如果你想让所有数码管同时亮,可以将disp_proc函数修改如下:
```
void disp_proc(void) {
for(i=0; i<4; i++) {
P2 = 0x1C >> i;
P0 = disp_code[cnt];
delay(1);
}
}
```
此时,程序会循环控制P2口的输出,使得所有数码管段选都被选中,并且P0口输出的数字相同,从而实现所有数码管同时显示的效果。
相关问题
#include<REG52.H> #include<stdio.h> #include <intrins.h> sbit Trig=P2^0; sbit Echo=P2^1;超声模块测距代码补全
`#include<REG52.H>`是一段头文件的引用,代表使用了基于Intel 8051的单片机开发环境。`<stdio.h>`是标准输入输出头文件的引用。`<intrins.h>`是用于特殊函数的头文件引用。
以下是超声模块测距的代码补全:
```
#include<REG52.H>
#include<stdio.h>
#include <intrins.h>
sbit Trig=P2^0;
sbit Echo=P2^1;
void delay(unsigned int us) //延时函数
{
while(us--);
}
unsigned char read_distance() //读取距离函数
{
unsigned char distance;
Trig = 0; //初始化
delay(2);
Trig = 1; //触发测量
delay(10);
Trig = 0; //停止测量
while(!Echo); //等待Echo为高电平
TH0 = 0;
TL0 = 0; //清零计时器
while(Echo); //等待Echo为低电平
distance = (unsigned char)(TH0*256+TL0)/58.0; //计算距离
return distance;
}
void main()
{
unsigned char distance;
TMOD |= 0x01; //设置为定时器0,工作方式1
while(1)
{
distance = read_distance(); //读取距离
printf("The distance is %d cm\n",distance); //打印距离
delay(500); //延时500ms
}
}
```
#include <reg51.h> sbit key = P3^3; sbit LED = P0^0; unsigned char key_down; void delay(unsigned int delay_time) { unsigned int j = 0; for(;delay_time > 0;delay_time--) { for(j = 0;j < 125 ; j++); } } void key_pressed(void) { if(key == 1); { delay(20); if(key == 1) key_down = 1; } if((key == 0)&&(key_down == 1)) { LED = !LED; key_down = 0; } } void main(void) { P0 = 0x00; while(1); key_pressed(); }哪里出问题了
这段代码有几个问题:
1. `while(1);` 这一行会导致程序永远停留在这里而无法执行其它代码,应该删除分号,改为 `while(1)`。
2. `if(key == 1);` 这一行的分号将会导致 if 语句失效,应该删除分号。
3. `if((key == 0)&&(key_down == 1))` 这一行的括号多余,应该改为 `if(key == 0 && key_down == 1)`
修改后的代码如下:
```
#include <reg51.h>
sbit key = P3^3;
sbit LED = P0^0;
unsigned char key_down;
void delay(unsigned int delay_time)
{
unsigned int j = 0;
for(;delay_time > 0;delay_time--)
{
for(j = 0;j < 125 ; j++);
}
}
void key_pressed(void)
{
if(key == 1)
{
delay(20);
if(key == 1)
key_down = 1;
}
if(key == 0 && key_down == 1)
{
LED = !LED;
key_down = 0;
}
}
void main(void)
{
P0 = 0x00;
while(1)
{
key_pressed();
}
}
```
请注意,这只是针对问题的解答,并不代表代码在其他方面没有问题。如果您需要更全面的代码评估,请提供更多细节。