[반도체 개요]
반도체란?
반도체 8대 공정
[C언어 개요]
프로그래밍 언어
▶Low쪽으로 갈 수록 컴퓨터가, High쪽으로 갈 수록 인간이 알기 쉽다.
1) Low level
- 기계어 : 2진 cpu 명령어
- 어셈블리어 : 기계어와 1:1로 대응되는 니모닉 기호
cf) 니모닉 기호 : 사람이 알아보기 쉬운 문자로 된 기호
2) High level
- C, C++, Java, Python
- CPU 종류나 하드웨어의 특성에 얽매이지 않는 프로그램을 작성
- C++ : c언어+객체지향프로그래밍+제네릭프로그래밍
C언어란?
- 원하는 결과를 얻어내기 위한 프로그램 작성 시, 필요한 일종의 언어
- 유닉스 운영 체제하에서 시스템 프로그래밍을 위해 개발된 언어
- 구조적이며 강력한 기능 및 빠른 속도를 가진다.
- 절차 지향 프로그래밍 언어이므로, 작성한 순서대로 작동한다.
C 프로그램 개발 과정
1) 소스 파일 작성
2) 컴파일
: 소스 파일을 기계어 파일로 만드는 과정
< 전처리기 → 구문분석 → 코드생성 → 링크 >
① 전처리기 : 소스파일을 컴파일하기위한 준비
② 구문분석 : 소스가 문법에 맞는지 검사(컴파일에러 체크)
③ 코드생성 : 각 소스마다 별개의 오브젝트 코드 생성
④ 링크 : 여러 개의 오브젝트 파일과 라이브러리, 시동 코드 등을
하나로 합쳐 실행파일 생성(문제 발생 시, 링크에러 생성)
3) 실행
- 링크 결과 생성된 실행 파일을 실행하여 올바른 결과를
얻을 수 있는 지 체크(문제 발생 시, 실행 에러 생성)
- 디버깅
: 프로그램 실행 흐름이 올바르게 진행되는지 등을
확인하고 에러를 고치는 과정.
[Visual studio setting]
1. 프로젝트 생성
2. 소스 파일 생성
3. 기본 세팅
[C언어 문법]
1. 기본 요소 및 구조
#include <stdio.h>
int main() {
printf("Hello world ! \n"); // C언어의 국룰
return 0;
}
<기본 요소>
1) #include <stdio.h>
: stdio는 standard input/output의 약자로, 표준 입출력 헤더 파일 모음을 의미
2) int main()
- int : integer의 약자로, 정수형을 뜻한다.
- main() : 함수의 시작을 알리는 요소
3) {}
: block을 의미한다.(begin-end와 같은 기능)
3) ;(세미 콜론)
: 문장의 끝을 알리는 표현
4) return 0
- 0을 운영체제에 반환한다는 의미
- 0을 반환함으로써 컴퓨터에게 실행되었던 프로그램이 무사히 종료되었음을 알림.
<기본 구조>
1) C 프로그램의 기본 단위는 함수이다.
- C언어로 구현되는 모든 프로그램은 반드시 main() 함수를 포함해야 한다.
- C 프로그램이 실행되면, 컴퓨터는 가장 먼저 main() 함수를 찾아서 호출한다.
2) 함수 내의 각 명령문은 ;(세미콜론)으로 끝나야 한다.
- 명령문 : 함수의 기능을 정의하는 문장
3) C 언어는 대소문자를 구분한다.
- 변수나 함수 명을 작성할 때 또는 키워드나 예약어를 사용할 때,
대소문자를 정확히 구분하여 사용할 것.
4) C언어는 자유형식(Free-format)을 허용한다.
- 문법에만 맞으면 여러 개의 명령문을 한 줄에도 쓸 수 있고,
하나의 명령문을 여러 줄에 나눠쓸 수도 있다.
- 되도록이면 가독성을 최대화하여 작성하도록 할 것.
<C system>
1) 구문
: 프로그램 규칙
2) 컴파일러
: C 프로그램이 구문에 맞는지 검사, 오류가 있다면 오류 메세지 출력
3) 컴파일 과정
: C프로그램 → 토큰으로 분리 → 토큰을 목적 코드로 변환
4) 토큰의 종류
: 키워드, 식별자, 상수, 문자열 상수, 연산자 등
- 키워드
: C 언어에서 고유한 의미를 가지는 토큰, 예약어
ex) if, int, long, register 등
- 식별자
: 사용자가 작성한 고유 명사(함수명, 변수명)
2. 전처리기
: 컴파일 하기 전, 소스 파일을 처리하는 컴파일러의 한 부분
<전처리기 지시어>
지시어 | 의미 |
#include | 파일 포함 |
#define | 매크로 정의 |
#undef | 매크로 정의 해제 |
#if | 조건이 참일 경우, |
#else | 조건이 거짓일 경우, |
#endif | 조건 처리 문장 종료 |
#ifdef | 매크로가 정의되어 있는 경우 |
#ifndef | 매크로가 정의되어 있지 않은 경우 |
#line | 행번호 출력 |
#pragma | 시스템에 따라 의미가 틀림 |
<#include>
// include 예시 //
#include <stdio.h> /// 컴파일러의 지정된 폴더에서 찾음
#include "abc.h" /// 현재 프로젝트 폴더 내에서 찾음
#include "C:\test\abc.h" /// 해당 드라이브 경로 내에서 찾음
#include "..\abc.h" /// 현재 소스 파일의 상위 폴더 내에서 찾음
<#define>
// define 예시 //
#include <stdio.h>
#define AMOUNT 10
#define NAME "사과"
int main(){
printf("%s %d \n", NAME, AMOUNT);
return 0;
}
// 이렇게도 코딩 가능 //
#include <stdio.h>
#define AMOUNT 10
#define NAME "사과"
#define OUTPUT printf("%s %d \n", NAME, AMOUNT)
int main() {
OUTPUT;
return 0;
}
// 계산도 가능함 //
#include <stdio.h>
#define CALC(x,y) ((x)*(y))
int main(){
printf("%d \n", CALC(2,4));
return 0;
}
<#if, #ifdef 등>
// #if #else #endif //
#if (조건1)
실행문(조건1 참)
#else if (조건2)
실행문(조건1 거짓, 조건2 참)
else
실행문(조건1, 조건2 거짓)
#endif
// #ifdef //
#ifdef 매크로 이름(#define NUM 10)
실행문(매크로가 정의되어 있을 때)
#else 실행문(매크로 정의x)
#endif // 열었으면 꼭 닫아줄 것!
수업 중 메모(정리 안 됨)
#include <stdio.h>
//// 전처리기, 표준 입출력 헤더파일들 모음
//// standard input/output 입출력에 관한 모든 것들이 들어 있다.
#include <stdint.h>
#define MAX 20 /// "앞으로 MAX는 20이야." 라고 정의해두는 것.
/// c언어는 대소문자를 가린다(A와 a는 서로 다른 단어)
#include <stdio.h> // 컴파일러에 지정된 폴더에서 찾음.
#include " abc.h" // 현재 프로젝트 폴더 내에서 찾음. 우리가 만들어준 헤더파일 만들 때는 ""
#include "C:\test\abc.h" // 해당 경로에서 찾음.
#include "..\abc.h" // 상위 폴더에서 찾음.
// ..\ : 상위 폴더를 의미
// 주석처리 : ctrl k ---> ctrl c
// 주석해제 : ctrl k ---> ctrl u
// 여기에 메인 함수의 설명을 쓴다.
// 슬래시 3개 치면, 아래와 같이 뜬다.--> 간략하게 서머리 기록 가능.
/// <summary>
/// 메인 함수의 내용이다.
/// </summary>
/// <returns></returns>
int main() /// int : 정수형의 약자
/// main 함수는 반드시 있어야 한다.
/// 절차적 프로그램 : 순서대로 실행된다.
{
double /// 예약어
a;
printf("Hello World ! \n\n\n\n"); /// printf : stdio 중 출력 함수, \n : 다음 라인을 만들어주는 것
printf("Hello World1 ! \n");
return 0; /// 정수값을 반환시키는 함수
/// 프로그램이 잘 실행됐어! 라는 걸 전달해주는 함수.
/// {} : 블럭을 의미(begin-end와 같다.)
/// ; : 문장의 끝을 의미.
}
//// 디버그할 때는 2가지가 있다.(디버그 후 실행, 디버그없이 실행)
// : 한 줄 주석처리
/* 여러 줄
*
*주석 처리
*/
// "" : 문자열로 취급
// '' : 문자로 취급
int add(int a, int b) { /// add라는 함수를 만듦(함수명은 알파벳 또는 숫자만 가능), 예약어들과 겹치지 않도록 할 것.
int a = 1;
int b = 2;
if (a > 0) { /// () 내부의 값이 참일 경우, 아래 문장 실행
a = 4; /// c언어에서의 같다(=) : ==
/// =는 대입연산자(좌변에 우변의 값을 넣어라)
}
else if (b > 0) {
b = 5;
}
else {
a = b = 0;
}
return a+b;
}
//include : 하일 포함ㅇㅇ
3. 내장 매크로
내장 매크로 | 설명 |
__DATE__ | 현재 소스 파일이 마지막으로 수정되어 컴파일된 날짜로 치환 |
__TIME__ | 현재 소스 파일이 마지막으로 수정되어 컴파일된 시간으로 치환 |
__TIMESTAMP__ | 현재 소스 파일이 마지막으로 수정되어 컴파일된 날짜, 시간으로 치환 |
__LINE__ | 현재 매크로가 호출된 라인 번호을 정수형으로 치환 |
__FUNCTION__ | 현재 매크로가 호출된 함수명으로 치환 |
__FILE__ | 현재 소스파일의 경로로 치환 |
#include <stdio.h>
// 내장 매크로 //
// : 이미 정의된 매크로
void fun();
int main()
{
printf("컴파일 날짜 : %s \n", __DATE__); // 마지막으로 컴파일된 날짜로 치환
printf("컴파일 시간 : %s \n", __TIME__); // 시간
printf("컴파일 요일 : %s \n", __TIMESTAMP__); // 날짜, 시간 --> 문자열
printf("라인 번호 : %d \n", __LINE__); // 현재 매크로가 호출된 라인 번로를 정수형으로 치환
fun(); // 사용자 정의 함수
printf("현재 소스 파일 위치 : %s \n", __FUNCTION__); // 현재 매크로가 호출된 함수명으로 치환
return 0;
}
void fun()
{
printf("현재 함수 : %s \n", __FUNCTION__);
}
※ 모든 함수는 메인함수보다 먼저 정의되어야 한다.
4. 서식 지정자
서식문자 | 출력대상(자료형) | 출력형태 |
%d | char, short, int | 부호있는 10진수 정수 |
%ld | long | 부호있는 10진수 정수 |
%lld | long long | 부호있는 10진수 정수 |
%u | unsigned int | 부호없는 10진수 정수 |
%o | unsigned int | 부호없는 8진수 정수 |
%x, %X | unsigned int | 부호없는 16진수 정수 |
%f | float, double | 10진수 방식의 부동소수점 실수 |
%lf | long double | 10진수 방식의 부동소수점 실수 |
%e, %E | float, double | e 또는 E 방식의 부동소수점 실수 |
%g, %G | float, double | 값에 따라 %f와 %e 사이에서 선택 |
%c | char, short, int | 값에 대응하는 문자 |
%s | char * | 문자열 |
%p | void | 포인터의 주소값 |
""서식 지정자의 갯수와 출력할 값의 갯수가 일치해야 한다.""
// 서식지정자 활용 //
#include <stdio.h>
int main() {
int num; // 정수형
float x; // 실수형
char c; // 문자형(사용자 정의형 데이터)
num = 123;
x = 1.23;
c = 'A'; // '' : 문자
// "" : 문자열
printf("%d %x \n", num, num); // 10진수, 16진수
printf("%f %e \n", x, x); // 부동 소수점
printf("%c \n", c); // 문자
printf("%x \n", num); // 소문자
printf("%X \n", num); // 대문자
printf("%#x \n", num); // #소문자(16진수로 0x를 접두어로 붙여 출력)
printf("%#X \n", num); // #대문자
return 0;
}
#include <stdio.h>
// 문자 폭 지정 //
int main()
{
int num = 12345;
printf("%d \n", num);
printf("%d \n", num*10);
printf("%d \n", num*100);
printf("%8d \n", num); // 폭을 설정하기 위해 자릿수 지정
printf("%8d \n", num * 10);
printf("%8d \n", num * 100);
printf("%8d \n", num * 10000);
printf("%08d \n", num * 100); /// 빈 칸에 0을 채움
return 0;
}
#include <stdio.h>
// 정밀도 지정 //
int main()
{
float x = 12.34567;
// float = x;
//x = 12.34567; 이렇게 두 줄로 써줘도 된다.
printf("%f \n", x); // 폭과 정밀도 지정 안 함
printf("%.2f \n", x); // 정밀도 지정(소수점 2째 자리까지)
printf("%8.2f \n", x); // 폭과 정밀도 지정
return 0;
}
5. scanf 함수의 형식 문자열
서식지정자 | 의미 | 예시 |
%d | 정수를 10진수로 입력 | int num; scanf("%d", &num); |
%x | 정수를 16진수로 입력 | int num; scanf("%x", &num); |
%i | 정수를 10진수, 8진수, 16진수로 입력 (012는 8진수, 0x12는 16진수) |
int num; scanf("%i", &num); |
%f | float 형 실수 입력 | float x; scanf("%f", &x); |
%lf | double형 실수 입력 | float x; scanf("%lf", &x); |
%c | 문자 입력 | char ch; scanf("%c", &ch); |
%s | 문자열 입력 | char name[20]; scanf("%s", &name); |
※ C4996 Warnings
▶2005년 이후 버전부터 scanf', 'fopen', 'strcpy' 사용 시, 해당 오류 출력됨.
1. 이유
: scanf가 받을 수 있는 입력 데이터 크기를 넘어선 데이터가 입력 시, 초과된 데이터가 다른 메모리로 침범하여 오류 발생
secure모드인 scanf_s가 있지만, 호환성 문제가 많으며 버퍼를 설정해 메모리를 직접 지정해 줘야하는 불편함이 있다.
2. 해결법
① 맨 윗줄에 #define _CRT_SECURE_NO_WARNINGS 전처리
② option-전처리기-전처리기 정의에서 편집을 눌러 _CRT_SECURE_NO_WARNINGS를 입력하여 설정
③ scanf_s를 쓰거나,(Visual Studio에서만)
④ #pragma warning(disable:4996) 요구문을 추가해 경고가 안뜨게 하면 된다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char name[20]; // 이름 배열
int age; // 나이
char gender; // 성별 M, F
printf("이름, 나이, 성별(M/F) 순으로 입력하세요. \n");
scanf("%s %d %c", name, &age, &gender); // s : 문장, d : 정수, c : 한 문자
// scanf : 치는 것을 받아들이겠다.
// 배열 제외, 앞에 &를 붙여줘야한다.
printf("나이 : %d \n", age);
printf("성별 : %c \n", gender);
printf("이름 : %s \n", name);
return 0;
}
<C언어 제어 문자>
제어 문자 표기 | 제어 문자 이름 | 의미 |
\0 | 널문자 | 문자열의 끝을 표시 |
\a | alert, 경고 | "삐" 경고음 발생 |
\b | back space | 커서를 현재 위치에서 한 글자 뒤로 옮김 |
\t | horizontal tab | 커서의 위치를 현재 라인에서 설정된 다음 탭 위치로 옮김 |
\n | new line | 커서를 다음 라인의 시작 위치로 옮김 |
\v | vertical tab | 설정되어 있는 다음 수직탭 위치로 옮김 |
\f | form feed | 주로 프린터에서 강제적으로 다음 페이지로 넘김 |
\r | carriage return | 커서를 현재 라인의 시작 위치로 옮김 |
\" | double quotation | " |
\' | single quotation | ' |
\\ | back slash | \ |
6. 자료형의 크기
<sizeof 연산자>
#include <stdio.h>
// sizeof(연산자)를 활용하여 데이터의 크기를 구해보자. //
int main()
{
char ch; // 데이터형과 변수명 선언
int num;
double x;
printf("char형의 바이트 크기 : %d \n", sizeof(char)); // 우리가 알고 싶어 하는 변수의 바이트 크기를 반환해준다.
printf("short형의 바이트 크기 : %d \n", sizeof(short));
printf("long형의 바이트 크기 : %d \n", sizeof(long));
printf("long long형의 바이트 크기 : %d \n", sizeof(long long));
printf("float형의 바이트 크기 : %d \n", sizeof(float));
printf("double형의 바이트 크기 : %d \n", sizeof(double));
printf("long double형의 바이트 크기 : %d \n", sizeof(long double));
printf("변수 ch의 바이트 크기 : %d \n", sizeof(ch));
printf("변수 num의 바이트 크기 : %d \n", sizeof(num));
printf("변수 x의 바이트 크기 : %d \n", sizeof(x));
return 0;
}
7. 변수 선언 규칙
: 변수를 선언하려면, 데이터 타입과 이름이 필요하다.
ex) int(데이터 타입) amount_apple(변수명);
- 반드시 영문자, 숫자, 언더바(_)만 사용 가능
- 첫 글짜는 반드시 영문자 또는 언더바
- 대소문자 구분 필수
- C언어 키워드는 변수명으로 사용 불가
8. 코딩 명명법
// 카멜 표기법 : 소문자로 시작, 다음 문자는 대문자부터
int manAge;
int womanAge;
int peopleAgeMan;
// 파스칼 표기법 : 모든 단어가 대문자로 시작
int ManAge;
int WomanAge;
// 스네이크표기법 : _를 활용하여 단어 사이를 구분
int man_age
// 헝가리안표기법 : 데이터 타입의 약자를 변수명 앞에 소문자로 적어준다.
String strName;
char ch1;
byte bAge;
// 굳이 지킬 필요는 없고, 그저 하나의 가이드
// 결과가 같다면, 틀린 코딩은 없다. 효율/비효율의 문제
9. 변수의 초기화
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
// 변수의 초기화
// 변수를 선언할 시, 초기화되지 않은 변수의 값은 쓰레기값.
int main() {
int price; // 변수를 선언, 아직 초기화는 안 한 상태
price = 100; // 변수의 초기화
printf("%d \n", price); // 초기화 안 하면, 4byte의 임의의 값을 넣어줌
return 0;
}
어떤 값으로 초기화해야될 지 모르겠으면, 0으로 초기화하는 것이 일반적이다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
// 변수의 초기화
// 변수를 선언할 시, 초기화되지 않은 변수의 값은 쓰레기값.
int main() {
int amount = 0; // 변수 선언
int price = 0;
int total_price = 0;
// int amount, price, total_amount;
// amount = price = total_price = 0; 이렇게도 변수 선언 및 초기화 가능
printf("amount : %d, price : %d \n", amount, price);
printf("수량? \n");
scanf("% d", &amount); // &amount : amount가 차지하고 있는 주소값을 의미
price = 2000;
total_price = amount * price;
printf("합계 : %d 원 \n", total_price);
return 0;
}
10. 연산자
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int n = 1; // 0000_0000_0000_0000_0000_0000_0000_0001
int r1 = n << 1; // 0000_0000_0000_0000_0000_0000_0000_0010
int r2 = n << 2; // 0000_0000_0000_0000_0000_0000_0000_0100
int r3 = n << 3; // 0000_0000_0000_0000_0000_0000_0000_1000
int r4 = n << 4; // 0000_0000_0000_0000_0000_0000_0001_0000
printf("결과 1 : %d \n", r1);
printf("결과 2 : %d \n", r2);
printf("결과 3 : %d \n", r3);
printf("결과 4 : %d \n", r4);
return 0;
}
하나 시프트할 때마다, 2배씩 올라간다 → 시프트 연산자를 활용하여 곱셈을 한다.
C언어에는 감/가산기만 존재하며,
곱셈과 나눗셈은 감/가산기를 활용해서 만든다.
→ 100 ÷ 3 : 3을 몫만큼 빼준다.
→ 100 × 3 : 3을 100번 더한다.
11. Overflow
: 변수가 표현할 수 있는 최대 범위를 넘어가는 현상
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
char a;
a = 127;
printf("%d \n", a);
a = 128;
printf("%d \n", a);
return 0;
}
12. Bitmask
1) 특정 bit만 clear(0으로 변환)
: 1을 clear를 원하는 bit(k)만큼 시프트 후, AND 연산
a &= ~(1<<k)
0b11101일 때, 3번째 값을 삭제(0으로 변경) ==> 결과 : 0b10101
11101 & ~(1 << 3) 으로 표현
==> 0b00001 << 3
==> 0b01000
==> ~ 시키면 0b10111
11101
& 10111
--------
10101
2) 특정 bit만 set(1로 변환)
: 1을 set을 원하는 bit(k)만큼 시프트 후, OR 연산
a |= (1<<k)
0b10101일 때, 3번째 값을 추가(1로 변경) ==> 결과 : 0b11101
10101 | 1 << 3 으로 표현
==> 0b00001을 왼쪽으로 3번
==> 0b01000
10101
| 01000
--------
11101
3) 특정 bit만 toggle(비트 반전)
: 1을 toggle을 원하는 bit(k)만큼 시프트 후, XOR 연산
a ^= (1<<k)
0b10101 일 때 3번째 값 토글 ( 0 -> 1 )
10101 ^ (1 << 3) 으로 표현
==> 0b00001 << 3
==> 0b01000
10101
^ 01000
--------
11101 ==> 3번째 값이 바뀜
4) k번째 값 조회
: 1을 조회를 원하는 bit(k)만큼 시프트 후, AND 연산
a &=(1<<k)
0b10101 일 때 3번째 값?
10101 & (1 << 3) 으로 표현
==> 0b00001 << 3
==> 0b01000
10101
& 01000
--------
00000 ==> 3번째가 0 이다 : 0이 아니면 무조건 1 이다
cf) 위 네 가지는 임베디드에서 자주 사용됨(함수로 만들어 놓고 쓰면 좋다.)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
unsigned short data = 0x5678; // 0101 0110 0111 1000
unsigned short msk1 = 0xf000; // 1111 0000 0000 0000
unsigned short msk2 = 0x0f00; // 0000 1111 0000 0000
unsigned short msk3 = 0x00f0; // 0000 0000 1111 0000
unsigned short msk4 = 0x000f; // 0000 0000 0000 1111
printf("결과1 = %#.4x \n", data & msk1); // & 연산을 활용하여 각 bit를 뽑아낼 수 있다.
printf("결과2 = %#.4x \n", data & msk2);
printf("결과3 = %#.4x \n", data & msk3);
printf("결과4 = %#.4x \n", data & msk4);
return 0;
}
#include <stdio.h>
int main() {
//unsigned short data = 0x5678; // 0101 0110 0111 1000
unsigned short data = 0xf000; // 0000 0000 0000 0000
unsigned short msk1 = 0xf000; // 1111 0000 0000 0000
unsigned short msk2 = 0x0f00; // 0000 1111 0000 0000
unsigned short msk3 = 0x00f0; // 0000 0000 1111 0000
unsigned short msk4 = 0x000f; // 0000 0000 0000 1111
printf("결과1 = %#.4x \n", data | msk1); // | 연산을 활용하면, f만 뽑힌다.
printf("결과2 = %#.4x \n", data | msk2);
printf("결과3 = %#.4x \n", data | msk3);
printf("결과4 = %#.4x \n", data | msk4);
return 0;
}
13. 형변환
정수형끼리의 연산을 하게되면, 결과도 정수로 출력되어야 한다.
따라서 연산 결과를 실수로 얻고 싶다면, 형변환을 활용하면 된다.
int main() {
int a, b, c;
double average;
printf("정수 3개를 입력하시오 : ");
scanf("%d %d %d", &a, &b, &c);
average = (a + b + c) / 3;
printf("평균 : %d \n", average);
return 0;
}
나누어 떨어지지 않으므로 평균이 0으로 출력됨.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
// 묵시적 형변환 //
int main() {
int a, b, c;
double average;
printf("정수 3개를 입력하시오 : ");
scanf("%d %d %d", &a, &b, &c);
average = (double)(a + b + c) / 3; // int값이지만, double로 변경해준다.
// 얘만 묵시적으로 형변환시켜준다.
printf("평균 : %f \n", average); // d → f 로 바꿔줌.
return 0;
}
'# Semiconductor > - Semicon Academy' 카테고리의 다른 글
[Harman 세미콘 아카데미] 13일차 - C언어 문법(조건문, 반복문, 함수) (0) | 2023.07.05 |
---|---|
[Harman 세미콘 아카데미] 12일차 - Review, 디지털 시계 만들기(교육 과정 외) (0) | 2023.07.04 |
[Harman 세미콘 아카데미] 10일차 - Register, Memory (0) | 2023.06.30 |
[Harman 세미콘 아카데미] 9일차 - Counter 활용(parameter, bin_to_dec, TFF, edge_detector, debouncing) (0) | 2023.06.29 |
[Harman 세미콘 아카데미] 8일차 - review, async/sync counter (0) | 2023.06.28 |