728x90

IR (명령 레지스터) : LCD 모듈 환경 설정

DR (데이터 레지스터) : LCD 모듈에 글자를 나타내기 위한 데이터 값 기록



LCD 컨트롤러 내부는 IR,DR과 문자를 표시하기 위해 사용되는 DDRAM, CGRAM, CGROM으로 구성



LCD 모듈은 보통 총 14핀 또는 16핀 구성 (16핀은 백라이트 구동을 위한 전원단자 2핀 추가)


1,2번 : LCD 모듈 구동전원 인가

3번 : LCD 표시장치 밝기 조절 (밝기 조절시 가변저항 연결, 필요없으면 GND 연결)


4-6 : LCD 제어 (RS, R/W, E) 

RS (4번) - 입력단자로서 LCD 모듈의 명령 또는 데이터 레지스터 선택

0이면 IR, 1이면 DR 선택


R/W (5번) - 데이터 또는 명령을 읽고, 쓰기할때 사용

0이면 쓰기 (CPU에서 LCD 모듈로 데이터 씀)

1이면 읽기 (LCD모듈에서 CPU로 데이터 읽음)


E (6번) - 활성화되어있으면 데이터 교환이 이루어짐

HIGH (1 입력) 일때 데이터 교환 가능, 0일때는 데이터 교환 불가능


7-14 : Data Bus (4비트 방식 제어시 11-14번만 이용됨)

마이크로 컨트롤러와 인터페이스를 할 경우에는 읽기 쓰기 타이밍을 고려해야 함(데이터 시트 타이밍도 참고)




IR (명령 레지스터)

: LCD의 제어에 필요한 명령 저장, 표시 데이터 DDRAM 위치주소와 문자발생기 CGRAM 위치 지정하기 위한 주소정보 저장


DR (데이터 레지스터)

: 화면에 표시할 데이터 또는 새로운 글꼴에 대한 데이터 임시 저장

데이터를 쓸 때는 IR에 의해 지정된 DDRAM 또는 CGRAM 주소로 데이터 전달

읽을때는, IR에 의해 지정된 DDRAM 또는 CGRAM 주소의 데이터가 마이크로 컨트롤러로 전달



제어 명령어는 데이터 시트를 참고

HY-1602W-204-LCD.pdf

케릭터 LCD 명령어 설명.pdf




비지 플래그 

: 연속적으로 LCD 모듈에 제어명령이 입력될 때, LCD 모듈이 이 명령을 처리할 수 있는가를 나타내는 상태 표시 플래그 

RS가 0 (IR), R/W가 1(읽기)일때 출력된다.


BF = 0 : LCD 모듈로 다음 명령을 쓸 수 있다.

BF = 1 : LCD 컨트롤러가 현재 IR로 입력된 명령어 처리하는 상태, 다음 제어 명령을 쓸수 없는 상태를 나타냄.








DDRAM (Display Data RAM)

화면에 표시할 8비트 문자를 저장 (표시되지 않는 영역의 RAM은 일반적 데이터 저장용 메모리로 사용가능)


CGROM (Character Generator ROM)

문자 패턴을 저장




 HY-1602W-204-LCD.pdf (CGROM에 저장된 내용은 데이터 시트 11p 참고)




CGRAM (Character Generator RAM)

사용자가 원하는 문자 패턴을 만들때 사용



화면 클리어

#define CLR    0x01 // 화면 전체 클리어 후, Return Home 명령


커서 홈

#define HOME  0x02 // 커서만 홈 위치로 보내는 명령


엔트리 모드 셋

: LCD 모듈에 데이터를 쓰기/읽기 수행할 경우 DDRAM주소 즉, 커서 위치를 오른쪽으로 증가 또는 왼쪽으로 감소시킬것인가를 결정하는 기능 수행

또한, 커서 위치는 변하지 않고 화면을 이동시킬지(shift) 결정



DB2 bit를 1로 설정 


1비트=I/D

I/D = 1일때 커서 또는 깜박임 위치가 우측 이동 (주소 +1)

I/D = 0일때 커서 또는 깜박임 위치가 좌측 이동 (주소 -1)


0비트=S    

S = 1, I/D=1일 때, 좌로 쉬프트

S = 1, I/D=0일 때, 우로 쉬프트

S = 0, 화면 쉬프트 되지 않음


* CGRAM도 같은 방법으로 적용



Display ON/OFF Control

: 화면의 ON/OFF, 커서의 ON/OFF, 커서위치에 있는 문자 점멸 등의 기능 설정

예) IR_Write(0x0E); // Display on/off DDRAM, 커서를 화면에 표시


* 더 자세한 명령어 설정은 데이터 시트 참고


커서 표시 시프트

: 커서의 위치 또는 표시할 데이터의 읽기 또는 쓰기없이 (DDRAM 내용 변경없이)

오른쪽/왼쪽으로 이동.


2줄을 표시할 경우 첫번째줄의 끝을 넘을 경우 두번째 줄 이동


* 첫번째줄과 두번째 줄이 동시 이동

데이터 쉬프트해도 두번째 줄 데이터는 첫번째 줄에 표시안됨

