Merhabalar
Lcd yi bir port üzerinden değilde farklı portlardan seçilmiş pinler üzerinden sürmek istiyorum. Bu pinlerle nasıl port oluşturabilirim?
Lcd ye yazmak istediğin veri nin d0... d7 kadar bitlerini test edip
"1" ise bağlı pini "1" , "0" ise pini "0" yaparak oluşturabilirsin.
Alıntı yapılan: sadogan - 25 Haziran 2016, 13:38:36
Lcd ye yazmak istediğin veri nin d0... d7 kadar bitlerini test edip
"1" ise bağlı pini "1" , "0" ise pini "0" yaparak oluşturabilirsin.
Hocam pin durumları programın akışına göre değiştiği için tek tek 1 se 1 , 0 sa 0 yapılamıyor.
Alıntı yapılan: cyhn41 - 25 Haziran 2016, 13:42:51
Hocam pin durumları programın akışına göre değiştiği için tek tek 1 se 1 , 0 sa 0 yapılamıyor.
Bu danık pinlere başka rütinlerdemi yazıyor.
Alıntı yapılan: sadogan - 25 Haziran 2016, 14:15:20
Bu danık pinlere başka rütinlerdemi yazıyor.
Hocam göndereceği veriye ve veriyi yazacagı satıra göre pin durumlarını saptamak neredeyse imkansız olup port halinde çalışmak gerekiyor. Ben tek portta çalışan uygulama yaptım, amacım farklı portlardaki pinleri port haline getirip yine port üzerinden çalışmak. Bu noktada farklı portlardaki pinleri bit bit ayırmam ve bunu bir sanal porta tanımlamam gerekiyor. Sıkıntı bu noktada başlıyor.
Bu yöntemi yıllardır kullanıyoruz, pin durumlarını saptamak imkansız gibi açıklamalar ön yargılı.
if(0B10000000&dt)pin7=1;
else pin7=0;
if(0B01000000&dt)pin6=1;
else pin6=0;
if(0B00100000&dt)pin5=1;
else pin5=0;
if(0B00010000&dt)pin4=1;
else pin4=0;
if(0B00001000&dt)pin3=1;
else pin3=0;
if(0B00000100&dt)pin2=1;
else pin2=0;
if(0B00000010&dt)pin1=1;
else pin1=0;
if(0B00000001&dt)pin0=1;
else pin0=0;
Alıntı yapılan: sadogan - 25 Haziran 2016, 14:56:05
Bu yöntemi yıllardır kullanıyoruz, pin durumlarını saptamak imkansız gibi açıklamalar ön yargılı.
if(0B10000000&dt)pin7=1;
else pin7=0;
if(0B01000000&dt)pin6=1;
else pin6=0;
if(0B00100000&dt)pin5=1;
else pin5=0;
if(0B00010000&dt)pin4=1;
else pin4=0;
if(0B00001000&dt)pin3=1;
else pin3=0;
if(0B00000100&dt)pin2=1;
else pin2=0;
if(0B00000010&dt)pin1=1;
else pin1=0;
if(0B00000001&dt)pin0=1;
else pin0=0;
Teşekkürler hocam bu yöntemi kullanmaya çalışacağım.
Farklı portlardaki pinlerin port oluşturmasını da bilenlerden öğrenmek isterim.
LCD rutinlerini sen yazıyorsan ya da rutinlerde portu okuyan rutini değiştirme şansın varsa ortada problem yok.
Ayrık portun veri bitlerini maskele kaydır bir araya getir işlemi yapılacak sadece.
Alıntı yapılan: z - 26 Haziran 2016, 10:20:27
LCD rutinlerini sen yazıyorsan ya da rutinlerde portu okuyan rutini değiştirme şansın varsa ortada problem yok.
Ayrık portun veri bitlerini maskele kaydır bir araya getir işlemi yapılacak sadece.
Lcd driveri elimde mevcut ben yazmadım hazır buldum sadece üzerinde bir kaç oynama ile driverde tanımlı olan GPIOB portu yerine keyfi seçeceğim pinler ile lcdyi sürmek istiyorum.
void lcd_port_okuma (void)
{
D1 = GPIOA->IDR; //D1 GPIO_PIN_3 GPIOA
D2 = GPIOA->IDR; //D2 GPIO_PIN_10 GPIOA
D3 = GPIOC->IDR; //D3 GPIO_PIN_4 GPIOC
D4 = GPIOC->IDR; //D4 PIO_PIN_8 GPIOC
E = GPIOB->IDR; //E GPIO_PIN_2 GPIOB
RS = GPIOB->IDR; //RS GPIO_PIN_4 GPIOB
LCD_GPIO =LCD_GPIO | (RS<<10) | (E<<11) | (D1<<12) | (D2<<13) | (D3<<14) | (D4<<15);
}
Böyle bir fonksiyon yazdım ama bu tam istediğim kod olmadı, d1,d2,.. pinlerini LCD_GPIO adlı portun içine atmam gerekli,bunu yapamıyorum
Alıntı yapılan: sadogan - 25 Haziran 2016, 14:56:05
Bu yöntemi yıllardır kullanıyoruz, pin durumlarını saptamak imkansız gibi açıklamalar ön yargılı.
if(0B10000000&dt)pin7=1;
else pin7=0;
if(0B01000000&dt)pin6=1;
else pin6=0;
if(0B00100000&dt)pin5=1;
else pin5=0;
if(0B00010000&dt)pin4=1;
else pin4=0;
if(0B00001000&dt)pin3=1;
else pin3=0;
if(0B00000100&dt)pin2=1;
else pin2=0;
if(0B00000010&dt)pin1=1;
else pin1=0;
if(0B00000001&dt)pin0=1;
else pin0=0;
void lcd_enable(void)
{
//LCD_GPIO->ODR|=E;
int mask=0x0000;
mask = mask | 0x0800;
if ((mask&0x0400)==0x0400)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);
if ((mask&0x0800)==0x0800)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
if ((mask&0x1000)==0x1000)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
if ((mask&0x2000)==0x2000)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET);
if ((mask&0x4000)==0x4000)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET);
if ((mask&0x8000)==0x8000)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);
lcd_busy();
// LCD_GPIO->ODR&=~(E);
mask=0x0000;
mask = mask | ~(0x0800);
if ((mask&0x0400)==0x0400)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);
if ((mask&0x0800)==0x0800)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
if ((mask&0x1000)==0x1000)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
if ((mask&0x2000)==0x2000)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET);
if ((mask&0x4000)==0x4000)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET);
if ((mask&0x8000)==0x8000)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);
}
Böyle bir şey yaptım ama çalıştıramadım, acaba koşulumu yanlış yazdım?
void lcd_yaz_pin (uint16_t bilgi)
{
if ((bilgi&0x0400)==0x0400)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); //RS
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); //RS
if ((bilgi&0x0800)==0x0800)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET); //E
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET); //E
if ((bilgi&0x1000)==0x1000)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET); //D1
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET); //D1
if ((bilgi&0x2000)==0x2000)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET); //D2
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET); //D2
if ((bilgi&0x4000)==0x4000)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_SET); //D3
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET); //D3
if ((bilgi&0x8000)==0x8000)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET); //D4
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET); //D4
}
Lcd farklı pinlerden sürmek için böyle bir fonksiyon yazdım çalıştıramadım. Başka bir yöntem önerebilecek biri var mı?
İlk önce dataları çık. 4/8 biti de çıktıktan sonra Reg Select ve Enable sinyallerini aktif et ardından Enable sinyalini pasif et.
Aksi takdirde sorun çıkar.
Sen tersini yapmışsın.
void lcd_busy(void)
{
unsigned long h=20000; // delay 32Mhz = 2000
while(h--);
}
/***************************************************************************/
void lcd_yaz_pin (uint16_t bilgi)
{
if ((bilgi&0x0400)==0x0400)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); //RS
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); //RS
if ((bilgi&0x0800)==0x0800)
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET); //E
else
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET); //E
if ((bilgi&0x1000)==0x1000)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET); //D1
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET); //D1
if ((bilgi&0x2000)==0x2000)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET); //D2
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET); //D2
if ((bilgi&0x4000)==0x4000)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_SET); //D3
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_RESET); //D3
if ((bilgi&0x8000)==0x8000)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET); //D4
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET); //D4
}
void lcd_komut(unsigned char c)
{
lcd_yaz_pin(0x03FF);// LCD_GPIO->ODR &=0x3FF;
lcd_yaz_pin(((c&0xF0)<<8)); // LCD_GPIO->ODR |=(c&0xF0)<<8;
lcd_enable();
lcd_busy();
lcd_yaz_pin(0x3FF); // LCD_GPIO->ODR &=0x3FF;
lcd_yaz_pin((c<<0x0C)); // LCD_GPIO->ODR |= (c<<0x0C);
lcd_enable();
lcd_busy();
}
/***************************************************************************/
void veri_yolla(unsigned char byte)
{
switch (byte)
{
case 'Ç' :
byte=0x00;
break;
case 'I' :
byte=0x01;
break;
case 'Ö' :
byte=0x02;
break;
case 'S' :
byte=0x03;
break;
case 'Ü' :
byte=0x04;
break;
case 'ç' :
byte=0x00;
break;
case 'i' :
byte=0x01;
break;
case 'ö' :
byte=0x02;
break;
case 's' :
byte=0x03;
break;
case 'ü' :
byte=0x04;
break;
default :
break;
}
lcd_yaz_pin(0x3FF); //LCD_GPIO->ODR &=0x3FF;
lcd_yaz_pin(((byte&0xF0)<<8)|RS); //LCD_GPIO->ODR |= ((byte&0xF0)<<8)|RS;
lcd_enable();
lcd_busy();
lcd_yaz_pin(0x3FF); //LCD_GPIO->ODR &=0x3FF;
lcd_yaz_pin((byte<<0x0C)|RS); //LCD_GPIO->ODR |= (byte<<0x0C)|RS;
lcd_enable();
lcd_busy();
}
/***************************************************************************/
void lcd_clear(void)
{
lcd_komut(0x1);
HAL_Delay(5);
}
/***************************************************************************/
void lcd_yaz(const char *s)
{
while(*s)
veri_yolla(*s++);
}
/***************************************************************************/
void lcd_gotoxy(unsigned char x,unsigned char y)
{
if(x==1)
lcd_komut(0x80+((y-1)%16));
else
lcd_komut(0xC0+((y-1)%16));
}
/***************************************************************************/
void lcd_enable(void)
{
lcd_yaz_pin(E); //LCD_GPIO->ODR|=E;
lcd_busy();
lcd_yaz_pin(~(E)); //LCD_GPIO->ODR&=~(E);
}
/***************************************************************************/
/***************************************************************************/
/***************************************************************************/
void lcd_init()
{
lcd_yaz_pin(0x03FF); // LCD_GPIO->ODR &=0x03FF;
HAL_Delay(100);
lcd_komut(0x03);
HAL_Delay(1);
lcd_enable();
HAL_Delay(1);
lcd_enable();
lcd_komut(0x02);
HAL_Delay(1);
lcd_komut(0x33);
lcd_komut(0x32);
lcd_komut(0x28);
lcd_komut(0x0C);
for(i=0; i<=7; i++) // tr karakter tanitiliyor
{
lcd_komut(adres);
for(s=0; s<=7; s++)
{
veri_yolla(karakter_[i][s]);
}
adres=adres+8;
}
lcd_clear();
}
lcd_init programında öyle yapılıyor olması lazım yinede gözden kaçırmış olabilirim. Lcd rutinleri yukarıda ve lcd nin normalde bağlı olduğu pinler GPIOB 10..15 dir.