التجربة رقم 6 :
الغرض :
استخدام العداد 4017 لمسح الأعمدة , حيث يتم إجراء "خمس إزاحات" "5-shift" وبعد ذلك تتم "الإعادة" reset .
لغة الأسمبلى :
لغة السى :
كود:
//PIC16F628A
//A single illumination LED
//across the bottom row off LEDs
void RESET_4017(viod){
PORTA.F1=1; //Reset 4017 : Line HIGH
PORTA.F1=0; //then LOW
}
void CLOCK_4017(void){
PORTA.F0=1; // Clock 4017 : Line HIGH
PORTA.F0=0; //then LOW
}
void main( ){
TRISA=0;
TRISB=0;
while (1){
RESET_4017(); //Reset 4017 , column 1 only active
PORTB=1; //Turn on bottom LED 1 , fixed for every column
delay_ms(500); //Illuminate LED 1
CLOCK_4017(); //Call clock 4017 , column 2 only active
delay_ms(500); //Illuminate LED 2
CLOCK_4017(); //Call clock 4017 , column 3 only active
delay_ms(500); //Illuminate LED 3
CLOCK_4017(); //Call clock 4017 , column 4 only active
delay_ms(500); //Illuminate LED 4
CLOCK_4017(); //Call clock 4017 , column 5only active
delay_ms(500); //Illuminate LED 5
}
}
ملحوظة 1 :
لعلك لاحظت أنه قد تم إنشاء دالة لإعادة reset ودالة لتوقيت العداد 4017 , بغرض تسهيل كتابة وفهم البرنامج , وصيغها كالتالى :
كود:
void RESET_4017(viod){
PORTA.F1=1; //Reset 4017 : Line HIGH
PORTA.F1=0; //then LOW
}
void CLOCK_4017(void){
PORTA.F0=1; // Clock 4017 : Line HIGH
PORTA.F0=0; //then LOW
}
ملحوظة 2 :
جزء الكود التالى :
كود:
CLOCK_4017(); //Call clock 4017 , column 2 only active
delay_ms(500); //Illuminate LED 2
CLOCK_4017(); //Call clock 4017 , column 3 only active
delay_ms(500); //Illuminate LED 3
CLOCK_4017(); //Call clock 4017 , column 4 only active
delay_ms(500); //Illuminate LED 4
CLOCK_4017(); //Call clock 4017 , column 5only active
delay_ms(500); //Illuminate LED 5
هو تكرار أربع مرات للعبارة :
كود:
CLOCK_4017();
delay_ms(500);
لذلك يمكن استخدام حلقة تكرار عدد المرات for كما يلى :
كود:
for(count=0;count<4;count++){
CLOCK_4017();
delay_ms(500);
}
ويجب إعلان متغير عداد الحلقة count مسبقا .
ويصبح البرنامج :
كود:
unsigned short count; //Loop count variable
void RESET_4017(viod){
PORTA.F1=1; //Reset 4017 : Line HIGH
PORTA.F1=0; //then LOW
}
void CLOCK_4017(void){
PORTA.F0=1; // Clock 4017 : Line HIGH
PORTA.F0=0; //then LOW
}
void main( ){
TRISA=0;
TRISB=0;
while (1){
RESET_4017(); //Reset 4017 , column 1 only active
PORTB=1; //Turn on bottom LED 1 , for every column
delay_ms(500); //Illuminate LED 1
for(count=0;count<4;count++){
CLOCK_4017();//Illumination LED 2 to LED 5
delay_ms(500);
}
}
}