쉬프트 해도 AC는 변하지 않음



Function Set

: Function Set은 LCD를 사용하기 앞서 선행되어야 한다.

(busy flag와 어드레스 명령을 제외한 다른 명령이 실행되기전에 프로그램 앞 부분에 실행되어야 함)



DL : 인터페이스 길이

1이면 데이터 길이 8비트 설정

0이면 데이터 길이 4비트 설정 (DB7-DB4사용), 이 경우 두번에 나누어 먼저 상위 4비트 전송하고, 하위 4비트 전송해야 함


N : 표시줄의 숫자 (0이면 1줄, 1이면 2줄)


F : 문자 폰트 설정 (0이면 5x8, 1이면 5x10)




CGRAM, DDRAM 주소 설정



CGRAM에 새로운 문자를 만들고자 할 경우 IR레지스터의 DB6 비트를 1로 설정(AC는 주소로서 전달)


DDRAM에 주소를 설정한 후에 데이터를 송수신하려면 DB7 비트를 1로 설정

N=0이면 한개의 라인을 가지며, 7비트 (AC0-AC6)는 0x00~0x4F로 설정


N=1이면, 두개의 줄을 가지며

첫번째 줄의 주소는 0x00~0x27

두번째 줄의 주소는 0x40~0x67까지로 설정

'Study > Embedded' 카테고리의 다른 글

7/21 Atmega128 포트/ win32 api  (0) 2016.07.21
7/8 LCD제어2  (0) 2016.07.08
5/26 업무일지 PC PWM을 이용한 LED 밝기 조절  (0) 2016.05.26
2016-05-19 업무일지-Atmega2560_LCD출력  (0) 2016.05.19
2016-05-17 업무일지-7 segment  (0) 2016.05.17
728x90
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
 
//이름/국영수 점수 입력받고 이름/국영수점수/총점/평균/석차 출력
 
namespace SScore
{
    class Student
    {
        public string Name;
        public int Kor;
        public int Eng;
        public int Math;
 
        public int input(object[] arr, int Cnt)
        {
            //이곳에 이름, 국영수 점수 입력받고 총점과 평균을 구한다  
            Console.Write("이름 입력 : ");
            Name = Console.ReadLine();
 
            while (true)
            {
                Console.Write("첫번째 점수 : ");
                Kor = int.Parse(Console.ReadLine());
                if (Kor < 0 || Kor > 100)
                    continue//반복문을 리셋하세요(반복문의 처음 위치로 이동)
 
                ReInput://Label statement
                Console.Write("두번째 점수 : ");
                Eng = int.Parse(Console.ReadLine());
                if (Eng < 0 || Eng > 100)
                    goto ReInput;//지정된 label statement로 이동
                do
                {
                    Console.Write("세번째 점수 : ");
                    Math = int.Parse(Console.ReadLine());
                } while (Math < 0 || Math > 100);
 
                int Sum = Kor + Eng + Math;
                Double Avg = Sum / 3;
 
                arr[Cnt] = Name + "\t" + Kor + "\t" + Eng + "\t" + Math + "\t" + Sum + "\t" + Avg + "\t";
 
                return Sum;
            }
        }
 
        class Program
        {
            static void Exception(int arg)
            {
                if (arg < 2)
                    Console.WriteLine("arg : {0}", arg);
                else
                    throw new Exception("arg가 10보다 큽니다.");
            }
 
            static void Main(string[] args)
            {
                object[] arr = new object[20];
                int[] arr_sum = new int[20];
                int[] rank = new int[20];
 
                Student std = new Student();
 
                char select;
                int Cnt = 0;
 
                while (true)
                {
                    Console.WriteLine("=====================================학생 성적 관리 프로그램=====================================");
                    Console.WriteLine("1. 학생성적 입력 ");
                    Console.WriteLine("2. 학생성적 보기 ");
                    Console.WriteLine("Q. 프로그램 종료 ");
                    Console.WriteLine("=================================================================================================");
 
                    Console.Write(" 메뉴선택 ( 1,2 또는 Q 입력 ) : ");
                    try
                    {
                        select = char.Parse(Console.ReadLine());
 
                        if (select == '1')
                        {
                            arr_sum[Cnt] = std.input(arr, Cnt);
                            Cnt++;
                        }
                        else if (select == '2')
                        {
                            Console.WriteLine();
                            Console.WriteLine("==============종합결과===============");
                            Console.WriteLine("성명\t국어\t영어\t수학\t총점\t평균\t순위");
 
                            for (int i = 0; i < Cnt; i++)
                            {
                                rank[i] = 1;
                                for (int a = 0; a < Cnt; a++)
                                {
                                    if (arr_sum[i] < arr_sum[a])
                                    {
                                        rank[i]++;
                                    }
                                }
                                Console.WriteLine("{0}{1}", arr[i], rank[i]);
                            }
                            break;
                        }
                        else if (select == 'q')
                        {
                            Console.Write("프로그램이 종료됩니다.");
                            break;
                        }
                        else if (select == 'Q')
                        {
                            Console.Write("프로그램이 종료됩니다.");
                            break;
                        }
                    }
 
                    catch (Exception e)
                    {
                        Console.WriteLine("올바른 값을 입력하세요");
                    }
                }
            }
        }
    }
}


