الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

LCD 2x16 with Atmeg16 does not work

بدأه benbeta في 13 نوفمبر 2011 · 3 رد · 1,477 مشاهدة · في الميكروكنترولر (المتحكم) و الدوائر الرقمية و المنطقية
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

عندى مشكله مع LCD بشوف cursor بس بعد كده مش بيكتب الحرف.

ده أول مشروع ليه بس أعتقد أن المشكله فى delay أنا مش قدره أحلها .

أنا عوزه أشغله على Proteus لأنى سوف أضيف Keypad .

main.c

#include <avr/io.h>
#include <avr/delay.h>
#include "lcd.h"

int main(void)
{

	DDRA = 0xff; //set port A as output port;
	DDRB = 0x07; //set port B  0, 1, 2 pin as output port

	LCD_init();//inti lcd 
  //  while(1)
    //{
        //TODO:: Please write your application code 
    //}

	LCD_SendData('A');//write to 

	return 1;
}

lcd.h

#ifndef LCD_H_
#define LCD_H_

#define dataport PORTA
#define commport PORTB


#define rs PB2
#define rw PB1
#define en PB0


int LCD_init(void);
int LCD_SendData(unsigned char D);
int LCD_Comm(void);
int LCD_Data(void);


#endif /* LCD_H_ */

lcd.c

#include <avr/io.h>
#include <avr/delay.h>
#include <string.h>
#include "lcd.h"

int LCD_init()
{
	dataport = 0x38; //init lcd 
	LCD_Comm();

	dataport = 0x01; // clear lcd
	LCD_Comm();

	dataport = 0x0E; //display cursor
	LCD_Comm();

	dataport = 0x08; //cursor at line 1 position 1
	LCD_Comm();

	dataport = 0x1c; //display to right
	LCD_Comm();

	return 1;
}


int LCD_SendData(unsigned char data_Send)
{
	dataport = data_Send;
	LCD_Data();

	return 1;
}


int LCD_Comm()
{
	commport &= ~(1<<rs); // set rs = 0; for command register
	commport &= ~(1<<rw); // set rw = 0
	commport |= (1<<en); // set en = 1
	_delay_ms(10);
	commport &= ~(1<<en); // set en = 0

	_delay_ms(200);

	return 1;
}


int LCD_Data()
{
	commport |= (1<<rs); // set rs = 1
	commport &= ~(1<<rw); // set rw = 0
	commport |= (1<<en); // set en = 1
	_delay_ms(10);
	commport &= ~(1<<en); // set en = 0

	_delay_ms(200);

	return 1;
}

أنا أضفت the proteus file for this code

شكرا

LCD_proteus.rar

#2

نعم المشكلة يبدوا انها فى ال delay

لم يتم تعريق قيمة ال crystal frequency الذى يعمل عليه المتحكم

ولكن هناك طريقة افضل من ال delay وهى قراءة حالة ال lcd وهى البن 7 فى الداتا بورت

موقع البرنامج

مبارك لشعب تونس photo-thumb-42837.png

#3

شكرا

بس كيف أستخدم pin7 وأنا بستخدم portA as output

تم تعديل هذه المشاركة بواسطة benbeta في 16 نوفمبر 2011 في 12:58

#4

يجب تحويل أولا البورت الى دخل

بعد ذلك

RS=0

RW=1

ثم يتم إخراج نبضة على الطرف E

ثم قراءة محتويات بورت البيانات

ثم قراءة البن رقم 7 فإذا كانت = 1 فالشاشة ليست جاهزة busy (لست متأكد ان كانت 0 أو واحد راجعى الداتا شيت)

هذه العملية افضل كثيرا من التأخير الزمنى واسرع منه

موقع البرنامج

مبارك لشعب تونس photo-thumb-42837.png

مواضيع مشابهة