ផ្នែកទី៦៖ TIMERS

ផ្នែគទី៦៖ TIMERS_Page_1ផ្នែគទី៦៖ TIMERS_Page_2ផ្នែគទី៦៖ TIMERS_Page_3ផ្នែគទី៦៖ TIMERS_Page_4ផ្នែគទី៦៖ TIMERS_Page_5ផ្នែគទី៦៖ TIMERS_Page_6ផ្នែគទី៦៖ TIMERS_Page_7ផ្នែគទី៦៖ TIMERS_Page_8

 

Posted in MikroC for 8-bit PICMicro | Leave a comment

ផ្នែកទី៥៖ INTERRUPT

N_Page_1N_Page_2N_Page_3N_Page_4N_Page_5N_Page_6

Posted in MikroC for 8-bit PICMicro | Leave a comment

ផ្នែកទី៤៖ ការសរសេរកម្មវិធី និងការតម្លើងហាដវ៊ែរ

p4__Page_01p4__Page_02p4__Page_03p4__Page_04p4__Page_05p4__Page_06p4__Page_07p4__Page_08p4__Page_09p4__Page_10p4__Page_11p4__Page_12p4__Page_13

Posted in MikroC for 8-bit PICMicro | Leave a comment

ផ្នែកទី៣៖ សិក្សាករណី PIC16F887

