pic18f4550 程式設定
#include <xc.h>
#pragma config CPUDIV = OSC1_PLL2, FOSC = HS
#pragma config WDT = OFF, PBADEN = OFF, XINST = OFF, LVP = OFF
#include <xc.h>
void delay_ms(unsigned int ms);
void init_TMR0(void);
void TMR0_INTEN(void);
extern unsigned char sta;
//---
void led_scan(void);
//---
unsigned char sta=0;
void dipsw(void){
unsigned char r;
TRISE = 0x07;
r = PORTEbits.RE0*4;
r += PORTEbits.RE1*2;
r += PORTEbits.RE2*1;
sta = r;
}
//---
volatile unsigned int tick;
void interrupt HighISR(void)
{
if (TMR0IE && TMR0IF)
{
TMR0H = (65536-4000)/256;
TMR0L = (65536-4000)&0xFF;
TMR0IF = 0;
led_scan();
dipsw();
tick++;
}
}
void delay_ms(unsigned int ms){
ms += tick;
while(ms!=tick){}
}
void init_TMR0(void){
T0CON = 0x88;
TMR0H = (65536-4000)/256;
TMR0L = (65536-4000)&0xFF;
TMR0IF=0;
}
void TMR0_INTEN(void){
TMR0IF = 0;
TMR0IE = 1;
TMR0IP = 1;
IPEN =1;
GIEL =1;
GIEH =1;
}
#include <xc.h>
void pwm0_on(unsigned char p);
void pwm0_off(void);
void pwm1_on(unsigned char p);
void pwm1_off(void);
//---- PWM
void pwm0_on(unsigned char p){
unsigned int r16;
//--- TMR2
TRISC2 = 0;
T2CON = 6;
//--- PWM
CCP1CON = 12; //RC2 -- D3
CCPR1L = 58;
PR2 = 83-1;
r16 = PR2 * p;
r16 = (r16+50)/100;
CCPR1L = r16;
}
void pwm0_off(void){
//T2CON=0;
CCP1CON=0;
TRISC2 = 0;
LATC2 = 0;
}
void pwm1_on(unsigned char p){
unsigned int r16;
//--- TMR2
TRISC1 = 0;
T2CON = 6;
//--- PWM
CCP2CON = 12; //RC2 -- D3
CCPR2L = 58;
PR2 = 83-1;
r16 = PR2 * p /2;
r16 = (r16+50)/100;
CCPR2L = r16;
}
void pwm1_off(void){
//T2CON
CCP2CON=0;
TRISC1 = 0;
LATC1 = 0;
}
//----
#include <xc.h>
void led_scan(void);
void led_dec(unsigned char hh, unsigned char ll);
void led_dot(unsigned char n);
void led_lv(unsigned char n);
const unsigned char seg[]={
0b11111100,
0b01100000,
0b11011010,
0b11110010,
0b01100110,
0b10110110,
0b10111110,
0b11100000,
0b11111110,
0b11110110
};
unsigned char li=0, tp=0;
unsigned char D1=2,D2=0,D3=1,D4=7;
unsigned char LV=3;
void led_scan(void){
unsigned char dot;
TRISD = 0;
TRISB &= 0xF0;
LATB |= 0x0F;
dot = 1;
switch(li){
case 0: //--- D1
if (tp & 0b1000){ dot = 0; }
LATD = ~seg[D1];
LATB3=0;
break;
case 1: //--- D2
if (tp & 0b0100){ dot = 0; }
LATD = ~seg[D2];
LATB2=0;
break;
case 2: //--- D3
if (tp & 0b0010){ dot = 0; }
LATD = ~seg[D3];
LATB1=0;
break;
case 3: //--- D4
if (tp & 0b0001){ dot = 0; }
LATD = ~seg[D4];
LATB0=0;
break;
}
li++;
if(li>12){ li=12; }
if(li>LV){ li=0; }
LATD0 = dot;
}
void led_dec(unsigned char hh, unsigned char ll){
D1 = hh/10; D2 = hh%10;
D3 = ll/10; D4 = ll%10;
}
void led_dot(unsigned char n){
tp = n;
}
void led_lv(unsigned char n){
switch(n){
case 0: LV=16-1; break;
case 1: LV=12-1; break;
case 2: LV=8-1; break;
case 3: LV=4-1; break;
}
}
#include <xc.h>
unsigned int get_adc(unsigned char n);
unsigned int get_adc(unsigned char n){
TRISA |= 0x0F;
ADCON0 = 0b00000001;
ADCON1 = 0b00001011;
ADCON2 = 0b10111101;
switch(n){
case 0: ADCON0 = 0b00000001; break;
case 1: ADCON0 = 0b00000101; break;
case 2: ADCON0 = 0b00001001; break;
case 3: ADCON0 = 0b00001101; break;
}
GO = 1;
while(GO==1){}
return ADRES;
}
#include <xc.h>
void led_on(unsigned char n);
void led_off(unsigned char n);
void led_tgl(unsigned char n);
void led_on(unsigned char n){
switch(n){
case 1: TRISB4=0; LATB4=1; break;
case 2: TRISB5=0; LATB5=1; break;
case 3: TRISC2=0; LATC2=1; break;
case 100: LATB4=LATB5=LATC2=1; break;
}
}
void led_off(unsigned char n){
switch(n){
case 1: TRISB4=0; LATB4=0; break;
case 2: TRISB5=0; LATB5=0; break;
case 3: TRISC2=0; LATC2=0; break;
case 100: LATB4=LATB5=LATC2=0; break;
}
}
void led_tgl(unsigned char n){
switch(n){
case 1: TRISB4=0; LATB4^=1; break;
case 2: TRISB5=0; LATB5^=1; break;
case 3: TRISC2=0; LATC2^=1; break;
case 100:
LATB4^=1;
LATB5^=1;
LATC2^=1;
break;
}
}
#include <xc.h>
//--- tmr0.c
void delay_ms(unsigned int ms);
void init_TMR0(void);
void TMR0_INTEN(void);
extern unsigned char sta;
//--- 7seg.c
void led_scan(void);
void led_dec(unsigned char hh, unsigned char ll);
void led_dot(unsigned char n);
void led_lv(unsigned char n);
//--- led.c
void led_on(unsigned char n);
void led_off(unsigned char n);
void led_tgl(unsigned char n);
//--- adc.c
unsigned int get_adc(unsigned char n);
//--- pwm.c
void pwm0_on(unsigned char p);
void pwm0_off(void);
void pwm1_on(unsigned char p);
void pwm1_off(void);
void TASK_11(void){
led_dot(0b1000);
led_off(1);
led_on(2);
while(1){
unsigned int r16;
r16 = get_adc(1);
if(r16>1000){ r16=1000; }
r16 = r16 *5;
led_dec(r16/100, r16%100);
delay_ms(100);
//---
if(sta != 0){ break;}
}
}
void TASK_12(void){
led_dot(0b1000);
led_on(1); led_off(2);
while(1){
unsigned int r16;
r16 = get_adc(2);
if(r16>1000){ r16=1000; }
r16 = r16 *5;
led_dec(r16/100, r16%100);
delay_ms(100);
//---
if(sta != 1){ break;}
}
}
void TASK_13(void){
led_dot(0b1000);
led_on(1); led_on(2);
while(1){
unsigned int r16;
r16 = get_adc(3);
if(r16>1000){ r16=1000; }
r16 = r16 *5;
led_dec(r16/100, r16%100);
//---
if(sta != 2){ break;}
}
}
void TASK_2(void){
led_dot(0b0010);
led_on(1); led_off(2);
while(1){
unsigned int r16;
r16 = get_adc(2);
if(r16>1000){ r16=1000; }
pwm0_on(r16/10);
led_dec(r16/100, r16%100);
delay_ms(100);
//---
if(sta != 3){ break;}
}
//---
pwm0_off();
}
void TASK_3(void){
led_dot(0b0010);
led_on(1); led_off(2);
while(1){
unsigned int r16;
r16 = get_adc(3);
if(r16>1000){ r16=1000; }
if(r16>300){
r16=500;
pwm1_on(50);
}else{
r16=0;
pwm1_off();
}
led_dec(r16/100, r16%100);
delay_ms(100);
//---
if(sta != 4){ break;}
}
pwm1_off();
}
void TASK_4(void){
led_dot(0b0010);
led_on(1); led_on(2);
//---
while(1){
unsigned long r16;
r16 = get_adc(0);
r16 = r16 * 600;
r16 = (r16+512)/1023;
r16 = r16 + 200;
//---
led_dec(r16/100, r16%100);
delay_ms(100);
if(sta != 5){ break;}
}
//---
}
void TASK_5(void){
led_dot(0b1010);
while(1){
unsigned int r16;
r16 = get_adc(2);
r16 = r16 /256;
switch(r16){
case 0:
led_off(1); led_off(2);
led_lv(0);
break;
case 1:
led_off(1); led_on(2);
led_lv(1);
break;
case 2:
led_on(1); led_off(2);
led_lv(2);
break;
case 3:
led_on(1); led_on(2);
led_lv(3);
break;
}
led_dec(88,88);
delay_ms(100);
if(sta != 6){ break;}
}
//---
led_lv(3);
}
void TASK_6(void){
unsigned int t1,t2,t3,ff;
led_dot(0b0010);
led_on(1); led_off(2);
T1CON=0x81;
ADCON1=0x0F;
TRISA0 = 1;
while(1){
int i;
for(i=0;i<20;i++){
while(PORTAbits.RA0==1){} //Low
while(PORTAbits.RA0==0){} //High
t1 = TMR1L;
t1 = t1 + (unsigned int)TMR1H*256;
while(PORTAbits.RA0==1){} //Low
while(PORTAbits.RA0==0){} //High
t2 = TMR1L;
t2 = t2 + (unsigned int)TMR1H*256;
t3 = t2 - t1;
ff = 4000000ul*10 / t3 ;
if(ff>4999){ ff=4999; }
led_dec(ff/100, ff%100);
delay_ms(100);
}
led_on(1); led_off(2);
for(i=0;i<20;i++){
while(PORTAbits.RA0==1){} //Low
while(PORTAbits.RA0==0){} //High
t1 = TMR1L;
t1 = t1 + (unsigned int)TMR1H*256;
while(PORTAbits.RA0==1){} //Low
while(PORTAbits.RA0==0){} //High
t2 = TMR1L;
t2 = t2 + (unsigned int)TMR1H*256;
t3 = t2 - t1;
ff = 4000000ul*10 / t3 ;
if(ff>4999){ ff=4999; }
led_dec(ff/100, ff%100);
delay_ms(100);
}
led_off(1); led_on(2);
//---
if(sta != 7){ break;}
}
T1CON=0;
}
//-----
void init(void){
init_TMR0();
TMR0_INTEN();
ADCON1 = 0x0F;
}
void main(void) {
init();
while(1){
switch(sta){
case 0: TASK_11(); break;
case 1: TASK_12(); break;
case 2: TASK_13(); break;
case 3: TASK_2(); break;
case 4: TASK_3(); break;
case 5: TASK_4(); break;
case 6: TASK_5(); break;
case 7: TASK_6(); break;
}
}
}