BÖLÜM-3 MİKROC PROGRAM ÖRNEKLERİ
Şekil-3.1 Uygulama devresi
Örnek_1 Portd' ye bağlı olan ledleri 0.5 ms aralıklarla yakıp söndüren program
void main() {
TRISD = 0; // PORTD Çıkış
while(1)
PORTD=255; //PORTD'nin bütün ledlerini yak.
Delay_ms(500); // 0.5 ms bekle.
PORTD = 0; // PORTD'nin bütün ledlerini söndür.
Delay_ms(500); // 0.5 ms bekle.
}
}
Örnek_2 RA0 Butonuna basılınca PORTD' deki en değerlikli 4 biti, RA1 butonuna basılınca PORTD' deki değerliksiz 4 biti aktif yapan program.
void main() {
adcon1=7; //Analog girişleri sayısala çevir.
TRISD=0; //PORTD çıkı
TRISA=255; //PORTA giriş
PORTD=0;
while (1) { //Sonsuz döngü
if (RA0_bit) { // RA0 butonuna basılınca
Delay_ms(40);
PORTD=0xF0; // 11110000’ yükle
}
if (RA1_bit) { // RA1 butonuna basılırsa
Delay_ms(40);
PORTD= 0x0F; // 00001111’ yükle
}
}
}
Örnek_3 Tek tuş RA0 Butonuna ilk basmada PORTD’ deki en değerlikli 4 ledi ikinci basmada değerliksiz 4 led’i yakan program.
int x;
void main() {
TRISD=0;
TRISA=255;
ADCON1=7;
x=0;
PORTD=0;
while(1) {
if ((RA0_bit)&& ( x==0))
{
Delay_ms(300);
PORTD= 0xF0;
x=2;
}
if ((RA0_Bit) && (x==2))
{
Delay_ms(300);
PORTD=0x0F;
x=0;
}
}
}
Örnek_3 alternatif RA0 Butonuna basılınca PORTD' deki en degerlikli 4 biti, RA0 butonuna tekrar basılınca PORTD'deki değerliksiz 4 biti aktif yapan program
int x;
void main() {
adcon1=7;
TRISD=0;
TRISA=0xFF;
PORTD=0;
x=0;
while (1) {
while (x==0) {
if (RA0_bit) { // RA0 butonuna basılınca
Delay_ms(200);
PORTD=0xF0;
x=1;
}
}
while (x==1) {
if (RA0_bit) { // RA1 butonuna basılırsa
Delay_ms(200);
PORTD=0x0F;
x=0;
}
}
}
Örnek_4 RA0 ve RA1 butonlarına aynı anda basıldığında PORTD' deki ledleri yakan program.
void main() {
TRISD=0;
TRISA0_bit=1;
TRISA1_BIT=1;
ADCON1=7;
PORTD=0;
while(1) {
if ((RA0_bit)&& ( RA1_bit))
{
Delay_ms(100);
PORTD= 0xFF;
}
}
}
Örnek_5 RA0 ve RA1 butonlarına aynı anda basıldığında PORTD' deki led’leri 20 kez yakıp söndüren program yakan program.
int x;
void main() {
TRISD=0;
TRISA0_bit=1;
TRISA1_BIT=1;
ADCON1=7;
PORTD=0;
while(1) {
if ((RA0_bit)&& ( RA1_bit))
{
for (x=0; x=19; x++) {
PORTD= 0xFF;
Delay_ms(300);
PORTD= 0;
Delay_ms(300);
}
}
}
}
Örnek_5 alternatif çözüm RA0 ve RA1 butonlarına aynı anda basıldığında PORTD' deki led’leri 20 kez yakıp söndüren program yakan program.
int x;
void main() {
TRISD=0;
TRISA0_bit=1;
TRISA1_BIT=1;
ADCON1=7;
PORTD=0;
while(1) {
x=0;
if ((RA0_bit)&& ( RA1_bit))
{
while (x<19) {
PORTD= 0xFF;
Delay_ms(300);
PORTD= 0;
Delay_ms(300);
x=x+1;
}
}
}
}
Örnek_6 RA0 ve RA1 butonlarına sırası ile basıldığında PORTD' deki led’leri 20 kez yakıp söndüren program yakan program.
int x;
void main() {
TRISD=0;
TRISA0_bit=1;
TRISA1_bit=1;
ADCON1=7;
PORTD=0;
while(1) {
if (RA0_bit){
x=1;
}
if ((x==1)&&( RA1_bit)){
x=0;
while (x<19) {
PORTD= 0xFF;
Delay_ms(300);
PORTD= 0;
Delay_ms(300);
x=x+1;
}
}
}
}
SEVEN SEGMENT DİSPLEY
Örnek_7 0-9 sayıcı
Conts char say[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}, int i;
void main() {
TRISA =0;
TRISB=0;
PORTA=1;
PORTB = 0;
while(1){
i=0;
while(i<10) {
PORTB = say[i];
Delay_ms(500);
i++ ;
}
}
}
Örnek_8 99 sayıcı
#define disp1 PORTA.F2
#define disp2 PORTA.F3
#define arttir PORTA.F0
#define azalt PORTA.F1
char sayi=0,birler,onlar;
void goster()
{
onlar=sayi/10;
birler=sayi%10;
disp2=1;
PORTB=onlar;
disp1=0;
delay_ms(3);
disp1=1;
PORTB=birler;
disp2=0;
delay_ms(3);
}
void kurulum()
{
CMCON=7; //girişler analog ve karşılaştırma kapalı
TRISA.f0=1; TRISA.f1=1; TRISA.f2=0; TRISA.f3=0;
TRISB=0; PORTB=0;
disp1=0; disp2=0;
}
void main()
{
kurulum();
while(1)
{
if(arttir)
{
sayi++;
if(sayi==100)sayi=0;
while(arttir)
{
goster();
}
}
if(azalt)
{
if(sayi==0)sayi=100;
sayi--;
while(azalt)
{
goster();
}
}
goster();
}
}
Step Motor Kontrolü
Örnek_9 A0 butonuna her basmada ileri, A1 butonuna her basmada geri adım atacak program yazınız?
int i, char adim[8]={8,12,4,6,2,3,1,6};
void main() {
trisb=0;
trisa=255;
i=0;
portb=0;
while(1)
{
if (RA_0) { //ileri tam adim
portb=adim(i);
delay_ms(300);
i++;
if (i==7)
i=0;
}
if (RA_1) { //geri tam adim
portb=motor(i);
delay_ms(300);
i--;
if (i==0);
i=7;
}
}
Örnek_10 A0 butonuna basıldığı sürece ileri, A1 butonuna basıldığı sürece geri adım atacak program yazınız?
int i, char adim[8]={8,12,4,6,2,3,1,6};
void main() {
trisb=0;
trisa=255;
i=0;
portb=0;
while(1)
{
While (RA_0) { //ileri tam adim
portb=adim(i);
delay_ms(300);
i++;
if (i==7)
i=0;
}
While (RA_1) { //geri tam adim
portb=motor(i);
delay_ms(300);
i--;
if (i==0);
i=7;
}
}
KESMELER(INTERRUPTS)
Kesme (interrupt) vektörü: Mikroişlemci program belleğindeki programı çalıştırırken, sırası belirsiz, acilen yapılması gerekli yordamları da çalıştırabilir. Sırası ve ne zaman ortaya çıkacağı bilinmeyen bu işleri yapmak için mikroişlemci, bir yolla dışarıdan veya kendi içinden uyarılmalıdır.
İç içe kullanılan altprogramlar en çok sekiz olabilir. Bunlara kesme bölümleri de dahildir. Kesmeleri dahil etmezsek, yığın taşmasına neden oluruz. Yığın taşması oluştuğunda bizi uyaracak, herhangi bir uyarı (flag) kaydedicisi bulunmamaktadır.
INTCON REGISTER (KESME KAYDEDİCİSİ)
INTCON kaydedicisi, okunabilir ve yazılabilir bir kaydedicidir. Kapsamında TMR0 / WDT kaydedicisi taşma uyarı bitleri, PORTB değişim ve dış kesme (RB0 / INT pin interrupt) denetim bitleri, TMR0 kesme denetim bitleri bulunur.
7 6 5 4 3 2 1 0
GIE
|
PEIE
|
TOIE
|
INTE
|
RBIE
|
TOIF
|
INTF
|
RBIF
|
Bit 7: GIE: Bütün kesmeler geçerli (Global Interrupt Enable) biti
1= Maskelenmemiş kesmeleri aktif yapar
0= Kesmeyi kaldırır
Bit 6: PEIE: Çevresel kesmeleri geçerli yapma biti
1= Çevresel kesmeyi aktifleştirir
0= Çevresel kesmeyi kaldırır
Bit 5: TOIE: TMR0 clock taşma kesmesi biti
1= TMR0 kesmesini aktif yapar
0= Kesmeyi kaldırır
Bit 4: INTE: RB0 / INT dış kesme biti
1= RB0 / INT pininden dış kesmeyi aktif yapar
0= Kesmeyi kaldırır
Bit 3: RBIE: PORTB değişiklik kesme biti
1= RB port değişimini aktif yapar
0= Kesmeyi kaldırır
Bit 2: TOIF: TMR0 taşma uyarısı bayrak biti
1= TMR0 taştı (taştıktan sonra program içinden temizlenir)
0= TMR0 taşmadı
Bit 1: INTF: TMR0 / INT dış kesme uyarı bayrak biti
1= TMR0 dış kesme oldu (program içinden temizlenir)
0= TMR0 dış kesme yok
Bit 0: RBIF: RB Port değişimi kesme uyarı bayrak biti
1= En az bir RB<7..4> pini durum değiştirdi (Programda kontrol edilir)
0= Hiçbir RB<7..4> pini durum değiştirmedi
OPTION REGISTER(DURUM KAYDEDİCİSİ)
Bu register değişik kontrol bitlerini içeren özel bir register'dır. B portunun çıkışlarını pull-up yapan, interrupt sinyalinin tetikleme kenarını seçen, TMR0 ve WDT için frekans bölme sayısını belirten ve TMR0 veya WDT seçme bayrağı bulunduran bir registerdir.
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
RBPU’
|
INTEGD
|
TOCS
|
TOSE
|
PSA
|
PS2
|
PS1
|
PS0
|
RBPU' : PORTB pull-up aktif etme bayrağı
1 : PORTB pull-up’ lar pasifleştirilir.
0 : PORTB pull-up’ lar aktifleştirilir.
INTEGD : Interrupt kenarı seçme biti
1 : Interruptlar RB0/INT sinyalin yükselen kenarında oluşur
0 : Interruptlar RB0/INT sinyalin düşen kenarında oluşur.
0 : Interruptlar RB0/INT sinyalin düşen kenarında oluşur.
TOCS : TMR0 clock sinyali kaynağı seçme biti
1 : RA4/TOCKI pinden alınan clock sinyali
0 : Komut dizimi ile oluşturulan clock ( CLK0 )
TOSE : TMR0 harici clock sinyali kenar seçme biti
1 : Düşen kenarda artış
0 : Yükselen kenarda artış
0 : Yükselen kenarda artış
PSA : Frekans bölücü seçme biti
1 : Prescaler (frekans bölme sayısı) değeri WDT için geçerli
0 : Prescaler değeri Timer0 için geçerli
0 : Prescaler değeri Timer0 için geçerli
PS2, PS1, PS0 : Prescaler değeri seçme bitleri
PS2 PS1 PS0
|
TMR0 Değeri
|
WDT Değeri
| ||
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
|
0
|
1/32
|
1/16
|
1
|
0
|
1
|
1/64
|
1/32
|
1
|
1
|
0
|
1/128
|
1/64
|
1
|
1
|
1
|
1/256
|
1/128
|
Örnek_11 RB0(Harici ) kesme örneği
void interrupt() // interrupt alt programı
{
portb=~portb; // portb'yi tersle
delay_ms(10000) //10 sn bekle
INTCON.INTF=0; // RB0 kesmesi bayrağını sıfırla
}
void main() //Ana program
{
INTCON.GIE=1;
INTCON.INTE=1;
OPTION_REG.INTEDG=0;
trisb=0b00000001;
portb=0;
while(1)
{
portb=0xff;
}
}
Örnek_12 TMR0 kesme örneği
unsigned cnt;
void interrupt() {
if (INTCON.TMR0IF) {
cnt++;
INTCON.TMR0IF = 0; // TMR0IF sıfırla
}
}
void main() {
ADCON1=7;
TRISB = 0;
PORTB = 0xFF;
TMR0 = 0;
INTCON.GIE = 1;
INTCON.TMR0IE = 1;
cnt = 0;
do {
if (cnt >= 122) {
PORTB = ~PORTB; // Toggle PORTB LED
cnt = 0; }
} while(1);
}
LCD
Sıvı kristal displeyler (LCD’ler) birçok uygulamada kullanılırlar. Bunun nedeni LCD’lerin pek çok sıradan video göstericilere göre okunmaları daha kolaydır ve uzun zaman diliminde onlarla çalışmak daha zevklidir. Sınırlı görüş açısı, parlaklık, kontrast (zıtlık), yüksek imalat maliyeti gibi sınırlandırıcı özellikleri olmakla birlikte, araştırmalar devam ederken bu sınırlamalar yavaş yavaş daha önemsiz olmaya başlamıştır.
Bugünün LCD’leri pasif ve aktif olmak üzere iki tip olarak karşımıza çıkar. Daha az pahalı pasif matrix displeyler imalat maliyeti, cevap verme zamanı, görüş açısı ve resim kalitesi itibariyle ticaret dışıdır. Aktif matrix displeyler süper resim kalitesi ve görüş özelliğine sahiptir. Fakat çalışmaları için daha fazla güce ihtiyaçları vardır ve imalatları çok pahalıdır. Farkına varmasak bile LCD paneller günlük hayatımızın bir parçası gibidir. En basitinden bazı cep telefonlarında, hesap makinalarında ve birçok elektronik eşyada bu teknoloji kullanılmaktadır. LCD paneller hafif ve az yer kaplarlar. Yaptığınız devrelere küçük bir LCD panel bağlayarak devreden, kullanıcıya göndermek istediğiniz mesajları bu ekrana yazdırabilirsiniz.
LCD_Init()
| ||||
Tanımı
|
| |||
Örnek
|
// Lcd pinout settings
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;
// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;
...
| |||
Lcd_out
| ||||
Tanımı
|
Metni (text) Lcd’nin belirtilen kolon ve satırına (row ve col paremetreleri) yazar. Hem sabitler ve hem de dizi değişkenlerini bir metin(text) gibi gönderebilir.
| |||
Gereklilikleri
|
Lcd’li port başlatılmalıdır. Lcd_config veya Lcd_Init’ bakınız.
| |||
Örnek
|
Lcd_Out(1,2,”text”) text yazısını 1 satır 2. karekterden başlatır.
| |||
Lcd_out_cp
| ||||
Lcd_Cmd
| ||||
Tanımı
|
Komutu lcd’ye yollar. Foksiyona önceden belirtilmiş sabitlerden birini geçebilirsiniz.
| |||
Gereklilikleri
|
Lcd’li port başlatılmalıdır. Lcd_config veya Lcd_Init’ bakınız.
| |||
Örnek
|
Lcd_cmd(lcd_clear) Lcd ekranını temizler.
| |||
Lcd_Chr
| ||||
Tanımı
|
Karakteri(character) Lcd’nin belirtilen kolon ve satırına (row ve col paremetreleri) yazar. Hem sabitler ve hem de dizi değişkenlerini bir character gibi gönderebilir.
| |||
Gereklilikleri
|
Lcd’li port başlatılmalıdır. Lcd_config veya Lcd_Init’ bakınız.
| |||
Örnek
|
Lcd_chr(1,3,’’i’’) i karakteri 1.satır 3.karakterden başlat.
| |||
Lcd_Chr_Cp
| ||||
Tanımı
|
Karakteri(character) Lcd’nin belirtilen kolon ve satırına (row ve col paremetreleri) başlayarak başlar. Sabitler ve hem de dizi değişkenlerini bir character gibi gönderebilir.
| |||
Gereklilikleri
|
Lcd’li port başlatılmalıdır. Lcd_config veya Lcd_Init’ bakınız.
| |||
Örnek
|
Lcd_Chr_Cp(‘’i’’) ‘’i’’ yi imlecinin bulunduğu yere yaz
| |||
LCD KOMUTU
|
AMACI
|
_LCD_FIRST_ROW
|
İmleci birinci satıra taşı
|
_LCD_SECOND_ROW
|
İmleci ikinci satıra taşı
|
_LCD_THIRD_ROW
|
İmleci üçüncü satıra taşı
|
_LCD_FOURTH_ROW
|
İmleci dördüncü satıra taşı
|
_LCD_CLEAR
|
Displeyi temizle
|
_LCD_RETURN_HOME
|
İmleci başa dönder
|
_LCD_CURSOR_OFF
|
İmleci kapat
|
_LCD_UNDERLINE_ON
|
İmlecin altı çizgili
|
_LCD_BLINK_CURSOR_ON
|
İmlecin flash yapmasını sağla
|
_LCD_MOVE_CURSOR_LEFT
|
İçeriği değiştirmeden verileri sola kaydır
|
_LCD_MOVE_CURSOR_RIGHT
|
İçeriği değiştirmeden verileri sağa kaydır
|
_LCD_TURN_ON
|
Lcd yi aç
|
_LCD_TURN_OFF
|
Lcd’ yi kapat
|
_LCD_SHIFT_LEFT
|
Ekrandaki veriyi değiştirmeksizin sola kaydır
|
_LCD_SHIFT_RIGHT
|
Ekrandaki veriyi değiştirmeksizin sağa kaydır
|
Örnek_13 LCD’ ye yazdırma
char a[ ]= “ELEKTRONIK";
char b[ ]= " VE OTOMASYON";
// Lcd pinout settings
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;
// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;
Void main{
Trisb=0;
lcd_init();
lcd_cmd(_lcd_clear);
lcd_cmd(_lcd_cursor_off);
LCD_OUT(1,1,a);
LCD_OUT(2,1,b);
}
Örnek 14 LCD’ de 0-255 arası sayan program
İnt t;
string txt [3];
// Lcd pinout settings
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;
// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;
Void main(){
trisb=0;
lcd_init();
lcd_cmd(_lcd_clear);
lcd_cmd(_lcd_cursor_off)Ü
while (1){
for (t= 0; t = 255; t++){
ByteToStr(t, txt);
lcd_out(1,1,txt);
delay_ms(1000);
}
}
}