saobang_1010
28-02-2010, 11:21 AM
Chào các anh chị và các bạn trên diễn đàn, em muốn hỏi vấn đề liên quan đến việc mở rộng đầu ra cho pic .Ở đây em mở rộng bằng cách quét 74151 (dmux), em viết chương trình và mô phỏng trên protues chạy đúng nhưng khi nạp xuống mạch thật lại chạy không đúng.Cụ thể là trong chương trình tại một thời điểm em chỉ quét một địa chỉ và đợi tín hiệu tác động vào đúng chân ứng với địa chỉ đó , ví dụ như a=0,b=0,c=0 ứng với D0 nhưng khi chạy thực tế thì lại không đúng như vậy tác động vào bất kì đầu vào nào ví dụ như D1,d2... đều chạy các chương trình như nhau , em không hiểu tại sao, mong mọi người giúp em với không biết chương trình em sai ở đâu ạ.
Đây là chương trình của em.
#include <18f4431.h>
#use delay (clock=20M)
#fuses nowdt, hs,noprotect, nolvp,hpol_low
#include <lcd_lib_4bitrobo.c>
//*********************************************
#byte TRISE = 0xF96
#byte TRISD = 0xF95
#byte TRISC = 0xF94
#byte TRISB = 0xF93
#byte TRISA = 0xF92
#byte LATE = 0xF8D
#byte LATD = 0xF8C
#byte LATC = 0xF8B
#byte LATB = 0xF8A
#byte LATA = 0xF89
#byte PORTD = 0xF83
#byte PORTC = 0xF82
#byte PORTA = 0xF80
#byte PORTE = 0xF84
#byte PORTB = 0xF81
#bit d1= portd.4
#bit c1= portc.7
#bit b1= portc.6
#bit a1=portc.5
#bit y=portc.4
int8 a,b,c,d;
//------------------------------------------------
void main ()
{ trisb=0x00;
trisc=0b00010000;
trisd=0x00;
trisa=0xff;
trise=0x00;
output_high (pin_b1);
output_high (pin_b3);
output_high (pin_b4);
output_high (pin_d7);
setup_power_pwm(PWM_CLOCK_DIV_4 | PWM_FREE_RUN ,1,0,300,0,1,0);
setup_power_pwm_pins(PWM_ODD_ON,PWM_ODD_ON,PWM_ODD _ON,PWM_ODD_ON);
set_power_pwm0_duty(0);
set_power_pwm2_duty(0);
set_power_pwm4_duty(0);
set_power_pwm6_duty(0);
{
set_power_pwm0_duty(300);
while (true)
{
d=0;c=1;b=0;a=0;
d1=d;c1=c;b1=b;a1=a;
if (y==1)
{
set_power_pwm0_duty(0);
set_power_pwm2_duty(500);
break;}}
delay_ms(500);
while (true)
{
d=0;c=0;b=1;a=0;
d1=d;c1=c;b1=b;a1=a;
if (y==1)
{
set_power_pwm2_duty(0);
set_power_pwm4_duty(300);
break;}}
delay_ms(500);
while (true)
{
d=0;c=0;b=0;a=1;
d1=d;c1=c;b1=b;a1=a;
if (y==1)
{ set_power_pwm4_duty(0);
set_power_pwm6_duty(300);
break;}}
while (true)
{
d=0;c=0;b=0;a=0;
d1=d;c1=c;b1=b;a1=a;
if (y==1)
{ // set_power_pwm4_duty(0);
set_power_pwm6_duty(0);
break;
}
while (true)
()
}
Đây là chương trình của em.
#include <18f4431.h>
#use delay (clock=20M)
#fuses nowdt, hs,noprotect, nolvp,hpol_low
#include <lcd_lib_4bitrobo.c>
//*********************************************
#byte TRISE = 0xF96
#byte TRISD = 0xF95
#byte TRISC = 0xF94
#byte TRISB = 0xF93
#byte TRISA = 0xF92
#byte LATE = 0xF8D
#byte LATD = 0xF8C
#byte LATC = 0xF8B
#byte LATB = 0xF8A
#byte LATA = 0xF89
#byte PORTD = 0xF83
#byte PORTC = 0xF82
#byte PORTA = 0xF80
#byte PORTE = 0xF84
#byte PORTB = 0xF81
#bit d1= portd.4
#bit c1= portc.7
#bit b1= portc.6
#bit a1=portc.5
#bit y=portc.4
int8 a,b,c,d;
//------------------------------------------------
void main ()
{ trisb=0x00;
trisc=0b00010000;
trisd=0x00;
trisa=0xff;
trise=0x00;
output_high (pin_b1);
output_high (pin_b3);
output_high (pin_b4);
output_high (pin_d7);
setup_power_pwm(PWM_CLOCK_DIV_4 | PWM_FREE_RUN ,1,0,300,0,1,0);
setup_power_pwm_pins(PWM_ODD_ON,PWM_ODD_ON,PWM_ODD _ON,PWM_ODD_ON);
set_power_pwm0_duty(0);
set_power_pwm2_duty(0);
set_power_pwm4_duty(0);
set_power_pwm6_duty(0);
{
set_power_pwm0_duty(300);
while (true)
{
d=0;c=1;b=0;a=0;
d1=d;c1=c;b1=b;a1=a;
if (y==1)
{
set_power_pwm0_duty(0);
set_power_pwm2_duty(500);
break;}}
delay_ms(500);
while (true)
{
d=0;c=0;b=1;a=0;
d1=d;c1=c;b1=b;a1=a;
if (y==1)
{
set_power_pwm2_duty(0);
set_power_pwm4_duty(300);
break;}}
delay_ms(500);
while (true)
{
d=0;c=0;b=0;a=1;
d1=d;c1=c;b1=b;a1=a;
if (y==1)
{ set_power_pwm4_duty(0);
set_power_pwm6_duty(300);
break;}}
while (true)
{
d=0;c=0;b=0;a=0;
d1=d;c1=c;b1=b;a1=a;
if (y==1)
{ // set_power_pwm4_duty(0);
set_power_pwm6_duty(0);
break;
}
while (true)
()
}