View difference between Paste ID: b6d3ZUW2 and RvTjchxv
SHOW: | | - or go back to the newest paste.
1
/* 
2
 * File:   NESRGBSwitch.c
3
 * Author: Ben Whitman
4
 *
5
 * PIC10F322
6
 *
7
 * Created on April 2, 2015, 6:33 PM
8
 */
9
10
#include <stdio.h>
11
#include <stdlib.h>
12
#include <stdint.h>
13
#include <xc.h>
14
15
#include "HEFlash.h"
16
17
// CONFIG
18
#pragma config FOSC = INTOSC    // Oscillator Selection bits (INTOSC oscillator: CLKIN function disabled)
19
#pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)
20
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
21
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
22
#pragma config MCLRE = OFF      // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
23
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
24
#pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
25
#pragma config LPBOR = ON       // Brown-out Reset Selection bits (BOR enabled)
26
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
27
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
28
29
30
uint8_t input_state = 1;
31
uint8_t output_state = 0;
32
uint8_t shift_reg = 0xFF;
33
34
void button_pressed();
35
void button_released();
36
void switch_output();
37
void save_selection();
38
39
/*
40
 * 
41
 */
42
int main(int argc, char** argv) {
43
44
    OSCCON = 0x00;
45
    INTCON = 0x00;
46
47
    OPTION_REGbits.nWPUEN = 0;
48
    OPTION_REGbits.T0CS = 0;
49
    OPTION_REGbits.PSA = 0;
50
    OPTION_REGbits.PS0 = 1;
51
    OPTION_REGbits.PS1 = 1;
52
    OPTION_REGbits.PS2 = 1;
53
54
    TRISA = 0x0F;
55
    LATA = 0x00;
56
    WPUA = 0x08;
57
    ANSELA = 0x00;
58
59
    INTCONbits.TMR0IF = 0;
60
    INTCONbits.TMR0IE = 0;
61
    INTCONbits.GIE = 0;
62
63
    HEFLASH_readBlock (&output_state, (HEFLASH_MAXROWS - 1), 1);
64
65
    while(1)
66
    {
67
        shift_reg = (shift_reg << 1) | PORTAbits.RA3;
68
69
        switch(input_state)
70
        {
71
            case 0:
72
                if(shift_reg == 0xFF)
73
                {
74
                    input_state = 1;
75
                    button_released();
76
                }
77
                break;
78
79
            case 1:
80
                if(shift_reg == 0x00)
81
                {
82
                    input_state = 0;
83
                    button_pressed();
84
                }
85
                break;
86
87
            default:
88
                input_state = PORTAbits.RA3;
89
        }
90
91
        switch(output_state)
92
        {
93
            case 0: // Natural palette: 011
94
                TRISA = 0x0B;
95
                break;
96
97
            case 1: // Improved palette: 101 | 001
98
                TRISA = 0x0D;
99
                break;
100
101
            case 2: // Garish palette: 110 | 010
102
                TRISA = 0x0E;
103
                break;
104
105
            case 3: // Composite out
106
                TRISA = 0x0F;
107
                break;
108
109
            default: // Natural palette
110
                TRISA = 0x0B;
111
        }
112
    }
113
114
    return (EXIT_SUCCESS);
115
}
116
117
void button_pressed()
118
{
119
    TMR0IF = 0;
120
    TMR0 = 239;
121
}
122
123
124
void button_released()
125
{
126
    if(TMR0IF)  // Long press
127
    {
128
        save_selection();
129
    }
130
131
    else  // Short press
132
    {
133
        switch_output();
134
    }
135
}
136
137
138
void switch_output()
139
{
140
    if(output_state++ > 2) // State 3 = NESRGB disabled/PPU component out
141
    {
142
        output_state = 0;
143
    }
144
}
145
146
147
void save_selection()
148
{
149
    char ret = HEFLASH_writeBlock ((HEFLASH_MAXROWS - 1), &output_state, 1);
150
}