پاسخ : تغییر شماره تلفن روی lcd کاراکتری توسط س
سلام دوستان
مشکل حل کردم :wow:
مشکل از ایجاد زیر برنامه های Calcnum11 و Calcnum12 و Calcnum13 بود، چون اگر وقفه میکردیم در کلیک روی کلیدها همه این زیر برنامه ها به دلیل وجود نداشتن Return زیر برنامه بعدی اجرا میشد و این مشکل به وجود میومد
خب من کلا این 3 زیر برنامه برداشتم و دستوراتش رو به زیر if مربوطه بردم و حل شد
اینم از برنامه :
[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
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
A_tell = 21
B_tell = 1
For W = 1 To 10
Num(w) = Enum(w)
Next W
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
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
End If
If Pinb.2 = 1 Then
Waitms 300
Num(b_tell) = Num(b_tell) - 1 : If Num(b_tell) = 255 Then Num(b_tell) = 9
While Pinb.2 = 1 : Wend : Goto Tellnum1
End If
If Pinb.0 = 1 Then
Waitms 300
While Pinb.0 = 1 : Wend
B_tell = B_tell + 1
A_tell = A_tell + 1
If B_tell > 10 Then
Enum(b_tell) = Num(b_tell)
A_tell = 21
B_tell = 1
Gosub Lcdwrite
Goto Startm
Else
Goto Tellnum1
End If
End If
Loop
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]
حالا روش کار میکنم باز و بهینه تز میکنم اگر تونستم
الان فقط تنها یک مورد میمونه، اگر بشه کلیدها رو به 3 تا کاهش بدیم عالی میشه، یعنی کلید Edite و Move یکی کنیم و با یک کلید کار این دو تا انجام بدیم (با دستور Debounce که در سورسهای اول استفاده کردم راحت میشد و انجامک دادم اما با if نمیدونم چطوری این کارو انجام بدم).
اگر روش دیگه ای هم نوشتید یا داشتید بزارید که شاید از مال من بهتر باشه و استفاده کنیم
با تشکر از دوستان
سلام دوستان

مشکل حل کردم :wow:
مشکل از ایجاد زیر برنامه های Calcnum11 و Calcnum12 و Calcnum13 بود، چون اگر وقفه میکردیم در کلیک روی کلیدها همه این زیر برنامه ها به دلیل وجود نداشتن Return زیر برنامه بعدی اجرا میشد و این مشکل به وجود میومد
خب من کلا این 3 زیر برنامه برداشتم و دستوراتش رو به زیر if مربوطه بردم و حل شد

اینم از برنامه :
[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
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
A_tell = 21
B_tell = 1
For W = 1 To 10
Num(w) = Enum(w)
Next W
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
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
End If
If Pinb.2 = 1 Then
Waitms 300
Num(b_tell) = Num(b_tell) - 1 : If Num(b_tell) = 255 Then Num(b_tell) = 9
While Pinb.2 = 1 : Wend : Goto Tellnum1
End If
If Pinb.0 = 1 Then
Waitms 300
While Pinb.0 = 1 : Wend
B_tell = B_tell + 1
A_tell = A_tell + 1
If B_tell > 10 Then
Enum(b_tell) = Num(b_tell)
A_tell = 21
B_tell = 1
Gosub Lcdwrite
Goto Startm
Else
Goto Tellnum1
End If
End If
Loop
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]
حالا روش کار میکنم باز و بهینه تز میکنم اگر تونستم
الان فقط تنها یک مورد میمونه، اگر بشه کلیدها رو به 3 تا کاهش بدیم عالی میشه، یعنی کلید Edite و Move یکی کنیم و با یک کلید کار این دو تا انجام بدیم (با دستور Debounce که در سورسهای اول استفاده کردم راحت میشد و انجامک دادم اما با if نمیدونم چطوری این کارو انجام بدم).
اگر روش دیگه ای هم نوشتید یا داشتید بزارید که شاید از مال من بهتر باشه و استفاده کنیم
با تشکر از دوستان
دیدگاه