ايران ويج

نسخه‌ی کامل: نوشتن در LCD با ارتباط سریال
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
این بردی هست که من برای این کار ساختم و کلا با قطعات و اینا 15 تومن شد
این برد شبیه این نمونه یه خارجی (LCD03) هست فعلا فقط با ارتباط سریال هست و در اینده ارتباط دو سیمه هم بهش اضافه میشه
الان شما متن رو میفرستید و در اخرش یه علامت $ و روی LCD نمایش داده میشه اگه طول حرف ها از 16 بیشتر شه خودش متن رو تایپ می کنه و نیازی به $ نخواهد بود
وقتی مشغوله PORTD.4 یک میشه البته نیازی به این کار نیست بیشتر مواقع درست کار میکنه
یه سری کاراکتر هم داره که باهاش میتونید پروگرس بار بسازید خودتون بسته به نیاز میتونید تغییرش بدید
روی برد دوتا جامپر هست یکی برای پروگرام کردن یکی هم برای تست که روی LCD یه مقداری رو به طور ثابت مینویسه و در اینده برای انتخاب مد استفاده میشه
نیازی به کریستال خارجی هم نیست اون مال تایمر 2 هست که فعلا با تایمر 1 راش انداختم سنسور دما رو هم میتونید نزارید
رمز
myrobo.org
با عرض پوزش برای استفاده در محیط نرم افزار پروتئوس اتصال گراند یکی از پین های ال سی دی )RW( رو حذف کنید
مانند عکس
مشاهده
(این نوشته ی روی عکس هارو خود سایت اضافه میکنه دیگه حالشو ندارم غیر فعالش کنم بعد دباره فعال شرمنده)
میتوانید برنامه را نیز به این صورت تغییر دهید
(دفعات ریست watchdog کاهش یافته است نیازی بهش نبود)
کد:
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 100
$swstack = 100
$framesize = 100

Config Portb = Input
Config Portd = Input
Config Portc = Input
Portb = 255
Portd = 255
Portc = 255
Led Alias Portd.7
Set Portd.6
Dim Ti As Byte
Set Portb.1
Set Portb.2
Set Portb.3
Set Portb.4
Set Portb.5
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.7 = Output
Config Portb.0 = Output
Set Portd.4

Config Portb.0 = Input
Portb.0 = 0
Disable Interrupts : Set Portd.4
On Ovf1 Sectic
Config Timer1 = Timer , Prescale = 256
Enable Timer1
Enable Ovf1
Start Timer1
Timer1 = 34286

On Urxc Rs
Enable Urxc
$baud = 9600
Reset Portd.7
Light Alias Portb.0
Config Adc = Single , Prescaler = 128 , Reference = Avcc
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0 , Wr = Portd.5
Config Lcd = 16 * 2
Dim Lt As Byte
Deflcdchar [0] , 31 , 32 , 32 , 32 , 32 , 32 , 32 , 31 ' replace [x] with number (0-7)
Deflcdchar [1] , 31 , 16 , 16 , 16 , 16 , 16 , 16 , 31 ' replace [x] with number (0-7)
Deflcdchar [2] , 31 , 24 , 24 , 24 , 24 , 24 , 24 , 31 ' replace [x] with number (0-7)
Deflcdchar [3] , 31 , 28 , 28 , 28 , 28 , 28 , 28 , 31 ' replace [x] with number (0-7)
Deflcdchar [4] , 31 , 30 , 30 , 30 , 30 , 30 , 30 , 31 ' replace [x] with number (0-7)
Deflcdchar [5] , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31 ' replace [x] with number (0-7)
Dim L(2) As String * 16
Dim D As Byte

Dim C As String * 1
Dim A As Word
Dim B As Single
Dim E As Bit
Dim Ln As Bit

Display On
Cls
Cursor Off
Lt = 0
Light = 1
Start Adc
Led = 1
Lcd "Hi!"
Lowerline

A = Getadc(6)
A = A * 5
B = A / 1023
C = Fusing(b , "#.#")
Lcd "Temp Is: " ; C ; "'C"

Wait 1

Lt = 0
Cls
A = Getadc(7)
A = A * 5
B = A / 1023

C = Fusing(b , "#.#")
Lcd "LCD Cont: " ; C ; "V"
Lowerline

A = Getadc(14)
A = A * 5
B = A / 1023
C = Fusing(b , "#.#")
Lcd "Int Ref is: " ; C ; "V"

Wait 1

Lt = 0
Cls
Reset Portd.4
Enable Urxc
Enable Interrupts : Reset Portd.4
Start Timer1
Config Watchdog = 2048
Start Watchdog

Do

Reset Portd.4
If E = 1 Then
Disable Interrupts : Set Portd.4
Set Portd.4
Cls
Lcd L(1)

Lowerline
Lcd L(2)

Lt = 0
Light = 1
E = 0
A = Ln + 1
L(a) = ""
Lt = 0
Light = 1
Enable Interrupts : Reset Portd.4
End If
If Len(l(1)) = 0 Then
If Len(l(2)) = 0 Then
Ln = 0
Light = 0
End If
End If
If L(1) = "disoff" Or L(2) = "disoff" Then
Display Off
L(1) = ""
L(2) = ""
E = 0
Ln = 0
End If
If L(1) = "dison" Or L(2) = "dison" Then
L(1) = ""
L(2) = ""
E = 0
Ln = 0
Display On
End If
If Pind.6 = 0 Then
Set Portd.4
Disable Interrupts : Set Portd.4
Led = 1
While Pind.6 = 0
Set Portd.4
Cls
Wait 1
Lcd " BehzadMokhtari "
Lowerline
Lcd " @live.com "
Wait 2
Light = 1
Wend
Cls
Light = 0
L(1) = ""
L(2) = ""
E = 0
Ln = 0
Enable Interrupts : Reset Portd.4
Reset Portd.4
End If

Idle
Loop
End
Sectic:

Toggle Led
Timer1 = 34286
If Lt = 6 Then
Light = 0
Lt = 0
Else
Incr Lt
End If
Reset Watchdog
Return
Rs:
D = Udr
Disable Interrupts : Set Portd.4

Light = 1
C = Chr(d)
If D < 6 Then
Lcd Chr(d)
C = ""
End If
If C = "$" Then
E = 1
Light = 1
Toggle Ln
Else
A = Ln + 1
L(a) = L(a) + C
End If

If Len(l(a)) = 16 Then
Toggle Ln
E = 1
Light = 1
End If
If E = 1 Then
Enable Interrupts
Set Portd.4
Else
Enable Interrupts : Reset Portd.4
End If

Return
برنامه همراه با I2C یکم وقت میخواد که فعلا موجود نیست اگه هم بهش نیاز دارید بهتره این برد رو نسازید چون به احتمال زیاد باید تغییر پیدا کنه(خودم که کارم راه افتاده دیگه فکر ایناش نبودم!)
والا بعضی از دوستان خواستند که توضیح بیشتری درمورد این برد بدم منم گفتم چشم!:)
گاهی وقت ها ما توانایی اینو نداریم که LCD رو به طور مستقیم به میکرو خودمون متصل کنیم(پایه کم داریم، نمی تونیم سرعت کار رو پایین بیاریم و ...) یا مثلا نیاز داریم با کامپیوتر روی LCD چیز بنویسیم(جل الخالق!)
خوب این برد بکارمون میاد
این برد کلیه داده هایی رو که توی خط سریال درحال رد و بدل شدن هست رو روی LCD می نویسه(شاید عیبشم باشه بهتر بود اون هایی رو که مخصوص خودش فرستاده میشه رو بنویسه)(این مضکل در آینده حل میشه)
برنامه ی پیچیده ای نداره برای همین میتونید برخی از پردازش هاتون رو روی این میکرو ببرید و استفاده کنید که سرعت میکرو اصلی خودتون بالا بره(اون پین های اضافه رو برای این کار سوکت بهش زدم)
قسمت اول برنامه که چیز خاصی نداره یه سری تنظیمات انجام میده و یه متن پیش فرضی رو مینویسه
تایمر واچ داگ هم گذاشتم که اگر میکرو هنگید خودش ریست بشه ممکنه جایی باشه که نتونید ریستش کنید(مثلا رو ربات) پس این لازمه
توی قسمت اصلی برنامه اگر بیت مربوط به اماده بودن داده ها برای نوشتن یک بشه کل LCD رو پاک میکنه و دو خط رو با متغییر های مربوط به اونا پر میکنه
قسمت دوم هم مال اینه که جامپری که روی برد هست اگه وصل شد یه متنی رو هی مینویسه
در اخر هم میره توی مد اسلیپ.
یه زیر برنامه داریم sectic که هر وقت تایمر 1 پر شد اجرا میشه(1 ثانیه)
این باعث بیدار شدن میکرو میشه LED روی برد رو تغییر وضعیت میده و اگه نور LCD به اندازه کافی روشن مونده باشه اونو خاموش میکنه متغییر Light.
زیر برنامه ای هم هست به نام RS
وقتی داده ای توی خط سریال ارسال بشه اجرا میشه و میکرو بیدار میشه
بسته به داده مقداری رو به متغییر C میده
اگه مقدار $ بود نشانه از اتمام داده از سوی ما هست پس بیت اماده بودن داده رو یک میکنه تا دفعه بعد میکرو داده ها رو روی LCD بنویسه اگه طول متغییر هایی که برای نگه داری داده ها هست بیشتر از طول LCD بشه خودش بیت اماده بودن داده هارو یک میکنه
در غیر این صورت ها C رو به متغییر خطی که درش هستیم اضافه میکنه
و تمام در این مدت میکرو ای که داده رو ارصال میکنه باید پین D.4 میکرو ی مارو پول آپ کنه و فقط وقتی این پایه صفر هست داده رو ارسال کنه وگرنه میکرو ریست میشه البته این اتفاق خیلی نادره مگر اینکه سرعت نوشتن داده هاتون خیلی زیاد باشه که اون موقع حتما باید این پین رو چک کنید (بهتره توی وقفه اتمام ارسال داده توی میکرو خودتون ویا تابعی که داده هارو تک تک میفرسته چک کردن این پین رو بنویسید تا این مشکل پیش نیاد )
سلام

؟؟؟؟ :
نقل قول: Config Portb = Input
Config Portd = Input
Config Portc = Input
Portb = 255
Portd = 255
Portc = 255

سطر آخر رو پاک کنید تا lcd کار کنه