'Study > C#' 카테고리의 다른 글

c# 복습  (0) 2017.03.31
headfirst c#-wpf  (0) 2016.11.19
c# 클래스 복습2  (0) 2016.05.23
c# 스터디일지 -클래스  (0) 2016.05.22
2016-05-20-C#복습  (0) 2016.05.20
728x90

PC PWM을 이용한 LED 밝기 조절




WGMn2~0 비트에 의한 동작모드

모드1 : Phase Correct PWM / TOP(0xFF)


/************************************************
* PC PWM을 이용한 LED 밝기 조절 프로그램
* 2016년 5월 26일
************************************************/

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  unsigned char i, duty;

  //PWM 출력을 뽑을 GPIO설정(OC0A(PB7))
  DDRB=0xFF; // PB7 PWM 출력, PB 0~6 사용안함
  //Time / Counter0의 설정 (PC PWM 모드)
  TCCR0A = 0b10000001; // 0x81, 상향카운터 compare match 0, 하향 1로 set
  TCCR0B = 0x01; // 1분주

  while(1)
  {
    for(i=0, duty=0; i<6; i++, duty +=51)
    {
      OCR0A = duty;
      _delay_ms(500);
    }

  }
  return 0;
}




/************************************************
* PC PWM을 이용한 LED 밝기 조절 프로그램
* 2016년 5월 26일
************************************************/

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  unsigned char i, duty;

  //PWM 출력을 뽑을 GPIO설정(OC0A(PB7))
  DDRB=0xFF; // PB7 PWM 출력, PB 0~6 사용안함
  //Time / Counter0의 설정 (PC PWM 모드)
  TCCR0A = 0b10000001; // 0x81, 상향카운터 compare match 0, 하향 1로 set
  TCCR0B = 0x01; // 1분주

  while(1)
  {
    for(i=0, duty=0; i<6; i++, duty +=51)
    {
      OCR0A = duty;
      _delay_ms(500);
    }

  }
  return 0;
}




switch문으로 변경

/************************************************
* PC PWM을 사용한 DC 모터 속도 제어용 프로그램

* 속도 조절 단계 15단계, 출력 0C0A 또는 OC0B
* 입력 스위치 입력 2개(UP, Down)
* 최대 속도 도달시 UP키 동작 안함, 회전하지 않을 때 DN키 동작 안함.
************************************************/
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  unsigned char duty = 0;
  
  
  DDRB  =  0xFF;            

  DDRA  =  0xFC;    //0,1번 포트를 스위치 입력으로                      
  
  TCCR0A  =  0x81;    //OC0A를 출력으로 사용                
  TCCR0B  =  0x01;          

   while(1)
  {
    key = (PINA & 0x03)
    switch(key)
    {
      case 1:
        while(PINA & 0x01 );
        if(i < 15)
          i++;
        break;
      case 2:
        while(PINA & 0x02);
        if(i > 0)
          i--;
        break;
    }
    OCR0A = 17*i;
  }
  return 0;
}


'Study > Embedded' 카테고리의 다른 글

7/8 LCD제어2  (0) 2016.07.08
7/5 LCD 제어  (0) 2016.07.05
2016-05-19 업무일지-Atmega2560_LCD출력  (0) 2016.05.19
2016-05-17 업무일지-7 segment  (0) 2016.05.17
7 Segment 출력(proteus시뮬)  (0) 2016.05.16
728x90

기반 클래스와 파생클래스 사이의 형 변환



안전한 형변환을 위한 is, as 연산자


is 연산자

객체가 해당형식에 해당하는지 검사하여, 결과를 bool값으로 반환

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TypeCasting
{
    class TestClass { }
    class Program
    {
        static void Main(string[] args)
        {
            Object obj=1004;
            Object obj2 = "천사";
            Console.WriteLine(" {0} is string -> {1}", obj, obj is string);
            Console.WriteLine(" {0} is string -> {1}", obj2, obj2 is string);
            Console.WriteLine("");
        }
    }
}

Output : 

 1004 is string -> False

 천사 is string -> True


계속하려면 아무 키나 누르십시오 . . .



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;

namespace TypeCasting
{
    class TestClass { }
    class Program
    {
        static void Main(string[] args)
        {
            Object obj = "This is string";

            if (obj is int)
                Console.WriteLine("obj는 string");
            else // else문이 없으면 화면에 아무것도 출력되지 않고 실행됨
                Console.WriteLine("obj는 string이 아님");
        }
    }
}

Output : 

obj는 string이 아님

계속하려면 아무 키나 누르십시오 . . .



as 연산자

형변환 연산과 다른 점은 변환이 가능하지 않는 경우 예외를 발생하지 않고 null이 반환됨.

               as 연산자는 오직 참조 형식에 대해서만 사용 가능


