51单片机输入4个数,首先小数点依次向左位移,然后首位数字移到最后一位,接着小数点向左位移,如此循环往复,直至数值为初始值
时间: 2024-01-07 12:03:49 浏览: 8
这是一个数码管循环显示的问题,可以通过以下步骤实现:
1. 定义一个长度为 4 的数组,用于存储输入的 4 个数。
2. 通过数码管显示函数,将数组中的数依次显示出来,并在每次显示后将小数点向左移动一位。
3. 将数组第一个元素移到最后一位,即将第一个元素存储到一个临时变量中,然后将数组中的元素全部向前移动一个位置,最后将临时变量存储到数组最后一位。
4. 重复步骤 2 和步骤 3,直至数值为初始值。
需要注意的是,在每次向左移动小数点时,需要判断当前小数点位置是否已经到达最左侧,如果是,则需要将小数点移回原来的位置。另外,为了实现数值的循环显示,可以设置一个计数器,当计数器达到一定值时,重新从数组的第一个元素开始显示。
相关问题
51单片机数码管2到9自右向左以此亮起,且带有小数点
可以使用以下代码来实现51单片机数码管2到9自右向左以此亮起,并且带有小数点的效果:
```
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void DigDisplay(uchar num)
{
switch(num)
{
case 0:LSA=0;LSB=0;LSC=0;break;
case 1:LSA=1;LSB=0;LSC=0;break;
case 2:LSA=0;LSB=1;LSC=0;break;
case 3:LSA=1;LSB=1;LSC=0;break;
case 4:LSA=0;LSB=0;LSC=1;break;
case 5:LSA=1;LSB=0;LSC=1;break;
case 6:LSA=0;LSB=1;LSC=1;break;
case 7:LSA=1;LSB=1;LSC=1;break;
}
}
void main()
{
uchar i,j;
while(1)
{
for(i=2;i<=9;i++)
{
for(j=0;j<50;j++)
{
P0=table[i];
DigDisplay(j%8);
delay(1);
P0=0x00;
}
}
}
}
```
该代码使用了一个数码管显示表格 `table[]`,其中存储了每个数字在数码管上的对应显示数据。在 `main()` 函数中,使用两个循环来控制数字的变化和小数点的闪烁,使用 `DigDisplay()` 函数来控制数码管的位选,从而实现了数码管2到9自右向左以此亮起,并且带有小数点的效果。
帮我写一个基于51单片机的lcd1602显示浮点数的程序,精确到小数点后两位
好的,以下是基于51单片机的lcd1602显示浮点数的程序,精确到小数点后两位:
```c
#include <reg51.h>
#include <stdio.h>
#include <string.h>
#define LCD_DATAPORT P0
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
void LCD_Init();
void LCD_WriteCommand(unsigned char cmd);
void LCD_WriteData(unsigned char dat);
void LCD_WriteString(unsigned char x, unsigned char y, unsigned char *str);
void LCD_WriteFloat(unsigned char x, unsigned char y, float num);
void main()
{
float num = 3.14;
char str[16];
LCD_Init();
while(1)
{
LCD_WriteFloat(0, 0, num);
}
}
void LCD_Init()
{
LCD_WriteCommand(0x38); // function set
LCD_WriteCommand(0x0c); // display on, cursor off, blink off
LCD_WriteCommand(0x06); // entry mode set
LCD_WriteCommand(0x01); // clear display
LCD_WriteCommand(0x80); // set DDRAM address
}
void LCD_WriteCommand(unsigned char cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 1;
LCD_DATAPORT = cmd;
LCD_EN = 0;
}
void LCD_WriteData(unsigned char dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 1;
LCD_DATAPORT = dat;
LCD_EN = 0;
}
void LCD_WriteString(unsigned char x, unsigned char y, unsigned char *str)
{
unsigned char addr;
if(y == 0)
{
addr = 0x80 + x;
}
else
{
addr = 0xc0 + x;
}
LCD_WriteCommand(addr);
while(*str != '\0')
{
LCD_WriteData(*str);
str++;
}
}
void LCD_WriteFloat(unsigned char x, unsigned char y, float num)
{
char str[16];
sprintf(str, "%.2f", num);
LCD_WriteString(x, y, str);
}
```
注:该程序中使用了 `sprintf()` 函数,需要包含 `<stdio.h>` 库。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)