اطلاعیه

Collapse
No announcement yet.

تغییر شماره تلفن روی lcd کاراکتری توسط سوئیچ &#

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    تغییر شماره تلفن روی lcd کاراکتری توسط سوئیچ &#

    سلام دوستان، خسته نباشید
    من دارم رو یک پروژه کار میکنم که یک قسمتش مربوط به زنگ زدن هست
    در این قسمت میخوام امکان تغییر شماره تلفن توسط کاربر رو داشته باشه
    خب خودم یک نمومه نوشتم خوب هم کار میکنه اما برای من که از atmega8 استفاده میکنم مشکل داره :
    1-این برنامه نصف atmega8 پر میکنه و برای بقیه کدهای پروژه مشکل ایجاد میکنه
    این نصف رو که اشغال میکنه فقط برای 1 شماره تلفن همراه هست حالا اگر 2 شماره یا بیشتر باشه که هیچی oo:
    من یک دستگاه که ساخت ایران بود خیلی وقت پیش دیدم که از 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
    راستی دوستان روش ذخیره در EEPROM درست نوشتم؟ و اینکه اینکارها برای میکرو مشکل ایجاد نمیکنند؟ چون شنیدم میگن در میکرو ATMEGA8 اگر بیشتر از 1000 بار نوشته و خوانده شودند میکرو آسیب میبینه
    با تشکر :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]
    ممنون میشم نگاه کنید ببینید مشکل چیه
    خیلی وقتمرو گرفته این برنامه :(

    #2
    پاسخ : پاسخ : تغییر شماره تلفن روی lcd کاراکتری توسط س

    نوشته اصلی توسط hamidelectroniic
    سلام دوباره
    دوستان خودم حجم کدهارو کم کردم
    به همین خاطر مجور شدم بجای 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) = 9
    If Num(4) > 9 Then Num(4) = 9
    If Num(5) > 9 Then Num(5) = 0
    If Num(6) > 9 Then Num(6) = 2
    If Num(7) > 9 Then Num(7) = 3
    If Num(8) > 9 Then Num(8) = 1
    If Num(9) > 9 Then Num(9) = 4
    If Num(10) > 9 Then Num(10) = 9
    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 "09199023149"

    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]
    ممنون میشم نگاه کنید ببینید مشکل چیه
    خیلی وقتمرو گرفته این برنامه :(
    درود کاک حمید
    چونی؟
    خاصی حمید گان ؟؟ :mrgreen:
    ببین
    با یه برنامه خیلی ساده شروع میکنیم ...
    کد:
    Do
      If Sw = 0 Then Incr X
      Waitms 100
    Loop
    End
    این کد هر 100 میلی ثانیه به متغیر X اضاف میکنه ...
    حالا اگر خواستیم با زدن کلید تنها یکی اضاف کند باید برنامه را بعد از زدن کلید برنامه منتظر بماند تا دستمان از روی کلید برداریم
    باید اینگونه کد نوشت
    کد:
    Do
      If Sw = 0 Then
       Incr X
       While Sw = 0 : Wend
      End If
      Waitms 100
    Loop
    End
    حالا شما اینکار را نکردید !!!
    کد:
    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
    باید اینطور نوشت
    کد:
    Calcnum11:
    Waitms 50
    Locate 2 , 7
    Num(b_tell) = Num(b_tell) + 1 : If Num(b_tell) > 9 Then Num(b_tell) = 0
    While Pinb.1 = 1 : Wend : Goto Tellnum1
    Calcnum12:
    Waitms 50
    Num(b_tell) = Num(b_tell) - 1 : If Num(b_tell) = 255 Then Num(b_tell) = 9
    While Pinb.2 = 1 : Wend : Goto Tellnum1
    این کد را امتحان کن و نتیجه رو بگو ...

    موفق باشید
    [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
    معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
    معرفی نرم افزار Codewizard PWM
    با من بیشتر آشنا شوید

    دیدگاه


      #3
      پاسخ : تغییر شماره تلفن روی lcd کاراکتری توسط سوئیچ د

      سلام مهندس گیان، سپاس ایوه باشن؟
      با تغیر به این کد باز مشکل داره و رو LCD اینبار نوشته های دیگه میاره :

      دیدگاه


        #4
        پاسخ : تغییر شماره تلفن روی lcd کاراکتری توسط سوئیچ &#

        سلام :

        فایل پروتئوست رو با فرمت ورژن 7.1 قرار بده تا من هم یه نیگا بهش بندازم . اینجوری برام باز نمیشه ...
        بر زنده باد گفتن این مردم خوش گریز

        دل بر مَنه که یک تنه در سنگرت کنند ...

        دیدگاه


          #5
          پاسخ : تغییر شماره تلفن روی lcd کاراکتری توسط سوئیچ &#

          نوشته اصلی توسط وحیـد
          سلام :

          فایل پروتئوست رو با فرمت ورژن 7.1 قرار بده تا من هم یه نیگا بهش بندازم . اینجوری برام باز نمیشه ...
          سلام
          فایل ستاپ این ورژن ندارم،
          اما فرمتشو دستی تغییر دادم به DSN، شاید باز کنه الان :
          کد:
          http://upir.ir/93dey/Change-Phone-Number-In-Lcd_16685.rar

          دیدگاه


            #6
            پاسخ : تغییر شماره تلفن روی lcd کاراکتری توسط سوئیچ &#

            نوشته اصلی توسط hamidelectroniic
            سلام
            فایل ستاپ این ورژن ندارم،
            اما فرمتشو دستی تغییر دادم به DSN، شاید باز کنه الان :
            کد:
            http://upir.ir/93dey/Change-Phone-Number-In-Lcd_16685.rar
            نه نمیشه ...
            [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
            معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
            معرفی نرم افزار Codewizard PWM
            با من بیشتر آشنا شوید

            دیدگاه


              #7
              پاسخ : تغییر شماره تلفن روی lcd کاراکتری توسط سوئیچ &#

              نوشته اصلی توسط hamidelectroniic
              سلام
              فایل ستاپ این ورژن ندارم،
              اما فرمتشو دستی تغییر دادم به DSN، شاید باز کنه الان
              خیر ... برای من هم باز نمیشه . ورژن 7.10 رو دانلود و نصب کن و اونجا شماتیک بکش تا بشه کمکت کرد ...
              بر زنده باد گفتن این مردم خوش گریز

              دل بر مَنه که یک تنه در سنگرت کنند ...

              دیدگاه


                #8
                پاسخ : تغییر شماره تلفن روی lcd کاراکتری توسط سوئیچ &#

                سلام
                خیلی ممنون
                اینم برای ورژن 7.1 پروتئوس :
                کد:
                http://upir.ir/93dey/Number-Changer.rar

                دیدگاه


                  #9
                  پاسخ : تغییر شماره تلفن روی lcd کاراکتری توسط سوئیچ &#

                  نوشته اصلی توسط hamidelectroniic
                  سلام
                  خیلی ممنون
                  اینم برای ورژن 7.1 پروتئوس :
                  کد:
                  http://upir.ir/93dey/Number-Changer.rar
                  بله الان دیدم شماتیک مدارتونو ...

                  متأسفانه برنامه تون زیاد جالب و منظم نوشته نشده و به خاطر پیچ در پیچ بودن روتین هاش و عدم تمایز اونها از هم ، دیباگینگ اون برای فردی غیر از خود شما کمی مشکل میشه ...

                  چون احساس کردم برای خودم هم جالب و کاربردی میتونه باشه ، مجدداًآ‌ یررسیش میکنم و سعی میکنم یه جورایی شُسته و رُفته تر بنویسمش و ایرادشو رفع کنم .

                  فقط لطفاً یه بار دیگه دقیقاً بگو که خواسته شما از برنامه چی بوده ...؟

                  آیا شما میخوای یه دفترچه تلفن داشته باشی و توش شماره ذخیره کنی و هرکدومو که خواستی انتخاب و باهاش تماس بگیری ... درسته ؟
                  بر زنده باد گفتن این مردم خوش گریز

                  دل بر مَنه که یک تنه در سنگرت کنند ...

                  دیدگاه


                    #10
                    پاسخ : تغییر شماره تلفن روی lcd کاراکتری توسط سوئیچ &#

                    نوشته اصلی توسط وحیـد
                    متأسفانه برنامه تون زیاد جالب و منظم نوشته نشده و به خاطر پیچ در پیچ بودن روتین هاش و عدم تمایز اونها از هم ، دیباگینگ اون برای فردی غیر از خود شما کمی مشکل میشه ...
                    دقیقا"
                    من هم بس که از این برچسب به اون برچسب پریدم گیج شدم ...
                    اصولی ترین راه استفاده از حلقه های استاندارد Do-loop until و while-wend و استفاده از دستورات Exit است ...
                    در ضمن برای قشنگ تر شدن برنامه باید توی هر حلقه دستورات را یک tab زده تا برنامه به طور تو در تو ایجاد شود ... که هر کسی بیاد برنامه را بخواند بفهمه چیکار کردی ...
                    الان این برنامه خیلی ساده رو برچسب به برچسب نوشتی ...
                    [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                    معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                    معرفی نرم افزار Codewizard PWM
                    با من بیشتر آشنا شوید

                    دیدگاه


                      #11
                      پاسخ : تغییر شماره تلفن روی lcd کاراکتری توسط سوئیچ &#

                      نوشته اصلی توسط سامان اسدی
                      دقیقا"
                      من هم بس که از این برچسب به اون برچسب پریدم گیج شدم ...
                      اصولی ترین راه استفاده از حلقه های استاندارد Do-loop until و while-wend و استفاده از دستورات Exit است ...
                      در ضمن برای قشنگ تر شدن برنامه باید توی هر حلقه دستورات را یک tab زده تا برنامه به طور تو در تو ایجاد شود ... که هر کسی بیاد برنامه را بخواند بفهمه چیکار کردی ...
                      الان این برنامه خیلی ساده رو برچسب به برچسب نوشتی ...
                      کاملاً موافقم :applause:...

                      روش کار میکنم ببینم چی از آب درمیاد :agree:
                      بر زنده باد گفتن این مردم خوش گریز

                      دل بر مَنه که یک تنه در سنگرت کنند ...

                      دیدگاه


                        #12
                        پاسخ : تغییر شماره تلفن روی lcd کاراکتری توسط س

                        خیلی ممنون دوستان
                        تقریبا مثل دفترچه تلفن اما با این تفاوت که یک یا 2 شماره تلفن وارد برنامه میکنم که بعدا به اون شماره ها زنگ بزنم
                        بله برنامه خیلی به هم ریخته هست شرمنده، اخه در حال تستش هستم و میخوام به برنامه اصلی که قراره برای چند مداره و هنگام خطر زنگ بزنه اضافه کنم و اینکه من تو AVR تازه وارد هستم و دلیل کار با بیسیک اینه که قبلا که برنامه نویسی سیستمی کار کردم یکی از زبان هایی که کار کردم VB6 بود
                        خب توضیح برنامه :
                        کدهای زیر که معلومه و برای تعریف متغیر و ... :
                        [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[/code]
                        متغییر Num(10) برای شماره تلفن تعریف کردم که بجز 0 اول شماره تلفن، ما 10 عدد داریم
                        متغییر Enum(10) هم برای ذخیره عددها در EEPROM بکار بردم

                        دستورات زیر هم برای خواندن عددها از EEPROM :
                        [code=vb]
                        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)[/code]
                        بعد از این که LCD هست و معلوم هستش

                        این تایمر هم برای این قرار دادم که عدد در حال ویرایش بصورت چشمک زن در بیاد و کاربر بدونه کدوم عدد در حال ویرایش هست
                        [code=vb]Config Timer2 = Timer , Async = On , Prescale = 32
                        Enable Interrupts
                        Enable Timer2
                        On Timer2 Togglelc[/code]

                        دستورات زیر به خاطر این قرار دادم چون متغییرهای Enum(1) تا Enum(10) در دفعه اول برابر هست با 255 که این عدد روی lcd نمایش داده بشه خیلی زشت میشه :
                        [code=vb]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[/code]

                        این کدهام که روی lcd شماره تغییر داده شده مینویسه (Lcd "09199023149" فعلا برای تست گذاشتم چون در پروتئوس EEPROM دقیق شبیه سازی نشده) :
                        [code=vb]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"[/code]

                        کدهای زیر هم :
                        متغییر F برای این هست که موقع تغییر عدد شماره تلفن فقط عدد در حال ویرایش بتونیم تغییر بدیم و چشمک بزنه که بعدا برابرش میکنیم با مثلا 21 که برای عدد اول شماره تلفن هست و 22 عدد دوم شماره تلفن و تا 30 که عدد دهم شماره تلفن هست.
                        در حلقه Loop هم از دستور Debounce استفاده کردم که برای این هست وقتی کلید وصل شده به پورت Pinb.3 فشار داده بشه بره به زیر برنامه Nset
                        [code=vb]Startm:
                        F = 0 : Waitms T1
                        Do
                        Debounce Pinb.3 , 1 , Nset
                        Loop[/code]

                        در زیر برنامه Nset :
                        توسط For یک وقفه 4حدود 4 ثانیه ای ایجاد میکنم
                        توسط دستور If هم دوباره چک میکنم ببینم کلیدی که به پورت Pinb.3 وصله هنوز پایین نگه داشته شده و ورودی پین 1 هست که اگر یک بود به زیر برنامه Tellnum1 بره
                        این وقفه و IF برای این هست که باید چند ثانیه کلید پایین نگه داشته بشه تا برنامه شروع به ویرایش شماره تلفن بکنه
                        [code=vb]Nset:
                        For W = 0 To 40000
                        Waitus 63
                        Next
                        If Pinb.3 = 1 Then
                        Goto Tellnum1
                        Else
                        Goto Startm
                        End If[/code]

                        خب این دستورات زیر مربوط به همون تایمر هست :
                        کار اصلی این دستورات رفتن به دو زیر برنامه Lcdclear و Lcdwrite هست که بین رفتن به این دو تا وقفه ایجاد میکنه و این دو تا زیر برنامه هم که یکیشون عدد در حال ویرایش پاک میکنه و بعدی عدد جدید مینویسه باعث ایجاد حالت چشمک زدن عدد در حال ویرایش میشه
                        این دستورات مدام در حال تکرار هستند که اگر عدد داخل متغیرهای Enum(1) تا Enum(1) تغییر کردن روی LCD ویرایش و نمایش بده
                        [code=vb]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[/code]

                        حالا زیر برنامه Tellnum1 :
                        1-توسط دستور F = A_tell : Waitms T1 متغییر F برابر A_tell میکنم که در اول برنامه A_tell برابر 1 کردم
                        متغییر F برای این هست در زیر برنامه های Lcdclear و Lcdwrite بدونیم عدد چندم شماره تلفن در حال ویرایش هست تا پاکش کنیم و عدد جدید بنویسیم،
                        متغییر A_tell هم در خطهای بعدی هر بار که کلید متصل به پورت Pinb.0 زده بشه یک عدد بهش اضافه میکنه که منظور از اینکار اینه :
                        21 = عدد اول شماره تلفن (عدد اول شماره تلفن صفر نیست چون در برنامه صفر تغییر نمیدیم بلکه بعد از صفر تغییر میدیم)
                        22 = عدد دوم شماره تلفن
                        23 = عدد سوم شماره تلفن
                        ...
                        ...
                        29 = عدد نهم شماره تلفن
                        30 = عدد دهم شماره تلفن
                        2- حلقه Loop :
                        توسط دستور If Pinb.1 = 1 Then میایم میگیم اگر کلید وصل شده به پورت Pinb.1 زده شد به زیر برنامه Calcnum11 بره و به عدد در حال ویرایش یک عدد اضافه کنه (دستورات زیر برنامه Calcnum11 کارش + هست یعنی اضافه کردن 1 به عدد در حال ویرایش شماره تلفن)
                        دستور If Pinb.2 = 1 Then هم کارش مثل بالایی هست اما با این تفاومت که میاد منها میکنه و از عدد در حال ویرایش یک عدد اضافه میکنه
                        دستور If Pinb.0 = 1 Then هم پورت Pinb.0 وصله به کلیدی که کارش پرش به عدد بعدی شماره تلفن هست یعنی هر وقت زده شد میاد به متغییر B_tell و A_tell یک عدد اضافه میکنه (متغییر B_tell رو برای متغییر Num() تعریف کردم که هر بار کلید Pinb.0 زده بشه متغییر Num() تغییر میکنه، A_tell هم برای متغییر F هست و در بالا توضیح دادم برای تشخیص این هست در زیر برنامه Lcdclear و Lcdwrite بدونیم کدوم عدد تغییر میده تا رو LCD ویرایش و نمایش بدیم)
                        خب بعد از اینکه B_tell و A_tell تغییر داد میره به زیر برنامه Calcnum13، در این زیر برنامه میاد بررسی میکنه ببینه B_tell بیشتر از 10 شده (چون شماره تلفن ما 10 عددی هست) که اگر شده میاد B_tell و A_tell برابر با مقدار اصلیشون میکنه و سپس بر میگرده به زیر برنامه Startm که دوباره از اول شرع بشه برنامه، یعنی برنامه وقتی بدونه B_tell بیشتر از 10 شد میفهمه که تمام عددهای شماره تلفن ویرایش شده و به اول برنامه بر میگرده. ولی اگر B_tell برابر با 10 نبود بر میگرده به زیر برنامه Tellnum1 که در این حالت متغییرهای B_tell و A_tell تغییر کردن و برنامه میره برای ویرایش عدد بعدی شماره تلفن.
                        برای اولین بار بعد از روشن شدن مدار اگر کلید متصل به Pinb.0 زده بشه B_tell + 1 میکنه و A_tell هم + 1 میکنه، خب B_tell میشه 2 و A_tell میشه 22 که وقتی دستورات زیر برنامه Lcdclear و Lcdwrite انجام میشه میفهمه که باید عدد دوم شماره تلفن باید تغییر بده و برابرش کنه با Num(b_tell) که 2 هستش یعنی عدد دوم
                        دومین بار که کلید رو بزنیم B_tell میشه 3 و A_tell میشه 23 که باز در زیر برنامه Lcdclear و Lcdwrite میفهمه باید عدد سوم شماره تلفن تغییر بده
                        و اینطوری ادامه پیدا میکنه تا عدد دهم شماره تلفن یعنی B_tell میشه 10 و A_tel میشه 30
                        در اصل Tellnum1 کار 10 تایی انجام میده
                        خب در زیر برنامه Calcnum11 و Calcnum12 دو شرط گزاشتم، شرط داخل Calcnum11 بررسی میکنه اگر عدد در حال ویرایش یعنی Num(b_tell) از 9 بیشتر شد Num(b_tell) برابر 0 میکنه و پرش میکنه به زیر برنامه Tellnum1 که دوباره همون Num(b_tell) ویرایش کنه، شرط داخل Calcnum12 هم همینکار رو میکنه با این تفاوت که اگر Num(b_tell) کمتر از 0 شد برابرش کن با 9 و برو به Tellnum1 و دوباره آماده ویرایش بشه (شرط در Calcnum11 وقتی اجرا میشه که از کلید به اضافه بزنیم و شرط در Calcnum12 وقتی اجرا میشه که ما کلید منها بزنیم)
                        زیر برنامه Calcnum13 هم که توضیح دادم
                        [code=vb]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[/code]

                        زیر برنامه Lcdclear هم کار پاک کردن عدد در حال ویرایش شماره تلفن هست که به کمک عدد داخل متغییر F میاد سطر مربوطه در LCD پاک میکنه و آماده میکنه برای نوشتن عدد جدید
                        [code=vb]
                        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[/code]

                        زیر برنامه Lcdwrite هم کار نوشتن عدد جدید روی LCD میکنه، بررسی میکنه که اگر عدد متغییر F بین 21 تا 30 بود عددهای جدید شماره تلفن روی LCD مینویسه
                        Locate 1 , 1 برابر 0 هست که ما بهش کاری نداریم و همون 0 مینویسیم
                        Locate 1 , 2 برابر با عدد اول شماره تلفن هست
                        Locate 1 , 3 برابر با عدد دوم شماره تلفن هست
                        Locate 1 , 4 برابر با عدد سوم شماره تلفن هست
                        ...
                        Locate 1 , 10 برابر با عدد نهم شماره تلفن هست
                        Locate 1 , 11 برابر با عدد دهم شماره تلفن هست
                        [code=vb]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]
                        اوه ببین چه قد نوشتم oo: :-)) #:S
                        خب دوستان شرمنده اگر خوب توضیح ندادم، من در توضیح برنامه خیلی مشکل دارم شرمنده
                        امیدوارم مثل برنامه پیچ در پیچ توضیح نداده باشم

                        دیدگاه


                          #13
                          پاسخ : تغییر شماره تلفن روی lcd کاراکتری توسط سوئیچ &#

                          پس همونی بود که حدس میزدم ...

                          یه مثال خیلی ساده برات میزنم از نحوه بهتر نوشتن . ببین چقدر حرفه ای تره . مثلا دستورات زیر رو :

                          [code=vb] 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)[/code]

                          بهتره اینجوری مینوشتی :

                          [code=vb]Do

                          Incr F
                          Num(f) = Enum(f)

                          Loop Until F = 10

                          F = 0[/code]

                          ببین چقدر ساده تره ... توی حجم کد تأثیری نداره ولی برنامه خواناتر میشه

                          بذار ببینم چی از آب درمیاد ....

                          بر زنده باد گفتن این مردم خوش گریز

                          دل بر مَنه که یک تنه در سنگرت کنند ...

                          دیدگاه


                            #14
                            پاسخ : تغییر شماره تلفن روی lcd کاراکتری توسط س&#16

                            نوشته اصلی توسط وحیـد
                            پس همونی بود که حدس میزدم ...

                            یه مثال خیلی ساده برات میزنم از نحوه بهتر نوشتن . ببین چقدر حرفه ای تره . مثلا دستورات زیر رو :

                            [code=vb] 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)[/code]

                            بهتره اینجوری مینوشتی :

                            [code=vb]Do

                            Incr F
                            Num(f) = Enum(f)

                            Loop Until F = 10

                            F = 0[/code]

                            ببین چقدر ساده تره ... توی حجم کد تأثیری نداره ولی برنامه خواناتر میشه

                            بذار ببینم چی از آب درمیاد ....

                            سلام
                            ممنون و تشکر، این هم تست کردم اما مشکل حل نشد
                            قبلا این دستورهارو د حلقه for هم نوشتم اما مشکل از این نبود :
                            [code=vb]For W = 1 To 10
                            Num(w) = Enum(w)
                            Next W[/code]

                            دیدگاه


                              #15
                              پاسخ : پاسخ : تغییر شماره تلفن روی lcd کاراکتری توسط س

                              نوشته اصلی توسط hamidelectroniic
                              سلام
                              ممنون و تشکر، این هم تست کردم اما مشکل حل نشد
                              قبلا این دستورهارو د حلقه for هم نوشتم اما مشکل از این نبود :
                              [code=vb]For W = 1 To 10
                              Num(w) = Enum(w)
                              Next W[/code]


                              نه رفیق ... اشتباه نشه . :nerd:

                              من که نگفتم اشکال برنامه ات از این بوده . فقط یه [glow=red,2,300]مثال[/glow] از نحوه جمع و جورتر نوشتن برنامه برات زدم . همین ... :nerd:


                              صبر کن تا منم روی اون کار کنم و نتیجه رو بگم :agree:
                              بر زنده باد گفتن این مردم خوش گریز

                              دل بر مَنه که یک تنه در سنگرت کنند ...

                              دیدگاه

                              لطفا صبر کنید...
                              X