ဒီ Project လေးကတော့ Rotary encoder အမျိုးအစား တစ်ခုဖြစ်တဲ့ EC11 encoder လေးကို ဖတ်ဖို့အတွက် PIC ရဲ့ GPIO တွေဖြစ်တဲ့ PORTA ရဲ့ PIN0 နဲ့ PIN1 ကို အသုံးပြုပြီး ENCODER ရဲ့ Channel1 နဲ့ Channel2 ကို တစ်ပြိုင်တည်း ဖတ်ပြီး Counter ကို တိုးခြင်း ၊ လျှော့ခြင်း တို့ကို 7 segment Display ပေါ်မှာ ကိန်းကဏန်း အနေဖြင့် ဖော်ပြခြင်းဖြင့် encoder ရဲ့ အတိုး အလျှော့ လှည့်ခြင်းကို လိုက်မှတ်ပြီး မိမိ အလိုရှိရာ အသုံးပြုရသော program code လေးကို ဖော်ပြပေးထားပါတယ်။
Rotary encoder အသုံးပြုပြီး အသုံးချသော ပစ္စည်းအချို့ကို ဖော်ပြလိုက်ပါတယ်။
အစရှိသည် ပစ္စည်းများတွင် အသုံးပြုကြသည်။
/*Example code
ယခုဖော်ပြပါ code သည် PIC16F887 ပေါ်တွင် ရေးသားထားပြီး Encoder Input အနေဖြင့် RA0 , RA1 ကို အသုံးပြုပြီး
7 segment Display ကို PORTD မှ နေပြီး အသုံးပြုပြီး ၊ 7 segment မှ common များကို PORTC မှ RC0,RC1,RC2,RC3
တို့ကိုအသုံးပြုထားပါသည်။
MKT မှ ထုတ်လုပ်သော PIC board ပေါ်တွင် လွယ်ကူစွာ အသုံးပြုနိုင်ပသည်။
*/
#include <pic.h>
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & LVPDIS);// Configuration bit များကြေညာခြင်း
void delay_ms(int ms);
void PIC_Init(void);// function prototype
void display(void);//function prototype
void Save(unsigned int count);
const char segment[16]={0b00000011,//0
0b10011111,//1
0b00100101,//2
0b00001101,//3
0b10011001,//4
0b01001001,//5
0b01000000,//6
0b00011110,//7
0b00000001,//8
0b00001001,//9
0b00010001,//A
0b11000001,//b
0b01100011,//C
0b10000101,//d
0b01100001,//E
0b01110001//F
};
__EEPROM_DATA(0xbc,0x61, 0x4e, 3, 4, 5, 6, 7);
__EEPROM_DATA(‘1′,’2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’);
__EEPROM_DATA(‘9′,’A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’);
unsigned int Delay=0;
char cnt,state=0,Push1=0;
unsigned char Digit[4];
unsigned int Counter=0;
unsigned char Disdelay=5;
unsigned int Cntdelay=1000,Pushdelay=0;
char EC11[4],Index=0;
unsigned char Digit[4];
void interrupt isr(void)
{
if(T0IF)//1ms
{
T0IF=0;
TMR0 = 6;
if(Delay)
–Delay;
if(Disdelay)
–Disdelay;
if(Cntdelay)
–Cntdelay;
}
}
void main(void)
{
PIC_Init();
Counter = eeprom_read(0)<<8;
Counter = Counter | eeprom_read(1);
while(1)//Forever
{
if(Disdelay==0)//5ms
{
display();
Disdelay=5;//Reload delay value
}
if(Cntdelay==0)
{
Digit[0]=Counter%10;
Digit[1]=Counter%1000%100/10;
Digit[2]=Counter%1000/100;
Digit[3]=Counter/1000;
Cntdelay=100;
}
if(!RB0)
{
if(!Push1)
{
Push1=1;
Save(Counter);
}
}
else Push1=0;
switch(PORTA & 0b00000011)
{
case 0b00000000://A=0,B=0
if(EC11[1] & EC11[2])
{
Counter++;
if(Counter>9999)
Counter=0;
EC11[1]=0;
EC11[2]=0;
}
else if(EC11[3] & EC11[2])
{
Counter–;
if(Counter<21)
Counter=0;
EC11[3]=0;
EC11[2]=0;
}
break;
case 0b00000001://A=1,B=0
if(EC11[2]==1)
{
EC11[1]=1;
}
break;
case 0b00000011://A=1,B=1
EC11[2]=1;
break;
case 0b00000010://A=0,B=1
if(EC11[2]==1)
{
EC11[3]=1;
}
break;
default:
break;
}
}
}
void PIC_Init(void)
{
TRISD = 0;//PORTD all OUTPUT
PORTD = 0;//PORTD Clear
TRISE = 0b00000111;//RE0,RE1,RE2 input
ANSEL = 0b00011100;//AN5,AN6,AN7 disable digit I/O
PORTE = 0;
TRISC = 0;//PORTC are output
PORTC = 0;
TRISA = 0b00000011;//RA0 , RA1 Input
PORTA = 0;//Clear porta
TRISB = 0b00000001;//RB0 input
ANSELH = 0; //Analog off Digital ON
WPUB = 0b00000001;//RB0 pull up
RBPU = 0;//PORTB Pull up enable
OPTION = 0x81; // PortB pull-up disable, Timer0 prescaler 1:2
TMR0 = 6; // Timer 0 ထဲကို Reload value 6 ထည့်ခဲ့မယ်
INTCON = 0xA0;// Global Interrupt set လုပ် ပြီး ၊ Timer 0 interrupt ဖြစ်တဲ့ T0IF ကို set လုပ်
}
void delay_ms(int ms)
{
Delay=ms;
while(Delay)
{
}
}
void display(void)
{
switch(state)
{
case 0:
PORTD = segment[Digit[0]];// Digit array ထဲက အခန်းနံပါတ်က segment array ထဲကအခန်း နံပါတ် ကိုယူပြီး PORTD ထဲကိုထည့်
RC0=1;//Digit 0 ON
RC1=0;//Digit 1 OFF
RC2=0;
RC3=0;
state=1;
break;
case 1:
PORTD = segment[Digit[1]];
RC0=0;//Digit 0 OFF
RC1=1;//Dgiit 1 ON
RC2=0;
RC3=0;
state=2;
break;
case 2:
PORTD = segment[Digit[2]];
RC0=0;//Digit 0 ON
RC1=0;//Digit 1 OFF
RC2=1;
RC3=0;
state=3;
break;
case 3:
PORTD = segment[Digit[3]];
RC0=0;//Digit 0 OFF
RC1=0;//Dgiit 1 ON
RC2=0;
RC3=1;
state=0;
break;
default:
break;
}
}
void Save(unsigned int count)
{ char x;
x = count>>8;
/* Counter သည် int 16bit ဖြစ်သောကြောင့် သိမ်းဆည်းရမည့် EEPROM သည် 8bit သာဖြစ်သောကြောင့် LSB , MSB ခွဲထည့်ရပါသည်။ */
eeprom_write(0,x);
x = count;
eeprom_write(1,x );
}