Files
jeon 096111e983 feat: 06-17 신규 작업본 반영 (개발사양서/기능검토/승인원/Source 등 추가)
.claude/ 제외(.gitignore 추가). 기존 초기커밋(5a96a69) 위에 신규·수정·이동분 커밋.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 07:54:58 +09:00

384 lines
5.6 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include "Nano100Series.h"
#include "adc.h"
#include "gpio.h"
#include "pwm.h"
#include "timer.h"
#include "uart.h"
#include "sys.h"
#include "clk.h"
#include "EEPROM_Emulate.h"
#include "My_define.h"
void Initial_Signal();
void Disp_Segdata(uint8_t Sel, uint8_t digit4, uint8_t digit3, uint8_t digit2, uint8_t digit1);
void Led_OnOff(uint8_t kind, uint8_t onoff);
uint8_t Font_Data[18]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67,\
0x80, 0x58, 0x79, 0x40, 0x00, 0x50, 0x77, 0x5E };
// . , c , E , - , ' ' , r , A , d
uint8_t seg_data[4][14];
#define A_DATA PA4
#define A_CLK PA3
#define A_STB PA2
void Initial_Signal()
{
uint8_t i;
A_CLK = 1;
A_STB = 1;
for(i=0; i<8; i++) //command 1 (#0000_0001B) -> 5grid 8seg
{
A_STB = 0;
A_CLK = 0;
if(i==0)
{
A_DATA = 1;
}
else
{
A_DATA = 0;
}
A_CLK = 1;
}
A_STB = 1;
for(i=0; i<8; i++) //command 2 (#0100_0000B)
{
A_STB = 0;
A_CLK = 0;
if(i==6)
{
A_DATA = 1;
}
else
{
A_DATA = 0;
}
A_CLK = 1;
}
A_STB = 1;
for(i=0; i<8; i++) //command 3 (#1100_0000B)
{
A_STB = 0;
A_CLK = 0;
if(i==6 || i==7)
{
A_DATA = 1;
}
else
{
A_DATA = 0;
}
A_CLK = 1;
}
for(i=0; i<112; i++) //data
{
A_STB = 0;
A_CLK = 0;
A_DATA = 0;
A_CLK = 1;
}
A_STB = 1;
for(i=0; i<8; i++) //command 4 (#1000_0100B)
{
A_STB = 0;
A_CLK = 0;
if(i==3 || i==7)
{
A_DATA = 1;
}
else
{
A_DATA = 0;
}
A_CLK = 1;
}
A_STB = 1;
}
uint16_t one_sec = 0;
extern uint8_t Tmperature_Error;
void Disp_Segdata(uint8_t Sel, uint8_t digit4, uint8_t digit3, uint8_t digit2, uint8_t digit1)
{
seg_data[Sel][0] = Font_Data[digit4];
seg_data[Sel][1] = Font_Data[digit4]>>3;
seg_data[Sel][2] = Font_Data[digit3];
seg_data[Sel][3] = Font_Data[digit3]>>3;
seg_data[Sel][4] = Font_Data[digit2];
seg_data[Sel][5] = Font_Data[digit2]>>3;
seg_data[Sel][6] = Font_Data[digit1];
seg_data[Sel][7] = Font_Data[digit1]>>3;
}
enum{
K_VENT,
K_AUTO,
K_AIR,
K_WIND1,
K_WIND2,
K_WIND3,
K_WIND4,
K_WIND5,
K_PM25_1,
K_PM25_2,
K_PM25_4,
K_PM25_3,
K_PM10_1,
K_PM10_2,
K_PM10_4,
K_PM10_3,
K_TIME_1,
K_TIME_4,
K_TIME_8,
K_LOCK,
K_JUMKEOM,
K_FILTER_CLEAN,
K_FILTER_CHANGE,
K_EXTRA1,
K_CO2_1,
K_CO2_2,
K_CO2_4,
K_CO2_3,
K_SOJA_CLEAN,
K_SOJA_CHANGE,
K_IOT,
K_EXTRA2,
};
void Led_OnOff(uint8_t kind, uint8_t onoff)
{
if(onoff == 1)
{
if(kind < 6)
{
seg_data[3][0] |= 0x01<<kind;
}
else if(kind < 8)
{
seg_data[3][1] |= 0x01<<(kind-3);
}
else if(kind < 14)
{
seg_data[3][2] |= 0x01<<(kind-8);
}
else if(kind < 16)
{
seg_data[3][3] |=0x01<<(kind-8-3);
}
else if(kind < 22)
{
seg_data[3][4] |= 0x01<<(kind-16);
}
else if(kind < 24)
{
seg_data[3][5] |=0x01<<(kind-16-3);
}
else if(kind < 30)
{
seg_data[3][6] |= 0x01<<(kind-24);
}
else if(kind < 32)
{
seg_data[3][7] |=0x01<<(kind-24-3);
}
else // all on
{
seg_data[3][0] = 0xFF;
seg_data[3][1] = 0xFF;
seg_data[3][2] = 0xFF;
seg_data[3][3] = 0xFF;
seg_data[3][4] = 0xFF;
seg_data[3][5] = 0xFF;
seg_data[3][6] = 0xFF;
seg_data[3][7] = 0xFF;
}
}
else
{
if(kind < 6)
{
seg_data[3][0] &= ~(0x01<<kind);
}
else if(kind < 8)
{
seg_data[3][1] &= ~(0x01<<(kind-3));
}
else if(kind < 14)
{
seg_data[3][2] &= ~(0x01<<(kind-8));
}
else if(kind < 16)
{
seg_data[3][3] &= ~(0x01<<(kind-8-3));
}
else if(kind < 22)
{
seg_data[3][4] &= ~(0x01<<kind-16);
}
else if(kind < 24)
{
seg_data[3][5] &= ~(0x01<<(kind-16-3));
}
else if(kind < 30)
{
seg_data[3][6] &= ~(0x01<<kind-24);
}
else if(kind < 32)
{
seg_data[3][7] &= ~(0x01<<(kind-24-3));
}
else // all off
{
seg_data[3][0] = 0;
seg_data[3][1] = 0;
seg_data[3][2] = 0;
seg_data[3][3] = 0;
seg_data[3][4] = 0;
seg_data[3][5] = 0;
seg_data[3][6] = 0;
seg_data[3][7] = 0;
} }
}
void Make_A(void)
{
uint8_t i,j;
uint8_t Mask;
A_STB = 1;
A_CLK = 1;
for(i=0; i<8; i++) //command 1 (#0000_0011B)
{
A_STB = 0;
A_CLK = 0;
if( i==0) //5grid, 8segment
A_DATA = 1;
else
A_DATA = 0;
A_CLK = 1;
}
A_STB = 1;
for(i=0; i<8; i++) //command 2 (#0100_0000B)
{
A_STB = 0;
A_CLK = 0;
if(i==6) //command2:01
A_DATA = 1;
else
A_DATA = 0;
A_CLK = 1;
}
A_STB = 1;
for(i=0; i<8; i++) //command 3 (#1100_0000B)
{
A_STB = 0;
A_CLK = 0;
if(i==6 || i==7)
A_DATA = 1;
else
A_DATA = 0;
A_CLK = 1;
}
for(i=0; i<14; i++)
{
Mask = 0x01;
for(j=0; j<8; j++)
{
A_STB = 0;
A_CLK = 0;
if(seg_data[0][i] & Mask)A_DATA = 1;
else A_DATA = 0;
A_CLK = 1;
Mask <<= 1;
}
}
A_STB = 1;
for(i=0; i<8; i++) //command 4 (#1000_0100B)
{
A_STB = 0;
A_CLK = 0;
if(i==0 ||i==1 ||i==2 ||i==3 || i==7) //pulse width=14/16
A_DATA = 1;
else
A_DATA = 0;
A_CLK = 1;
}
A_STB = 1;
}
uint8_t Power_On = 0;
void Display_update(void)
{
uint8_t Digit_1000 = 0,Digit_100 = 0,Digit_10 = 0,Digit_1 = 0;
if(Power_On == 0)
{
Disp_Segdata(0, 14, 14, 14, 14);
}
else
{
Digit_1000 = SEN66_CO2_value%10000/1000;
if(Digit_1000 == 0) Digit_1000 = 14; // blank
Digit_100 = SEN66_CO2_value%1000/100;
if((Digit_1000 == 0)&&(Digit_100 == 0)) Digit_100 = 14; // blank
Disp_Segdata(0, Digit_1000, Digit_100, SEN66_CO2_value%100/10, SEN66_CO2_value%10);
}
}
void Display_process(void)
{
Make_A();
}