سلام دوستان، خسته نباشید
من دارم رو یک پروژه کار میکنم که یک قسمتش مربوط به زنگ زدن هست
در این قسمت میخوام امکان تغییر شماره تلفن توسط کاربر رو داشته باشه
خب خودم یک نمومه نوشتم خوب هم کار میکنه اما برای من که از atmega8 استفاده میکنم مشکل داره :
1-این برنامه نصف atmega8 پر میکنه و برای بقیه کدهای پروژه مشکل ایجاد میکنه
این نصف رو که اشغال میکنه فقط برای 1 شماره تلفن همراه هست حالا اگر 2 شماره یا بیشتر باشه که هیچی
oo:
من یک دستگاه که ساخت ایران بود خیلی وقت پیش دیدم که از atmega8 استفاده کرده بود و امکان دادن و تغییر 4 شماره تلفن داشت
2-یک مشکل دیگه هم هنگام ویرایش عددهای شماره هستش که چشمک زدن هنگام ویرایش یک شماره با شماره دیگه فرق میکنه یعنی با هم دیگه هماهنگ نیستند، بخصوص دو شماره آخر.
مثلا شماره 09187654321 در نظر بگیرید، هنگام رفتن به حالت ویرایش هر کدوم از عددها، اون عدد مورد ویرایش چشمک میزنه که مشکلش اینه چشمک زدن هر عدد با دیگری هماهنگ نیست یعنی مثلا یکی هر 100 میلی ثانیه خاموش و روش میشه اما یکی دیگه زمان روشن و خاموشیش یکی نیستن (روشن و خاموشی منظورم همون پاک شدن و نوشته شدن عدد که چشمک زدن بوجود میاد).
سورس همراه با فایل پروتئوس میزارم دانلود کنید
اگر تونستید یک جوری سبکترش کنید ی اگر نمونه ای از این جور برنامه که سبک باشه دارید بزارید ممنون میشم
کدها :
لینک دانلود فایل پروتئوس و فایل بسکام :
خب یک سری توضیحات در مورد نحوه کار این برنامه :
برای استفاده از برنامه فقط 3 سویچ گذاشتم
سوئیچ ها : up,down,edite and move
برای رفتن به حالت ویرایش شماره تلفن سوئیچ edite and move باید برای حدود 3 ثانیه پایی نگه داریم.
برای حرکت بین عددهای شماره سوئیچ edite and move رو بصورت لحظه ای میزنیم.
برای تغییر عدد شماره ها هم از سوئیچ های up و down به صورت لحظه ای استفاده میکنیم.
ممنون میشم راهنمایی کنید.
با تشکر
اضافه شده در تاریخ :
سلام دوباره
با یک ساعت کار تونستم حدود 4 درصد حجم برنامه رو کم کنم و مشکل چشمک زدن ناهمانگ حل کنم
اما با توجه به نوشتن تایمر برای حل مشکل چشمک زدن حجم برنامه به اندازه برنامه پست اول شد باز :sad:
دوستان کمک کنید
اینم برنامه جدید :
راستی دوستان روش ذخیره در EEPROM درست نوشتم؟ و اینکه اینکارها برای میکرو مشکل ایجاد نمیکنند؟ چون شنیدم میگن در میکرو ATMEGA8 اگر بیشتر از 1000 بار نوشته و خوانده شودند میکرو آسیب میبینه
با تشکر :sad:
اضافه شده در تاریخ :
سلام دوستان کسی نیست کمک کنه؟
این برنامه شبیه برنامه ی ساعتهای دیجیتاله که توسط سوئیچ ساعت تنظیم میکنند
با این تفاوت که من شماره تلفن تنظیم میکنم
اضافه شده در تاریخ :
سلام دوباره
دوستان خودم حجم کدهارو کم کردم
به همین خاطر مجور شدم بجای Debounce از شرط IF استفاده کنم برای کلیدها
الان حجم برنامه پایین آوردم اما یک مشکل ایجاد شده :
وقتی از کلیدهای UP و DOWN زیاد استفاده کنیم و یک عدد از شماره تلفن زیاد تغییر بدیم برنامه قاطی میکنه و رو LCD چیزهای پرت نشون میده (مثلا 20 باری یک عدد تغییر بدیم حتی اگر بین هر تغییر 10 ثانیه هم صبر کنیم باز همین مشکل هست) :