1-   លក្ខណៈសំខាន់ៗ

  • ស្ថាបត្យកម្ម (Architecture) RISC
  • ប្រតិបត្តិការណ៍ក្នុងកម្រិតប្រេកង់រហូតដល់ 20MHz
  • មានប្រភពក្លក (clock) ខាងក្នុងក្នុងចន្លោះពី 31kHz ដល់ 8MHz
  • តង់ស្យុងចិញ្ចឹមចន្លោះពី 0V ទៅ 5.0V (2.0V@4MHz)
  • Power Saving Sleep Mode
  • Brown-out Reset (BOR)
  • មានជើងចេញចូលចំនួន 35 (ចរន្តហូរចូល ហូរចេញធំសម្រាប់ LED មាន Pullup resistor មាន Interrupt-on-Change ។
  • ទំហំ ROM 8k អាចបញ្ជុល/លុប បាន 100 000 ដង ។
  • មាន In-Circuit Serial Programming
  • មាន EEPROM ទំហំ 256 bytes ហើយអាចបញ្ជុល/លុប បាន 1000 000 ដង
  • មាន RAM ទំហំ 368 bytes
  • មាន A/D Converter ចំនួន 14 ច្រក និង 10-bit Resolution
  • មាន Timer/Counter ឯករាជ្យចំនួនបី
  • មាន Watch-dog Timer
  • មាន Analog Comparator ចំនួនពីរ
  • PWM (Pulse Width Modulation)
  • Enhanced UART Module
  • Master Synchronous Serial Port (MSSP) (SPI និង I2C)

pic-microcontrollers-programming-in-c-chapter-03-image-1

pic-microcontrollers-programming-in-c-chapter-03-image-2

pic-microcontrollers-programming-in-c-chapter-03-image-3

2-   Central Processing Unit (CPU )

PIC16F887 ជាកុំព្យូទ័រប្រភេទ RISC (Reduced Instruction Set Computer) ។ RISC សម្រាប់ PIC មានលក្ខណសម្បត្តិដូចខាងក្រោម៖

  • នៅក្នុង CPU មានពាក្យបញ្ជាតែ 35 ប៉ុណ្ណោះ ។ ពាក្យបញ្ជានីមួយៗ ប្រតិបត្តដោយល្បឿន 200 nanoseconds ពេលប្រើក្លក 20MHz ។
  • ពាក្យបញ្ជានីមួយៗ មានល្បឿនស្ទើរតែស្មើរគ្នាទាំងអស់គឺស្មើរនឹង ¼ នៃក្លកចូល ។ ឧទាហរណ៍ពេ លយើងប្រើក្លកចូល 20MHz នោះល្បឿននៃការប្រតិបត្តនៃពាក្យបញ្ជាគឺ ¼(20MHz) = 5 លាន ពាក្យបញ្ជាក្នុងមួយវិនាទី (5MIPS) ហើយរយៈពេលនៃការអនុវត្តពាក្យបញ្ជានីមួយៗគឺ 200 nanoseconds ។

pic-microcontrollers-programming-in-c-chapter-03-image-7

3-   Memory

Memory ដែលប្រើនៅក្នុង PIC16F887 មានបីប្រភេទគឺ៖ RAM ROM និង EEPROM ។

  • ROM

ROM (Read Only Memory )មានតួនាទីរក្សាទុកកម្មវិធីសម្រាប់ដើម្បីដំណើរការជាអចិន្ត្រៃយ៍  ហើយគេតែងហៅវាថា Program Memory ។ ទំហំ ROM គឺ 8kword (8192×14-bit) ។

pic-microcontrollers-programming-in-c-chapter-03-image-8

ដោយ ROM នៃ PIC16F887 ប្រើបច្ចេកវិទ្យា Flash Memory ដូចនេះវាត្រូវការកម្រិតតង់ស្យុង 13V ទៅ 14V ដើម្បីលុបទិន្នន័យ ។ Programmer ជាឧបករណ៍ដែលមានតួនាទីទាញយកកម្មវិធីដែលបាន Compile រួចរាល់ពីក្នុងកុំព្យូទ័រផ្ទាល់ខ្លួន ទៅក្នុង PIC មៃក្រូខុនត្រូល័រ ។

  • RAM

ផ្នែកនេះជាផ្នែកដែលស្មុគស្មាញបំផុតនៅក្នុងមៃក្រូខុនត្រូល័រ ។ ក្នុងករណីនេះ RAM ត្រូវបានបែងចែក ជាពីរផ្នែកគឺ GPR (General Purpose Registers) និង SFR (Special Function Registers) ។ RAM ត្រូវបានបែងចែកជាបួន Banks ។

GPR ត្រូវបានប្រើប្រាស់ក្នុងគោលបំណងទូទៅដូចជាអថេរសម្រាប់រក្សាទុកតម្លៃបណ្តោះអាសន្ន នៃប្រ មាណវិធីគណិតវិទ្យាជាដើម ។

  • SFR

SRF ក៏ជា RAM ដែរប៉ុន្តែវាមានមុខងារខុសពី GPR ។ SFR មានមុខងារពិសេស កំណត់រួចជាស្រេច នៅពេលគេឌីហ្សាញ និងផលិតមៃក្រូខុនត្រូល័រ ។ ថតទិន្នន័យ ឫ bit នីមួយៗរបស់វាត្រូវបានតភ្ជាប់ទៅ បញ្តាញសៀគ្វីខាងក្នុងរបស់មៃក្រូខុនត្រូល័រដូចជា៖ ADC និង Serial-Communication ជាដើមដើម្បី បញ្ជា ឫផ្ទេរទិន្នន័យ ។ ឧទាហរណ៍ ADCON0 មានមុខងារបញ្ជាទៅកាន់ផ្នែក ADC ដើម្បីគ្រប់គ្រងដំណើរ ការនៃការបំលែងស៊ីញ្ញាលអាណាឡូកទៅឌីជីថល ។ ថតទិន្នន័យនៃ SFR នីមួយៗមានអាស័យដ្ឋាន និង ឈ្មោះខុសៗគ្នា  ។

ទោះបីជា RAM ត្រូវបានបែងចែកជាបួន Banks ខុសៗគ្នាក៏ដោយ ក៏ SFRs ខ្លះដូចជា៖ STATUS និង OPTION_REG ជាដើមមានវត្តមាននៅគ្រប់ Bank ទាំងបួនពីព្រោះវាជាថតទិន្នន័យដែលត្រូវការ ជាចាំបាច់ ។pic-microcontrollers-programming-in-c-chapter-03-image-9

  • EEPROM

EEPROM ដូចជាទៅនឹង flash ដែរគឺរក្សាទិន្នន័យជាអចិន្រ្តៃយ៍ ទោះបីជាគ្មានតង់ស្យុងចឹញ្ចឹមក៏ដោយ ប៉ុន្តែវាខុសពីរ Flash ត្រង់ថា Flash ជា ROM ដូចជារាល់ទិន្នន័យ (កម្មវិធី) នៅក្នុង Flash មិនអាច កែប្រែបាននៅពេលកម្មវិធីដំណើរការបានទេ ។ ខណៈទិន្នន័យនៅក្នុង EEPROM អាចកែតម្រូវបាន នៅ ពេលកម្មវិធីដំណើរការ ។

pic-microcontrollers-programming-in-c-chapter-03-image-10

pic-microcontrollers-programming-in-c-chapter-03-image-11

pic-microcontrollers-programming-in-c-chapter-03-image-12

pic-microcontrollers-programming-in-c-chapter-03-image-13

pic-microcontrollers-programming-in-c-chapter-03-image-14

4-   Interrupt System

នៅពេលដែលការការផ្អាក (interrupt) កើតឡើងនោះកម្មវិធីដែលត្រូវដំណើរការជាប្រក្រតីត្រូវបាន ផ្អាក ហើយប្លុកកម្មវិធីដែលឆ្លើយតបទៅនឹង Interrupt (ISR)ត្រូវបានយកមកអនុវត្ត ។ នៅពេលដែល ISR ត្រូវបានអនុវត្តចប់ទើបវាត្រលប់មកកម្មវិធីជាប្រក្រតីវិញ ។ ជាធម្មតាកម្មវិធីដំណើរការជាប្រក្រតី ចាប់ ផ្តើមពីអាស័យដ្ឋាន 0x0000 នៃ ROM ខណៈ ISR ចាប់ផ្តើមនៅអាស័យដ្ឋានទី 0x0004 ។ ជាទូទៅ យើងអាចប្រើ Interrupt ក៏បានឫអត់ប្រើក៏បាន ។ ប្រភពនៃ Interrupt មានច្រើនដូចជា៖ External-Interrupt និង Timer0_overflow- interrupt ជាដើម ។ យើងនឹងបង្ហាញនៅពេលក្រោយ។

5-   Core SFRs

SFRs នៅក្នុង RAM មានច្រើន ប៉ុន្តែក្នុងនេះយើងលើកយកតែ SFRs សំខាន់មួយចំនួនដែលយើង ត្រូវការប្រើប្រាស់ជាចាំបាច់ និងញ្ញឹកញ្ញាប់ជាងគេតែប៉ុណ្ណោះ ។

  • STATUS Register

pic-microcontrollers-programming-in-c-chapter-03-image-16

ថតទិន្នន័យ STATUS រួមមាន៖ ស្ថានភាពនៃថតទិន្នន័យ WREG ស្ថានភាពនៃ Reset និងប៊ីត សម្រាប់ជ្រើសរើស Bank ជាដើម ។

  • IRP ៖ Bits Select Register Bank (ប្រើសម្រាប់ Indirect Addressing)

1-> ប្រើ Bank0 និង Bank1

0-> ប្រើ Bank2 និង Bank3

  • RP1 , RP0 ៖ bits សម្រាប់ជ្រើសរើស Bank (ប្រើសម្រាប់ Direct Addressing)
RP1 RP0 Bank ដែលជ្រើសរើស
0 0 Bank0
0 1 Bank1
1 0 Bank2
1 1 Bank3
  • TO ៖ Time-out bit

1-> បន្ទាប់ពីបើកដំណើរការ (power-on) ហើយបន្ទាប់ពីអនុវត្តពាក្យបញ្ជា CLRWDT

0-> បន្ទាប់ពី WDT ធ្វើការ Reset

  • PD ៖ Power-down bit

1-> បន្ទាប់ពីវា Reset WDT

0-> បន្ទាប់ពីអនុវត្តពាក្យបញ្ជា SLEEP

  • Z ៖ Zero bit

1-> លទ្ធផលនៃប្រមាណវិធីនព្វន្ត ឫឡូស៊ីកគឺសូន្ស

0-> លទ្ធផលនៃប្រមាណវិធីនព្វន្ត ឫឡូស៊ីកផ្ទុយពីសូន្ស

  • DC ៖ Digit Carry/ Borrow bit

1-> មាន carry-out ពីខ្ទង់ទី4 នៃ lower-nibble

0-> គ្មាន carry-out ពីខ្ទង់ទី4 នៃ lower-nibble

  • C ៖ Carry/Borrow bit

1-> មាន Carry-out ពី MSB ចេញពីលទ្ធផលនៃប្រមាណវិធី

0-> គ្មាន Carry-out ពី LSB ចេញពីលទ្ធផលនៃប្រមាណវិធី

  • OPTION_REG

pic-microcontrollers-programming-in-c-chapter-03-image-17

  • RBPU៖ Port B Pullup Enableb bit

1-> មិនប្រើ PORTB Pullups

0-> ប្រើ PORTB Pullups

pic-microcontrollers-programming-in-c-chapter-03-image-18

  • INTEDG ៖ Interrupt Edge Select bit

1-> Interrupt កើតឡើងនៅលើជំរាលឡើងនៃជើង RB0

0-> Interrupt កើតឡើងនៅលើជំរាលចុះនៃជើង RB0

pic-microcontrollers-programming-in-c-chapter-03-image-19

  • TOCS ៖ TMR0 Clock Source Select bit

1-> យកស៊ីញ្ញាលចូលតាមជើង T0CKI

0-> យកស៊ីញ្ញាល់ខាងក្នុងមៃក្រូខុនត្រូល័រ (¼Fosc)

pic-microcontrollers-programming-in-c-chapter-03-image-20

  • T0SE ៖ TMR0 Source Edge bit (ជ្រើសរើសប្រភេទជម្រាលចុះ ឫឡើង ដើម្បីឲ្យ TMR0 រាប់ តាមរយៈជើង T0CKI ។

1-> TMR0 កើនតម្លៃនៅពេលមានជម្រាលចុះតាមជើង T0CKI

0-> TMR0 កើនតម្លៃនៅពេលមានជម្រាលឡើងតាមជើង T0CKI

pic-microcontrollers-programming-in-c-chapter-03-image-21

  • PSA ៖ Prescaler Assignment Bit (ដើម្បីកំណត់ Prescaler ឲ្យ TMR0 ក្នុងមាត្រដ្ឋាន 1:1 យើងត្រូវកំណត់ Prescaler ទៅឲ្យ WDT )
PS2 PS1 PS0 TMR0 WDT
0 0 0 1:2 1:1
0 0 1 1:4 1:2
0 1 0 1:8 1:4
0 1 1 1:16 1:8
1 0 1 1:64 1:32
1 1 0 1:128 1:64
1 1 1 1:256 1:128

5-3- INTCON

មានមុខងារបញ្ជាទៅកាន់ Interrupt ផ្សេងៗដូចជា TMR0 ឫ External Interrupt ។ លើសពីនេះ ទៀតវាអាចប្រាប់ពីប្រភពនៃ interrupt ផងដែរ ។

pic-microcontrollers-programming-in-c-chapter-03-image-26

  • GIE៖ Global Interrupt Enable bit

1-> អនុញ្ញាតឲ្យមាន Interrupt

0-> មិនអនុញ្ញាតឲ្យមាន Interrupt

  • PEIE ៖ Peripheral Interrupt Enable bit

1-> អនុញ្ញាតឲ្យមាន Peripheral Interrupt

0-> មិនអនុញ្ញាតឲ្យមាន Peripheral Interrupt ទេ

  • T0IE ៖ Timer0 Interrupt Enable bit

1-> អនុញ្ញាតឲ្យមាន TMR0 interrupt

0-> មិនអនុញ្ញាតឲ្យមាន TMR0 interrupt

  • INTE ៖ RB0/External Interrupt Enable bit

1-> អនុញ្ញាតឲ្យមាន External Interrupt តាមជើង RB0

0-> មិនអនុញ្ញាតឲ្យមាន External Interrupt តាមជើង RB0

  • RBIE ៖ RB PORT Interrupt Enable bit

1-> អនុញ្ញាតឲ្យមាន Interrupt តាមជើងក្នុង PORTB ណាមួយប្តូរស្ថានភាព

0-> មិនអនុញ្ញាតឲ្យមាន Interrupt តាមជើងក្នុង PORTB ណាមួយប្តូរស្ថានភាព

  • T0IF ៖ TMR0 Overflow Interrupt Flag bit

1-> មាន Interrupt តាមជើង RB0

0-> គ្មាន Interrupt តាមជើង RB0

  • TBIF ៖ RB Port Interrupt Flag bit

1-> មានជើងណាមួយក្នុង PORTB បានផ្លាស់ប្តូរស្ថានភាព

0-> គ្មានជើងណាមួយក្នុង PORTB បានផ្លាស់ប្តូរស្ថានភាពទេ

Posted in MikroC for 8-bit PICMicro | Leave a comment

ផ្នែកទី២៖ ភាសា C សម្រាប់ MikroC

 

1-   ភាសា

មៃក្រូខុនត្រូល័រអនុវត្តកម្មវិធីដែលរក្សាទុកក្នុង Flash Memory ។ កម្មវិធីនោះផ្សំឡើងដោយទិន្នន័យ គោលពីរដែលមៃក្រូខុនត្រូល័រអាចយល់បាន ឫគេហៅថាភាសាម៉ាស៊ីន ។ ភាសាម៉ាស៊ីនមានទម្រង់ជាគោ លពីរ ប៉ុន្តែជាទូទៅគេតាងវាជាគោល 16 ដើម្បីឲ្យខ្លី ហើយអ្នកសរសេរកម្មវិធីមិនងាយនឹងយល់ភាសាម៉ា ស៊ីនទេ ។ ដូចនេះគេតាងភាសាម៉ាស៊ីនជានិមិត្តសញ្ញាដែលមានអត្ថន័យគ្រប់គ្រាន់ហើយអាចយល់បាន គេហៅថាភាសា Assembly ។ ភាសា Assembly មានប្រវែងខុសៗគ្នា ឧទាហរណ៍៖ 12-bit 14-bit ឫ 16-bit ជាដើម ហើយខុសៗគ្នាទៅតាមស្ថាបត្យកម្មនៃមៃក្រូខុនត្រូល័រនីមួយៗ ។ ពាក្យបញ្ជា (instruction) ជាធាតុនៃភាសា Assembly ។ពាក្យបញ្ជាទាំង អស់នៃមៃក្រូខុនត្រូល័រមួយ គេហៅថាសំនុំនៃពាក្យបញ្ជា (Instructions Set) ។ ចំពោះ PIC16 ឧទាហ រណ៍ PIC16F887 មានសំនុំពាក្យបញ្ជាចំនួន 35 និងប្រវែងនៃពាក្យបញ្ជានីមួយគឺ 14-bit ដូចៗគ្នា ។

pic-microcontrollers-programming-in-c-chapter-02-image-1

យើងសរសេរកម្មវិធីឲ្យមៃក្រូខុនត្រូល័រនៅក្នុងកុំព្យូទ័រ (Personal Computer) ដោយប្រើ Compiler ។ Compiler គឺកម្មវិធីមានតួរនាទីបំលែងកម្មវិធីដែលយើងសរសេរជាភាសា Assembly ឲ្យទៅជាភាសា របស់ម៉ាស៊ីននៃមៃក្រូខុនត្រូល័រ ។ ជាទូទៅគេហៅ Compiler សម្រាប់ភាសា Assembly ថា Assembler ។

pic-microcontrollers-programming-in-c-chapter-02-image-2

ភាសា Assembly មានទំនាក់ទំនងដោយផ្ទាល់ទៅនឹងដំណើរការខាងក្នុងរបស់មៃក្រូខុនត្រូល័រ ដូចជា ការផ្ទេរទិន្នន័យពីថតទិន្នន័យមួយទៅថតទិន្នន័យមួយ ការបញ្ជាទៅ ALU ឲ្យធ្វើប្រមាណវិធីនព្វន្តជាដើម។ ការសរសេរកម្មវិធីក្នុងភាសា Assembly ចំនេញទំហំ ROM កម្មវិធីមានល្បឿនប្រតិបត្តិការលឿន ។ ប៉ុន្តែ ការសរសេរកម្មវិធីក្នុងកម្មវិធីនេះចំណាយពេលកាន់តែយូរ និងកាន់តែស្មុគស្មាញប្រសិនបើទំហំការងារ កាន់ តែធំ ។

pic-microcontrollers-programming-in-c-chapter-02-image-4

ដើម្បីសម្រួលដល់ការសរសេរកម្មវិធីសម្រាប់មៃក្រូខុនត្រូល័រ ក្រុមហ៊ុនផលិត និងអ្នកបង្កើត Compiler ព្យាយ៊ាមបង្កើត Compiler ដែលប្រើភាសាកម្រិតខ្ពស់ជាងនេះដើម្បីសរសេរកម្មវិធី ។ នាពេលបច្ចុប្បន្នភា សា C ជាភាសាដែលគេប្រើយ៉ាងទូលំទូលាយបំផុតក្នុងពិភពមៃក្រូខុនត្រូល័រ ។ ភាសា C មានភាពងាយ ស្រួលសរសេរ មិនសូវស្មុគស្មាញ ប៉ុន្តវាត្រូវការទំហំ ROM ធំ បើប្រៀបធៀបទៅនឹងភាសា Assembly ។

pic-microcontrollers-programming-in-c-chapter-02-image-5

C Compiler ជាកម្មវិធីដែលដំណើរការនៅក្នុងកុំព្យូទ័រ ហើយវាមានតួនាទីសម្រាប់បំលែងកម្មវិធីជា ភាសា C ឲ្យទៅជាភាសាម៉ាស៊ីន ។ ទោះបីជាយើងសរសេរយើងសរសេរជាភាសាស៊ីក៏ដោយ ក៏ Compiler ត្រូវបំលែងពីភាសាស៊ី ឲ្យទៅជាភាសា Assembly សិនទើបបំលែងទៅជាភាសាម៉ាស៊ីនចុងក្រោយបង្អស់។

pic-microcontrollers-programming-in-c-chapter-02-image-6

2-   មូលដ្ឋាននៃភាសា C

ជាទូទៅសម្រាប់អ្នកសរសេរកម្មវិធី មុននឹងសរសេរកម្មវិធីគេត្រូវរៀបចំផែនការ ហើយបំបែកផែនការ នេះជាចំណែកតូចៗ និងទៅតាមជំហ៊ានៗ ។ ឧទាហរណ៍យើងចង់សរសេរកម្មវិធីសម្រាប់អានសីតុណ្ហ ភាពពីសេនស័រ ហើយបង្ហាញស៊ីតុណ្ហភាពទៅក្នុងអេក្រង់ ។

pic-microcontrollers-programming-in-c-chapter-02-image-9

យើងត្រូវបំបែកការងារនេះទៅតាមជំហ៊ានៗ ដូចខាងក្រោម៖

  • កំណត់ និងបើកប្លុក ADC
  • អានតម្លៃអាណាឡូកពីសេនស័រសីតុណ្ហភាព
  • គណនាសីតុណ្ហភាព
  • ផ្ទេរទិន្នន័យនៃសីតុណ្ហភាព ទៅកាន់អេក្រង់ ។

 

ចំណាំ៖ កម្មវិធី MikroC មានតួនាទីបំលែងភាសា C ឲ្យទៅជាភាសាម៉ាស៊ីន ។ ភាសាស៊ីដែលសរសេរនៅ ក្នុងមៃក្រូស៊ីមានទម្រង់ និងអនុលោមទៅតាមស្តង់ដារួមនៃភាសាស៊ី ។ ប៉ុន្តែកូដក្នុងមៃក្រូស៊ីទាំងអស់មិន សុទ្ធតែអាចសរសេរក្នុង Compiler ផ្សេងនៅក្នុងម៉ាស៊ីនកុំព្យូទ័របានទេ ។

  • COMMENTS

Comments ជាកំណត់ហេតុ ឫការកំណត់ចំណាំសម្រាប់អ្នកសរសេរកម្មវិធី ដូចជាសំគាល់ថ្ងៃខែ គោលបំណងនៃកម្មវិធី ឫដំណើរការនៃប្លុកនីមួយៗជាដើម ។ Comments មិនត្រូវបានរាប់បញ្ចូលទៅ ក្នុងកម្មវិធីពេលយើង Compile ទេ ។

ការសរសេរ Comment មានពីររបៀគឺ៖

  • single-line comment ៖ ចាប់ផ្តើមសញ្ញាស្លាស់ពីរដង //

ឧទាហរណ៍៖

// this is a comment of a test program

// write your code below

// start timer0

  • Multiple-lines comment ៖ ផ្តើមដោយសញ្ញា /* និងបញ្ចប់ដោយសញ្ញា */

ឧទាហរណ៍៖

/* A program to demonstrate external interrupt */

/* C Program Demo

A program for finding odd integer or even integer

written by Mr. Sambo Jai

Date: 25 December 2015

*/

  • ប្រភេទទិន្នន័យ

ខាងក្រោមជាប្រភេទទិន្នន័យដែលកម្មវិធីមៃក្រូស៊ី រួមជាមួយទំហំ និងដែនកំណត់ ។

 

ប្រភេទ ពិពណ៌នា ទំហំ (ចំនួន bits) ដែនកំណត់
bit Bit type 1-bit 0 ឫ 1
sbit Bit type 1-bit 0 ឫ 1
char Characer 8 0 ទៅ 255
signed char Signed 8 -128 ទៅ 127
Unsigned short int Unsigned Short integer 8 0 ទៅ 255
short int Signed short integer 8 -128 ទៅ 127
int Integer 16 -32768 ទៅ 32767
unsigned int Unsigned integer 16 0 ទៅ 65535
long signed Long integer 32 -2147483648 ទៅ 2147483647
unsigned long i unsigned long integer 32 0 ទៅ 4294967295
float Floationg point 32 ±1.17549435082 x 10-38 ទៅ

±6.80564774407 x 1038

double Double Precision Floating point 32 ±1.17549435082 x 10-38 ទៅ

±6.80564774407 x 1038

2-3 អថេរ (Variable)

អថេរជាកន្លែងរក្សាទុកទិន្នន័យ ហើយតម្លៃនៃទិន្នន័យនេះអាចមានការប្រែប្រួលនៅពេលកម្មវិធីដំ ណើរការ ដូចជាការលុបទិន្នន័យ ការកើនតម្លៃ ឫប្រមាណវិធីទៅលើទិន្នន័យជាដើម ។

ជាទូទៅយើងប្រកាសទិន្នន័យដូចខាងក្រោម៖

ប្រភេទទិន្នន័យ ឈ្មោះនៃទិន្នន័យ

ឧទាហរណ៍៖   int temperature;

                   char grade;

ម្យ៉ាងទៀតយើងអាចផ្តល់តម្លៃដើមឲ្យអថេរនៅពេលប្រកាស៖

unsigned short int speed=0;

char RCV=’C’;

 

ក្រឹតក្រមខ្លះសម្រាប់ការប្រកាសអថេរ៖

  • ឈ្មោះនៃអថេរជាតួរអក្សរពី A ដល់ Z ពី a ដល់ z ពីលេខ 0 ដល់ 9 ប្រើសញ្ញា _ ជំនួសឲ្យការ ដកឃ្លា
  • មិនត្រូវមានតួរលេខនៅខ្ទង់ដំបូងគេទេ
  • ពាក្យមួយចំនួនមិនត្រូវបានអនុញ្ញាតឲ្យប្រើជាឈ្មោះរបស់អថេរទេ ។ ពាក្យនោះគេហៅថា Keywords មានដូចខាងក្រោម៖
ពាក្យគន្លឹះក្នុងមៃក្រូស៊ី
absolute data if return typedef
asm default inline rx typeid
at delete int sfr typename
auto do io short union
bit double long signed unsigned
bool else mutable sizeof using
break enum namespace static virtual
case explicit operator struct void
catch extern org switch volatile
char false pascal template while
class float private this
code for protected throw
const friend public true
continue goto register try

 

2-4 Pointer

Pointer ជាអថេរប្រភេទពិសេសមានតួនាទីរក្សាទុកនូវអាស័យដ្ឋាននៃអថេរផ្សេង ។ យើងអាចនិយាយ បានថា Pointer ចង្អុរទៅកាន់អថេរផ្សេង ។ យើងប្រកាស Pointer ដូចខាងក្រោម៖

ប្រភេទអថេរ   ឈ្មោះនៃPointer;

ឧទាហរណ៍៖

unsigned int *multiplex;     // ប្រកាស pointer ឈ្មោះ multiplex

multiplex = &display1;        // multiplex រក្សាទុកអាស័យដ្ឋាននៃអថេរឈ្មោះ Display

 

ដើម្បីផ្តល់តម្លៃថ្មីឲ្យ pointer យើងត្រូវដាក់សញ្ញាផ្កាយ * នៅពីមុខឈ្មោះនៃ Pointer៖

ឧទាហរណ៍៖

*multiplex=6;           // យើងផ្តល់តម្លៃឲ្យអថេរ display1=6

 

ស្រដៀងគ្នានេះដែរដើម្បីអានតម្លៃពីអថេរដែលយើងបានចង្អុលទៅយើងត្រូវសរសេរដូចខាងក្រោម៖

ឧទាហរណ៍៖

temp=*multiplex;    //  ផ្ទេរតម្លៃពីអថេរ display1 ទៅឲ្យ temp

 

2-5 ចំនួនថេរ (Constant)

ចំនួនថេរគឺជាតម្លៃលេខដែលតម្លៃរបស់វាត្រូវបានកំណត់រួចទុកជាមុន ហើយមិនអាចប្រែប្រួលឫកែ តម្រូវនៅពេលកម្មវិធីដំណើរការទេ ។ ខុសពីអថេរដែលរក្សាតម្លៃទុកនៅក្នុង RAM ចំនួនថេររក្សាតម្លៃរបស់ វាទុកនៅក្នុង ROM ដើម្បីសន្សំសំចៃផ្ទៃ RAM ។

 

  • Integer Constants
ទម្រង់ (Format) បុព្វបទ(prefix) ឧទាហរណ៍
Decimal const MAX = 100;
Hexadecimal 0x ឫ 0X const MAX = 0xFF;
Octal 0 const MAX = 016
Binary 0b ឫ 0B const MAX = 0b11011101

 

  • Floating Point Constant

ចំនួនថេរជាតំលៃទស្សភាគត្រូវប្រកាសដូចខាងក្រោម ។ អក្សរ e ឫ E តំណាងឲ្យដប់ស្វ័យគុណ ៖

const T_MAX = 32.60;       // Declare Temperature T_MAX

const T_MAX1 = 32.26E1;   // Another declaration

  • Character Constants (ASCII)

ចំនួនថេរជាតួរអក្សរ តួរអក្សរដែលត្រូវផ្តល់ឲ្យត្រូវដាក់ក្នុងសញ្ញា ‘  ‘ ។

ឧទាហរណ៍៖

const class1 = ‘A’;         // ផ្តល់កូដ ASCII A ទៅឲ្យចំនួនថេរ class1

const class2 = ‘B’;         // ផ្តល់កូដ ASCII B ទៅឲ្យចំនួនថេរ class2

  • String Constants

ចំនួនថេរដែលបង្កើតឡើងដោយសេរ៊ីនៃតួរអក្សរដែលគេហៅថា String ។ ចំនួនថេរជា String ត្រូវ ស្ថិតនៅក្នុងសញ្ញា “  “ ។

ឧទាហរណ៍៖

const message_1 =  “ Press START Button”;

const message_2 = “ Press STOP Button”;

const message_2 = “ Press OK Button”;

 

  • Enumerated constants

Enumerated Constant ជាចំនួនថេរពិសេសមួយ យើងប្រើវាដើម្បីឲ្យកូដដែលយើងសរសេរងាយ យល់ ។ Enum ជំនួសតម្លៃលេខរៀង ដោយនិមិត្តសញ្ញាដែលយើងអាចយល់បាន ។

ឧទាហរណ៍៖

enum MOTORS { UP , DOWN , LEFT , RIGHT } ;       // constants of motor

ក្នុងឧទាហរណ៍ខាងលើ Compiler នឹងជំនួស UP ដោយលេខ 0 DOWN ដោយលេខ 1 LEFT ដោយលេខ 2 និង RIGHT ដោយលេខ 3 ។

2-6 OPERATORS OPERATIONS និង EXPRESSIONS

ការី (OPERATOR) មានច្រើនដូចជា ការីនព្វន្ត (arithmetic Operator) ការីឡូស៊ីក (logical operator)និងការីផ្សេងៗទៀត ។

  • ការីនព្វន្ត
ការី ប្រមាណវិធី
+ បូក
ដក
* គុណ
/ ចែក
% សំណល់
  • ការីផ្តល់តម្លៃ (សញ្ញា = ) (assignment operator)
ការី ឧទាហរណ៍
កន្សោម (expression) សមមូល
+= a+=8 a=a+8
-= a-=8 a=a-8
*= a*=8 a=a*8
/= a/=8 a=a/8
%= a%=8 a=a%8
  • ការីបង្កើន និងបន្ថយតម្លៃ (increment and decrement operator)
ការី ឧទាហរណ៍ ពិពណ៌នា
++ ++a អថេរ a កើនតម្លៃ 1
a++
–b អថេរ b ថយតម្លៃ 1
b–

 

  • ការីប្រៀបធៀប (Rational Operators)

ការីប្រៀបធៀបប្រើសម្រាប់ប្រៀបធៀបរវាងអថេរពីរ ។ ប្រសិនបើកន្សោម(Expression)នោះពិត វានឹងបោះតម្លៃ 1 បើមិនដូចច្នេះទេ វានឹងបោះតម្លៃ 0 ។

ការី អត្ថន័យ ឧទាហរណ៍
> ធំជាង b > a
=> ជំជាងឫស្មើរ a >= 5
< តូចជាង a < b
<= តូចជាង ឫស្មើរ a <= b
== ស្មើរ a == 6
!= មិនស្មើរ a != b

 

  • ការីឡូស៊ីក (Logic Operater)

នៅក្នុងភាសាស៊ី មានការីឡូស៊ីកបីគឺ៖ AND (និង) OR (ឫ) និង NOT (ផ្ទុយ) ។ ក្នុងតត្កវិទ្យាគេតាង ធាតុពិត(TRUE) ដោយ 1 និងធាតុមិនពិត (False) ដោយ 0 ។

 

ការី AND
 && A B លទ្ធផល

(A&&B)

0 0 0
0 1 0
1 0 0
1 1 1
ការី OR
|| A B លទ្ធផល

(A||B)

0 0 0
0 1 1
1 0 1
1 1 1
ការី NOT
! A លទ្ធផល (NOT A )
0 1
1 0

 

2-7 Bitwise Operators

ការីនេះធ្វើប្រមាណវិធីទៅលើទិន្នន័យម្តងមួយ bit ម្តងមួយ bit ។ ជាទូទៅគេច្រើនប្រើការីប្រភេទនេះ សម្រាប់កែតម្រូវប៊ីតនៅក្នុងអថេរ ។

 

ការី អត្ថន័យ ឧទាហរណ៍ លទ្ធផល
~ Bitwise complement (ផ្ទុយ) a = ~ b ; b = 11110000 a = 00001111
<< រំកិលទៅខាងឆ្វេង a = b << 2; b = 11110011 a = 11001100
>> រំកិលទៅខាងស្តាំ a = b >> 2; b = 11110011 a = 00111100
& Bitwise AND c = a & b a = 11100011

b = 11001100

c = 11000000
| Bitwise OR c = a | b a = 11100011

b = 11001100

c = 111011111
^ Bitwise XOR c = a ^ b a = 11100011

b = 11001100

c = 00101111

 

2-8 Conditional Operator

លក្ខណជាធាតុផ្សំយ៉ាងសាមញ្ញក្នុងកម្មវិធី ។ ពេលខ្លះយើងត្រូវការធ្វើប្រមាណវិធីទៅតាមលក្ខណនី មួយៗដែលបានកំណត់ ។

  • if

វាមានទំម្រង់ដូចខាងក្រោម៖

if(expression) operation;

 

ប្រសិនបើ expression នៅក្នុង if ពិតនោះ operation នឹងត្រូវប្រតិបត្ត ។

 

  • if-else

វាមានទម្រង់ដូចខាងក្រោម៖

if(expression) operation1;

else    operation2;

 

ប្រសិនបើ expression ពិតនោះ operation1 នឹងត្រូវប្រតិបត្ត បើពុំដូចច្នោះទេ operation2 នឹងត្រូវ ប្រតិបត្ត ។ ជារឿយៗ ក្នុងលក្ខណនីមួយៗមាន operation ច្រើនដូចនេះគេត្រូវប្រើសញ្ញា {} ដើម្បីផ្តុំ operation ទាំងនោះ ។

យើងអាចជំនួស if-else ដោយការី ? ដូចខាងក្រោម៖

(expression1)?expression2 : expression3

 

ប្រសិនបើ expression1 ពិត នោះលទ្ធផលនៃប្រមាណវិធីទាំងមូលគឺជាតម្លៃនៃ expression2 បើមិន ដូចច្នោះទេលទ្ធផលនៃប្រមាណវិធីទាំងមូលគឺជាតម្លៃនៃ Expression3 ។

ឧទាហរណ៍៖

maximum= (a>b)? a : b;

ក្នុងឧទាហរណ៍ខាងលើប្រសិនបើ a ពិតជាធំជាង b មែននោះលទ្ធផលគឺជ្រើសរើសយក a បើមិនដូច ច្នោះទេគឺជ្រើសរើស b ។

  • Switch

នៅពេលយើងត្រូវការជ្រើសរើសលក្ខណច្រើន អ្នកសរសេរកម្មវិធីច្រើនប្រើប្រាស់ Switch ព្រោះវាមាន សណ្តាប់ធ្នាប់ជាង និងងាយស្រួលយល់។

Switch មានទម្រង់ដូចខាងក្រោម៖

switch(selector)           // selector is int or char type

{    

      case constant1:

               operation1;    // operation1 is executed if selector and constant1 are equal

               break;

      case constant2:

               operation2;   // operation2 is executed if selector and constant2 are equal

               break;

      default:

               operation;     // operation is executed if no constant is equal to selector

               break;

}

 

switch ដំណើរការដូចតទៅ៖

  • selector ត្រូវបានអនុវត្តដំបូងគេ ហើយវាត្រូវបានប្រៀបធៀបនឹង constant1 ។
  • ប្រសិនបើ selector និង constant1 ស្មើរគ្នានោះ statement នៅក្នុង case ត្រូវបានអនុវត្ត រហូតដល់ break ទើបចាកចេញ ។
  • ប្រសិនបើ selector និង constant1 មិនស្មើរគ្នាទេ វានឹងប្រៀបធៀប selector ទៅនឹង constant2 ប្រសិនបើវាស្មើរគ្នានោះ statement នៅក្នុង case ត្រូវបានអនុវត្ត ។
  • ប្រសិនបើ selector មិនស្មើរគ្នាទៅនឹង constant ណាមួយទេនោះវានឹងអនុវត្ត default ។

 

 

 

 

 

2-9 LOOP

  • while loop មានទម្រង់ដូចខាងក្រោម៖

while(expression) {

     commands;

}

 

ក្នុងនេះ commands ត្រូវបានអនុវត្តម្តងហើយម្តងទៀត រហូតដល់ expression នៅក្នុង while មិន ពិត ។ ក្នុងករណីដែល expression មិនពិតនោះប្លុកទាំងប៉ុន្មានរបស់ while ត្រូវបានរំលងចោល ។

ឧទាហរណ៍៖

while(Button==1) {

LED=1;

}

 

  • for loop

for loop មានទម្រង់ដូចខាងក្រោម៖

for(initial_expression; condition_expression;increment_expression)

      operation;

 

initial_expression ជាការផ្តល់តម្លៃឲ្យតំបូងឲ្យអថេរ ហើយតម្លៃនោះត្រូវបានប្រៀបធៀបទៅនឹង លក្ខណ condition_expression សិនមុននឹង loop ដំណើរការ ។ increment_condition ជាការកើន តម្លៃឲ្យអថេរ ។ loop នឹងដំណើរការម្តងហើយម្តងទៀត លុះដល់ condition_expression មិនពិត ។

ឧទារហណ៍៖

for(k=1;k<5;k++)           // k is increment 5 time

operation;               // so this operation is repeated 5 time

 

  • do-while loop

do-while loop ធ្វើការម្តងហើយទើបពិនិត្យមើលលក្ខណ check_condtion ។ ប្រសិនបើ check_condtion ពិត វានៅតែបន្ត បើពុំដូចច្នោះទេវានឹងចាកចេញពី loop ។

 

វាមានទម្រង់ដូចខាងក្រោម៖

do

operation;

while(check_condtion);

 

ឧទាហរណ៍៖

a=0;

do

a=a+1;      // increment a by one

while(a<10);       // a is increment until 9 before exiting the loop

 

2-10 ARRAY

Array ជាបណ្តុំនៃអថេរដែលមាប្រភេទដូចៗគ្នា ។ ការប្រកាស array មានទម្រង់ដូចខាងក្រោម៖

type array_name [number_of_element];

 

ឧទាហរណ៍៖

unsigned char days[7]={1,2,3,4,5,6,7};

 

ក្នុងឧទាហរណ៍ខាងលើធាតុនីមួយៗ របស់ array ឈ្មោះ days មានដូចជា៖

ធាតុទី០៖    days[0]=1;

ធាតុទី១៖    days[1]=2;

——————————-

ធាតុទី៦៖    days[6]=7;

 

ដូចគ្នានេះ យើងអាចប្រកាស Array នៃ character ដូចខាងក្រោម៖

const char msg[] = “TEST”;

const char txt_box[]= { ‘T’ , ‘e’ , ‘s’ , ‘ t ‘ , ‘\n’ } ;

 

 

2-11 Two-dimensional Array

Array ប្រភេទនេះមានលក្ខណៈដូចគ្នានឹងម៉ាទ្រីស ដែលមានជួរដេក (row ) និងជួរឈរ (column) យើងប្រកាសវាដូចខាងក្រោម៖

type array_nam [rows][columns];

 

ឧទាហរណ៍៖

int Table [3][4];    // Table has 3 rows and 4 columns

int Temp_data[2][3]={ {3,42,1} , {2,15,3} };

 

តារាងខាងក្រោមបង្ហាញពីធាតុនីមួយៗ នៃ Temp_data៖

3 42 1
2 15 3

 

2-12 អនុគមន៍ (Functions)

នៅក្នុងកម្មវិធីប្លុកនៃ expression ជាច្រើន ។ ប្រសិនបើកម្មវិធីមានភាពស្មុគស្មាញយើងត្រូវបំបែកវា ជាប្លុកតូចៗ ឫកម្មវិធីរង(subprogram)ជាច្រើន ។ គេតែងហៅ Function ថាជាកម្មវិធីរង ដែលបោះ តម្លៃត្រលប់មកកម្មវិធីមេ (main) វិញទៅតាមប៉ារ៉ាម៉ែត្រដែលបានដាក់ចូល ។ យើងអាចបោះតម្លៃចេញ ពីអនុគមន៍ដោយប្រើ Expression ។ បើតាមលក្ខណៈបច្ចេកទេស គេថាអនុគមន៍គឺជាបណ្តុំនៃ Epression ។

ជាទូទៅការប្រកាសអនុគមន៍ត្រូវមានធាតុដូចខាងក្រោម៖

  • Function name (ឈ្មោះនៃអនុគមន៍)
  • Function body (តួរខ្លួននៃអនុគមន៍)
  • list of parameters (តារាងនៃប៉ារ៉ាមែត្រ)
  • Declaration of parameters (ការប្រកាសប៉ារ៉ាម៉ែត្រ)
  • type of function result (ប្រភេទនៃលទ្ធផល ឫតម្លៃដែលបោះមក)

 

 

 

 

យើងប្រកាសវាដូចខាងក្រោម៖

type function_nam (list_of_parameters);

 

  • Function Defination

ការកំណត់តួនាទីនៃអនុគមន៍ បង្កើតឡើងដោយ៖ ការប្រកាសអនុគមន៍ និងតួរខ្លួននៃអនុគមន៍ ។ តួរខ្លួននៃអនុគមន៍គឺជាបណ្តុំនៃ statements ហើយខ័ណ្ឌចែកដោយសញ្ញា {} ។ អនុគមន៍អាចបោះតម្លៃ ត្រលប់មកកម្មវិធីមេ ឫក៏មិនបោះតម្លៃត្រលប់ ។ អនុគមន៍ដែលមិនបោះតម្លៃត្រលប់ជាប្រភេទ void ។

ទម្រង់នៃការកំណត់អនុគមន៍៖

type_of_result function_name (type argument1, type argument2,….)

{   

     command1;

     command2;

}

 

ដើម្បីបោះតម្លៃត្រលប់មកកម្មវិធីធំ យើងត្រូវប្រើ return statement ។ return statement មាន ទម្រង់៖ return [expression];

ឧទាហរណ៍៖

 

            /* function max returns greater one of its 2 arguments: */

int max(int x, int y)

{

return (x>=y) ? x : y;

}

 

  • ការហៅអនុគមន៍មកប្រើ (Function Call)

ក្រោយពេលប្រកាសនិងកំណត់អនុគមន៍រួចរាល់ហើយ យើងអាចហៅអនុគមន៍មកប្រើតាមរបៀបខាង ក្រោម៖            function_name(expression_1,….,expression_n);

ឧទាហរណ៍៖ max(3,5);

Posted in MikroC for 8-bit PICMicro | Leave a comment

ការប្រើប្រាស់កម្មវិធី MikroC សម្រាប់ PIC សាកល្បង

1- បើកកម្មវិធីមៃក្រូស៊ី

MikroC_Test (1)

2- ចូល Project -> New Project

MikroC_Test (2)

3- ចុច Next

MikroC_Test (3)

4- ក្នុង Project Name: យើងដាក់ឈ្មោះឲ្យ Project ។ Project Folder: យើងជ្រើសរើសទីតាំងដែលត្រូវ ដាក់ Project ។ ក្នុង Device Name: យើងជ្រើសរើសលេខអ៊ីសេ ដែលយើងនឹងប្រើ ឧទាហរណ៍ក្នុងករណីនេះយើងរើសយក P16F887 ( P គឺ PIC) ។ ក្នុង Device Clock: យើងជ្រើសរើសប្រេកង់របស់ក្លកដែលត្រូវប្រើគឺ 20MHz ។

រូចចុច Next តទៅទៀត ។

MikroC_Test (4)

5- ក្នុងប្រអប់ Confirm យើងរើសយក Yes ។

MikroC_Test (5)

6- យើងចុច Next តទៅទៀត ។

MikroC_Test (6)

6-  ក្នុងប្រអប់ជ្រើសរើស Include Libraries: យើងរើសយក Include All (Default) ។

MikroC_Test (7)

7- យើងចុចលើ Finish ដើម្បីបញ្ចប់ ។MikroC_Test (8)

8- នៅលើផ្ទាំងសរសេរកូដ យើងសរសេរកូដដូចខាងក្រោម ។

MikroC_Test (9)

/* DEMO PROGRAM FOR PIC16F887
 SHIFTING PORTD ONE BY ONES
 AUTHOR: KHMER OPEN LAB
 DATE: 26-04-201
 */

void main() {
 unsigned short int TEMP=0x01;
 TRISD=0x00;    // SET PORTD AS OUTPUT
 while(1)
 {
 PORTD=TEMP;
 delay_ms(300);      // DELAY FOR 300milliseconds
 TEMP=TEMP<<1;       // SHIFT TO LEFT ONE TIME
 if(TEMP==0x00)
 TEMP=0x01;          // if TEMP=0 RETURN TO 1 AGAIN
 }
 }

9- ពេលសរសេររួចរាល់ចូល Build -> Build

MikroC_Test (12)

10- ខាងក្រោមជាកូដដែល Build រួចរាល់ហើយគ្មានកំហុស ។

MikroC_Test (13)

10- ខាងក្រោមជាសៀគ្វីសាកល្បងនៅក្នុង Proteus ។

DEMO1

11- ខាងក្រោមជាវីដែអូពីដើមដល់ចប់

 

សូមអរគុណ!

រៀបចំដោយ៖ អេង ប៊ុនថា

កាលបរិច្ឆេទ៖ ថ្ងៃពុធទី 26 ខែមេសា ឆ្នាំ 2017

Posted in MikroC for 8-bit PICMicro | Leave a comment

ការតម្លើង MikroC សម្រាប់ 8-bit PIC

1-   អ្វីទៅជា MicroC

កម្មវិធីមៃក្រូស៊ី (MikroC) ជាកម្មវិធីសម្រាប់បំលែងកូដដែលអ្នកសរសេរកម្មវិធីជាភាសា C ឲ្យទៅជា ភាសារបស់ម៉ាស៊ីនដែលមៃក្រូខុនត្រូល័រ PIC អាចដំណើរការបាន ។  មៃក្រូស៊ីបង្កើតឡើងដោយក្រុមហ៊ុន Mikroelectronika ដែលមានមូលដ្ឋាននៅប្រទេសស៊ែកប៊ី នៃទ្វីបអ៊ឺរ៉ុបខាងកើត ។ មៃក្រូស៊ីមានច្រើនប្រភេទដូចជា៖

  • មៃក្រូស៊ីសម្រាប់ 8-bit PIC
  • មៃក្រូស៊ីសម្រាប់ 16-bit PIC
  • មៃក្រូស៊ីសម្រាប់ 32-bit PIC
  • មៃក្រូស៊ីសម្រាប់ AVR និង STM32 ។ល។

ក្នុងមេរៀននេះយើងសូមលើកយកមៃក្រូស៊ីសម្រាប់ 8-bit PIC ។

គេហៈទំព័រធំរបស់មៃក្រូស៊ី៖ https://www.mikroe.com/mikroc/

ទីតាំងទាញយកកម្មវិធីដែលមានក្រេក៖ https://www.dropbox.com/s/ytpjj9rr6anucf0/MikroC%20Pro%202012%20%5B5.61%5D.rar?dl=0

2-   ការតម្លើង

សូមមើលតាមការណែនាំក្នុងវីដែអូខាងក្រោម៖

 

Posted in Uncategorized | Leave a comment