즉, as 연산자는 as 뒤에 나오는 타입이 아니면 null을 반환.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TypeCasting
{
    class Program
    {
        static void Main(string[] args)
        {
            object obj1= "alpha";
            object obj2 = 273;
            object obj3 = 52.273;

            string alpha = (string)obj1;
            string beta = (string)obj2;
            string gamma = (string)obj3;

            Console.WriteLine("alpha : " + alpha);
            Console.WriteLine("beta : " + beta);
            Console.WriteLine("gamma : " + gamma);
        }
    }
}

Output :

위와 같이 강제 형 변환을 하게 되면 처리되지 않은 예외가 뜨면서 프로그램이 종료된다.



아래는 as연산자를 쓴 소스이다.  변환이 가능하지않은 A는 null을 반환하게 된다.

using System;

namespace TypeCasting
{
    class Program
    {
        static void Main(string[] args)
        {
            object obj1 = 1004;
            object obj2 ="STRING!";

            string A = obj1 as string;
            string B = obj2 as string;

            Console.WriteLine("(string아니면 null) A: " + A);
            Console.WriteLine("(string아니면 null) B: " + B);
        }
    }
}

Output :

(string아니면 null) A:

(string아니면 null) B: STRING!

계속하려면 아무 키나 누르십시오 . . .

'Study > C#' 카테고리의 다른 글

c# 복습  (0) 2017.03.31
headfirst c#-wpf  (0) 2016.11.19
5/27 업무일지 c#학생성적관리(콘솔)  (0) 2016.05.27
c# 스터디일지 -클래스  (0) 2016.05.22
2016-05-20-C#복습  (0) 2016.05.20
728x90

try~catch 문


try 블록과 각각 다른 예외의 처리기를 지정하는 하나 이상의 catch 절로 구성



아래의 소스는 실행시 에러와 함께 종료된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
 
namespace TryCatchText
{
    class Program
    {
        static void Main(string[] args)
        {
            int a, b, c;
            a = 10;
            b = 0;
            c = a / b;
            Console.WriteLine(c);
        }
    }
}
cs



실행시 에러가 뜨면서 프로그램 종료 



try~catch문을 통해 예외문구를 출력하게하고 비정상 종료를 막을 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
 
