#include "ch32v00x.h" #include #define TMP101_ADDR 0x48 // I2C-Adresse des TMP101 Sensors (Standard) #define I2C_SPEED 100000 // I2C Geschwindigkeit (100kHz) // GPIO-Pins für 7-Segment-Anzeige #define SEG_PORT GPIOA #define SEG_A GPIO_Pin_0 #define SEG_B GPIO_Pin_1 #define SEG_C GPIO_Pin_2 #define SEG_D GPIO_Pin_3 #define SEG_E GPIO_Pin_4 #define SEG_F GPIO_Pin_5 #define SEG_G GPIO_Pin_6 #define SEG_DP GPIO_Pin_7 #define DIGIT_PORT GPIOC #define DIGIT_1 GPIO_Pin_0 #define DIGIT_2 GPIO_Pin_1 #define DIGIT_3 GPIO_Pin_2 #define DIGIT_4 GPIO_Pin_3 uint8_t temp_reading = 0; uint8_t digits[4] = {0}; // Digit-Werte für die 4 Ziffern // Segment-Code für 0-9 uint8_t segment_map[10] = { 0b00111111, // 0 0b00000110, // 1 0b01011011, // 2 0b01001111, // 3 0b01100110, // 4 0b01101101, // 5 0b01111101, // 6 0b00000111, // 7 0b01111111, // 8 0b01101111 // 9 }; void Delay_ms(uint32_t ms); void I2C_Init_Custom(void); uint8_t TMP101_ReadTemperature(void); void Display_Update(void); void Display_SetDigit(uint8_t digit, uint8_t value); int main(void) { SystemInit(); I2C_Init_Custom(); // GPIO für 7-Segment-Anzeige initialisieren GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = 0xFF; // Alle 8 Pins für Segmente GPIO_Init(SEG_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = DIGIT_1 | DIGIT_2 | DIGIT_3 | DIGIT_4; GPIO_Init(DIGIT_PORT, &GPIO_InitStructure); while (1) { // Temperatur vom TMP101 auslesen temp_reading = TMP101_ReadTemperature(); // Temperatur in Ziffern umwandeln (z.B. 25 Grad -> {2, 5, 0, 0}) digits[0] = temp_reading / 10; digits[1] = temp_reading % 10; digits[2] = digits[3] = 0; // Keine weiteren Digits // Anzeige aktualisieren for (uint8_t i = 0; i < 4; i++) { Display_SetDigit(i, digits[i]); Display_Update(); Delay_ms(5); // Kurze Verzögerung für Multiplexing } } } // I2C-Initialisierung void I2C_Init_Custom(void) { I2C_InitTypeDef I2C_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); I2C_InitStructure.I2C_ClockSpeed = I2C_SPEED; I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x00; I2C_InitStructure.I2C_Ack = I2C_Ack_Disable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_Init(I2C1, &I2C_InitStructure); I2C_Cmd(I2C1, ENABLE); } // TMP101 Temperatur auslesen uint8_t TMP101_ReadTemperature(void) { uint8_t temp = 0; // I2C Start I2C_GenerateSTART(I2C1, ENABLE); while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // Adresse senden I2C_Send7bitAddress(I2C1, TMP101_ADDR << 1, I2C_Direction_Receiver); while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); // Daten empfangen while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); temp = I2C_ReceiveData(I2C1); // I2C Stop I2C_GenerateSTOP(I2C1, ENABLE); return temp; } // Anzeige aktualisieren void Display_Update(void) { GPIO_ResetBits(DIGIT_PORT, DIGIT_1 | DIGIT_2 | DIGIT_3 | DIGIT_4); GPIO_Write(SEG_PORT, 0x00); Delay_ms(1); } void Display_SetDigit(uint8_t digit, uint8_t value) { uint16_t digit_pin = 0; switch (digit) { case 0: digit_pin = DIGIT_1; break; case 1: digit_pin = DIGIT_2; break; case 2: digit_pin = DIGIT_3; break; case 3: digit_pin = DIGIT_4; break; } // Segment-Daten setzen GPIO_Write(SEG_PORT, segment_map[value]); GPIO_SetBits(DIGIT_PORT, digit_pin); } void Delay_ms(uint32_t ms) { for (uint32_t i = 0; i < ms * 800; i++) __NOP(); // Einfache Verzögerung }