1. 프로그램 개요
P22는 Green 0 LED, P24는 Red LED, P26은 Green 1 LED가 연결되어 있다.
P60, P60을 High 출력을 유지하다가 500ms 마다 100us진폭으로 Low 출력을 만든다.
2. 회로도
3. Code
⑴ main routine
void main()
{
InitSystem(); // 시스템 초기화
LED_G_0=0;LED_R=0;LED_G_1=0; // LED 전체 ON
DelayXms(1000); // 1초 딜레이
LED_G_0=1;LED_R=1;LED_G_1=1; // LED 전체 OFF
while(1)
{
LED_R=!LED_R; // RED LED Toggle
DelayXms(500); // Delay 500ms
P60=0; // P60 clear
P61=0; // P61 clear
DelayXus(100); // 100us delay
P60=1; // P60 Set
P61=1; // P61 Set
DelayXus(100); // 100us delay
}
}
⑵ 시스템 초기화 루틴
/***********************************************************************************
*Function: void InitSystem(void)
*Description: Initialize MCU
*Input:
*Output:
*************************************************************************************/
void InitSystem(void)
{
InitPort(); // 포트 설정
}
- 포트 설정만 수행한다.
⑶ Port 초기화
/***********************************************************************************
*Function: void InitPort(void)
*Description: Initialize IO Port
*Input:
*Output:
*************************************************************************************/
void InitPort(void)
{
PORT_SetP2PushPull(BIT2|BIT4|BIT6); // Set P22,P24,P26 as Push-Pull,For LED.
//PORT_SetP6AInputOnly(BIT0|BIT1); // Set P60,P61 as Analog-Input-Only
//PORT_SetP6OpenDrainPu(BIT0|BIT1); // Set P60,P61 as Open-Drain with Pull-High,such as Quasi-Bidirectional
//PORT_SetP6OpenDrain(BIT0|BIT1); // Set P60,P61 as Open-Drain
PORT_SetP6PushPull(BIT0|BIT1); // Set P60,P61 as Push-Pull,
}
- LED 구동을 위한 핀 설정 : P22, P24, P26을 Push-Pull 로 설정한다.
PORT_SetP2PushPull(BIT2|BIT4|BIT6);
#define PORT_SetP2PushPull(x) P2M0=P2M0|(x); SFRPI=1;P2M1=P2M1&(~(x));SFRPI=0
Port 2의 Push-Pull 설정, P2M0는 SFR 0번 Page에있고, P2M1은 SFR 1번 Page에 있으므로 데이터 변경 전에 SFRPI=1, SFRPI=0을 사용해서 SFR Page를 변경시켜준다.
- P60, P61의 포트를 아날로그 입력으로 설정한다.
PORT_SetP6AInputOnly(BIT0|BIT1);
#define PORT_SetP6AInputOnly(x) SFRPI=1;P6M0=P6M0&(~(x));SFRPI=3;P6M1=P6M1|(x) ;SFRPI=0
P6M0는 SFR PAGE 1에 있고, P6M1은 SFR PAGE 3에 있다. 그러므로 위의 매크로와 같이 해당 레지스터를 제어하기 전에 반드시 SFRPI에 SFR PAGE의 번호를 저장한다.
- P60, P61을 풀업이 된 Open Drain 타입으로 설정
PORT_SetP6OpenDrainPu(BIT0|BIT1);
PORT_SetP6OpenDrain(x) SFRPI=1;P6M0=P6M0&(~(x));SFRPI=3;P6M1=P6M1&(~(x));SFRPI=0
- P60, P61을 Open Drain 타입으로 설정
PORT_SetP6OpenDrain(BIT0|BIT1);
#define PORT_SetP6OpenDrain(x) SFRPI=1;P6M0=P6M0&(~(x));SFRPI=3;P6M1=P6M1&(~(x));SFRPI=0
- P60, P61을 Push Pull 타입으로 설정
PORT_SetP6PushPull(BIT0|BIT1);
#define PORT_SetP6PushPull(x) SFRPI=1;P6M0=P6M0|(x); SFRPI=3;P6M1=P6M1&(~(x));SFRPI=0
해당 핀에 디지털 출력(1 or 0)을 출력 시키므로 Push-Pull 타입으로 설정하였음
* 포트 설정 시 설정에 필요한 레지스터가 SFR Page 몇 번에 있는지 필히 확인 해야 함
** SFRPI의 값은 필요한 페이지 번호로 변경했다가 레지스터의 제어가 마무리 되면 반드시 0번으로 바꾸어 둠
*** 사용된 매크로함수는 “API_Macro_MG82FG6D16.H”에서 찾아볼 수 있다.
\Megawin 8051\(EN)MG82F6D16_SampleCode_v1.20\MG82F6D16_GPIO_P60\code\include
4. 프로그램 실행
*** Keil compiler가 인스톨되어 있어야함 ***
해당 Example 폴더를 찾아가 KeilPrj폴더를 Open 한다.
\Megawin 8051\(EN)MG82F6D16_SampleCode_v1.20\ MG82F6D16_GPIO_P60\KeilPrj
해당 폴더의 Keil project 파일을 더블 클릭하여 실행시킨다.(MG82F6D16_DEMO.uvproj)
Rebuild 아이콘을 클릭하여 프로젝트를 컴파일 한다.
Demo Board에 USB Connector를 연결하여 전원을 인가하고, 전원 스위치를 ON시키고, OCD ICE를 연결한 상태에서 위 이미지의 Start/Stop Debug Session(Ctrl+F5) 버튼을 눌러 컴파일된 프로젝트의 디버그 데이터를 다운로드 시킨다.(컴파일 시 에러가 발생하지 않아야함)
다운로드 후 Run(F5) 버튼을 클릭하면 프로그램이 동작한다.
5. 동작 영상
https://youtube.com/shorts/QjQs6PIGTS8?feature=share

'MEGAWIN' 카테고리의 다른 글
MG82F6D Series CLK ILRCO P60OC (0) | 2022.11.11 |
---|---|
MG82F6D Series CLK xtal (0) | 2022.11.10 |
MG82F6D Series ADC with Interrupt - 4 (0) | 2022.11.08 |
MG82F6D Series ADC with Interrupt - 3 (0) | 2022.11.08 |
MG82F6D Series ADC with Interrupt - 2 (0) | 2022.11.08 |