|
#include <MsTimer2.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(A1, A0); // A1 = rx, A0 = tx
// fnd
#define fnd_d A0
#define fnd_clk A1
#define fnd_latch A2
unsigned char key_buf = 0;
char scan = 0;
char key_flag = 0;
char key_code = 0;
char d_buf[30];
int code = 1234;
char fnd_scan = 0;
void setup() {
// put your setup code here, to run once:
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
// fnd out
pinMode(fnd_d, OUTPUT);
pinMode(fnd_clk, OUTPUT);
pinMode(fnd_latch, OUTPUT);
digitalWrite(4, 1);
digitalWrite(5, 1);
digitalWrite(6, 1);
digitalWrite(7, 1);
MsTimer2::set(100, key_irq);
MsTimer2::set(5, fnd_irq);
MsTimer2::start();
Serial.begin(9600);
}
void fnd_irq()
{
fnd_scan++;
fnd_595_out(fnd_scan,code);
if(fnd_scan > 4) fnd_scan = 1;
}
int key_chk()
{
key_flag = 0;
(key_buf == 126) ? key_code = 1, Serial.println('1') : // 7e
(key_buf == 125) ? key_code = 2, Serial.println('2') : // 7d
(key_buf == 123) ? key_code = 3, Serial.println('3') : // 7b
(key_buf == 119) ? key_code = 4, Serial.println('4') : // 77
(key_buf == 190) ? key_code = 5, Serial.println('5') : //be
(key_buf == 189) ? key_code = 6, Serial.println('6') : //bd
(key_buf == 187) ? key_code = 7, Serial.println('7') : //bb
(key_buf == 183) ? key_code = 8, Serial.println('8') : //b7
(key_buf == 222) ? key_code = 9, Serial.println('9') : //de
(key_buf == 221) ? key_code = 10, Serial.println("10") : //dd
(key_buf == 219) ? key_code = 11, Serial.println("11") : //db
(key_buf == 215) ? key_code = 12, Serial.println("12") : // d7
(key_buf == 0xee) ? key_code = 13, Serial.println("13") : //ee =238
(key_buf == 0xed) ? key_code = 14, Serial.println("14") : //ed =237
(key_buf == 0xeb) ? key_code = 15, Serial.println("15") : // eb =235
(key_buf == 0xe7) ? key_code = 16, Serial.println("16") : 0; //e7 =231
return key_code;
}
void key_irq(){
char old_key;
for(int k = 4; k <= 7; k++){
digitalWrite(k, LOW);
key_buf = (PINB & 0x0f);// B구역의 핀 중에 앞 4개 핀만 사용
if(key_buf != 0x0f){
if(k == 4) key_buf |= 0xe0;
else if(k == 5) key_buf |= 0xd0;
else if(k == 6) key_buf |= 0xb0;
else if(k == 7) key_buf |= 0x70;
Serial.println(key_buf);
key_flag = 1;
// 채터링방지
old_key = key_buf;
while(old_key != 0x0f){
old_key = (PINB & 0x0f);
fnd_irq();
}
}
digitalWrite(k, HIGH);
if(key_flag == 1) code = key_chk();
fnd_irq();
}
}
void loop() {
Serail.println(code);
_delay_ms(300);
// scan++;
// if(scan > 4) scan = 1;
// fnd_595_out(scan, key_code);
// Serial.println("Test2");
// char old_key;
// for(int k = 4; k <= 7; k++){
// digitalWrite(k, LOW);
// key_buf = (PINB & 0x0f);// B구역의 핀 중에 앞 4개 핀만 사용
// if(key_buf != 0x0f){
// if(k == 4) key_buf |= 0xe0;
// else if(k == 5) key_buf |= 0xd0;
// else if(k == 6) key_buf |= 0xb0;
// else if(k == 7) key_buf |= 0x70;
// Serial.println(key_buf);
// key_flag = 1;
// // 채터링방지
// old_key = key_buf;
// while(old_key != 0x0f){
// old_key = (PINB & 0x0f);
// }
// //delay(200);//채터링방지 단순지연
// }
// digitalWrite(k, HIGH);
// if(key_flag == 1) key_chk();
// }
}
//======================================================
// FND LIB
#ifndef _my_fnd_lib_
#define _my_fnd_lib_
// Arduino 멀티펑션보드 FND 핀 신호 = 74hc595 사용 = 2022, 10, 18
#define S_data A0 // d8
#define S_clk A1
#define L_clk A2 //d4
// fnd scan define
#define x1000 8 // D8
#define x100 9
#define x10 10
#define x1 11 // d11
// fnd font data K-컴몬기준
const unsigned char fnd_font[] =
{
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, H, L, E, o, P, F,
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x76,0x38,0x79,0x5c,0x73,0x71,
// C, d, A, u, T, r, b, blk
0x39, 0x5e, 0x77, 0x1c, 0x44, 0x50, 0x7c, 0x00
};
// fnd maseg display
#define O 0x0d //o display
#define F 0x0f // F display
#define H 0x0a // H "
#define L 0x0b // L "
#define E 0x0c // E "
#define P 0x0e // P "
#define C 0x10 // C "
#define D 0x11 // d "
#define A 0x12 // A "
#define U 0x13 // u "
#define T 0x14 // t "
#define R 0x15 // r "
#define b 0x16 // b "
#define BLK 0x00 // fnd blk display
/*
#define bit_set(ADDRESS, BIT) (ADDRESS |= (1<<BIT)) // bit hi
#define bit_clr(ADDRESS, BIT) (ADDRESS &= ~(1<<BIT)) // bit low
#define bit_chk(ADDRESS, BIT) (ADDRESS & (1<<BIT)) // bit chak
#define tgi(PORT, BIT) (PORT ^= (1<<BIT)) //bit 토글
*/
// macro func
#define d_out(port, val) digitalWrite(port, val)
#define clk (d_out(S_clk, 1), d_out(S_clk, 0))
char scan_cnt = 0;
//char tg_flag = 0;
// Arduino 멀티펑션보드 FND display func
void fnd_dis_595(char scan, unsigned char data)
{
char i;
d_out(L_clk, 0); // Latch ds
// fnd display data out
for(i = 0; i <= 7; i++)
{
if((data & 0x80) == 0x80) d_out(S_data, 1);
else d_out(S_data, 0);
clk;
/*
d_out(S_clk, 1);
delayMicroseconds(2);
d_out(S_clk, 0);
*/
data <<= 1;
}
// fnd com = digit en 출력
for(i = 0; i <= 7; i++)
{
if((scan & 0x80) == 0x80) d_out(S_data, 1);
else d_out(S_data, 0);
clk;
/*
d_out(S_clk, 1);
delayMicroseconds(2);
d_out(S_clk, 0);
*/
scan <<= 1;
}
// Latch clk out
d_out(L_clk, 1);
}
void fnd_595_out(char scan_cnt, int data)
{
if(scan_cnt==1) fnd_dis_595(0x01, ~fnd_font[data/1000]); // x1000
else if(scan_cnt==2) fnd_dis_595(0x02, ~fnd_font[data%1000/100]); // x100 == ^ 0x80
else if(scan_cnt==3)
{
//if(tg_flag == 1) fnd_dis_595(0x04, ~fnd_font[data%100/10] & 0x7f);
//else fnd_dis_595(0x04, ~fnd_font[data%100/10] | 0x80);
fnd_dis_595(0x04, ~fnd_font[data%100/10]); // x10
}
else if(scan_cnt==4) fnd_dis_595(0x08, ~fnd_font[data%10]); // x1
}
/*
// time display fnd func
void fnd_dis_T(char t_min, char t_sec)
{
scan_cnt++;
if(scan_cnt > 4) scan_cnt = 1;
switch(scan_cnt)
{
case 1: //x1000
d_out(x1, 0); // x1 fnd off
PORTD = ~fnd_font[t_min/10];
d_out(x1000, 1); //x1000 on
break;
case 2: //x100
d_out(x1000, 0); // x1000 fnd off
PORTD = ~(fnd_font[t_min%10] | 0x80);
// dp 단자 표시방법
// PORTD = ~(fnd_font[t_min%10] | 0x80); // dp 단자 on시
// PORTD = ~(fnd_font[t_min%10] & 0x7f); // dp 단자 off시
// bit_Set(PORTD, 1);
// bit_clr(PORTD, 0);
// digitalWrite(7, 1);
// digitalWrite(7, 0);
d_out(x100, 1); // x100 on
break;
case 3: //x10
d_out(x100, 0); // x100 fnd off
PORTD = ~fnd_font[t_sec/10];
if(tg_flag == 1) digitalWrite(7, 0);
else digitalWrite(7, 1);
//if(tg_flag == 1) PORTD = (~(fnd_font[t_sec/10]) | 0x80); // on
//else PORTD = (~(fnd_font[t_sec/10]) & 0x7f); // off
d_out(x10, 1); // x10 on
break;
case 4: //x1
d_out(x10, 0); // x10 fnd off
PORTD = ~fnd_font[t_sec%10];
if(tg_flag == 0) digitalWrite(7, 0);
else digitalWrite(7, 1);
//if(tg_flag == 0) PORTD = (~(fnd_font[t_sec%10]) | 0x80); // on
// else PORTD = (~(fnd_font[t_sec%10]) & 0x7f);
d_out(x1, 1); // x1 on
break;
}
}
// fnd display func
// A컴몬 fnd 표시
void fnd_dis_A(int d_buf)
{
scan_cnt++;
if(scan_cnt > 4) scan_cnt = 1;
switch(scan_cnt)
{
case 1: //x1000
d_out(x1, 0); // x1 fnd off
PORTD = ~fnd_font[d_buf/1000];
d_out(x1000, 1); //x1000 on
break;
case 2: //x100
d_out(x1000, 0); // x1000 fnd off
PORTD = ~fnd_font[d_buf%1000/100];
d_out(x100, 1); // x100 on
break;
case 3: //x10
d_out(x100, 0); // x100 fnd off
PORTD = ~fnd_font[d_buf%100/10];
d_out(x10, 1); // x10 on
break;
case 4: //x1
d_out(x10, 0); // x10 fnd off
PORTD = ~fnd_font[d_buf%10];
d_out(x1, 1); // x1 on
break;
}
}
// // K컴몬 fnd 표시
void fnd_dis_K(int d_buf)
{
scan_cnt++;
if(scan_cnt > 4) scan_cnt = 1;
switch(scan_cnt)
{
case 1: //x1000
d_out(x1, 0); // x1 fnd off
PORTD = fnd_font[A];//d_buf/1000];
d_out(x1000, 1); //x1000 on
break;
case 2: //x100
d_out(x1000, 0); // x1000 fnd off
PORTD = fnd_font[b];//d_buf%1000/100];
d_out(x100, 1); // x100 on
break;
case 3: //x10
d_out(x100, 0); // x100 fnd off
PORTD = fnd_font[H];//d_buf%100/10];
d_out(x10, 1); // x10 on
break;
case 4: //x1
d_out(x10, 0); // x10 fnd off
PORTD = fnd_font[F];//d_buf%10];
d_out(x1, 1); // x1 on
break;
}
}
const unsigned char fnd_font_bar[] ={0x01,0x01,0x01,0x01, 0x02, 0x04, 0x08,0x08,0x08,0x08, 0x10, 0x20};
//fnd_font[] =부분에 추가
void fnd_dis_rot()
{
scan_cnt++;
delay(100);
if(scan_cnt > 13) scan_cnt = 1;
switch(scan_cnt)
{
case 1: //min x10
d_out(x1, 0); // x1 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1]; \
d_out(x1000, 1); //x1000 on
break;
case 2: //min x1
d_out(x1000, 0); // x1000 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x100, 1); // x100 on
break;
case 3: //sec x10
d_out(x100, 0); // x100 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x10, 1); // x10 on
break;
case 4: //sec x1
d_out(x10, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1 ];
d_out(x1, 1); // x1 on
break;
case 5: //sec x1
d_out(x10, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x1, 1); // x1 on
break;
case 6: //sec x1
d_out(x10, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x1, 1); // x1 on
break;
case 7: //sec x1
d_out(x10, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x1, 1); // x1 on
break;
case 8: //sec x1
d_out(x1, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x10, 1); // x1 on
break;
case 9: //sec x1
d_out(x10, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x100, 1); // x1 on
break;
case 10: //sec x1
d_out(x100, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x1000, 1); // x1 on
break;
case 11: //sec x1
d_out(x100, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x1000, 1); // x1 on
break;
case 12: //sec x1
d_out(x100, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x1000, 1); // x1 on
break;
case 13: //sec x1
d_out(x100, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x1000, 1); // x1 on
break;
}
}
*/
#endif
|