// Sys Lib
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// Dev Lib
#include <MsTimer2.h>
// My Lib
#include "My_Arduino_GPIO_Lib_V1_6.h"
#define COM_A 1
#define Digit_4 2
#define Arduino_mode 3
#include "My_Arduino_FND_Lib_V2_4.h"
#define Arduino_Mode 4
#define SW_Uart_mode 5
//#include "My_MCU_Printf_Lib_V2_2.h"
struct ValUE
{
unsigned int cnt;
char mode_cnt;
int loop;
int loop1;
int loop2;
int loop3;
int loop4;
int cnt_bak;
char key; // key 값 저장 버퍼
}valu = {1234, 1, 0,0,0,0,0,1234,0};
struct ValUE *valu_p = &valu;
struct FLAG_
{
char key_flag;
char run_flag;
}flag = {0,0};
struct FLAG_ *flag_p = &flag;
void my_time()
{
fnd_dis_A_4(valu_p -> cnt_bak);
/*
unsigned int i, j, k,h;
(valu_p -> loop1 > 20) ? valu_p -> loop1 = 0, // 200ms
(valu_p -> cnt /1000 > 9) ? valu_p -> cnt &= 0x0fff : i = (valu_p -> cnt / 1000) + 1000
: (*valu_p).loop1++;
/*
(valu_p -> loop2 > 50) ? valu_p -> loop2 = 0, // 500ms
(valu_p -> cnt %1000/100 > 9) ? valu_p -> cnt &= 0xf0ff : j = (valu_p -> cnt%1000/100) + 100
: (*valu_p).loop2++;
(valu_p -> loop3 > 80) ? valu_p -> loop3 = 0, // 800ms
(valu_p -> cnt %100/10 > 9) ? valu_p -> cnt &= 0xff0f : k = (valu_p -> cnt%100/10) + 10
: (*valu_p).loop3++;
(valu_p -> loop4 > 110) ? valu_p -> loop4 = 0, // 1.1sec
(valu_p -> cnt %10 > 9) ? valu_p -> cnt &= 0xfff0 : h = (valu_p -> cnt%10) + 1,
Serial.println(valu_p -> cnt) : (*valu_p).loop4++;
valu_p -> cnt = i + j + k + h;
*/
// 10ms
//(valu_p -> loop > 30) ? valu_p -> loop = 0,
// valu_p -> cnt++ : valu_p -> loop++;
}
enum {
sw1 = 2,
sw2 = 3,
sw3 = 4,
sw4 = 5
}key_pin;
void setup()
{
DDRB = 0xff;
DDRC = 0x1f; // a0.a1.a2.a3.a4 == 출력, a5 = 입력
DDRD = 128 + 64; // 0b11000000 // 0xc0
pinMode(sw1, INPUT_PULLUP);
pinMode(sw2, INPUT_PULLUP);
pinMode(sw3, INPUT_PULLUP);
pinMode(sw4, INPUT_PULLUP);
MsTimer2::set(2, my_time);
MsTimer2::start();
Serial.begin(115200);
}
char key_rd()
{
char buf = 0;
if((PIND & 0x3c) != 0x3c) // MCU Mode
{
buf = (PIND & 0x3c);
while((PIND & 0x3c) != 0x3c){}
flag_p -> key_flag = 1;
}
return buf;
}
void key_chk()
{
flag_p -> key_flag = 0;
// 디버깅 용
//Serial.println(valu_p -> key, HEX);
//Serial.println(valu_p -> key, BIN);
switch( valu_p -> key)
{
case 0x38: // sw1 = UP CNt
valu_p -> cnt_bak = valu_p -> cnt++;
break;
case 0x34: // sw2 = DN CNt
valu_p -> cnt_bak = valu_p -> cnt--;
break;
case 0x2c: // sw3 // 짝수 cnt
valu_p -> cnt++;
if((valu_p -> cnt % 2) == 0) valu_p -> cnt_bak = (*valu_p).cnt;
break;
case 0x1c: // sw4 // 홀수 cnt
// 홀수 cnt
valu_p -> cnt++;
if((valu_p -> cnt % 2) == 1) valu_p -> cnt_bak = (*valu_p).cnt;
break;
}
Serial.println(valu_p -> cnt_bak);
}
void loop()
{
valu_p -> key = key_rd();
if(flag_p -> key_flag == 1) key_chk();
/*
// 실습 1 폴링방식 Bit IN
if(!bit_chk(PIND, sw1))//digitalRead(sw1) == 0)//digitalRead(sw1) == 0)
{
Serial.println("Sw1");
// 방법2 = Timer IRQ
while(!bit_chk(PIND, sw1){}//digitalRead(sw1) == 0){}
valu_p -> cnt_bak = valu_p -> cnt++;
// 방법1
//while(digitalRead(sw1) == 0){fnd_dis_A_4(valu_p -> cnt); _delay_ms(1);}
}
else if(!bit_chk(PIND, sw2))//digitalRead(sw2) == 0)
{
Serial.println("Sw2");
// 방법2 = Timer IRQ
while(!bit_chk(PIND, sw1)){}//digitalRead(sw2) == 0){}
valu_p -> cnt_bak = valu_p -> cnt--;
// 방법1
//while(digitalRead(sw2) == 0){fnd_dis_A_4(valu_p -> cnt); _delay_ms(1); }
}
else if(!bit_chk(PIND, sw1))//d_in(sw3) == 0)
{
Serial.println("Sw3");
// 방법2 = Timer IRQ
while(!bit_chk(PIND, sw1)){}//digitalRead(sw3) == 0){}
// 짝수 cnt
valu_p -> cnt++;
if((valu_p -> cnt % 2) == 0) valu_p -> cnt_bak = (*valu_p).cnt;
// 방법1
//while(digitalRead(sw3) == 0){fnd_dis_A_4(valu_p -> cnt); _delay_ms(1);}
}
else if(!bit_chk(PIND, sw1))//d_in(sw4) == 0)
{
Serial.println("Sw4");
// 방법2 = Timer IRQ
while(!bit_chk(PIND, sw1)){}//digitalRead(sw4) == 0){}
// 홀수 cnt
valu_p -> cnt++;
if((valu_p -> cnt % 2) == 1) valu_p -> cnt_bak = (*valu_p).cnt;
// 방법1
//while(digitalRead(sw4) == 0){fnd_dis_A_4(valu_p -> cnt); _delay_ms(1);}
}
// 방법2에서는 아래 코드를 주석처리 합니다. = Timer IRQ방식
//_delay_ms(1);
//fnd_dis_A_4(valu_p -> cnt);
*/
//Serial.println(valu_p -> cnt/1000);
//_delay_ms(500);
}
//Prj Lib