السلام عليكم
برمجه النظام الموجود في هذا الرابط مشاركه 116
http://www.qariya.info/vb/showthread...612#post957612
تم تنفيذ كود وتجربته بشكل عملي
http://up.top4top.net/downloadf-top4...cc841-rar.html
كود:
//#define Check_bit(var,pos) (var&(1<<pos))
//#define set_bit(var,pos) (var|=(1<<pos) )
//#define clear_bit(var,pos) ( var&=~(1<<pos) )
sbit sh_cp at LATA4_bit;
sbit sh_cp_dir at TRISA4_bit;
sbit st_cp at LATC0_bit;
sbit st_cp_dir at TRISC0_bit;
sbit ds at LATC1_bit;
sbit ds_dir at TRISC1_bit;
//******************************************************
/////***************input define ***********************//
sbit input1 at RA0_bit;
sbit input2 at RA1_bit;
sbit input3 at RA2_bit;
sbit input4 at RA3_bit;
sbit input5 at RA5_bit;
sbit input6 at RE0_bit;
sbit input7 at RE1_bit;
sbit input8 at RE2_bit;
sbit input9 at RD2_bit;
sbit input10 at RD3_bit;
sbit input1_dir at TRISA0_bit;
sbit input2_dir at TRISA1_bit;
sbit input3_dir at TRISA2_bit;
sbit input4_dir at TRISA3_bit;
sbit input5_dir at TRISA5_bit;
sbit input6_dir at TRISE0_bit;
sbit input7_dir at TRISE1_bit;
sbit input8_dir at TRISE2_bit;
sbit input9_dir at TRISD2_bit;
sbit input10_dir at TRISD3_bit;
//*************************end define input **************************************//
char keypadPort at PORTB;
//*********************************//
//w3Lcd0 pin definitions:
sbit w3Lcd0_EN at LATC5_bit;
sbit w3Lcd0_DATA at LATC3_bit;
sbit w3Lcd0_CLOCK at LATC4_bit;
sbit led_lcd at LATC2_bit;
sbit w3Lcd0_EN_Direction at TRISC5_bit;
sbit w3Lcd0_DATA_Direction at TRISC3_bit;
sbit w3Lcd0_CLOCK_Direction at TRISC4_bit;
sbit led_lcd_Direction at TRISC2_bit;
//************************************//
//***************************** define speaker ***************************//
sbit speaker at LATD4_bit;
sbit speaker_dir at TRISD4_bit;
//****************************define variable && function ***************
char input_flag=0,output_all_off_on=0 , display_flag=0;
unsigned int value_out=0 ,value_keypad=0 ;
char x,output_relay[1],output_relay_save[1] ;
char value_from_keypad=0 , flag_keypad=0 ;
char flag_state_output_function=0 , inital_value=0;
//uart //
unsigned char recived_data_from_uart=0,cont1_uart=0,cont2_uart=0 , flag_recive_from_uart=0;
void init_pic();
void display();
void switch_states();
void output_relay_action(char input, char state_input);
void keypad_state();
void output_action ( unsigned char output_vaule_);
//***************** end define variable && function **********************//
void init_pic()
{
ANSELA=0;
ANSELB=0;
ANSELC=0;
ANSELD=0;
ANSELE=0;
SLRCON=0;
//********************************************************************//
output_relay[0]=0;
input1_dir=1; input2_dir=1; input3_dir=1; input4_dir=1; input5_dir=1;
input6_dir=1; input7_dir=1; input8_dir=1; input9_dir=1; input10_dir=1;
input_flag.b0=~input1;
input_flag.b1=~input2;
input_flag.b2=~input3;
input_flag.b3=~input4;
input_flag.b4=~input5;
input_flag.b5=~input6;
input_flag.b6=~input7;
input_flag.b7=~input8;
//************************************************************************//
speaker_dir=0; speaker=0;
//*********************************************************************//
ic_74hc595_init(1);
//***********************************************************************//
//***LCD ***//
led_lcd_Direction=0;// lcd led
led_lcd=1;// on led for lcd
Keypad_Init();
w3Lcd0_Init();
w3Lcd0_Command(_lcd_cursor_off); // to turn off Cursor
w3Lcd0_GotoYX(0,0);
w3Lcd0_CstrOut("welcome");
Delay_ms(1000); /* One second pause */
w3Lcd0_Command(_lcd_clear); // to turn off Cursor
w3Lcd0_GotoYX(0,0);
w3Lcd0_CstrOut("IN:");
w3Lcd0_GotoYX(1,0);
w3Lcd0_CstrOut("OUT:");
//*************************** uart ******************************************//
RC1IE_bit = 1; // turn ON interrupt on UART1 receive
RC1IF_bit = 0; // Clear interrupt flag
//RC2IE_bit = 1; // turn ON interrupt on UART2 receive
//RC2IF_bit = 0; // Clear interrupt flag
PEIE_bit = 1; // Enable peripheral interrupts
UART1_Init(19200); // initialize UART1 module
Delay_ms(200);
//************************************************************************
GIE_bit = 1; // Enable GLOBAL interrupts
}
//*************************************************************//
void output_relay_action(char input, char state_input)
{
ic_74hc595(input,state_input,output_relay,output_relay_save);
display_flag=1;
output_all_off_on=0;
}
//********************************************************//
// Interrupt routine
void interrupt()
{
char temp=0;
if(RC1IF_bit==1 ) // RxON , RxOFF; where x=0...9
{
RC1IF_bit = 0;
temp=UART1_Read();
switch(cont1_uart)
{
case 0 : if(temp=='R'){ recived_data_from_uart=0; cont1_uart=1;}
else cont1_uart=0;
break;
case 1 :if(temp >='0' && temp <='9'){ recived_data_from_uart=temp-48; cont1_uart=2;}
else cont1_uart=0;
break;
case 2 :if(temp=='O') cont1_uart=3;
else cont1_uart=0;
break;
case 3 :if(temp=='N')
{
value_out=(recived_data_from_uart*10)+1;
cont1_uart=0;
flag_state_output_function=3;
}
else if(temp=='F')cont1_uart=4;
else cont1_uart=0;
break;
case 4 :if(temp=='F')
{
value_out=(recived_data_from_uart*10);
cont1_uart=0;
flag_state_output_function=3;
}
cont1_uart=0;
break;
}
}
}
//****************************************************************//
void main()
{
init_pic();
speaker=1;
delay_ms(1000);
speaker=0;
while(1)
{
switch_states();
keypad_state();
if(value_out !=0)output_action(value_out);
if( display_flag==1)display();
}
}
//*********************************************************//
void display()
{
unsigned char input_value;
input_value= ~ input_flag;
display_flag=0;
w3Lcd0_GotoYX(1,8);
for(x=0;x<8;x++)
{
if(output_relay_save[0]&(1<<x)) w3Lcd0_WriteChar('1');
else w3Lcd0_WriteChar('0');
}
w3Lcd0_GotoYX(0,8);
for(x=0;x<8;x++)
{
if(input_value&(1<<x)) w3Lcd0_WriteChar('1');
else w3Lcd0_WriteChar('0');
}
w3Lcd0_GotoYX(1,5);
switch (flag_state_output_function)
{
case 1 : w3Lcd0_RstrOut("SW");break;// control from input
case 2 : w3Lcd0_RstrOut("KE");break;// control from keybad
case 3 : w3Lcd0_RstrOut("UR"); // control from computer
// send feed back for output
UART1_Write_Text("OUTPUT=");
UART1_Write(output_relay_save[0]/100+48);
UART1_Write((output_relay_save[0]/10)%10+48);
UART1_Write(output_relay_save[0]%10+48);
break;
default : break;
}
flag_state_output_function=0;
}
//***********************************************************//
void switch_states()
{
inital_value=input_flag;
if(input1==1 && input_flag.b0==0)
{
input_flag.b0=1;
value_out=10;
}
else if(input1==0 && input_flag.b0==1)
{
input_flag.b0=0 ;
value_out=11;
}
if(input2==1 && input_flag.b1==0)
{
input_flag.b1=1 ;
value_out=20;
}
else if(input2==0 && input_flag.b1==1)
{
input_flag.b1=0;
value_out=21;
}
if(input3==1 && input_flag.b2==0)
{
input_flag.b2=1;
value_out=30;
}
else if(input3==0 && input_flag.b2==1)
{
input_flag.b2=0;
value_out=31;
}
if(input4==1 && input_flag.b3==0)
{
input_flag.b3=1;
value_out=40;
}
else if(input4==0 && input_flag.b3==1)
{
input_flag.b3=0;
value_out=41;
}
if(input5==1 && input_flag.b4==0)
{
input_flag.b4=1;
value_out=50;
}
else if(input5==0 && input_flag.b4==1)
{
input_flag.b4=0;
value_out=51;
}
if(input6==1 && input_flag.b5==0)
{
input_flag.b5=1;
value_out=60;
}
else if(input6==0 && input_flag.b5==1)
{
input_flag.b5=0;
value_out= 61;
}
if(input7==1 && input_flag.b6==0)
{
input_flag.b6=1;
value_out=70;
}
else if(input7==0 && input_flag.b6==1)
{
input_flag.b6=0;
value_out=71;
}
if(input8==1 && input_flag.b7==0)
{
input_flag.b7=1;
value_out=80;
}
else if(input8==0&& input_flag.b7==1)
{
input_flag.b7=0;
value_out=81;
}
if(input9==0 && output_all_off_on==0)
{
value_out=90;
output_all_off_on=255;
}
if(input10==0 && output_all_off_on==255)
{
value_out=91;
output_all_off_on=0;
}
if(inital_value !=input_flag)flag_state_output_function=1;// action by switch
delay_ms(100);
}
//**********************************************************//
void keypad_state()
{
value_from_keypad=keypad_4x4();
if(value_from_keypad !='F')
{
if(value_from_keypad>=0 && value_from_keypad<=9)
{
flag_keypad++;
if(flag_keypad>=3)flag_keypad=1;
if(flag_keypad==1)value_keypad=value_from_keypad;
else if(flag_keypad==2)value_keypad =(value_keypad*10)+value_from_keypad;
w3Lcd0_GotoYX(0,3);
w3Lcd0_CstrOut("K=");
w3Lcd0_WriteChar( value_keypad/10+48);
w3Lcd0_WriteChar( value_keypad%10+48);
}
else w3Lcd0_WriteChar( value_from_keypad);
if(value_from_keypad=='#' && flag_keypad==2)
{
flag_keypad=0;
w3Lcd0_GotoYX(0,3);
w3Lcd0_CstrOut(" ");
value_out=value_keypad;
flag_state_output_function=2;
}
}
}
//****************************************************************//
void output_action ( unsigned char output_vaule_)
{
value_out=0;
switch(output_vaule_)
{
case 10 : output_relay_action(1,0);break;
case 11 : output_relay_action(1,1);break;
case 20 : output_relay_action(2,0);break;
case 21 : output_relay_action(2,1);break;
case 30 : output_relay_action(3,0);break;
case 31 : output_relay_action(3,1);break;
case 40 : output_relay_action(4,0);break;
case 41 : output_relay_action(4,1);break;
case 50 : output_relay_action(5,0);break;
case 51 : output_relay_action(5,1);break;
case 60 : output_relay_action(6,0);break;
case 61 : output_relay_action(6,1);break;
case 70 : output_relay_action(7,0);break;
case 71 : output_relay_action(7,1);break;
case 80 : output_relay_action(8,0);break;
case 81 : output_relay_action(8,1);break;
case 90 : for(x=1;x<=8;x++)output_relay_action(x,0);break;
case 91 : for(x=1;x<=8;x++)output_relay_action(x,1);break;
default : break;
}
}