اینم لینک دانلود سورس برنامه همراه با شبیه ساز پروتئوس برای تست :
اینم سورس برنامه که اگر دانلود نکردید اینجا ببینید :
[code=vb]$regfile = "m8def.dat"
$crystal = 8000000
Config Pinb.0 = Input
Config Pinb.1 = Input
Config Pinb.2 = Input
Config Pinb.3 = Input
Dim F As Byte , W As Word , Atl As Long , Btl(10) As Long , Ctl As Long , A_tell As Long , B_tell As Long
Dim Num(10) As Byte , Enum(10) As Eram Byte
Dim Ttimer As Byte
Const T1 = 100
A_tell = 21
B_tell = 1
Num(1) = Enum(1) : Num(2) = Enum(2) : Num(3) = Enum(3) : Num(4) = Enum(4) : Num(5) = Enum(5)
Num(6) = Enum(6) : Num(7) = Enum(7) : Num(8) = Enum(8) : Num(9) = Enum(9) : Num(10) = Enum(10)
Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.4 , Rs = Portd.5
Config Lcd = 16 * 2
Cursor Off
Config Timer2 = Timer , Async = On , Prescale = 32
Enable Interrupts
Enable Timer2
On Timer2 Togglelc
If Num(1) > 9 Then Num(1) = 9
If Num(2) > 9 Then Num(2) = 1
If Num(3) > 9 Then Num(3) = 8
If Num(4) > 9 Then Num(4) = 4
If Num(5) > 9 Then Num(5) = 5
If Num(6) > 9 Then Num(6) = 0
If Num(7) > 9 Then Num(7) = 1
If Num(8) > 9 Then Num(8) = 5
If Num(9) > 9 Then Num(9) = 3
If Num(10) > 9 Then Num(10) = 8
Locate 1 , 1
'Lcd "0" ; Num(1) ; Num(2) ; Num(3) ; Num(4) ; Num(5) ; Num(6) ; Num(7) ; Num(8) ; Num(9) ; Num(10)
Lcd "09184501538"
Startm:
F = 0 : Waitms T1
Do
Debounce Pinb.3 , 1 , Nset
Loop
Nset:
For W = 0 To 40000
Waitus 63
Next
If Pinb.3 = 1 Then
Goto Tellnum1
Else
Goto Startm
End If
Togglelc:
Select Case Ttimer
Case 0
Gosub Lcdclear
Case 1 :
Gosub Lcdwrite
Case 2 :
Gosub Lcdclear
Case 3 :
Gosub Lcdwrite : Ttimer = 255
End Select
Incr Ttimer ': Locate 2 , 20
Return
Tellnum1:
F = A_tell : Waitms T1
Do
If Pinb.1 = 1 Then
Waitms 300
Gosub Calcnum11
End If
If Pinb.2 = 1 Then
Waitms 300
Gosub Calcnum12
End If
If Pinb.0 = 1 Then
Waitms 300
B_tell = B_tell + 1
A_tell = A_tell + 1
Gosub Calcnum13
End If
Loop
Calcnum11:
Waitms 50
Locate 2 , 7
Num(b_tell) = Num(b_tell) + 1 : If Num(b_tell) > 9 Then Num(b_tell) = 0 : Goto Tellnum1
Calcnum12:
Waitms 50
Num(b_tell) = Num(b_tell) - 1 : If Num(b_tell) = 255 Then Num(b_tell) = 9 : Goto Tellnum1
Calcnum13:
Waitms 50
If B_tell = 10 Then
Enum(b_tell) = Num(b_tell)
A_tell = 21
B_tell = 1
Goto Startm
Else
Goto Tellnum1
End If
Goto Tellnum1
'Return
Lcdclear:
For Atl = 1 To 10
Btl(atl) = 20 + Atl
If F = Btl(atl) Then
Ctl = Atl + 1
Locate 1 , Ctl
Lcd " "
End If
Next Atl
Return
Lcdwrite:
If F > 20 And F < 31 Then
Locate 1 , 1 : Lcd "0"
Locate 1 , 2 : Lcd Num(1)
Locate 1 , 3 : Lcd Num(2)
Locate 1 , 4 : Lcd Num(3)
Locate 1 , 5 : Lcd Num(4)
Locate 1 , 6 : Lcd Num(5)
Locate 1 , 7 : Lcd Num(6)
Locate 1 , 8 : Lcd Num(7)
Locate 1 , 9 : Lcd Num(8)
Locate 1 , 10 : Lcd Num(9)
Locate 1 , 11 : Lcd Num(10)
End If
Return
End[/code]
ممنون میشم نگاه کنید ببینید مشکل چیه
خیلی وقتمرو گرفته این برنامه :(
من دارم رو یک پروژه کار میکنم که یک قسمتش مربوط به زنگ زدن هست
در این قسمت میخوام امکان تغییر شماره تلفن توسط کاربر رو داشته باشه
خب خودم یک نمومه نوشتم خوب هم کار میکنه اما برای من که از atmega8 استفاده میکنم مشکل داره :
1-این برنامه نصف atmega8 پر میکنه و برای بقیه کدهای پروژه مشکل ایجاد میکنه
این نصف رو که اشغال میکنه فقط برای 1 شماره تلفن همراه هست حالا اگر 2 شماره یا بیشتر باشه که هیچی

من یک دستگاه که ساخت ایران بود خیلی وقت پیش دیدم که از atmega8 استفاده کرده بود و امکان دادن و تغییر 4 شماره تلفن داشت
2-یک مشکل دیگه هم هنگام ویرایش عددهای شماره هستش که چشمک زدن هنگام ویرایش یک شماره با شماره دیگه فرق میکنه یعنی با هم دیگه هماهنگ نیستند، بخصوص دو شماره آخر.
مثلا شماره 09187654321 در نظر بگیرید، هنگام رفتن به حالت ویرایش هر کدوم از عددها، اون عدد مورد ویرایش چشمک میزنه که مشکلش اینه چشمک زدن هر عدد با دیگری هماهنگ نیست یعنی مثلا یکی هر 100 میلی ثانیه خاموش و روش میشه اما یکی دیگه زمان روشن و خاموشیش یکی نیستن (روشن و خاموشی منظورم همون پاک شدن و نوشته شدن عدد که چشمک زدن بوجود میاد).
سورس همراه با فایل پروتئوس میزارم دانلود کنید
اگر تونستید یک جوری سبکترش کنید ی اگر نمونه ای از این جور برنامه که سبک باشه دارید بزارید ممنون میشم
کدها :
کد:
$regfile = "m8def.dat" $crystal = 8000000 Config Pinb.1 = Input Config Pinb.2 = Input Config Pinb.3 = Input Dim F As Byte , W As Word , Atl As Long , Btl(10) As Long , Ctl As Long Dim Num1 As Byte , Num2 As Byte , Num3 As Byte , Num4 As Byte , Num5 As Byte Dim Num6 As Byte , Num7 As Byte , Num8 As Byte , Num9 As Byte , Num10 As Byte Dim Enum1 As Eram Byte , Enum2 As Eram Byte , Enum3 As Eram Byte , Enum4 As Eram Byte Dim Enum5 As Eram Byte , Enum6 As Eram Byte , Enum7 As Eram Byte , Enum8 As Eram Byte Dim Enum9 As Eram Byte , Enum10 As Eram Byte Const T1 = 10 Num1 = Enum1 : Num2 = Enum2 : Num3 = Enum3 : Num4 = Enum4 : Num5 = Enum5 Num6 = Enum6 : Num7 = Enum7 : Num8 = Enum8 : Num9 = Enum9 : Num10 = Enum10 Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.4 , Rs = Portd.5 Config Lcd = 16 * 2 Cursor Off Locate 1 , 1 Lcd "09184501538" If Num1 > 9 Then Num1 = 9 If Num2 > 9 Then Num2 = 1 If Num3 > 9 Then Num3 = 8 If Num4 > 9 Then Num4 = 4 If Num5 > 9 Then Num5 = 5 If Num6 > 9 Then Num6 = 0 If Num7 > 9 Then Num7 = 1 If Num8 > 9 Then Num8 = 5 If Num9 > 9 Then Num9 = 3 If Num10 > 9 Then Num10 = 8 Startm: F = 0 : Waitms T1 Do Debounce Pinb.3 , 1 , Nset Loop Nset: For W = 0 To 40000 Waitus 63 Next If Pinb.3 = 1 Then Goto Tellnum1 Else Goto Startm End If Tellnum1: F = 21 : Waitms T1 : Cls Do Debounce Pinb.1 , 1 , Calcnum11 Debounce Pinb.2 , 1 , Calcnum12 Debounce Pinb.3 , 1 , Calcnum13 Gosub Lcdclear Loop Calcnum11: Num1 = Num1 + 1 : If Num1 > 9 Then Num1 = 0 : Goto Tellnum1 Calcnum12: Num1 = Num1 - 1 : If Num1 = 255 Then Num1 = 9 : Goto Tellnum1 Calcnum13: Enum1 = Num1 : Goto Tellnum2 Return Tellnum2: F = 22 : Waitms T1 : Cls Do Debounce Pinb.1 , 1 , Calcnum21 Debounce Pinb.2 , 1 , Calcnum22 Debounce Pinb.3 , 1 , Calcnum23 Gosub Lcdclear Loop Calcnum21: Num2 = Num2 + 1 : If Num2 > 9 Then Num2 = 0 : Goto Tellnum2 Calcnum22: Num2 = Num2 - 1 : If Num2 = 255 Then Num2 = 9 : Goto Tellnum2 Calcnum23: Enum2 = Num2 : Goto Tellnum3 Return Tellnum3: F = 23 : Waitms T1 : Cls Do Debounce Pinb.1 , 1 , Calcnum31 Debounce Pinb.2 , 1 , Calcnum32 Debounce Pinb.3 , 1 , Calcnum33 Gosub Lcdclear Loop Calcnum31: Num3 = Num3 + 1 : If Num3 > 9 Then Num3 = 0 : Goto Tellnum3 Calcnum32: Num3 = Num3 - 1 : If Num3 = 255 Then Num3 = 9 : Goto Tellnum3 Calcnum33: Enum3 = Num3 : Goto Tellnum4 Return Tellnum4: F = 24 : Waitms T1 : Cls Do Debounce Pinb.1 , 1 , Calcnum41 Debounce Pinb.2 , 1 , Calcnum42 Debounce Pinb.3 , 1 , Calcnum43 Gosub Lcdclear Loop Calcnum41: Num4 = Num4 + 1 : If Num4 > 9 Then Num4 = 0 : Goto Tellnum4 Calcnum42: Num4 = Num4 - 1 : If Num4 = 255 Then Num4 = 9 : Goto Tellnum4 Calcnum43: Enum4 = Num4 : Goto Tellnum5 Return Tellnum5: F = 25 : Waitms T1 : Cls Do Debounce Pinb.1 , 1 , Calcnum51 Debounce Pinb.2 , 1 , Calcnum52 Debounce Pinb.3 , 1 , Calcnum53 Gosub Lcdclear Loop Calcnum51: Num5 = Num5 + 1 : If Num5 > 9 Then Num5 = 0 : Goto Tellnum5 Calcnum52: Num5 = Num5 - 1 : If Num5 = 255 Then Num5 = 9 : Goto Tellnum5 Calcnum53: Enum5 = Num5 : Goto Tellnum6 Return Tellnum6: F = 26 : Waitms T1 : Cls Do Debounce Pinb.1 , 1 , Calcnum61 Debounce Pinb.2 , 1 , Calcnum62 Debounce Pinb.3 , 1 , Calcnum63 Gosub Lcdclear Loop Calcnum61: Num6 = Num6 + 1 : If Num6 > 9 Then Num6 = 0 : Goto Tellnum6 Calcnum62: Num6 = Num6 - 1 : If Num6 = 255 Then Num6 = 9 : Goto Tellnum6 Calcnum63: Enum6 = Num6 : Goto Tellnum7 Return Tellnum7: F = 27 : Waitms T1 : Cls Do Debounce Pinb.1 , 1 , Calcnum71 Debounce Pinb.2 , 1 , Calcnum72 Debounce Pinb.3 , 1 , Calcnum73 Gosub Lcdclear Loop Calcnum71: Num7 = Num7 + 1 : If Num7 > 9 Then Num7 = 0 : Goto Tellnum7 Calcnum72: Num7 = Num7 - 1 : If Num7 = 255 Then Num7 = 9 : Goto Tellnum7 Calcnum73: Enum7 = Num7 : Goto Tellnum8 Return Tellnum8: F = 28 : Waitms T1 : Cls Do Debounce Pinb.1 , 1 , Calcnum81 Debounce Pinb.2 , 1 , Calcnum82 Debounce Pinb.3 , 1 , Calcnum83 Gosub Lcdclear Loop Calcnum81: Num8 = Num8 + 1 : If Num8 > 9 Then Num8 = 0 : Goto Tellnum8 Calcnum82: Num8 = Num8 - 1 : If Num8 = 255 Then Num8 = 9 : Goto Tellnum8 Calcnum83: Enum8 = Num8 : Goto Tellnum9 Return Tellnum9: F = 29 : Waitms T1 : Cls Do Debounce Pinb.1 , 1 , Calcnum91 Debounce Pinb.2 , 1 , Calcnum92 Debounce Pinb.3 , 1 , Calcnum93 Gosub Lcdclear Loop Calcnum91: Num9 = Num9 + 1 : If Num9 > 9 Then Num9 = 0 : Goto Tellnum9 Calcnum92: Num9 = Num9 - 1 : If Num9 = 255 Then Num9 = 9 : Goto Tellnum9 Calcnum93: Enum9 = Num9 : Goto Tellnum10 Return Tellnum10: F = 30 : Waitms T1 : Cls Do Debounce Pinb.1 , 1 , Calcnum101 Debounce Pinb.2 , 1 , Calcnum102 Debounce Pinb.3 , 1 , Calcnum103 Gosub Lcdclear Loop Calcnum101: Num10 = Num10 + 1 : If Num10 > 9 Then Num10 = 0 : Goto Tellnum10 Calcnum102: Num10 = Num10 - 1 : If Num10 = 255 Then Num10 = 9 : Goto Tellnum10 Calcnum103: F = 0 : Enum10 = Num10 : Goto Startm Return Lcdclear: For Atl = 1 To 10 Btl(atl) = 20 + Atl If F = Btl(atl) Then Ctl = Atl + 1 Locate 1 , Ctl Lcd " " Gosub Lcdwrite End If Next Atl Return Lcdwrite: If F > 20 And F < 31 Then Locate 1 , 1 : Lcd "0" ; Num1 ; Num2 ; Num3 ; Num4 ; Num5 ; Num6 ; Num7 ; Num8 ; Num9 ; Num10 End If Return End
کد:
http://upir.ir/93dey/Change-Telephone-Number-In-Lcd.rar
برای استفاده از برنامه فقط 3 سویچ گذاشتم
سوئیچ ها : up,down,edite and move
برای رفتن به حالت ویرایش شماره تلفن سوئیچ edite and move باید برای حدود 3 ثانیه پایی نگه داریم.
برای حرکت بین عددهای شماره سوئیچ edite and move رو بصورت لحظه ای میزنیم.
برای تغییر عدد شماره ها هم از سوئیچ های up و down به صورت لحظه ای استفاده میکنیم.
ممنون میشم راهنمایی کنید.
با تشکر
اضافه شده در تاریخ :
سلام دوباره
با یک ساعت کار تونستم حدود 4 درصد حجم برنامه رو کم کنم و مشکل چشمک زدن ناهمانگ حل کنم
اما با توجه به نوشتن تایمر برای حل مشکل چشمک زدن حجم برنامه به اندازه برنامه پست اول شد باز :sad:
دوستان کمک کنید
اینم برنامه جدید :
کد:
$regfile = "m8def.dat" $crystal = 8000000 Config Pinb.1 = Input Config Pinb.2 = Input Config Pinb.3 = Input Declare Sub Tellnuma() : Declare Sub Tellnumb() : Declare Sub Tellnumc() : Declare Sub Tellnumd() Dim F As Byte , W As Word , Atl As Long , Btl(10) As Long , Ctl As Long , A_tell As Long , B_tell As Long Dim Num(10) As Byte , Enum(10) As Eram Byte Dim Ttimer As Byte Const T1 = 10 Num(1) = Enum(1) : Num(2) = Enum(2) : Num(3) = Enum(3) : Num(4) = Enum(4) : Num(5) = Enum(5) Num(6) = Enum(6) : Num(7) = Enum(7) : Num(8) = Enum(8) : Num(9) = Enum(9) : Num(10) = Enum(10) Config Timer2 = Timer , Async = On , Prescale = 32 Enable Interrupts Enable Timer2 On Timer2 Togglelc Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.4 , Rs = Portd.5 Config Lcd = 16 * 2 Cursor Off Locate 1 , 1 Lcd "09184501538" If Num(1) > 9 Then Num(1) = 9 If Num(2) > 9 Then Num(2) = 1 If Num(3) > 9 Then Num(3) = 8 If Num(4) > 9 Then Num(4) = 4 If Num(5) > 9 Then Num(5) = 5 If Num(6) > 9 Then Num(6) = 0 If Num(7) > 9 Then Num(7) = 1 If Num(8) > 9 Then Num(8) = 5 If Num(9) > 9 Then Num(9) = 3 If Num(10) > 9 Then Num(10) = 8 Startm: F = 0 : Waitms T1 Do Debounce Pinb.3 , 1 , Nset Loop Nset: For W = 0 To 40000 Waitus 63 Next If Pinb.3 = 1 Then Goto Tellnum1 Else Goto Startm End If Togglelc: Select Case Ttimer Case 0 Gosub Lcdclear Case 1 : Gosub Lcdwrite Case 2 : Gosub Lcdclear Case 3 : Gosub Lcdwrite : Ttimer = 255 End Select Incr Ttimer : Locate 2 , 20 Return Tellnum1: A_tell = 21 B_tell = 1 Call Tellnuma Do Debounce Pinb.1 , 1 , Calcnum11 Debounce Pinb.2 , 1 , Calcnum12 Debounce Pinb.3 , 1 , Calcnum13 Loop Calcnum11: Call Tellnumb : Goto Tellnum1 Calcnum12: Call Tellnumc : Goto Tellnum1 Calcnum13: Call Tellnumd : Goto Tellnum2 Return Tellnum2: A_tell = 22 B_tell = 2 Call Tellnuma Do Debounce Pinb.1 , 1 , Calcnum21 Debounce Pinb.2 , 1 , Calcnum22 Debounce Pinb.3 , 1 , Calcnum23 Loop Calcnum21: Call Tellnumb : Goto Tellnum2 Calcnum22: Call Tellnumc : Goto Tellnum2 Calcnum23: Call Tellnumd : Goto Tellnum3 Return Tellnum3: A_tell = 23 B_tell = 3 Call Tellnuma Do Debounce Pinb.1 , 1 , Calcnum31 Debounce Pinb.2 , 1 , Calcnum32 Debounce Pinb.3 , 1 , Calcnum33 Loop Calcnum31: Call Tellnumb : Goto Tellnum3 Calcnum32: Call Tellnumc : Goto Tellnum3 Calcnum33: Call Tellnumd : Goto Tellnum4 Return Tellnum4: A_tell = 24 B_tell = 4 Call Tellnuma Do Debounce Pinb.1 , 1 , Calcnum41 Debounce Pinb.2 , 1 , Calcnum42 Debounce Pinb.3 , 1 , Calcnum43 Loop Calcnum41: Call Tellnumb : Goto Tellnum4 Calcnum42: Call Tellnumc : Goto Tellnum4 Calcnum43: Call Tellnumd : Goto Tellnum5 Return Tellnum5: A_tell = 25 B_tell = 5 Call Tellnuma Do Debounce Pinb.1 , 1 , Calcnum51 Debounce Pinb.2 , 1 , Calcnum52 Debounce Pinb.3 , 1 , Calcnum53 Loop Calcnum51: Call Tellnumb : Goto Tellnum5 Calcnum52: Call Tellnumc : Goto Tellnum5 Calcnum53: Call Tellnumd : Goto Tellnum6 Return Tellnum6: A_tell = 26 B_tell = 6 Call Tellnuma Do Debounce Pinb.1 , 1 , Calcnum61 Debounce Pinb.2 , 1 , Calcnum62 Debounce Pinb.3 , 1 , Calcnum63 Loop Calcnum61: Call Tellnumb : Goto Tellnum6 Calcnum62: Call Tellnumc : Goto Tellnum6 Calcnum63: Call Tellnumd : Goto Tellnum7 Return Tellnum7: A_tell = 27 B_tell = 7 Call Tellnuma Do Debounce Pinb.1 , 1 , Calcnum71 Debounce Pinb.2 , 1 , Calcnum72 Debounce Pinb.3 , 1 , Calcnum73 Loop Calcnum71: Call Tellnumb : Goto Tellnum7 Calcnum72: Call Tellnumc : Goto Tellnum7 Calcnum73: Call Tellnumd : Goto Tellnum8 Return Tellnum8: A_tell = 28 B_tell = 8 Call Tellnuma Do Debounce Pinb.1 , 1 , Calcnum81 Debounce Pinb.2 , 1 , Calcnum82 Debounce Pinb.3 , 1 , Calcnum83 Loop Calcnum81: Call Tellnumb : Goto Tellnum8 Calcnum82: Call Tellnumc : Goto Tellnum8 Calcnum83: Call Tellnumd : Goto Tellnum9 Return Tellnum9: A_tell = 29 B_tell = 9 Call Tellnuma Do Debounce Pinb.1 , 1 , Calcnum91 Debounce Pinb.2 , 1 , Calcnum92 Debounce Pinb.3 , 1 , Calcnum93 Loop Calcnum91: Call Tellnumb : Goto Tellnum9 Calcnum92: Call Tellnumc : Goto Tellnum9 Calcnum93: F = 0 : Call Tellnumd : Goto Tellnum10 Return Tellnum10: A_tell = 30 B_tell = 10 Call Tellnuma Do Debounce Pinb.1 , 1 , Calcnum101 Debounce Pinb.2 , 1 , Calcnum102 Debounce Pinb.3 , 1 , Calcnum103 Loop Calcnum101: Call Tellnumb : Goto Tellnum10 Calcnum102: Call Tellnumc : Goto Tellnum10 Calcnum103: Gosub Lcdwrite : F = 0 : Call Tellnumd : Goto Startm Return Lcdclear: For Atl = 1 To 10 Btl(atl) = 20 + Atl If F = Btl(atl) Then Ctl = Atl + 1 Locate 1 , Ctl Lcd " " End If Next Atl Return Lcdwrite: If F > 20 And F < 31 Then Locate 1 , 1 : Lcd "0" ; Num(1) ; Num(2) ; Num(3) ; Num(4) ; Num(5) ; Num(6) ; Num(7) ; Num(8) ; Num(9) ; Num(10) End If Return End Sub Tellnuma() F = A_tell : Waitms T1 End Sub Sub Tellnumb() Num(b_tell) = Num(b_tell) + 1 : If Num(b_tell) > 9 Then Num(b_tell) = 0 End Sub Sub Tellnumc() Num(b_tell) = Num(b_tell) - 1 : If Num(b_tell) = 255 Then Num(b_tell) = 9 End Sub Sub Tellnumd() Enum(b_tell) = Num(b_tell) End Sub
با تشکر :sad:
اضافه شده در تاریخ :
سلام دوستان کسی نیست کمک کنه؟
این برنامه شبیه برنامه ی ساعتهای دیجیتاله که توسط سوئیچ ساعت تنظیم میکنند
با این تفاوت که من شماره تلفن تنظیم میکنم
اضافه شده در تاریخ :
سلام دوباره
دوستان خودم حجم کدهارو کم کردم
به همین خاطر مجور شدم بجای Debounce از شرط IF استفاده کنم برای کلیدها
الان حجم برنامه پایین آوردم اما یک مشکل ایجاد شده :
وقتی از کلیدهای UP و DOWN زیاد استفاده کنیم و یک عدد از شماره تلفن زیاد تغییر بدیم برنامه قاطی میکنه و رو LCD چیزهای پرت نشون میده (مثلا 20 باری یک عدد تغییر بدیم حتی اگر بین هر تغییر 10 ثانیه هم صبر کنیم باز همین مشکل هست) :

اینم لینک دانلود سورس برنامه همراه با شبیه ساز پروتئوس برای تست :
کد:
http://upir.ir/93dey/Change-Phone-Number-In-Lcd.rar
[code=vb]$regfile = "m8def.dat"
$crystal = 8000000
Config Pinb.0 = Input
Config Pinb.1 = Input
Config Pinb.2 = Input
Config Pinb.3 = Input
Dim F As Byte , W As Word , Atl As Long , Btl(10) As Long , Ctl As Long , A_tell As Long , B_tell As Long
Dim Num(10) As Byte , Enum(10) As Eram Byte
Dim Ttimer As Byte
Const T1 = 100
A_tell = 21
B_tell = 1
Num(1) = Enum(1) : Num(2) = Enum(2) : Num(3) = Enum(3) : Num(4) = Enum(4) : Num(5) = Enum(5)
Num(6) = Enum(6) : Num(7) = Enum(7) : Num(8) = Enum(8) : Num(9) = Enum(9) : Num(10) = Enum(10)
Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.4 , Rs = Portd.5
Config Lcd = 16 * 2
Cursor Off
Config Timer2 = Timer , Async = On , Prescale = 32
Enable Interrupts
Enable Timer2
On Timer2 Togglelc
If Num(1) > 9 Then Num(1) = 9
If Num(2) > 9 Then Num(2) = 1
If Num(3) > 9 Then Num(3) = 8
If Num(4) > 9 Then Num(4) = 4
If Num(5) > 9 Then Num(5) = 5
If Num(6) > 9 Then Num(6) = 0
If Num(7) > 9 Then Num(7) = 1
If Num(8) > 9 Then Num(8) = 5
If Num(9) > 9 Then Num(9) = 3
If Num(10) > 9 Then Num(10) = 8
Locate 1 , 1
'Lcd "0" ; Num(1) ; Num(2) ; Num(3) ; Num(4) ; Num(5) ; Num(6) ; Num(7) ; Num(8) ; Num(9) ; Num(10)
Lcd "09184501538"
Startm:
F = 0 : Waitms T1
Do
Debounce Pinb.3 , 1 , Nset
Loop
Nset:
For W = 0 To 40000
Waitus 63
Next
If Pinb.3 = 1 Then
Goto Tellnum1
Else
Goto Startm
End If
Togglelc:
Select Case Ttimer
Case 0
Gosub Lcdclear
Case 1 :
Gosub Lcdwrite
Case 2 :
Gosub Lcdclear
Case 3 :
Gosub Lcdwrite : Ttimer = 255
End Select
Incr Ttimer ': Locate 2 , 20
Return
Tellnum1:
F = A_tell : Waitms T1
Do
If Pinb.1 = 1 Then
Waitms 300
Gosub Calcnum11
End If
If Pinb.2 = 1 Then
Waitms 300
Gosub Calcnum12
End If
If Pinb.0 = 1 Then
Waitms 300
B_tell = B_tell + 1
A_tell = A_tell + 1
Gosub Calcnum13
End If
Loop
Calcnum11:
Waitms 50
Locate 2 , 7
Num(b_tell) = Num(b_tell) + 1 : If Num(b_tell) > 9 Then Num(b_tell) = 0 : Goto Tellnum1
Calcnum12:
Waitms 50
Num(b_tell) = Num(b_tell) - 1 : If Num(b_tell) = 255 Then Num(b_tell) = 9 : Goto Tellnum1
Calcnum13:
Waitms 50
If B_tell = 10 Then
Enum(b_tell) = Num(b_tell)
A_tell = 21
B_tell = 1
Goto Startm
Else
Goto Tellnum1
End If
Goto Tellnum1
'Return
Lcdclear:
For Atl = 1 To 10
Btl(atl) = 20 + Atl
If F = Btl(atl) Then
Ctl = Atl + 1
Locate 1 , Ctl
Lcd " "
End If
Next Atl
Return
Lcdwrite:
If F > 20 And F < 31 Then
Locate 1 , 1 : Lcd "0"
Locate 1 , 2 : Lcd Num(1)
Locate 1 , 3 : Lcd Num(2)
Locate 1 , 4 : Lcd Num(3)
Locate 1 , 5 : Lcd Num(4)
Locate 1 , 6 : Lcd Num(5)
Locate 1 , 7 : Lcd Num(6)
Locate 1 , 8 : Lcd Num(7)
Locate 1 , 9 : Lcd Num(8)
Locate 1 , 10 : Lcd Num(9)
Locate 1 , 11 : Lcd Num(10)
End If
Return
End[/code]
ممنون میشم نگاه کنید ببینید مشکل چیه
خیلی وقتمرو گرفته این برنامه :(
دیدگاه