|
اخي الحبيب حسن انتظر منك تصحيح الخطأ الموجود بالكود
وجزاكم الله عني بكل خير
|
السلام عليكم
نعم أخي يوجد أخطاء وسقوم بتعديل عليه فيما بعد
ارجو اطلاع على هذا مشروع لمصعد 16 طابق (( مشروع غيركامل )) مهم منه هو استفاده من استخدام متكامله 74hc165
http://arabsh.com/files/0c32444c67f6...floor-rar.html
كود:
#define so_165 portb.f0
#define so_165_dir trisb.f0
#define sh_165 portb.f1
#define sh_165_dir trisb.f1
#define clk_165 portb.f2
#define clk_165_dir trisb.f2
#define ds_595 portc.f2
#define ds_595_dir trisc.f2
#define st_cp_595 portc.f3
#define st_cp_595_dir trisc.f3
#define sh_cp_595 portc.f4
#define sh_cp_595_dir trisc.f4
#define segment portd
#define segment_dir trisd
#define en_seg1 portd.f4
#define en_seg1_dir trisd.f4
#define en_seg2 portd.f5
#define en_seg2_dir trisd.f5
#define input 1
#define output 0
#define up portc.f0
#define up_dir trisc.f0
#define down portc.f1
#define down_dir trisc.f1
#define is ==
#define on 1
#define off 0
#define set_bit(var,pos) (var|=1<<pos)
////////////////// varable ////////////////////////
char x=0 , cont=0, dd=0 ,k1=255 , bb=0;
char y=0 , i=0 ,n=0;
void motor_up();
void motor_down();
void direction(char mm);
void floor_check();
char floor_switch[16];
input_switch[16];
void show_number(char number);
/////////////////// init////////////////////////////
void init()
{
adcon1=6;
//eecon1=0b10000111;
so_165_dir= input;
clk_165_dir=sh_165_dir=output;
ds_595_dir= st_cp_595_dir=sh_cp_595_dir=output;
up=down=off;// off motor
up_dir =down_dir=output;
segment_dir=output;
segment=0x0f;// portd =0
en_seg1 =en_seg2 =off;
}
void main()
{
init();
if( eeprom_read(16) !=0xff)cont=eeprom_read(16);// cont mean the position now for eevaloter
if(eeprom_read(17) !=0xff)dd=eeprom_read(17); // dd mean the number floor to show 7 seg
while(1)
{
show_number(dd);
direction(1);// check floor down to up
if( k1 is 1 )motor_up();// runing motor
direction(0);
if( k1 is 0 ) motor_down();
}
}
void show_number(char number)
{
en_seg1=on; en_seg2=off;
segment=(segment & 0xf0)+(number/10);
delay_ms(1);
segment=(segment & 0xf0)+0x0f; // turn off segment
en_seg1=off; en_seg2=on;
segment=(segment & 0xf0)+(number%10);
delay_ms(1);
segment=(segment & 0xf0)+0x0f; // turn off segment
}
void floor_check()
{
clk_165 =0;
sh_165=0; sh_165=1;// puls from 0 to 1
for(i=0;i<16;i++)
{
floor_switch[i]=so_165;
clk_165 =0; clk_165 =1;// puls for clock from 0 to 1
}
/*for(i=0;i<16;i++)
{
if( floor_switch[i] is 1 )eeprom_write(i,1);// give me error in eeprom i dont know
}*/
for(i=0;i<16;i++)
{
//input_switch[i]=eeprom_read(i);
if( floor_switch[i] is 1)input_switch[i]=1;// store value for ani switch is pressed
}
}
void direction(char mm)
{
for(x=0;x<=15;x++)
{ floor_check(); // check switch for all flowers
//if( (EEPROM_Read(x) is 1) )
if( (input_switch[x] is 1) )
{
if((x-cont)>0 && mm==1)
{k1=1;
if((x-y)>0) y=x; // choice max. floor
}
if((cont-x)>0 && mm==0)
{k1=0;
if((y-x)>=0) y=x;// choice mim floor
}
}
}
}
void motor_up()
{
if(k1 is 1)
{
for(dd=cont+1;dd<=y;dd++) // cont mean poistion for lift and y mean last flower can be arrived
{
up=on; down=off;
for( bb=0;bb<=250;bb++)// equivalent delay_ms(2000);
{
delay_ms(10);
show_number(dd-1);// for example for(dd=cont+1;dd<=y;dd++) cont=0; y=1; ==> for(dd=1;dd<=1;dd++) this mean the eevaloter
// in floor 0 and must be up to floor 1 need for this project 2.5 second now if write show_number(dd)
// what show direct no floor 1 this not correct must be show no floor 0 this mean write show_number( dd-1)
direction(1);
}
if( input_switch[dd] is 1)
{ up=off; down=off;
input_switch[dd]=0;
for( bb=0;bb<=150;bb++) // this mean time delay 1.5 second
{
delay_ms(10);
show_number(dd);
direction(1);
}
}
eeprom_write(16,cont); // store value for position elevator
EEPROM_Write(17,dd); // store number for last floor for show in 7 seg
}
cont=y;
dd-=1;// this using show example for(dd=cont+1;dd<=y;dd++) , cont=0 y=1 ==> for(dd=1;dd<=1;dd++) this mean floor no 1 after that dd++
// equal 2 but dd<=1 this mean exit from for , now in void main() write show_number(dd) now without write dd-=1; the 7 seg
// will show no floor 2 this no true also show EEPROM_Write(17,dd); this mean without dd-=1; store no floor 2
eeprom_write(16,cont); // store value for position elevator
EEPROM_Write(17,dd); // store number for last floor for show in 7 seg
k1=255;//randam value
}
}
void motor_down()
{
if(k1 is 0){
for(dd=cont-1;dd>=y && dd!=255;dd--)
{
up=off; down=on;
portc&=3;// mean portc =portc & 0000 0011 // this clear all leds and no effect for bit 0 and bit 1
for( bb=0;bb<=200;bb++)
{
delay_ms(10);
show_number(dd+1);
direction(0);
}
if( input_switch[dd] is 1)
{ up=off; down=off;
//set_bit( portc,dd+2);
input_switch[dd]=0;
//eeprom_write(dd,0);
for( bb=0;bb<=100;bb++)
{
delay_ms(10);
show_number(dd);
direction(0);
}
}
eeprom_write(16,cont); // store value for position elevator
EEPROM_Write(17,dd); // store number for last floor for show in 7 seg
}
cont=y;
dd+=1;
eeprom_write(16,cont); // store value for position elevator
EEPROM_Write(17,dd); // store number for last floor for show in 7 seg
k1=255;
}
}