Dinçer Aydın adlı arkadaşın yıllar önce keşfettiğim internet sayfası üzerinde çalışan
2x16 lcd simulatörü var.
Denemelerini simulatör üzerinde yapabilirsin.
Donanımsal hata varsa devrenle saç baş yolmadan önce yapman gerekeni biliyor olursun.
http://www.dinceraydin.com/djlcdsim/djlcdsim.html
Adım adım lcd ye ne gönderilmesi gerektiği ile ilgili bir kaynak hazırlamıştım,
bulursam onu gönderirim.
Olursa şu videodan da aynı çıkarımı yapabilirsin:
Bunları denedim ve similasyonda olduğu gibi yaptım . Maalesef olmadı bu yüzden proteus programında da kurduğum devreyi yaptım ve yine sonuç yok. Ekranda bi yazıyı çıkartamıyorum. Sizin bu konuda bilginiz var mı ? Eğer ilgilenmek isterseniz tüm yaptıklarımı detaylı bir şekilde tek tek anlatıcam.Buldum, aradığın nokta atışı özet olarak aşağıda var:
2x16 lcd nasıl kulanılır sürülür ucanel RaMu
http://www.mediafire.com/file/ii3guh6g9emk19d/2X16_LCD_giri%C5%9F.pptx/file
//MCU to 2x16LCD pinout connection
// MCU A5, A4, A3, A2, A1, A0
// LCD E R/S D7 D6 D5 D4
uint16_t lcd_init_buf[]={
0x03,0x23,0x03, // init 0x03
0x03,0x23,0x03,
0x03,0x23,0x03,
0x02,0x22,0x02, // init 0x02
0x02,0x22,0x02, // init 0x28 -2
0x08,0x28,0x08, // init 0x28 -8
0x00,0x20,0x00, // init 0x0C -0
0x0C,0x2C,0x0C, // init 0x0C -C
0x00,0x20,0x00, // init 0x01 -0
0x01,0x21,0x01, // init 0x01 -1
0x00,0x20,0x00, // init 0x06 -0
0x06,0x26,0x06, // init 0x06 -6
//FORMAT for sending command to the LCD
//for example to send a 0xYZ as a command
//we need to translate it to the 6 bytes as follows
//0x0Y,0x2Y,0x0Y, // init 0xYZ -Y
//0x0Z,0x2Z,0x0Z, // init 0xYZ -Z
};
#define LCD_INIT_BUFLEN (((sizeof(lcd_init_buf)) / 2) -1)
uint16_t dma_lcd_buf[]={
0x28,0x08, // CMD 0x80 -8 ilk satirbasi
0x20,0x00, // CMD 0x80 -0
0x34,0x14, // DATA 1M
0x31,0x11, // DATA 1L
0x34,0x14, // DATA 2M
0x31,0x11, // DATA 2L
0x34,0x14, // DATA 3M
0x31,0x11, // DATA 3L
0x34,0x14, // DATA 4M
0x31,0x11, // DATA 4L
0x34,0x14, // DATA 5M
0x31,0x11, // DATA 5L
0x34,0x14, // DATA 6M
0x31,0x11, // DATA 6L
0x34,0x14, // DATA 7M
0x31,0x11, // DATA 7L
0x34,0x14, // DATA 8M
0x31,0x11, // DATA 8L
0x34,0x14, // DATA 9M
0x31,0x11, // DATA 9L
0x34,0x14, // DATA 10M
0x31,0x11, // DATA 10L
0x34,0x14, // DATA 11M
0x31,0x11, // DATA 11L
0x34,0x14, // DATA 12M
0x31,0x11, // DATA 12L
0x34,0x14, // DATA 13M
0x31,0x11, // DATA 13L
0x34,0x14, // DATA 14M
0x31,0x11, // DATA 14L
0x34,0x14, // DATA 15M
0x31,0x11, // DATA 15L
0x34,0x14, // DATA 16M
0x31,0x11, // DATA 16L
0x2C,0xC0, // CMD C0-C ikinci satirbasi
0x20,0x00, // CMD C0-0
0x34,0x14, // DATA 1M
0x32,0x12, // DATA 1L
0x34,0x14, // DATA 2M
0x32,0x12, // DATA 2L
0x34,0x14, // DATA 3M
0x32,0x12, // DATA 3L
0x34,0x14, // DATA 4M
0x32,0x12, // DATA 4L
0x34,0x14, // DATA 5M
0x32,0x12, // DATA 5L
0x34,0x14, // DATA 6M
0x32,0x12, // DATA 6L
0x34,0x14, // DATA 7M
0x32,0x12, // DATA 7L
0x34,0x14, // DATA 8M
0x32,0x12, // DATA 8L
0x34,0x14, // DATA 9M
0x32,0x12, // DATA 9L
0x34,0x14, // DATA 10M
0x32,0x12, // DATA 10L
0x34,0x14, // DATA 11M
0x32,0x12, // DATA 11L
0x34,0x14, // DATA 12M
0x32,0x12, // DATA 12L
0x34,0x14, // DATA 13M
0x32,0x12, // DATA 13L
0x34,0x14, // DATA 14M
0x32,0x12, // DATA 14L
0x34,0x14, // DATA 15M
0x32,0x12, // DATA 15L
0x34,0x14, // DATA 16M
0x32,0x12, // DATA 16L
};
#define LCD_BUFLEN ( (sizeof(dma_lcd_buf) / 2) )//- 1)
char user_lcd_buf[32];
void lcd_bufbuf()
{
//FORMAT for sending DATA to the LCD
//for example to send a 0xYZ as a DATA
//we need to translate it to the 4 bytes as follows
//0x3Y,0x1Y, // 0xYZ -Y
//0x3Z,0x1Z, // 0xYZ -Z
uint16_t h_nibble,l_nibble,i=0,j;
for(j=4;j<((4*16)+4);)
{
h_nibble = ( (user_lcd_buf[i] & 0xF0) >> 4);
dma_lcd_buf[j++] = (h_nibble | 0x30);
dma_lcd_buf[j++] = (h_nibble | 0x10);
l_nibble = ( (user_lcd_buf[i++] & 0x0F) );
dma_lcd_buf[j++] = (l_nibble | 0x30);
dma_lcd_buf[j++] = (l_nibble | 0x10);
}
for(j=4*16+4+4;j<4*16+4+4+4*16;)
{
h_nibble = ( (user_lcd_buf[i] & 0xF0) >> 4);
dma_lcd_buf[j++] = (h_nibble | 0x30);
dma_lcd_buf[j++] = (h_nibble | 0x10);
l_nibble = ( (user_lcd_buf[i++] & 0x0F) );
dma_lcd_buf[j++] = (l_nibble | 0x30);
dma_lcd_buf[j++] = (l_nibble | 0x10);
}
}
Teşekkürler amacım kodla çalıştırmak değil bunu zaten yapabiliyorum. Sadece voltajı manuel olarak pinlere tek tek kendim vermek istiyorum. Bu mümkün müdür toksa bir mikrodenetleyici gerekli mi?Ben denedim, çalıştırdım, simulasyondada gerçektede.
Çok adım var, yanlış yaptığın bir şey vardır.
Ben Eater ın yukarıda paylaştığım videosuna benzer şekilde ama
mcu kullnarak yaptığım bir çalışma vardı.
Mcu ram de bulunan bir diziyi sürekli port çıkışlarına basıyordu,
ram deki bilgiyi öyle ayarlamıştım ki lcd de istediğim bilgi yazılıyordu.
(ramdeki diziyi lcd pinlerine DMA gönderiyordu)
Ben lcd yi 4 bit modda kullandığım için
lcd ye gönderilmesi gereken bilgi dizide aşağıdaki gibi oluyor.
Bu dizideki bilgileri aynı şekilde ve
verdiğim pin sırasına uyarak lcd ye gönderirsen
lcd nin tüm satırlarına 1 karakterini yazar.
Kod://MCU to 2x16LCD pinout connection // MCU A5, A4, A3, A2, A1, A0 // LCD E R/S D7 D6 D5 D4 uint16_t lcd_init_buf[]={ 0x03,0x23,0x03, // init 0x03 0x03,0x23,0x03, 0x03,0x23,0x03, 0x02,0x22,0x02, // init 0x02 0x02,0x22,0x02, // init 0x28 -2 0x08,0x28,0x08, // init 0x28 -8 0x00,0x20,0x00, // init 0x0C -0 0x0C,0x2C,0x0C, // init 0x0C -C 0x00,0x20,0x00, // init 0x01 -0 0x01,0x21,0x01, // init 0x01 -1 0x00,0x20,0x00, // init 0x06 -0 0x06,0x26,0x06, // init 0x06 -6 //FORMAT for sending command to the LCD //for example to send a 0xYZ as a command //we need to translate it to the 6 bytes as follows //0x0Y,0x2Y,0x0Y, // init 0xYZ -Y //0x0Z,0x2Z,0x0Z, // init 0xYZ -Z }; #define LCD_INIT_BUFLEN (((sizeof(lcd_init_buf)) / 2) -1) uint16_t dma_lcd_buf[]={ 0x28,0x08, // CMD 0x80 -8 ilk satirbasi 0x20,0x00, // CMD 0x80 -0 0x34,0x14, // DATA 1M 0x31,0x11, // DATA 1L 0x34,0x14, // DATA 2M 0x31,0x11, // DATA 2L 0x34,0x14, // DATA 3M 0x31,0x11, // DATA 3L 0x34,0x14, // DATA 4M 0x31,0x11, // DATA 4L 0x34,0x14, // DATA 5M 0x31,0x11, // DATA 5L 0x34,0x14, // DATA 6M 0x31,0x11, // DATA 6L 0x34,0x14, // DATA 7M 0x31,0x11, // DATA 7L 0x34,0x14, // DATA 8M 0x31,0x11, // DATA 8L 0x34,0x14, // DATA 9M 0x31,0x11, // DATA 9L 0x34,0x14, // DATA 10M 0x31,0x11, // DATA 10L 0x34,0x14, // DATA 11M 0x31,0x11, // DATA 11L 0x34,0x14, // DATA 12M 0x31,0x11, // DATA 12L 0x34,0x14, // DATA 13M 0x31,0x11, // DATA 13L 0x34,0x14, // DATA 14M 0x31,0x11, // DATA 14L 0x34,0x14, // DATA 15M 0x31,0x11, // DATA 15L 0x34,0x14, // DATA 16M 0x31,0x11, // DATA 16L 0x2C,0xC0, // CMD C0-C ikinci satirbasi 0x20,0x00, // CMD C0-0 0x34,0x14, // DATA 1M 0x32,0x12, // DATA 1L 0x34,0x14, // DATA 2M 0x32,0x12, // DATA 2L 0x34,0x14, // DATA 3M 0x32,0x12, // DATA 3L 0x34,0x14, // DATA 4M 0x32,0x12, // DATA 4L 0x34,0x14, // DATA 5M 0x32,0x12, // DATA 5L 0x34,0x14, // DATA 6M 0x32,0x12, // DATA 6L 0x34,0x14, // DATA 7M 0x32,0x12, // DATA 7L 0x34,0x14, // DATA 8M 0x32,0x12, // DATA 8L 0x34,0x14, // DATA 9M 0x32,0x12, // DATA 9L 0x34,0x14, // DATA 10M 0x32,0x12, // DATA 10L 0x34,0x14, // DATA 11M 0x32,0x12, // DATA 11L 0x34,0x14, // DATA 12M 0x32,0x12, // DATA 12L 0x34,0x14, // DATA 13M 0x32,0x12, // DATA 13L 0x34,0x14, // DATA 14M 0x32,0x12, // DATA 14L 0x34,0x14, // DATA 15M 0x32,0x12, // DATA 15L 0x34,0x14, // DATA 16M 0x32,0x12, // DATA 16L }; #define LCD_BUFLEN ( (sizeof(dma_lcd_buf) / 2) )//- 1) char user_lcd_buf[32]; void lcd_bufbuf() { //FORMAT for sending DATA to the LCD //for example to send a 0xYZ as a DATA //we need to translate it to the 4 bytes as follows //0x3Y,0x1Y, // 0xYZ -Y //0x3Z,0x1Z, // 0xYZ -Z uint16_t h_nibble,l_nibble,i=0,j; for(j=4;j<((4*16)+4);) { h_nibble = ( (user_lcd_buf[i] & 0xF0) >> 4); dma_lcd_buf[j++] = (h_nibble | 0x30); dma_lcd_buf[j++] = (h_nibble | 0x10); l_nibble = ( (user_lcd_buf[i++] & 0x0F) ); dma_lcd_buf[j++] = (l_nibble | 0x30); dma_lcd_buf[j++] = (l_nibble | 0x10); } for(j=4*16+4+4;j<4*16+4+4+4*16;) { h_nibble = ( (user_lcd_buf[i] & 0xF0) >> 4); dma_lcd_buf[j++] = (h_nibble | 0x30); dma_lcd_buf[j++] = (h_nibble | 0x10); l_nibble = ( (user_lcd_buf[i++] & 0x0F) ); dma_lcd_buf[j++] = (l_nibble | 0x30); dma_lcd_buf[j++] = (l_nibble | 0x10); } }
Mümkün.Bu mümkün müdür toksa bir mikrodenetleyici gerekli mi?
bu devreyi yapmıştım ilk olarak rs , rw ve e pinleri 0 iken 7,6,5,4 data piblerini 1 yapıp e pinini 1 ve ardından 0 yaptım. Şuan displayin açılmış olması gerekiyor. Sonrasında rs pinini 1 yaparak 2 ve 3. data pinlerini aktif ettim(bunu yaptığım anda diğer pinleri sıfıra çekmiştim.) ve e pininin butonunan bası çektim. Ekranda 0 berilmesi gerekiyordu. Ancak hiçbir şey olmadı.Kodla yapman için vermedim örneği.
Zaten standart yöntem değil yukarıdaki.
Pinlere tek tek ne vermen lazım o örnekten bakabilirsin.
Mümkün.
Gerçek devreyle uğraşırken E ve RS pinine dikkat etmen gerekebilir.
Özellikle buton kulanacaksan buton arkını önlemen gerekir.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?