namespace TryCatchText
{
    class Program
    {
        static void Main(string[] args)
        {
            int a, b, c;
            a = 10;
            b = 0;
            try
            {
                c = a / b;
                Console.WriteLine(c);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}
cs


Output : 


0으로 나누려 했습니다.

계속하려면 아무 키나 누르십시오 . . .




c#에서의 접근 한정자

 public

 클래스의 내부/외부 모든 곳에서 접근 가능



 protected

 클래스의 외부에서는 접근할수 없지만, 파생 클래스에서는 접근 가능.

 private

 클래스의 내부에서만 접근가능.(파생클래스도 접근불가)



멤버에 접근 한정자가 명시되어 있지 않으면 암시적으로 private으로 지정된다.

아래는 protected접근자에 대한 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
 
namespace AccessModifier
{
    class WaterHeater
    {
        int a;
        protected int temperature;
 
        public void SetTemperature(int temperature)
        // 변수가 protected이므로 public메소드로 접근. 
        
        {
            if (temperature < -5 || temperature > 42// -5~42사이의 값을 받음
            {
                throw new Exception("Out of temperature range");
                // 값이 범위를 벗어나면 위의 Exception문구를 출력
            }
 
            this.temperature = temperature;
        }
 
        internal void TurnOnWater()
        {
            Console.WriteLine("Turn on water : {0}", temperature);
        }
    }
 
    class MainApp
    {
        static void Main(string[] args)
        {
            try
            {
                WaterHeater heater = new WaterHeater();
                heater.SetTemperature(20);
                heater.TurnOnWater();
 
                heater.SetTemperature(-2);
                heater.TurnOnWater();
 
                heater.SetTemperature(50);
                // try~catch문을 쓰지않으면 컴파일시 처리되지않은 예외가 뜸
                heater.TurnOnWater();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}
cs

Turn on water : 20
Turn on water : -2
Out of temperature range

실행결과 : http://ideone.com/CgGv4G



c#에서의 상속


상속(Inheritance)은 부모(기반) 클래스의 멤버를 자식(파생) 클래스가 물려받는것이다.


기반클래스 -> 파생클래스 또는 슈퍼클래스 -> 서브클래스

라고도 한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Base //기반 클래스
{
    //멤버 선언
 
    public void BaseMethod(){};
 }
 
class Derived : Base //기반 클래스 : 파생 클래스
{
    //기반 클래스의 모든 것을 상속 받음.
    //단, private으로 선언된 것 제외.
 
    public void DerivedMethod()
    {
        base.BaseMethod(); //base키워드를 통해 기반 클래스에 접근 가능.(this키워드는 자기 자신)
    }
}
cs


상속시 멤버의 접근 지정자는 아래와 같다. 

 - 기반클래스의 public 멤버는 파생클래스에서도 public

 - 기반클래스의 protected 멤버는 파생클래스에서도 protected

 - 기반클래스의 private은 상속 불가


아래는 상속을 활용한 예제이다. 

실제적으로는 파생클라스가 기반클래스의 개념들을 물려받아 더 넓은 개념을 가지게 된다.


(참고 예제 : http://rintiantta.blog.me/40113370865)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace food
{
    class Food
    {
        public void Maked()
        {
            Console.WriteLine("(만들어짐)");
        }
        public void Selled()
        {
            Console.WriteLine("(팔림)");
        }
        public void Eatted()
        {
            Console.WriteLine("(먹힘)");
        }
    }
 
    class Pizza : Food
    {
        public string TypeOfPizza;
    }
    class Chiecken : Food
    {
        public string TypeOfChicken;
    }
    class Program
    {
        static void Main(string[] args)
        {
            Pizza pizza = new Pizza();
            Chiecken chinnim = new Chiecken();
            
            pizza.TypeOfPizza = "포테이토 피자";
            Console.WriteLine("{0}", pizza.TypeOfPizza);
            pizza.Maked();
            pizza.Selled();
            pizza.Eatted();
 
            chinnim.TypeOfChicken = "갈릭 치킨";
            Console.WriteLine("{0}", chinnim.TypeOfChicken);
            chinnim.Maked();
            chinnim.Selled();
            chinnim.Eatted();
        }
    }
}
cs

Output : (http://ideone.com/fDrY8D)


포테이토 피자
(만들어짐)
(팔림)
(먹힘)
갈릭 치킨
(만들어짐)
(팔림)
(먹힘)


음식은 만들어지고 팔리고 먹힌다는 공통속성을 가지고 있다. 

위와같이 "상속"을 통해 기반 클래스의 코드를 재사용하거나, 자식 클래스에서 기반클래스를 바탕으로 클래스를 확장할 수 있다.



'Study > C#' 카테고리의 다른 글

c# 복습  (0) 2017.03.31
headfirst c#-wpf  (0) 2016.11.19
5/27 업무일지 c#학생성적관리(콘솔)  (0) 2016.05.27
c# 클래스 복습2  (0) 2016.05.23
2016-05-20-C#복습  (0) 2016.05.20
728x90

메소드 오버로딩


1
2
3
4
5
6
7
8
9
10
11
12
13
int Plus(int a, int b)
{
    return a + b;
}
 
double Plus(doubl a, double b)
{
    return a + b;
}
 
//
int       result1 = Plus(12);
double result2 = Plus(3.12.4);
cs


새로운 이름을 붙이지않고 하나의 메소드 이름에 여러개의 구현을 올림.

이름에 대한 고민을 줄여주고 코드의 일관성을 유지해주며, 생산성을 높인다. 






객체지향 프로그래밍


객체는 데이터와 메소드로 이루어진다.


: 속성은 데이터(변수), 기능은 메소드




Class는 객체를 만들기위한 청사진

붕어빵 틀이 클래스, 붕어빵은 객체

1
2
3
4
5
 
class 클래스 이름
{
    // 데이터와 메소드
}
cs




고양이를 추상화하기


1
2
3
4
5
6
7
8
9
class Cat
{
    public string Name;
    public string Color;    // 고양이의 속성(이름과 색)은 데이터
 
    public void Meow()    // 기능("야옹"은 메소드
    {
        Console.WriteLine("{0} : 야옹", Name);
    }
cs


위의 코드에서 Cat class에 선언된 Name,Color와 같은 클래스안에 선언된 변수들을 Field라고 한다.



Cat class은 청사진으로 실체(instance)는 아니다. 고양이 한마리의 이름과 색깔들을 정의해주어야 한다.




Cat 객체 생성


1
2
3
4
5
6
//kitty라는 객체를 생성
Cat kitty = new Cat();  
kitty.Color = "white";
kitty.Name = "kitty";
Kitty.Mew();
Console.WriteLine("{0} : {1}", kitty.Name, kitty.Color);
cs




1
Cat kitty = new Cat();   
cs

에서 cat()은 생성자.

new 키워드는 생성자를 호출해서 객체를 생성하는데 사용하는 연산자




this 키워드


1
2
3
4
5
6
7
8
9
10
class Employee
{
    private string Name;
 
    public void SetName(string Name)
    {
        this.Name = Name;
    }
}
//
cs

위의 코드에서 class Employee의 field도 Name,

SetName의 매개변수도 Name이다. (string Name)



this는 이런 모호성을 해결할 수 있는 키워드.

this.Name은 Employee 필드를 가리키고 오른쪽의 Name은 SetName() 메소드의 매개 변수를 가리킨다.



this() 생성자


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class MyClass
    {
        int a, b, c;
 
        public MyClass()
        {
            this.a = 5425;
        }
 
        public MyClass(int b) 
        {
      this.a = 5425;
            this.b = b;
        }
 
        public MyClass(int b, int c) 
        {
 this.a = 5425;
            this.b = b;
            this.c = c;
        }
cs


위 소스를 보면 문법적 문제는 없다. 다만 세개의 MyClass() 생성자안에 중복되는 코드들이 들어가있는데,

이것을 this() 생성자를 이용해 코드를 개선할 수 있다.

  1. using System;
  2.  
  3. namespace ThisConstructor
  4. {
  5. class MyClass
  6. {
  7. int a, b, c;
  8.  
  9. public MyClass()
  10. {
  11. this.a = 10;
  12. }
  13.  
  14. public MyClass(int b) : this()    //this()가 9행의 MyClass()를 호출
  15. {
  16. this.b = 20;
  17. }
  18.  
  19. public MyClass(int b, int c) : this(b)    //14행의 class호출
  20. {
  21. this.c = 30;
  22. }
  23.  
  24. public void PrintFields()
  25. {
  26. Console.WriteLine("a:{0}, b:{1}, c:{2}", a, b, c);
  27. }
  28. }
  29.  
  30. class MainApp
  31. {
  32. static void Main(string[] args)
  33. {
  34. MyClass a = new MyClass();
  35. a.PrintFields();
  36.  
  37. MyClass b = new MyClass(0);
  38. b.PrintFields();
  39.  
  40. MyClass c = new MyClass(0, 0);
  41. c.PrintFields();
  42. }
  43. }


 stdout

a:10, b:0, c:0

a:10, b:20, c:0

a:10, b:20, c:30



C# 성적관리 프로그램


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Student_Score
{
    class STUDENT
    {
        public string name;
        public int Kor;
        public int Eng;
        public int Tot;
        public double ag;
        public int grd;

        public string Total(string a, string b)
        {
            string temp = (int.Parse(a) + int.Parse(b)).ToString();
            return temp;
        }
        public string Avg(string a, string b)
        {
            string temp = ((int.Parse(a) + int.Parse(b)) / 2).ToString();
            return temp;
        }
        public string Grade(double ag)
        {
            string grade;
            if (90 >= ag)
                grade = "A";
            else if (80 >= ag)
                grade = "B";
            else if (70 >= ag)
                grade = "C";
            else
                grade = "F";
            return grade;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("학생정보 입력");

            STUDENT s1 = new STUDENT();

            Console.Write("이름 : ");
            s1.name = Console.ReadLine();

            Console.Write("국어성적 : ");
            s1.Kor = int.Parse(Console.ReadLine());

            Console.Write("영어성적 : ");
            s1.Eng = int.Parse(Console.ReadLine());

            s1.Tot = s1.Kor + s1.Eng;
            s1.ag = (s1.Kor + s1.Eng) / (double)2;

            Console.WriteLine("====================================================================================");
            Console.WriteLine("이름" + "\t" + "국어" + "\t" + "영어" + "\t" + "총점" + "\t" + "평균" + "\t" + "등급");
            Console.WriteLine(s1.name + "\t" + s1.Kor + "\t" + s1.Eng + "\t" + s1.Tot + "\t" + s1.ag + "\t" + s1.Grade(s1.ag));
        }


    }
}


Output :



'Study > C#' 카테고리의 다른 글

c# 복습  (0) 2017.03.31
headfirst c#-wpf  (0) 2016.11.19
5/27 업무일지 c#학생성적관리(콘솔)  (0) 2016.05.27
c# 클래스 복습2  (0) 2016.05.23
c# 스터디일지 -클래스  (0) 2016.05.22
728x90
#include <avr/io.h>
#include <util/delay.h>

#define  CLR   0x01      //Clear Display 명령
#define  HOME  0x02      //Return Home 명령 
#define  FNC   0x38      //Function Set 명령
                		 //Data Length = 8bit. 행수 2행


void LCD_PortSetting(void)
{
  DDRC = 0xFF;        //데이터 라인
  DDRD = 0xFF;        //0~2 제어핀 사용
  //D0: RS ,D1: R/W ,D2: EN
}

void IR_Write(unsigned char Data)  
{
  PORTD &= 0xFC;    //RS = 0, Write Enable
  _delay_us(1);    //Enable 까지 최소 대기 시간 40ns
  PORTD |= 0x04;    //Enable 활성화
  _delay_us(1);    //
  PORTC = Data;    //Data
  _delay_us(1);
  PORTD = 0b00000010;  //Disable, Read Mode  

}

void DR_Write(unsigned char Data)
{
  PORTD = 0x01;    //RS = 1, Write Enable
  _delay_us(1);    //Enable 까지 최소 대기 시간 40ns
  PORTD |= 0x04;    //Enable 활성화
  _delay_us(1);    //
  PORTC = Data;    //Data
  _delay_us(1);
  PORTD = 0b00000010;  //Disable, Read Mode  
}

void LCD_drive()
{
  _delay_ms(50);
  IR_Write(FNC);
  _delay_ms(5);
  IR_Write(FNC);
  _delay_us(100);
  IR_Write(FNC);
  _delay_ms(2);
  IR_Write(0x0E);	// Display On / Off, 	DDRAM, 커서 ON
  _delay_ms(2);  
  IR_Write(CLR);	// Display Clear
  _delay_ms(30);
  IR_Write(0x06);	// Entry Mode Set, 커서위치를 오른쪽으로 증가
  _delay_ms(2);
}

int main(void)
{
  LCD_PortSetting();
  LCD_drive();
  DR_Write(65);
  _delay_ms(2);
  DR_Write('D');

  while(1)
  {     
  }
  return 0;
}

Output :

LCD에 D 출력




#include <avr/io.h>
#include <util/delay.h>

#define CLR    0x01 // Return Home 명령
#define HOME  0x02 // Function Set 명령
#define FNC    0x38 // Data Length 8 bit 

void LCD_PortSetting(void)
{
  DDRC = 0xFF; // 데이터 라인
  DDRD = 0xFF; // 0 ~ 2 제어 핀 사용
  // 00: RS, 01: R/W, 02: En
}

void IR_Write(unsigned char Data)
{
  PORTD &= 0xFC; // RS = 0, Write Enable

  _delay_us(1); // Enable 까지 최소 대기 시간 40ns
  PORTD |= 0x04; // En

  _delay_us(1);
  PORTC = Data;

  _delay_us(1);
  PORTD = 0b00000010; // Disable. Read Mode
}

void DR_Write(unsigned char Data)
{
  PORTD = 0x01; // RS = 1, Write Enable

  _delay_us(1); // Enable 까지 최소 대기 시간 40ns
  PORTD |= 0x04; // En

  _delay_us(1);
  PORTC = Data;

  _delay_us(1);
  PORTD = 0b00000010; // Disable. Read Mode
}

void LCD_drive()
{
  _delay_ms(50); // 
  IR_Write(FNC);

  _delay_ms(5);
  IR_Write(FNC);
  
  _delay_us(100);
  IR_Write(FNC);
  _delay_ms(2);

  IR_Write(0x0E); // Display on/off DDRAM, 커서를 화면에 표시
  _delay_ms(2);


  IR_Write(CLR); // Display Clear
  _delay_ms(30);

  IR_Write(0x06); // Entry module set 명령. 오른쪽으로 커서 이동.
  _delay_ms(2);
}

void LCD_CHAR(unsigned char a)
{
  _delay_ms(1); // 명령어 쓰기 전 일정 시간 지연
  DR_Write(a); // 사유: Busy Flage 확인 대용
}

void cursor_HOME(void)
{
  IR_Write(0x02);
  _delay_ms(2);
}

void Display_Shift(unsigned char p)
{
  if(p == 1) // 표시화면 전체를 오른쪽으로 이동.
  {
    IR_Write(0x1C); // 화면 표시 내용을 오른쪽으로 이동.
    _delay_us(50);
  }

  else if(p == 0)
  {
    IR_Write(0x18); // 화면 표시 내용을 오른쪽으로 이동.
    _delay_us(50);    
  }
}

void LCD_STR(unsigned char *str)
{
  while(*str != 0)	// 0은 null, 값이 들어오면 
  {
    LCD_CHAR(*str);
    str++;
  }
}

void Position(unsigned char col, unsigned char row)	// 열과 행 
{
	IR_Write(0x80 | row+col*(0x40));
}

int main(void)
{
  LCD_PortSetting();
  LCD_drive();
  /*
  DR_Write(65);
  DR_Write('B');
  */
  Position(1,1);
  LCD_STR("Hello");
  //Display_Shift(1);

  while(1)
  {

  }

  return 0;
}

Output :

LCD에 Hello 출력







'Study > Embedded' 카테고리의 다른 글

7/5 LCD 제어  (0) 2016.07.05
5/26 업무일지 PC PWM을 이용한 LED 밝기 조절  (0) 2016.05.26
2016-05-17 업무일지-7 segment  (0) 2016.05.17
7 Segment 출력(proteus시뮬)  (0) 2016.05.16
5/12 avr 업무일지  (0) 2016.05.12
728x90

 

7 segment 숫자와 알파벳 출력 


캐소드 구동방식은 FND의 세그먼트중 켜길 원하는 비트가 0, 끄길 원하는 비트가 1이 된다.




 

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	unsigned char fnd[16] = 
				{0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xd8, 
		 		 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
	volatile unsigned char i;

	DDRF=0xFF;
	while(1)
	{	
		for(i=0; i<16; i++)
		{		
			_delay_ms(20);
			PORTF = fnd[i];
		}
	}
}



  //  PORTF = 0b1000000;  //0

  //  PORTF = 0b1111001;  //1

  //  PORTF = 0b0100100;  //2

  //  PORTF = 0b0110000;  //3  B0

  //  PORTF = 0b0011001;  //4  99

  //  PORTF = 0b0010010;  //5  92

  //  PORTF = 0b0000010;  //6  82

  //  PORTF = 0b1011000;  //7  E8

  //  PORTF = 0b0000000;  //8  80

  //  PORTF = 0b0010000;  //9  90

  //  PORTF = 0b0001000;  //A  88

  //  PORTF = 0b0000011;  //b  83

  //  PORTF = 0b1000110;  //c  c6

  //  PORTF = 0b0100001;  //d  a1

  //  PORTF = 0b0000110;  //e  86

  //  PORTF = 0b0001110;  //f  8e








애노드 구동방식은 FND의 세그먼트중 켜길 원하는 비트가 1, 끄길 원하는 비트가 0이 된다.


#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	unsigned char fnd[10] = // 0~9
							{0xC0, 0xF9, 0xA4, 0xB0, 0x99, 
							 0x92, 0x82, 0xd8, 0x80, 0x90};
		
	unsigned char n10;
	unsigned char n1;

	unsigned char num=0;

	DDRH=0xFF;	// 7 Segment의 Data Line
	DDRJ=0xFF;	// 7 Segment의 자릿수 ON/OFF
	while(1)
	{	
		n10 = num / 10;	// 십의 자리
		n1 = num % 10;	// 일의 자리
		
		PORTJ = 0x00;	// ON
		PORTH = fnd[n10];	// Data
		PORTJ = 0x01;	// OFF
		_delay_ms(2);
				
		PORTJ = 0x00;
		PORTH = fnd[n1];
		PORTJ = 0x02;
		_delay_ms(2);
		PORTJ = 0x00;		

		num++;
		num = num % 100;
	}
	return 0;
}








728x90

bcd.DSN


proteus에서 회로도 그리고 아래 소스를 시뮬레이션



hex파일을 프로그램으로 올려줌




7 Segment - up & down 카운트



#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	unsigned char in, out =0;
	
	DDRA = 0b11111100;		// A0, A1만 입력 (0xFC) / 사용하지 않는 포트는 출력 
	DDRB = 0xFF;
	while(1)
	{
			in = PINA;
			switch (in)
			{
					case 0x01 :		// Up count
							while(PINA=0x01);	// 스위치 때는 순간 while문 탈출(high->low)
							out++;
							break;
					case 0x02 :
							while(PINA=0x02);
							out--;
							break;
			}
			PORTB = out;
			//_delay_ms(50);
	}
		return 0;
}





7 Segment - 입출력



#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	unsigned char a;

	DDRA = 0x00;	// A 포트는 입력으로 사용, 생략 가능
	DDRB = 0xFF;	// B 포트는 출력으로 사용
	DDRC = 0xFF;	// 미사용 포트는 출력으로 설정
	DDRD = 0xFF;	// 미사용 포트는 출력으로 설정
	DDRE = 0xFF;	// 미사용 포트는 출력으로 설정
	DDRF = 0xFF;	// 미사용 포트는 출력으로 설정
	DDRG = 0xFF;	// 미사용 포트는 출력으로 설정
	DDRH = 0xFF;	// 미사용 포트는 출력으로 설정
	DDRJ = 0xFF;	// 미사용 포트는 출력으로 설정
	DDRK = 0xFF 	// 미사용 포트는 출력으로 설정

	while(1)
	{
		a = PINA;
		switch(a)
		{
			case 0x01;
					PORTB = 0x01;
					break;
			case 0x02;
					PORTB = 0x02;
					break;
			case 0x04;
					PORTB = 0x04;
					break;
			case 0x08;
					PORTB = 0x08;
					break;

			case 0x10;
					PORTB = 0x10;
					break;
			case 0x20;
					PORTB = 0x20;
					break;
			case 0x40;
					PORTB = 0x40;
					break;
			case 0x80;
					PORTB = 0x80;
					break;
			default :
				PORTB = 0;
				break;
		}
		PORTB = a;
	}
	return 0;
}




'Study > Embedded' 카테고리의 다른 글

2016-05-19 업무일지-Atmega2560_LCD출력  (0) 2016.05.19
2016-05-17 업무일지-7 segment  (0) 2016.05.17
5/12 avr 업무일지  (0) 2016.05.12
5/2 디지털이란? / 저항, 인덕터, 캐패시터  (0) 2016.05.02
2016 04 28 디코더  (0) 2016.04.28
728x90

#include <avr/io.h>

#include <util/delay.h>


int main(void)

{

DDRA=0xFF;

while(1)

{

// PORTA ^=0XFF; // DDRA = (*(volatile unsigned char *)0x21)

PORTA = PORTA ^ 0XFF;

_delay_ms(3000);

}

return 0;

}



PORTA = PORTA ^ 0xFF; //xor =  모든값을 반전


0x02에 offset값(0x20) 더해서 0x22

오프셋이란, 두 번째 주소를 만들기 위해 기준이 되는 주소에 더해진 값을 의미한다. 


오프셋을 이용하여 주소를 나타내는 것을 상대주소 지정방식이라고 부르는데, 그 이유는 결과 주소가 다른 지점의 상대적인 위치가 되기 때문이다. 오프셋을 다른 말로 "변위"라고도 부른다.



안넣으면 계속 켜진거처럼 보임, 오실로스코프를 통해 클럭이 움직이는걸 볼 수 있음


'Study > Embedded' 카테고리의 다른 글

2016-05-17 업무일지-7 segment  (0) 2016.05.17
7 Segment 출력(proteus시뮬)  (0) 2016.05.16
5/2 디지털이란? / 저항, 인덕터, 캐패시터  (0) 2016.05.02
2016 04 28 디코더  (0) 2016.04.28
2016 04 27 논리회로  (0) 2016.04.27

+ Recent posts