与单片机相关Page Address Set 什么意思,有什么用
时间: 2023-06-16 19:04:51 浏览: 46
在单片机中,Page Address Set是指用于设置存储器中的页面地址的寄存器或指令。页面是存储器中的一段连续地址空间,用于存储特定类型的数据或代码。通过选择不同的页面地址,单片机可以访问不同的数据或代码,从而实现更高效的数据存储和访问。
Page Address Set通常用于存储器映射、内存分页和虚拟内存等相关应用中。例如,在存储器映射中,将外设映射到某个地址范围内的页面中,可以通过设置页面地址来访问外设数据。在内存分页和虚拟内存中,通过设置页面地址可以实现将物理地址映射到不同的虚拟地址空间中,从而实现更高效的内存管理和使用。
总之,Page Address Set在单片机中具有非常重要的作用,可以帮助程序员更好地管理和使用存储器资源。
相关问题
生成一个用C52单片机,超声波测距,要求:oled屏幕
显示距离值的程序
以下是使用C语言编写的超声波测距程序,使用C52单片机和OLED屏幕显示距离值:
```c
#include <reg52.h>
#include <intrins.h>
#define FREQ 11059200UL
sbit TRIG = P1^0;
sbit ECHO = P1^1;
unsigned char code font_6x8[95][6];
unsigned int distance = 0;
void delay_us(unsigned int us)
{
while(us--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void delay_ms(unsigned int ms)
{
while(ms--)
{
delay_us(1000);
}
}
void init()
{
TMOD = 0x01;
TH0 = 0;
TL0 = 0;
EA = 1;
ET0 = 1;
TRIG = 0;
}
void display(unsigned char x, unsigned char y, unsigned char ch)
{
unsigned char i, j;
ch -= 32;
for(i = 0; i < 6; i++)
{
j = font_6x8[ch][i];
OLED_SetPos(x, y + i);
OLED_WrDat(j);
}
}
void OLED_Init()
{
OLED_WR_Byte(0xAE,OLED_CMD);//--display off
OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
OLED_WR_Byte(0x40,OLED_CMD);//--set start line address
OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
OLED_WR_Byte(0x81,OLED_CMD); // contract control
OLED_WR_Byte(0xFF,OLED_CMD);//--128
OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap
OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
OLED_WR_Byte(0x3F,OLED_CMD);//--1/64 duty
OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
OLED_WR_Byte(0xD3,OLED_CMD);//set display offset
OLED_WR_Byte(0x00,OLED_CMD);//
OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
OLED_WR_Byte(0x80,OLED_CMD);//
OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
OLED_WR_Byte(0x05,OLED_CMD);//
OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
OLED_WR_Byte(0xF1,OLED_CMD);//
OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
OLED_WR_Byte(0x12,OLED_CMD);//
OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
OLED_WR_Byte(0x30,OLED_CMD);//
OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
OLED_WR_Byte(0x14,OLED_CMD);//
OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
}
void OLED_SetPos(unsigned char x, unsigned char y)
{
OLED_WR_Byte(0xb0 + y, OLED_CMD);
OLED_WR_Byte(((x & 0xf0) >> 4) | 0x10, OLED_CMD);
OLED_WR_Byte((x & 0x0f), OLED_CMD);
}
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
unsigned char i;
if(cmd)
{
OLED_DC = 1;
}
else
{
OLED_DC = 0;
}
OLED_CS = 0;
for(i = 0; i < 8; i++)
{
OLED_SCLK = 0;
if(dat & 0x80)
{
OLED_SDIN = 1;
}
else
{
OLED_SDIN = 0;
}
OLED_SCLK = 1;
dat <<= 1;
}
OLED_CS = 1;
}
void OLED_Clear()
{
unsigned char i, j;
for(i = 0; i < 8; i++)
{
OLED_SetPos(0,i);
for(j = 0; j < 128; j++)
{
OLED_WrDat(0);
}
}
}
void OLED_WrDat(unsigned char dat)
{
OLED_WR_Byte(dat, OLED_DATA);
}
void Timer0_ISR() interrupt 1
{
static unsigned int counter = 0;
if(counter > 50)
{
TRIG = 1;
delay_us(10);
TRIG = 0;
while(ECHO == 0);
TH0 = 0;
TL0 = 0;
while(ECHO == 1);
distance = (unsigned int)(TH0 << 8 | TL0) / 58;
counter = 0;
}
counter++;
}
void main()
{
init();
OLED_Init();
OLED_Clear();
while(1)
{
display(0, 0, 'D');
display(6, 0, 'i');
display(12, 0, 's');
display(18, 0, 't');
display(24, 0, 'a');
display(30, 0, 'n');
display(36, 0, 'c');
display(42, 0, 'e');
display(48, 0, ':');
display(54, 0, ' ');
display(72, 0, distance / 100 + '0');
display(78, 0, distance % 100 / 10 + '0');
display(84, 0, distance % 10 + '0');
delay_ms(100);
OLED_Clear();
}
}
```
该程序通过超声波测距模块测量距离,并在OLED屏幕上显示距离值。程序中使用了定时器0来计数,每50个计数就触发一次超声波测距,并计算距离值。距离值通过数字的方式在OLED屏幕上显示。
基于标准库单片机rtc实现eled刷新的程序,加注释
以下是基于标准库的单片机RTC实现OLED刷新的程序,已加入详细注释,供参考:
```c
#include "stm32f1xx_hal.h"
#include "stdlib.h"
#include "stdio.h"
// 定义OLED的宽度和高度
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
// 定义OLED的数据寄存器地址
#define OLED_DATA_ADDRESS 0x40
// 定义OLED的命令寄存器地址
#define OLED_CMD_ADDRESS 0x00
// 定义I2C的地址和时序参数
#define OLED_I2C_ADDRESS 0x78
#define OLED_I2C_TIMEOUT 1000
#define OLED_I2C_DELAY 5
// 定义RTC的时钟源和时钟周期
#define RTC_CLOCK_SOURCE LSE
#define RTC_CLOCK_PERIOD 32768
// 定义RTC的时钟结构体和配置变量
RTC_HandleTypeDef hrtc;
RTC_TimeTypeDef sTime = {0};
// 定义OLED的显示缓存和指针
uint8_t OLED_Buffer[OLED_WIDTH * OLED_HEIGHT / 8];
uint8_t *OLED_Pointer = OLED_Buffer;
// 初始化OLED
void OLED_Init(I2C_HandleTypeDef *hi2c)
{
uint8_t init_cmd[] = {
0xAE, // turn off OLED
0xD5, 0x80, // set display clock divide ratio/oscillator frequency
0xA8, 0x3F, // set multiplex ratio(1 to 64)
0xD3, 0x00, // set display offset
0x40, // set start line address
0x8D, 0x14, // set charge pump
0x20, 0x00, // set memory addressing mode(horizontal/vertical)
0xA1, // set segment re-map
0xC8, // set com output scan direction
0xDA, 0x12, // set com pins hardware configuration
0x81, 0xCF, // set contrast control
0xD9, 0xF1, // set pre-charge period
0xDB, 0x40, // set vcomh
0xAF // turn on OLED
};
HAL_I2C_Mem_Write(hi2c, OLED_I2C_ADDRESS, OLED_CMD_ADDRESS, 1, init_cmd, sizeof(init_cmd), OLED_I2C_TIMEOUT);
}
// 显示OLED
void OLED_Show(I2C_HandleTypeDef *hi2c)
{
uint8_t page_start = 0xB0; // 设置页起始地址
uint8_t col_start = 0x00; // 设置列起始地址
uint8_t col_end = 0x7F; // 设置列结束地址
for (uint8_t page = 0; page < OLED_HEIGHT / 8; page++)
{
HAL_I2C_Mem_Write(hi2c, OLED_I2C_ADDRESS, OLED_CMD_ADDRESS, 1, &page_start, 1, OLED_I2C_TIMEOUT); // 设置页地址
HAL_I2C_Mem_Write(hi2c, OLED_I2C_ADDRESS, OLED_CMD_ADDRESS, 1, &col_start, 1, OLED_I2C_TIMEOUT); // 设置列地址
HAL_I2C_Mem_Write(hi2c, OLED_I2C_ADDRESS, OLED_DATA_ADDRESS, 1, OLED_Pointer, OLED_WIDTH, OLED_I2C_TIMEOUT); // 写入数据
page_start++; // 下一页
OLED_Pointer += OLED_WIDTH; // 移动指针到下一行
}
OLED_Pointer = OLED_Buffer; // 重置指针
}
// 刷新OLED
void OLED_Refresh(I2C_HandleTypeDef *hi2c)
{
OLED_Show(hi2c); // 显示OLED
}
// 配置RTC
void RTC_Config(void)
{
// 初始化RTC
hrtc.Instance = RTC;
hrtc.Init.AsynchPrediv = RTC_CLOCK_PERIOD >> 16;
hrtc.Init.SynchPrediv = RTC_CLOCK_PERIOD & 0xFFFF;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
HAL_RTC_Init(&hrtc);
// 判断是否需要重新配置RTC
if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != RTC_CLOCK_SOURCE)
{
// 配置RTC时钟源
__HAL_RCC_LSE_CONFIG(RCC_LSE_ON);
while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET);
__HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE);
// 重置RTC时间
sTime.Hours = 0;
sTime.Minutes = 0;
sTime.Seconds = 0;
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
// 写入RTC时钟源到备份寄存器
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, RTC_CLOCK_SOURCE);
}
}
int main(void)
{
// 初始化HAL库
HAL_Init();
// 配置时钟
SystemClock_Config();
// 配置RTC
RTC_Config();
// 配置I2C
I2C_HandleTypeDef hi2c;
hi2c.Instance = I2C1;
hi2c.Init.ClockSpeed = 100000;
hi2c.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c.Init.OwnAddress1 = 0;
hi2c.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c.Init.OwnAddress2 = 0;
hi2c.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
HAL_I2C_Init(&hi2c);
// 初始化OLED
OLED_Init(&hi2c);
while (1)
{
// 获取RTC时间
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
// 刷新OLED
OLED_Refresh(&hi2c);
// 等待一段时间
HAL_Delay(1000);
}
}
```
在该程序中,使用了STM32 HAL库提供的RTC和I2C驱动,通过配置RTC的时钟源和时钟周期,读取RTC的时间,判断是否需要刷新OLED,并将需要显示的内容发送给OLED控制器,从而实现单片机RTC与OLED的刷新显示。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![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)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)