#include <16f887.h>
#include <DEF_16F887.h>
#fuses HS, NOWDT, NOPROTECT, NOLVP, NOBROWNOUT
#use delay(clock=20000000)
//khai bao cac port su dung
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
//khai bao dia chi port
#byte porta=0x05
#byte portb=0x06
#byte portc=0x07
#byte portd=0x08
#byte porte=0x09
//khai bao cac thu vien su dung
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#bit bt1 = portd.7
#bit bt2 = portd.6
#bit bt3 = portd.5
#bit relay = portd.3
#bit sv_r = porte.0
#bit sv_g = porte.1
#bit sv_b = porte.2
#bit data = portc.2
#bit stcp = portc.1
#bit shcp = portc.0
#bit s2 = portb.1
#bit s3 = portb.2
#bit s1 = portb.3
#bit s0 = portb.4
#bit led = portb.5
unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
unsigned int16 pulse=0, pulse_r=0, pulse_g=0, pulse_b=0;
unsigned int val_r=0, val_g=0, val_b=0;
unsigned int step=0, color=0;
1
#INT_EXT
void ngat()
{
pulse++;
}
#INT_TIMER1
void ngat_time()
{
step++;
switch(step)
{
case 1: //1.5ms
sv_r=1; sv_g=1; sv_b=1;
set_timer1(59535);
break;
case 2: //0.3ms
switch(color)
{
case 1:
sv_r=0;
break;
case 2:
sv_g=0;
break;
case 3:
sv_b=0;
break;
default:
break;
}
set_timer1(63035);
break;
case 3: //8.2ms
sv_r=0; sv_g=0; sv_b=0;
set_timer1(24535);
break;
case 4: //10ms
2
sv_r=0; sv_g=0; sv_b=0;
set_timer1(15535);
step=0;
break;
default:
break;
}
}
void IC_74hc595(int val)
{
unsigned char i;
shcp = 0;
for(i=0;i<=7;i++)
{
if((val & 0x80)==0) data=0;
else
data=1;
val=val<<1;
shcp=1;
shcp=0;
}
}
void show_led(unsigned int val1, unsigned int val2, unsigned int val3)
{
IC_74hc595(Code7Seg[val1]);
IC_74hc595(Code7Seg[val2]);
IC_74hc595(Code7Seg[val3]);
stcp=0;
delay_us(5);
stcp=1;
stcp=0;
}
void read_color()
{
s2=0; s3=0; pulse=0; delay_ms(10); pulse_r = pulse; // doc tin ieu mau do
s2=1; s3=1; pulse=0; delay_ms(10); pulse_g = pulse; // doc tin ieu mau xanh la
s2=0; s3=1; pulse=0; delay_ms(10); pulse_b = pulse; // doc tin ieu mau xanh duong
if((pulse_r>pulse_g)&&(pulse_r>pulse_b)&&(pulse_r>100))
{
if(val_r++>9)
val_r=0;
write_eeprom(0x00, val_r);
3
show_led(val_b,val_g,val_r);
color=1;
delay_ms(8000);
}
if((pulse_g>pulse_r)&&(pulse_g>pulse_b)&&(pulse_g>50))
{
if(val_g++>9)
val_g=0;
write_eeprom(0x01, val_g);
show_led(val_b,val_g,val_r);
color=2;
delay_ms(10000);
}
if((pulse_b>pulse_g)&&(pulse_b>pulse_r)&&(pulse_b>100))
{
if(val_b++>9)
val_b=0;
write_eeprom(0x02, val_b);
show_led(val_b,val_g,val_r);
color=3;
delay_ms(12000);
}
if((pulse_r<100)&&(pulse_g<100)&&(pulse_b<100))
{
color=0;
}
}
void pulsh_button()
{
if(bt1==0)
{
delay_ms(1000);
relay =~ relay;
while(bt1==0){};
}
if(bt2==0)
{
delay_ms(100);
val_r=0; val_g=0; val_b=0;
write_eeprom(0x00, val_r);
write_eeprom(0x01, val_g);
write_eeprom(0x02, val_b);
4
show_led(val_b,val_g,val_r);
while(bt2==0){};
}
}
void main()
{
set_tris_a(0b000110);
set_tris_b(0b00000001);
set_tris_d(0b11100000);
set_tris_c(0b10000000);
set_tris_e(0b000);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
set_timer1(55035);
enable_interrupts(INT_TIMER1);
s0=1; s1=0; //f=100%
led=1;
val_r = read_eeprom(0x00);
val_g = read_eeprom(0x01);
val_b = read_eeprom(0x02);
show_led(val_b,val_g,val_r);
while(TRUE)
{
read_color();
pulsh_button();
}
}
5