البرمجة بلغة السى والمترجم ميكروسى برو :
1- تفعيل العامود الأول فقط , عن طريق استدعاء دالة الإعادة void RESET_4017 ثم إخراج بيانات العامود الأول 0x55 على المنفذ PORTB=0x55 . يلى ذلك تأخير طويل للمسح البطىء ( لملاحظة التغيرات) أو تأخير قصير للمسح السريع (لدمج الشكل) . فى النهاية يتم فصل المنفذ PORTB=0 إستعدادا للعامود التالى .
2- فصل العامود الأول وتفعيل العامود الثانى , عن طريق استدعاء دالة التوقيت void CLOCK_4017 ثم إخراج بيانات العامود الثانى 0x2A على المنفذ PORTB=0x2A . يلى ذلك تأخير طويل للمسح البطىء ( لملاحظة التغيرات) أو تأخير قصير للمسح السريع (لدمج الشكل) . فى النهاية يتم فصل المنفذ PORTB=0 إستعدادا للعامود التالى .
3- تكرار الخطوة السابقة مع العامود الثالث والرابع والخامس .
4- ونظرا لتكرار مجموعات تعليمات البرنامج يتم استخدام حلقة for فى تنفيذ البرنامج , مع تمرير عناصر مصفوفة إلى بيانات المنفذ ليكون البرنامج كما يلى :
كود:
//PIC16F628A , Internal clock , 4MHz
// "chequer-board,"
unsigned short column_no;
unsigned short Rows_Data [5] ={0x55,0x2A,0X55,0X2A,0X55};
// Functions
void Reset_4017(viod){ //Reset counter 4017
PORTA.F1=1; //Reset 4017 : Line HIGH, column 1 on
PORTA.F1=0; //then LOW, allow 4017 to clock via clock line
}
void Clock_4017(void){ //Clock counter 4017
PORTA.F0=1; // Clock 4017 : Line HIGH
PORTA.F0=0; //then LOW
}
//Main function
void main (){
//Registers and PORTS Configurations
CMCON=0x7; // Turn comparators off and enable pins for I/O functions
TRISA=0; // Make all RA lines output
TRISB=0; //Make all RB lines output
// Endless loop
while(1){ //Endless loop START
Reset_4017( ); // Reset = Column 1
for(column_no=0; column_no <5; column_no ++){ // Scanning
PORTB= Rows_Data [column_no] ; //
Delay_ms(1); // Call Delay 1 ms , FAST SCAN
PORTB=0;
Clock_4017( ); // Clock = New Column
} //end of count loop
} // endless loop
}
//END of main
أ- عرض حرف "A" غير متحرك :