OLED_I2C_Init(); while (1) { for (int i =8; i < 12; i++) { GPIO_ResetBits(GPIOA, 1 << i); for (int j = 12; j < 16; j++) { if (GPIO_ReadInputDataBit(GPIOB, 1 << j) == RESET) { OLED_ShowChar(i-7, j-11, 'a'); } } GPIO_SetBits(GPIOA, 1 << i); }
时间: 2024-03-31 15:37:24 浏览: 49
这是一段嵌入式C语言代码,它使用了STM32的GPIO库和OLED显示屏的I2C通讯库。代码先调用了OLED_I2C_Init函数来初始化OLED显示屏,然后进入了一个无限循环。
在循环中,代码使用两个for循环来遍历GPIOA的第8到11个引脚,并将它们依次重置为低电平状态。然后,在GPIOB的第12到15个引脚中,找到一个处于低电平状态的引脚,并在OLED屏幕上显示一个字符'a',位置为(i-7, j-11)。最后,代码将GPIOA的对应引脚恢复为高电平状态,等待下一次遍历。
这段代码的具体作用需要结合具体的硬件连接来理解,但大致上可以理解为通过GPIO控制OLED显示屏,在特定的位置显示字符。
相关问题
"oled.h" #include "24cxx.h" #include "OLED4PINiic.h" const u8 TEXT_Buffer[]={"Explorer STM32F4 IIC TEST"}; #define SIZE sizeof(TEXT_Buffer) int main(void) { const unsigned char *point; u16 i=0; u8 j=0; delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); uart_init(115200); LED_Init(); KEY_Init(); ¯ AT24CXX_Init(); OLED_init(); point= &picture_tab[0]; for(i=0;i<SIZE;i++) { OLED_Clear(); OLED_ShowString(0,30,"21221054",16); OLED_ShowString(0,15,"2023/5/18",16); OLED_ShowChinese(0,0,0,16,1); OLED_ShowChinese(16,0,1,16,1); OLED_ShowChinese(32,0,2,16,1); OLED_Refresh_Gram(); delay_ms(1000); }在此基础上编写程序,使得显示的字体从OLED屏右端进入,左端出去,实现字体的滚动播放
以下是实现字体滚动播放的代码:
```C
#include "oled.h"
#define SCROLL_SPEED 100 // 滚动速度,单位为毫秒
int main(void)
{
const unsigned char *point;
u16 i = 0;
u8 j = 0;
u8 scroll_pos = 0; // 滚动位置
u8 scroll_dir = 0; // 滚动方向,0表示向左滚动,1表示向右滚动
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LED_Init();
KEY_Init();
AT24CXX_Init();
OLED_init();
point = &TEXT_Buffer[0];
while (1)
{
OLED_Clear();
// 显示固定内容
OLED_ShowString(0, 30, "21221054", 16);
OLED_ShowString(0, 15, "2023/5/18", 16);
OLED_ShowChinese(0, 0, 0, 16, 1);
OLED_ShowChinese(16, 0, 1, 16, 1);
OLED_ShowChinese(32, 0, 2, 16, 1);
// 显示滚动内容
for (j = 0; j < 8; j++) // 一页最多能显示8个汉字或16个英文字母
{
OLED_ShowChinese(64 + j * 16, 0, point[scroll_pos + j], 16, 1);
}
OLED_Refresh_Gram();
delay_ms(SCROLL_SPEED);
// 更新滚动位置和方向
if (scroll_dir == 0)
{
scroll_pos++;
if (scroll_pos + 8 >= SIZE) // 到达右端,改变滚动方向
{
scroll_dir = 1;
scroll_pos = SIZE - 8;
}
}
else
{
scroll_pos--;
if (scroll_pos == 0) // 到达左端,改变滚动方向
{
scroll_dir = 0;
scroll_pos = 0;
}
}
}
}
```
代码中使用了一个 `scroll_pos` 变量来表示当前滚动位置,同时使用一个 `scroll_dir` 变量来表示滚动方向,0表示向左滚动,1表示向右滚动。在每次刷新 OLED 显示之前,先显示固定内容(包括日期、姓名等),然后再根据 `scroll_pos` 和 `scroll_dir` 来显示滚动内容。每隔一定时间更新 `scroll_pos` 和 `scroll_dir` 变量,实现滚动播放的效果。
int main(void) { SystemInit(); USART3_Init(); OLED_GPIO_Init(); OLED_Init(); while (1) { Elude_detect_barrier(); // 进入死循环 char buf[10]; // 定义一个长度为10的字符数组用于存储串口接收到的数据 int i = 0; // 初始化计数器变量i为0 while (1) { // 进入一个无限循环,用于读取串口接收到的数据 // 判断USART3接收到数据标志是否被设置,如果被设置则表示USART3接收到了数据 if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET) { buf[i] = USART_ReceiveData(USART3); // 读取USART3接收到的数据,并存储在buf数组中 i++; // 计数器变量i加1 if (i == 9) { // 如果i等于9,则表示buf数组已经存满了9个数据 break; // 跳出内层循环 } } } formaldehyde = (buf[2] << 8) + buf[3]; // 将buf数组中的第三个和第四个数据合并为一个16位的值,存储在formaldehyde变量中 sprintf(display, "Formaldehyde: %d", formaldehyde); float formaldehyde_f = (float)formaldehyde / 10.0; // 将formaldehyde转换为浮点型,并且除以10.0 if (formaldehyde_f > 0.1) { sprintf(display, "Formaldehyde: %.1f", formaldehyde_f); Car_Stop(0); // 将浮点数格式化为带有1位小数点的字符串 OLED_Clear(); // 清空OLED屏幕 OLED_ShowString(0, 0, display, 16); // 在OLED屏幕上显示display数组中的字符串 Beep_Alert(); delay(30000); // 延时30秒 }怎么加入一个存储超过浓度阈值的环节
你可以在检测到超过浓度阈值后,将数据存储到一个数组中或者写入到一个文件中。例如:
1. 定义一个数组或者文件,在其中存储超过浓度阈值的数据。
2. 在检测到超过浓度阈值后,将数据存储到数组或者文件中。
3. 在程序中添加一个定时任务或者定时器,在指定的时间间隔内检查数组或者文件中存储的数据,如果超过一定数量则触发相应的报警或者处理机制。
下面是一个示例代码,用于将超过浓度阈值的数据存储到一个数组中:
```C
#define MAX_DATA_NUM 100 // 定义数组的最大容量为100
int data[MAX_DATA_NUM]; // 定义一个长度为100的数组用于存储数据
int data_num = 0; // 定义一个变量用于记录已经存储的数据数量
while (1)
{
Elude_detect_barrier();
char buf[10];
int i = 0;
while (1)
{
if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET)
{
buf[i] = USART_ReceiveData(USART3);
i++;
if (i == 9)
{
break;
}
}
}
formaldehyde = (buf[2] << 8) + buf[3];
sprintf(display, "Formaldehyde: %d", formaldehyde);
float formaldehyde_f = (float)formaldehyde / 10.0;
if (formaldehyde_f > 0.1)
{
sprintf(display, "Formaldehyde: %.1f", formaldehyde_f);
Car_Stop(0);
OLED_Clear();
OLED_ShowString(0, 0, display, 16);
Beep_Alert();
// 将超过浓度阈值的数据存储到数组中
if (data_num < MAX_DATA_NUM)
{
data[data_num] = formaldehyde;
data_num++;
}
}
// 检查数组中存储的数据是否超过一定数量,如果超过则触发相应的报警或者处理机制
if (data_num >= 10)
{
// TODO: 触发报警或者处理机制
data_num = 0; // 重置数据数量
}
delay(30000);
}
```
阅读全文