PIC18F23K20 電子工作を始めよう #5 LEDフラッシャー改

今回は前回のLEDフラシャーのプログラムに改良を加えます。

タイマー割込みを使うことで、点滅タイミング切り替え時

長押しをしなくてよくなります。

またスイッチを押している間点滅が停止することもなくなります。

 

PIC入門GUIプログラミング#5LEDフラッシャー改 - YouTube

【ゆっくり】PIC入門GUIプログラミング#5LEDフラッシャー改 by 電子ライダー ニコニコ技術部/動画 - ニコニコ動画

完成形のプログラムを提示します。

main.c

/**
Generated Main Source File

Company:
Microchip Technology Inc.

File Name:
main.c

Summary:
This is the main file generated using MPLAB(c) Code Configurator

Description:
This header file provides implementations for driver APIs for all modules selected in the GUI.
Generation Information :
Product Revision : MPLAB(c) Code Configurator - 4.15
Device : PIC18F23K20
Driver Version : 2.00
The generated drivers are tested against the following:
Compiler : XC8 1.35
MPLAB : MPLAB X 3.40
*/

/*
(c) 2016 Microchip Technology Inc. and its subsidiaries. You may use this
software and any derivatives exclusively with Microchip products.

THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A
PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION
WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION.

IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS
BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE
FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN
ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.

MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE
TERMS.
*/

#include "mcc_generated_files/mcc.h"

/*
Main application
*/
#define LED0 PORTAbits.RA0
#define LED1 PORTAbits.RA1
#define LED2 PORTAbits.RA2
#define LED3 PORTAbits.RA3
#define SW0 !PORTBbits.RB0
#define SW1 !PORTBbits.RB1
#define SW2 !PORTBbits.RB2
#define SW3 !PORTBbits.RB3

void interrupt_10ms(void);
int mode=0;
void main(void)
{
// Initialize the device
SYSTEM_Initialize();

// If using interrupts in PIC18 High/Low Priority Mode you need to enable the Global High and Low Interrupts
// If using interrupts in PIC Mid-Range Compatibility Mode you need to enable the Global and Peripheral Interrupts
// Use the following macros to:

// Enable high priority global interrupts
//INTERRUPT_GlobalInterruptHighEnable();

// Enable low priority global interrupts.
//INTERRUPT_GlobalInterruptLowEnable();

// Disable high priority global interrupts
//INTERRUPT_GlobalInterruptHighDisable();

// Disable low priority global interrupts.
//INTERRUPT_GlobalInterruptLowDisable();

// Enable the Global Interrupts
INTERRUPT_GlobalInterruptEnable();

// Enable the Peripheral Interrupts
//INTERRUPT_PeripheralInterruptEnable();

// Disable the Global Interrupts
//INTERRUPT_GlobalInterruptDisable();

// Disable the Peripheral Interrupts
//INTERRUPT_PeripheralInterruptDisable();

TMR0_SetInterruptHandler(interrupt_10ms);
unsigned int i;
while (1)
{
// Add your application code
switch(mode){
case 0:
LED0=1;
LED1=1;
LED2=1;
LED3=1;
for(i=0;i<30000;i++);
LED0=0;
LED1=0;
LED2=0;
LED3=0;
for(i=0;i<30000;i++);
break;
case 1:
LED0=1;
LED1=0;
LED2=1;
LED3=0;
for(i=0;i<30000;i++);
LED0=0;
LED1=1;
LED2=0;
LED3=1;
for(i=0;i<30000;i++);
break;
case 2:
LED0=1;
LED1=1;
LED2=0;
LED3=0;
for(i=0;i<30000;i++);
LED0=0;
LED1=0;
LED2=1;
LED3=1;
for(i=0;i<30000;i++);
break;
case 3:
LED0=1;
LED1=0;
LED2=0;
LED3=1;
for(i=0;i<30000;i++);
LED0=0;
LED1=1;
LED2=1;
LED3=0;
for(i=0;i<30000;i++);
break;

}
}
}

void interrupt_10ms(void){
if(SW0) mode=0;
if(SW1) mode=1;
if(SW2) mode=2;
if(SW3) mode=3;

}
/**
End of File
*/