Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <xc.h>
- #include <stdio.h>
- // CONFIG1H
- #pragma config OSC = HS // Oscillator Selection bits (HS oscillator)
- #pragma config OSCS = OFF // Oscillator System Clock Switch Enable bit (Oscillator system clock switch option is disabled (main oscillator is source))
- // CONFIG2L
- #pragma config PWRT = ON // Power-up Timer Enable bit (PWRT disabled)
- #pragma config BOR = OFF // Brown-out Reset Enable bit (Brown-out Reset disabled)
- #pragma config BORV = 20 // Brown-out Reset Voltage bits (VBOR set to 2.0V)
- // CONFIG2H
- #pragma config WDT = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
- #pragma config WDTPS = 128 // Watchdog Timer Postscale Select bits (1:128)
- // CONFIG3H
- #pragma config CCP2MUX = ON // CCP2 Mux bit (CCP2 input/output is multiplexed with RC1)
- // CONFIG4L
- #pragma config STVR = ON // Stack Full/Underflow Reset Enable bit (Stack Full/Underflow will cause RESET)
- #pragma config LVP = OFF // Low Voltage ICSP Enable bit (Low Voltage ICSP enabled)
- // CONFIG5L
- #pragma config CP0 = OFF // Code Protection bit (Block 0 (000200-001FFFh) not code protected)
- #pragma config CP1 = OFF // Code Protection bit (Block 1 (002000-003FFFh) not code protected)
- #pragma config CP2 = OFF // Code Protection bit (Block 2 (004000-005FFFh) not code protected)
- #pragma config CP3 = OFF // Code Protection bit (Block 3 (006000-007FFFh) not code protected)
- // CONFIG5H
- #pragma config CPB = OFF // Boot Block Code Protection bit (Boot Block (000000-0001FFh) not code protected)
- #pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not code protected)
- // CONFIG6L
- #pragma config WRT0 = OFF // Write Protection bit (Block 0 (000200-001FFFh) not write protected)
- #pragma config WRT1 = OFF // Write Protection bit (Block 1 (002000-003FFFh) not write protected)
- #pragma config WRT2 = OFF // Write Protection bit (Block 2 (004000-005FFFh) not write protected)
- #pragma config WRT3 = OFF // Write Protection bit (Block 3 (006000-007FFFh) not write protected)
- // CONFIG6H
- #pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write protected)
- #pragma config WRTB = OFF // Boot Block Write Protection bit (Boot Block (000000-0001FFh) not write protected)
- #pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write protected)
- // CONFIG7L
- #pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (000200-001FFFh) not protected from Table Reads executed in other blocks)
- #pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (002000-003FFFh) not protected from Table Reads executed in other blocks)
- #pragma config EBTR2 = OFF // Table Read Protection bit (Block 2 (004000-005FFFh) not protected from Table Reads executed in other blocks)
- #pragma config EBTR3 = OFF // Table Read Protection bit (Block 3 (006000-007FFFh) not protected from Table Reads executed in other blocks)
- // CONFIG7H
- #pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot Block (000000-0001FFh) not protected from Table Reads executed in other blocks)
- #define _XTAL_FREQ 16000000
- #define RS(value) {if (value) {PORTC|= 0b10000000;} else {PORTC&=01111111;}}
- #define ENABLE(value) {if (value) {PORTC|= 0b01000000;} else {PORTC&=10111111;}}
- #define RW(value) {if (value) {PORTD|= 0b00001000;} else {PORTD&=11110111;}}
- const int COUNT_UP = 1;
- const int COUNT_DOWN = 0;
- const int PRESS_ACK = 6;
- static int operation;
- static short currentNumber;
- static char pressCounter = 0;
- static char buttonPressed = 0;
- void pulseEnable() {
- ENABLE(0);
- __delay_us(1);
- ENABLE(1);
- __delay_us(1);
- ENABLE(0);
- __delay_us(100);
- }
- void write4Bits(char bits) {
- bits<<= 4;
- PORTB = bits;
- pulseEnable();
- }
- void sendCommand(char cmd) {
- RS(0);
- RW(0);
- write4Bits(cmd >> 4);
- write4Bits(cmd);
- }
- void writeChar(char c) {
- RS(1);
- RW(0);
- write4Bits(c >> 4);
- write4Bits(c);
- }
- void writeString(char *s) {
- while (*s) {
- writeChar(*(s++));
- }
- }
- void interrupt debouncer(void) {
- TMR0H = 0xD1;
- TMR0L = 0x20;
- INTCONbits.TMR0IF = 0;
- if (PORTB & 0x01) {
- if (pressCounter <= PRESS_ACK) {
- if (pressCounter == PRESS_ACK) {
- buttonPressed = 1;
- ++pressCounter;
- }
- ++pressCounter;
- }
- } else {
- pressCounter = 0;
- buttonPressed = 0;
- }
- }
- void logic() {
- if (buttonPressed) {
- if (operation == COUNT_UP) {
- operation = COUNT_DOWN;
- } else {
- operation = COUNT_UP;
- }
- buttonPressed = 0;
- }
- if (operation == COUNT_UP) {
- if (currentNumber < 100) {
- ++currentNumber;
- }
- } else if (currentNumber > 0) {
- --currentNumber;
- }
- }
- void displayCurrentNumber() {
- sendCommand(0xC0);
- switch (currentNumber) {
- case 0: writeString("0 "); break;
- case 1: writeString("1 "); break;
- case 2: writeString("2 "); break;
- case 3: writeString("3 "); break;
- case 4: writeString("4 "); break;
- case 5: writeString("5 "); break;
- case 6: writeString("6 "); break;
- case 7: writeString("7 "); break;
- case 8: writeString("8 "); break;
- case 9: writeString("9 "); break;
- case 10: writeString("10 "); break;
- case 11: writeString("11 "); break;
- case 12: writeString("12 "); break;
- case 13: writeString("13 "); break;
- case 14: writeString("14 "); break;
- case 15: writeString("15 "); break;
- case 16: writeString("16 "); break;
- case 17: writeString("17 "); break;
- case 18: writeString("18 "); break;
- case 19: writeString("19 "); break;
- case 20: writeString("20 "); break;
- case 21: writeString("21 "); break;
- case 22: writeString("22 "); break;
- case 23: writeString("23 "); break;
- case 24: writeString("24 "); break;
- case 25: writeString("25 "); break;
- case 26: writeString("26 "); break;
- case 27: writeString("27 "); break;
- case 28: writeString("28 "); break;
- case 29: writeString("29 "); break;
- case 30: writeString("30 "); break;
- case 31: writeString("31 "); break;
- case 32: writeString("32 "); break;
- case 33: writeString("33 "); break;
- case 34: writeString("34 "); break;
- case 35: writeString("35 "); break;
- case 36: writeString("36 "); break;
- case 37: writeString("37 "); break;
- case 38: writeString("38 "); break;
- case 39: writeString("39 "); break;
- case 40: writeString("40 "); break;
- case 41: writeString("41 "); break;
- case 42: writeString("42 "); break;
- case 43: writeString("43 "); break;
- case 44: writeString("44 "); break;
- case 45: writeString("45 "); break;
- case 46: writeString("46 "); break;
- case 47: writeString("47 "); break;
- case 48: writeString("48 "); break;
- case 49: writeString("49 "); break;
- case 50: writeString("50 "); break;
- case 51: writeString("51 "); break;
- case 52: writeString("52 "); break;
- case 53: writeString("53 "); break;
- case 54: writeString("54 "); break;
- case 55: writeString("55 "); break;
- case 56: writeString("56 "); break;
- case 57: writeString("57 "); break;
- case 58: writeString("58 "); break;
- case 59: writeString("59 "); break;
- case 60: writeString("60 "); break;
- case 61: writeString("61 "); break;
- case 62: writeString("62 "); break;
- case 63: writeString("63 "); break;
- case 64: writeString("64 "); break;
- case 65: writeString("65 "); break;
- case 66: writeString("66 "); break;
- case 67: writeString("67 "); break;
- case 68: writeString("68 "); break;
- case 69: writeString("69 "); break;
- case 70: writeString("70 "); break;
- case 71: writeString("71 "); break;
- case 72: writeString("72 "); break;
- case 73: writeString("73 "); break;
- case 74: writeString("74 "); break;
- case 75: writeString("75 "); break;
- case 76: writeString("76 "); break;
- case 77: writeString("77 "); break;
- case 78: writeString("78 "); break;
- case 79: writeString("79 "); break;
- case 80: writeString("80 "); break;
- case 81: writeString("81 "); break;
- case 82: writeString("82 "); break;
- case 83: writeString("83 "); break;
- case 84: writeString("84 "); break;
- case 85: writeString("85 "); break;
- case 86: writeString("86 "); break;
- case 87: writeString("87 "); break;
- case 88: writeString("88 "); break;
- case 89: writeString("89 "); break;
- case 90: writeString("90 "); break;
- case 91: writeString("91 "); break;
- case 92: writeString("92 "); break;
- case 93: writeString("93 "); break;
- case 94: writeString("94 "); break;
- case 95: writeString("95 "); break;
- case 96: writeString("96 "); break;
- case 97: writeString("97 "); break;
- case 98: writeString("98 "); break;
- case 99: writeString("99 "); break;
- default: writeString("100"); break;
- }
- }
- void main(void) {
- TRISB = 0b00000001;
- TRISC = 0b00000000;
- TRISD = 0X00;
- __delay_ms(50);
- PORTB = 0x00;
- PORTC = 0x00;
- PORTD = 0x00;
- operation = COUNT_UP;
- currentNumber = 0;
- INTCONbits.GIE = 1;
- INTCONbits.PEIE = 1;
- INTCONbits.TMR0IF = 0x0;
- INTCONbits.TMR0IE = 1;
- T0CONbits.T08BIT = 0;
- T0CONbits.T0CS = 0;
- T0CONbits.PSA = 1;
- TMR0H = 0xD1;
- TMR0L = 0x20;
- T0CONbits.TMR0ON = 1;
- write4Bits(0x03);
- __delay_us(4500);
- write4Bits(0x03);
- __delay_us(4500);
- write4Bits(0x03);
- __delay_us(150);
- write4Bits(0x02);
- // Finally, set number of lines, font size, etc.
- sendCommand(0b00101000);
- __delay_us(40);
- // Turn the display on with no cursor or blinking default
- sendCommand(0b00001100);
- __delay_us(40);
- // Clear
- sendCommand(0b00000001);
- __delay_us(2000);
- sendCommand(0b00000110);
- sendCommand(0x80);
- writeString("Value:");
- __delay_ms(1000);
- displayCurrentNumber();
- for (;;) {
- logic();
- displayCurrentNumber();
- __delay_ms(500);
- }
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement