⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 基于PIC18F45K20板子的时钟程序 现在在板子的LCD上 可用2个开关调节时间
💻 C
字号:

#include <p18f46K20.h>
#include "oled_interface.h"
#include "oled.h" 

#pragma config IESO=OFF, FCMEN=OFF, FOSC=INTIO67, PWRT=OFF, BOREN=OFF, WDTEN=OFF
#pragma config WDTPS=32768, MCLRE=ON, LPT1OSC=OFF, PBADEN=OFF, CCP2MX=PORTBE
#pragma config STVREN=OFF, LVP=OFF, XINST=OFF, DEBUG=OFF, CP0=OFF, CP1=OFF
#pragma config CP2=OFF, CP3=OFF, CPB=OFF, CPD=OFF, WRT0=OFF, WRT1=OFF
#pragma config WRT2=OFF, WRT3=OFF, WRTB=OFF, WRTC=OFF, WRTD=OFF, EBTR0=OFF
#pragma config EBTR1=OFF, EBTR2=OFF, EBTR3=OFF, EBTRB=OFF

#define LED0 LATDbits.LATD0
#define LED1 LATDbits.LATD1
#define LED2 LATDbits.LATD2
#define LED3 LATDbits.LATD3
#define LED4 LATDbits.LATD4
#define LED5 LATDbits.LATD5
#define LED6 LATDbits.LATD6
#define LED7 LATDbits.LATD7

#define SW1	LATBbits.LATB0
#define	SW2 LATBbits.LATB1
#define	SW3 LATBbits.LATB2
#define	SW4 LATBbits.LATB3


unsigned char timeFlag, buttons;
unsigned char hours, minutes, seconds, Mode;

unsigned char r1[23];
unsigned char r2[23];
unsigned char r3[23];
unsigned char r4[23];
unsigned int delay;


/** D E C L A R A T I O N S **************************************************/
void InterruptHandler(void);
void InitializeSystem(void);
void updateTime(void);


#pragma code high_vector=0x08

void high_interrupt (void)
{
	_asm GOTO InterruptHandler _endasm
}

#pragma code low_vector=0x18
void low_interrupt (void)
{
	_asm GOTO InterruptHandler _endasm
}

#pragma code


#pragma interruptlow InterruptHandler
#pragma interrupt	InterruptHandler

void InterruptHandler(void) { 
	
	if (INTCONbits.INT0IF) {
		INTCONbits.INT0IF = 0;
		hours++;
		if (hours >=13){
			hours = 1;
		}
		updateTime();
	
				

	} // endif INTCONbits.INT0IF

	if (INTCON3bits.INT1IF) {
		INTCON3bits.INT1IF = 0;

	} // endif INTCON3bits.INT1IF

	if (INTCON3bits.INT2IF) {
		INTCON3bits.INT2IF=0;
		minutes++;
		if (minutes >= 60){
			minutes = 0;
		}
		updateTime();
	} // endif INTCON3bits.INT2IF

	if (PIR1bits.TMR1IF && PIE1bits.TMR1IE){

		timeFlag = 1; 			// and update has occured, set time flag
		PIR1bits.TMR1IF = 0;	
		TMR1H =+ 0x80;			// preload TMR1 for 1 second roll over
		seconds++;		
		if (seconds >= 60){
			minutes++;
			seconds = 0;	
			if (minutes >= 60){
				hours++;
				minutes = 0;
				if (hours >=13){
					hours = 1;
				}
			}
		}


	}// endif timer 1 interrupt
	
} // end InterruptHandler


void main(void){

	char temp;

	InitializeSystem();


	delay = 30000;
	while(delay--);


	oled_init();
	oled_clear();
	hours = 12;
	minutes = 0;
	seconds = 0;


	for(temp = 0; temp<23; temp++){
		r1[temp]= ' ';
		r2[temp]= ' ';
		r3[temp]= ' ';
		r4[temp]= ' ';
	}
	oled_puts_2x(r1);
	oled_puts_2x(r2);
	oled_puts_2x(r3);
	oled_puts_2x(r4);	
	oled_refresh();



	while(1){							// main loop
		Sleep();
		Nop();
		Nop();		
		if (timeFlag == 1){		
			
			updateTime();
		
			timeFlag=0;	 		//clear time flag

			Nop();
			Nop();
		}
	}

}




void InitializeSystem(void)
{

	OSCCON = 0b01110000;
	OSCTUNEbits.PLLEN = 0; 					// turn off the PLL

	// Setup I/O Ports.
	
	TRISA = 0;								// TRISA outputs
	LATA = 0b11110000;						// drive PORTA pins low

	oled_res = 1;							// do not reset LCD yet
	oled_cs = 1;							// do not select the LCD

	TRISB = 0b11001111;


	LATC = 0b00101000;
	TRISC = 0b00000000;

	TRISD = 0;								// TRISD is LED output
	LATD = 0;								// turn off LEDS

	TRISE = 0b00000111;

	//configure buttons
	WPUB = 0b00001111;
	INTCON2bits.RBPU = 0; 					// turn on weak pull ups for RB0-RB3

	INTCONbits.INT0IF = 0;					// clear RB0 INT
	INTCONbits.INT0IE = 1;					// enable RB0 INT
	INTCON2bits.INTEDG0 = 0;				// interrupt on falling edge 

	INTCON3bits.INT1IF = 0;					// clear RB1 INT
	INTCON3bits.INT1IE = 1;					// enable RB1 INT	
	INTCON2bits.INTEDG1 = 0;				// interrupt on falling edge

	INTCON3bits.INT2IF = 0;					// clear RB2 INT
	INTCON3bits.INT2IE = 1;					// enable RB2 INT
	INTCON2bits.INTEDG2 = 0;				// interrupt on falling edge

	
	// Setup analog functionality
	ANSEL = 0x00;							// all pins digital
	ANSELH = 0x00;
	
	ANSELbits.ANS6=1;						// RE2 is a temperature input


	ADCON1=0;								// Reference Vdd and Vss
	ADCON2=0b10001100;						// right, AN6, 2 Tad, Fosc/64
	ADCON0=0b00011101;						// turn on ADC


	// Setup TMR1
	// Configure Timer 1
	T1CON 	= 0b00001111;

		
	// Setup TMR2
	T2CON = 0b00000100;						// 1:1 prescaler
	PR2 = 0xFF;
	T0CON = 0x80;

	// Configure MSSP for SPI master mode
	SSPCON1 = 0b00110010;					// clock idle high, Clk /64

	SSPSTAT = 0b00000000;

	PIR1bits.TMR1IF = 0; 
	PIE1bits.TMR1IE = 1; 

	INTCONbits.PEIE = 1; 
	INTCONbits.GIE = 1; 

} // end InitializeSystem

void updateTime(void){
			INTCONbits.GIE=0;
		    oled_clear();
			r1[1]='h';
			r1[2]='+';
			r2[6]=' ';
			r2[7] = hours + 0x30;



			if(hours>=10){
				r2[6] = '1';
				r2[7] = (hours - 10)+ 0x30;
			}

			r2[8] = ':';
			r2[9] = minutes/10 + 0x30;
			r2[10] = minutes % 10 + 0x30;
			r2[11] = ':';
			r2[12] = seconds/10+ 0x30;
			r2[13] = seconds % 10+ 0x30;
	
			
			r1[19]='m';
			r1[20]='+';
			r1[21]='\n';
			oled_puts_2x(r1);
			oled_puts_2x(r2);
			oled_puts_2x(r3);
			oled_puts_2x(r4);
			oled_refresh();
			INTCONbits.GIE=1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -