[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
проблема с подпрограммой
Lelik54Дата: Воскресенье, 05.08.2012, 20:28 | Сообщение # 1
Группа: Проверенные
Сообщений: 11

Статус: Offline
Всем доброго времени суток.Подскажите пожалуйсто,почему если команду INCR пишу в подпрограме GOTO,то она не работает,а цикле do...loop прекрасно себя ведёт?
[code]$regfile = "m8535.dat"
$lib "mcsbyte.lbx"
$lib "lcd4.lbx"
$crystal = 8000000
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2
Deflcdchar 4 , 0 , 4 , 2 , 31 , 2 , 4 , 0 , 0
Deflcdchar 5 , 0 , 4 , 8 , 31 , 8 , 4 , 0 , 0
Config Pind.2 = Input
Config Rc5 = Pind.2(timer1)
Enable Interrupts
Dim Address As Byte , Command As Byte
Dim A As Byte
Dim B As Byte
Cursor Off
Cls
'--------------------------------------------------------'
Do
Getrc5(address , Command)
If Address < 255 Then
Command = Command And &B01111111
End If
If Command = 16 Then
Goto Vpravo
End If
If Command = 17 Then
Goto Vlevo
End If
Locate 2 , 1
Lcd B
Loop
'--------------------------------------------'
Vpravo:
Cls
Locate 1 , 1
Lcd Chr(4)
If B = 5 Then
B = 1
End If
Select Case B
Case 1 : Portd = &B00001000
Case 2 : Portd = &B00010000
Case 3 : Portd = &B00100000
Case 4 : Portd = &B01000000
End Select
Incr B
Waitms 10
Return
End
'-----------------------------------------'
Vlevo:
Cls
Locate 1 , 1
Lcd Chr(5)
If B = 1 Then
B = 5
End If
Select Case B
Case 1 : Portd = &B00001000
Case 2 : Portd = &B00010000
Case 3 : Portd = &B00100000
Case 4 : Portd = &B01000000
End Select
Locate 2 , 1
Waitms 10
Return
End


 
exersizzeДата: Понедельник, 06.08.2012, 12:11 | Сообщение # 2
Группа: Администраторы
Сообщений: 723

Статус: Offline
Просто ты пытаешься возвратится с помощью Return. Замени Goto на Gosub, должно заработать

 
Aleks8383Дата: Понедельник, 06.08.2012, 22:37 | Сообщение # 3
Группа: Проверенные
Сообщений: 104

Статус: Offline
Либо просто перед Return поставить Goto на метку ,а саму метку поставить в цикл после do.

 
Lelik54Дата: Вторник, 07.08.2012, 16:59 | Сообщение # 4
Группа: Проверенные
Сообщений: 11

Статус: Offline
спасибо,с gosub заработало,но почему так,мне не понятно.

 
exersizzeДата: Вторник, 07.08.2012, 19:49 | Сообщение # 5
Группа: Администраторы
Сообщений: 723

Статус: Offline
Все просто, по команде Goto микроконтроллер перепрыгнет на кусок программы с соответствующей меткой, при этом место откуда был переход не запоминается. Просто переход на другой участок кода. Поэтому команда Return не может возвратить проц на выполнение первоначального кода.

 
Aleks8383Дата: Вторник, 07.08.2012, 20:44 | Сообщение # 6
Группа: Проверенные
Сообщений: 104

Статус: Offline
Это хорошо видно когда в том же барсике пошагово включаешь выполнене в симуляторе,прыгает писец,так бы наши олимпийцибы пригали:) Я это давно просёк но первым описал Ексисайз ,я то думал все знают гуры програмирования(я не про вас просто думал что это уже давно известный факт) ,а оказалось что нет.



Сообщение отредактировал Aleks8383 - Вторник, 07.08.2012, 20:45
 
  • Страница 1 из 1
  • 1
Поиск: