Что нового

Имитация 7-ми сегментного 5-ти знакового индикатора

DemkaDV

Новичок
Сообщения
16
Репутация
3
Добрый день уважаемые пользователи.
Возникла необходимость воспроизвести на форме эумуляцию индикатора, 6 символов.
1.1-й Символ пустой, либо минус.
2. 2,3,4,5 символы - Символы цифр, минуса и L
3. 6-Специализированные символы
Использовал для смены символов UDF GIFAnimation.au3, возникают мерцания, можно ли этого как-то избежать? Пробовал GUICtrlCreatePic при использовании GUICtrlSetImage - тоже возникает мерцание.
Все символы подготовлены заранее, в виде GIF статических картинок.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Эмитация 7-ми сегментного 5-ти знакового индикатора.

DemkaDV [?]
Все символы подготовлены заранее, в виде GIF статических картинок.
Где они?
Где Ваш код?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Эмитация 7-ми сегментного 5-ти знакового индикатора.

DemkaDV
Зачем точка в конце названия темы?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Re: Эмитация 7-ми сегментного 5-ти знакового индикатора.

OffTopic:
CreatoR [?]
Зачем точка в конце названия темы?
Лучше придраться к опечатке в названии темы. Для обеспечения работы поиска. ;)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
DemkaDV [?]
Пробовал GUICtrlCreatePic при использовании GUICtrlSetImage - тоже возникает мерцание
Что значит "мерцание"? Вот набросал пример... и не вижу мерцаний.
Код:
#include <ScreenCapture.au3>

Dim $pic[6]

$gui = GUICreate("Pic", 300, 100)
For $i = 0 To 5
  _ScreenCapture_Capture(@ScriptDir & "\" & $i & ".gif",  $i * 50, 0, $i * 50 + 50, 100)
  $pic[$i] = GUICtrlCreatePic(@ScriptDir & "\" & $i & ".gif", $i * 50, 0, 50, 100)
Next

GUISetState()

Do
  For $i = 0 To 5
    GUICtrlSetImage($pic[3], @ScriptDir & "\" & $i & ".gif")
    Sleep(500)
  Next
Until 0
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
DemkaDV,
Можно без картинок попробовать сделать.
Код:
#include <GUIConstantsEx.au3>
;#include <StaticConstants.au3>

Global $aCoord[7][4] = [[34, 10, 22, 3],[34, 40, 22, 3],[30, 10, 3, 31],[57, 10, 3, 31],[30, 42, 3, 31],[57, 42, 3, 31],[34, 70, 22, 3]], _
		$aLabelDigit[7][4], $fGo, $iOffset

$hGui = GUICreate('Test', 210, 150)
GUICtrlCreateLabel('', 5, 5, 200, 73);, $SS_SUNKEN)
GUICtrlSetBkColor(-1, 0x000000)
GUICtrlSetState(-1, $GUI_DISABLE)
$nMinus = GUICtrlCreateLabel('', 10, 40, 10, 3);, $SS_SUNKEN)
GUICtrlSetBkColor(-1, 0xFF0000)
;GUICtrlSetState(-1, $GUI_HIDE)
For $j = 0 To 3
	If $j = 3 Then $iOffset = 9
	For $i = 0 To 6
		$aLabelDigit[$i][$j] = GUICtrlCreateLabel('', $aCoord[$i][0] + $j * 40 + $iOffset, $aCoord[$i][1], $aCoord[$i][2], $aCoord[$i][3]);, $SS_SUNKEN)
		GUICtrlSetBkColor(-1, 0xFF0000)
		;GUICtrlSetState(-1, $GUI_HIDE)
	Next
Next
$aCoord = 0
GUICtrlCreateLabel('', 148, 70, 3, 3);, $SS_SUNKEN)
GUICtrlSetBkColor(-1, 0xFF0000)
$nBtn = GUICtrlCreateButton('Click', 55, 100, 100, 30)
GUISetState()
;#cs
For $j = 9 To 0 Step -1
	For $i = 0 To 3
		_Digit($j, $i, $aLabelDigit)
	Next
	Sleep(1000)
Next
;#ce
_ChangeRandom()
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nBtn
			$fGo = Not $fGo
			If $fGo Then
				_ChangeRandom()
				AdlibRegister('_ChangeRandom', 1000)
			Else
				AdlibUnRegister('_ChangeRandom')
			EndIf
	EndSwitch
WEnd
;$GUI_SHOW = 16
;$GUI_HIDE = 32
Func _Digit($i_Digit, $i_Column, $a_LabelDigit)
	Local $a_DigitState[10][7] = [[16, 32, 16, 16, 16, 16, 16],[32, 32, 32, 16, 32, 16, 32],[16, 16, 32, 16, 16, 32, 16], _
			[16, 16, 32, 16, 32, 16, 16],[32, 16, 16, 16, 32, 16, 32],[16, 16, 16, 32, 32, 16, 16],[16, 16, 16, 32, 16, 16, 16], _
			[16, 32, 32, 16, 32, 16, 32],[16, 16, 16, 16, 16, 16, 16],[16, 16, 16, 16, 32, 16, 16]]
	$i_Column = Int($i_Column)
	Switch $i_Column
		Case 0 To 3
			;OK
		Case Else
			Return
	EndSwitch
	$i_Digit = Int($i_Digit)
	Switch $i_Digit
		Case 0 To 9
			;OK
		Case Else
			Return
	EndSwitch
	For $i = 0 To 6
		GUICtrlSetState($a_LabelDigit[$i][$i_Column], $a_DigitState[$i_Digit][$i])
	Next
EndFunc   ;==>_Digit

Func _ChangeRandom()
	Switch Random(0, 1, 1)
		Case 0
			GUICtrlSetState($nMinus, $GUI_HIDE)
		Case 1
			GUICtrlSetState($nMinus, $GUI_SHOW)
	EndSwitch
	For $i = 0 To 3
		_Digit(Random(0, 9, 1), $i, $aLabelDigit)
	Next
EndFunc   ;==>_ChangeRandom
 
Автор
D

DemkaDV

Новичок
Сообщения
16
Репутация
3
Вот как бы полный код, спасибо, все теперь работает. Прибор мультиметр MS8226 DMM - по COM порту через переходник USB - COM от MasterKIT BA8050 имеет режим передачи данных дисплея. Передается последовательно 14 байт 3 раза в секунду. Режим COM порта 2400 8n1.
Ссылка на протокол передачи данных http://rahmyzdhyfbr.tripod.com/
Спасибо всем за помощь.
Код:
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <CommMG.au3>
#include <Array.au3>

Dim $meter_AC = 0
Dim $meter_DC = 0
Dim $meter_AUTO = 0
Dim $meter_RS232 = 0
Dim $meter_Minus = 0
Dim $meter_4e = 0
Dim $meter_4f = 0
Dim $meter_4a = 0
Dim $meter_4d = 0
Dim $meter_4c = 0
Dim $meter_4g = 0
Dim $meter_4b = 0
Dim $meter_P3 = 0
Dim $meter_3e = 0
Dim $meter_3f = 0
Dim $meter_3a = 0
Dim $meter_3d = 0
Dim $meter_3c = 0
Dim $meter_3g = 0
Dim $meter_3b = 0
Dim $meter_P2 = 0
Dim $meter_2e = 0
Dim $meter_2f = 0
Dim $meter_2a = 0
Dim $meter_2d = 0
Dim $meter_2c = 0
Dim $meter_2g = 0
Dim $meter_2b = 0
Dim $meter_P1 = 0
Dim $meter_1e = 0
Dim $meter_1f = 0
Dim $meter_1a = 0
Dim $meter_1d = 0
Dim $meter_1c = 0
Dim $meter_1g = 0
Dim $meter_1b = 0
Dim $meter_u = 0
Dim $meter_n = 0
Dim $meter_K = 0
Dim $meter_Diode = 0
Dim $meter_m = 0
Dim $meter_Percent = 0
Dim $meter_Mega = 0
Dim $meter_Beep = 0
Dim $meter_F = 0
Dim $meter_Ohm = 0
Dim $meter_REL = 0
Dim $meter_Hold = 0
Dim $meter_A = 0
Dim $meter_V = 0
Dim $meter_Hz = 0
Dim $meter_C = 0
Dim $meter_Batt = 0
Dim $ArrData[14],$ArrData1[14]
If Not FileExists("portsettings.ini") Then ;если файл не существует, то
$iniFile = FileOpen ( @ScriptDir&"\portsettings.ini", 1 );создаём
 ;и пишем в него всю структуру
FileWrite ( $iniFile, "[comport]"&@CRLF&"port=1"&@CRLF&"baud=115200"& _
@CRLF&"databits=8"&@CRLF&"stopbits=1"&@CRLF&"parity=0"&@CRLF&"flowcontrol=0")
FileClose ($iniFile)
MsgBox (0, "AT sender v.0.1", "Это первый запуск, настройте параметры COM порта в файле portsettings.ini"& _
@CRLF&"port - Номер порта"&@CRLF&"baud - Скopocть (бит/c)"&@CRLF&"databits - Биты дaнныx"&@CRLF& _
"stopbits - Стoпoвыe биты"&@CRLF&"parity - Чeтнocть"&@CRLF&"flowcontrol - Упpaвлeниe пoтoкoм")
Exit
 EndIf
;-------------
$port = IniRead (@ScriptDir&"\portsettings.ini", "comport", "port", "NotFound");Номер порта
$baud = IniRead (@ScriptDir&"\portsettings.ini", "comport", "baud", "NotFound");Скopocть (бит/c)
$databits = IniRead (@ScriptDir&"\portsettings.ini", "comport", "databits", "NotFound");Биты дaнныx
$stopbits = IniRead (@ScriptDir&"\portsettings.ini", "comport", "stopbits", "NotFound");Стoпoвыe биты
$parity = IniRead (@ScriptDir&"\portsettings.ini", "comport", "parity", "NotFound");Чeтнocть
$flowcontrol = IniRead (@ScriptDir&"\portsettings.ini", "comport", "flowcontrol", "NotFound");Упpaвлeниe пoтoкoм
$result_err = ""
$status_string = "Нет подключения"
Dim $ArrData[14]
Dim $T1,$T2,$T3,$Num1,$Num2,$Num3,$Num4

;-------------
 ;подключаемся к порту
$portstatus = _CommSetPort($port,$result_err,$baud,$databits,$parity,$stopbits,$flowcontrol)
If $portstatus = 1 Then ; если ответ функции 1 то всё ОК и пишем это на лейбле
$status_string = "Подключено к порту: COM"&$port
;***********************
;***********************
Else ; если ответ не 1 то всё плохо...
$status_string = "Ошибка подключения к порту: COM"&$port
EndIf

$Form1 = GUICreate("Digital Multimeter MS8226", 500, 692)
$Label1 = GUICtrlCreateLabel ($status_string,8, 2, 390, 17)
$Input1 = GUICtrlCreateInput("", 8, 352, 297, 21)
$Button1 = GUICtrlCreateButton("Send", 312, 350, 75, 25, 0)
$Edit1 = GUICtrlCreateEdit("", 8, 20, 377, 321, $WS_VSCROLL)

;***************************
;Добавлние графических символов
$Gif0=GUICtrlCreatePic(@ScriptDir&"\Images\Blank.gif",10,420,80,120)
$Gif1=GUICtrlCreatePic(@ScriptDir&"\Images\Blank.gif",90,420,80,120)
$Gif2=GUICtrlCreatePic(@ScriptDir&"\Images\Blank.gif",170,420,80,120)
$Gif3=GUICtrlCreatePic(@ScriptDir&"\Images\Blank.gif",250,420,80,120)
$Gif4=GUICtrlCreatePic(@ScriptDir&"\Images\Blank.gif",330,420,80,120)
$Gif5=GUICtrlCreatePic(@ScriptDir&"\Images\Blank.gif",410,420,80,120)

;
GUISetState(@SW_SHOW)
Dim $Dig = ""
;***************************
; ~~~~~~~~ основной цикл программы ~~~~~~~~

While 1
     $nMsg = GUIGetMsg()
     Switch $nMsg
     Case $GUI_EVENT_CLOSE
          If $portstatus = 1 Then
          $status_string = "Закрытие порта: COM"&$port&" ..."
          GUICtrlSetData ($Label1, $status_string)
          sleep(800);пауза, чтоб успели прочитать лейбл
          EndIf
         Exit
     Case $Button1 ; отправка данных в порт
         ;$senddata = GUICtrlRead ($Input1); считываем что ввели в Input
        ; If Not $senddata = "" Then; если не путо, то отправляем порту
         ;_CommSendString($senddata&@CR, 1); в конце нужно добавлять @CR
         ;GUICtrlSetData ($Edit1, "Отправлено:"&@CRLF&$senddata&@CRLF,1);пишем в Edit
         ;Else
         ;GUICtrlSetData ($Edit1, "Ошибка: нечего отправлять!"&@CRLF,1)
         ;EndIf
		 ;Grafotobragenie($Gif1,$T1,$Num1)
		 ;Grafotobragenie($Gif2,$T2,$Num2)
		 ;Grafotobragenie($Gif3,$T3,$Num3)
		 ;Grafotobragenie($Gif4,0,$Num4)
;Проверка индикации параметры протокола: 1 тетрада байта порядковый номер байта, вторая тетрада данные.
IntToBin(0x13)
IntToBin(0x27)
IntToBin(0x3D)
IntToBin(0x45)
IntToBin(0x5B)
IntToBin(0x67)
IntToBin(0x7D)
IntToBin(0x8D)
IntToBin(0x9B)
IntToBin(0xA0)
IntToBin(0xB0)
IntToBin(0xC0)
IntToBin(0xD0)
IntToBin(0xE4)
UpdateDisplay()
EndSwitch
$Ret_string = _CommGetLine("E4" , 14 , 0 )
$ArrData1 = StringToASCIIArray($Ret_string,0,StringLen($Ret_string),1)
For $i = 0 To UBound($ArrData1) - 1
$ArrData[$i]=Hex($ArrData1[$i],2)
Next

For $i = 0 To UBound($ArrData) - 1
IntToBin("0x"& $ArrData[$i])
Next

UpdateDisplay()

;Sleep(100)
;**************************************************************************
 WEnd

Func OnAutoItExit(); функция срабатывает при выходе.
 _CommClosePort()
;MsgBox (0, "AT sender v.0.1", "порт закрыт")
EndFunc

Func IntToBin($iInt) ; coded by Malkey
Local $b = ""
   For $i = 1 To 4
	  If $i<5 Then 
		 $b = BitAND($iInt, 1) & $b
		 ;MsgBox(0, "", $b)
		 $iInt = BitShift($iInt, 1)
	  EndIf
   Next
	  ;MsgBox(0, "", $iInt)
Switch $iInt
  Case 1
	 If StringMid($b, 1, 1)="1" Then
		$meter_AC = 1
	 Else
		$meter_AC = 0
     EndIf
	 If StringMid($b, 2, 1)="1" Then
		$meter_DC = 1
	 Else
		$meter_DC = 0
     EndIf
	 If StringMid($b, 3, 1)="1" Then
		$meter_AUTO = 1
	 Else
		$meter_AUTO = 0
     EndIf
	 If StringMid($b, 4, 1)="1" Then
		$meter_RS232 = 1
	 Else
		$meter_RS232 = 0
     EndIf		
  Case 2
	 If StringMid($b, 1, 1)="1" Then
		$meter_Minus = 1
	 Else
		$meter_Minus = 0
     EndIf
	 If StringMid($b, 2, 1)="1" Then
		$meter_4e = 1
	 Else
		$meter_4e = 0
     EndIf
	 If StringMid($b, 3, 1)="1" Then
		$meter_4f = 1
	 Else
		$meter_4f = 0
     EndIf
	 If StringMid($b, 4, 1)="1" Then
		$meter_4a = 1
	 Else
		$meter_4a = 0
     EndIf	 
  Case 3
     If StringMid($b, 1, 1)="1" Then
		$meter_4d = 1
	 Else
		$meter_4d = 0
     EndIf
	 If StringMid($b, 2, 1)="1" Then
		$meter_4c = 1
	 Else
		$meter_4c = 0
     EndIf
	 If StringMid($b, 3, 1)="1" Then
		$meter_4g = 1
	 Else
		$meter_4g = 0
     EndIf
	 If StringMid($b, 4, 1)="1" Then
		$meter_4b = 1
	 Else
		$meter_4b = 0
     EndIf
  Case 4
     If StringMid($b, 1, 1)="1" Then
		$meter_P3 = 1
	 Else
		$meter_P3 = 0
     EndIf
	 If StringMid($b, 2, 1)="1" Then
		$meter_3e = 1
	 Else
		$meter_3e = 0
     EndIf
	 If StringMid($b, 3, 1)="1" Then
		$meter_3f = 1
	 Else
		$meter_3f = 0
     EndIf
	 If StringMid($b, 4, 1)="1" Then
		$meter_3a = 1
	 Else
		$meter_3a = 0
     EndIf
  Case 5
     If StringMid($b, 1, 1)="1" Then
		$meter_3d = 1
	 Else
		$meter_3d = 0
     EndIf
	 If StringMid($b, 2, 1)="1" Then
		$meter_3c = 1
	 Else
		$meter_3c = 0
     EndIf
	 If StringMid($b, 3, 1)="1" Then
		$meter_3g = 1
	 Else
		$meter_3g = 0
     EndIf
	 If StringMid($b, 4, 1)="1" Then
		$meter_3b = 1
	 Else
		$meter_3b = 0
     EndIf
  Case 6
     If StringMid($b, 1, 1)="1" Then
		$meter_P2 = 1
	 Else
		$meter_P2 = 0
     EndIf
	 If StringMid($b, 2, 1)="1" Then
		$meter_2e = 1
	 Else
		$meter_2e = 0
     EndIf
	 If StringMid($b, 3, 1)="1" Then
		$meter_2f = 1
	 Else
		$meter_2f = 0
     EndIf
	 If StringMid($b, 4, 1)="1" Then
		$meter_2a = 1
	 Else
		$meter_2a = 0
     EndIf
  Case 7
     If StringMid($b, 1, 1)="1" Then
		$meter_2d = 1
	 Else
		$meter_2d = 0
     EndIf
	 If StringMid($b, 2, 1)="1" Then
		$meter_2c = 1
	 Else
		$meter_2c = 0
     EndIf
	 If StringMid($b, 3, 1)="1" Then
		$meter_2g = 1
	 Else
		$meter_2g = 0
     EndIf
	 If StringMid($b, 4, 1)="1" Then
		$meter_2b = 1
	 Else
		$meter_2b = 0
     EndIf
  Case 8
     If StringMid($b, 1, 1)="1" Then
		$meter_P1 = 1
	 Else
		$meter_P1 = 0
     EndIf
	 If StringMid($b, 2, 1)="1" Then
		$meter_1e = 1
	 Else
		$meter_1e = 0
     EndIf
	 If StringMid($b, 3, 1)="1" Then
		$meter_1f = 1
	 Else
		$meter_1f = 0
     EndIf
	 If StringMid($b, 4, 1)="1" Then
		$meter_1a = 1
	 Else
		$meter_1a = 0
     EndIf
  Case 9
     If StringMid($b, 1, 1)="1" Then
		$meter_1d = 1
	 Else
		$meter_1d = 0
     EndIf
	 If StringMid($b, 2, 1)="1" Then
		$meter_1c = 1
	 Else
		$meter_1c = 0
     EndIf
	 If StringMid($b, 3, 1)="1" Then
		$meter_1g = 1
	 Else
		$meter_1g = 0
     EndIf
	 If StringMid($b, 4, 1)="1" Then
		$meter_1b = 1
	 Else
		$meter_1b = 0
     EndIf
  Case 10
     If StringMid($b, 1, 1)="1" Then
		$meter_u = 1
	 Else
		$meter_u = 0
     EndIf
	 If StringMid($b, 2, 1)="1" Then
		$meter_n = 1
	 Else
		$meter_n = 0
     EndIf
	 If StringMid($b, 3, 1)="1" Then
		$meter_K = 1
	 Else
		$meter_K = 0
     EndIf
	 If StringMid($b, 4, 1)="1" Then
		$meter_Diode = 1
	 Else
		$meter_Diode = 0
     EndIf
  Case 11
     If StringMid($b, 1, 1)="1" Then
		$meter_m = 1
	 Else
		$meter_m = 0
     EndIf
	 If StringMid($b, 2, 1)="1" Then
		$meter_Percent = 1
	 Else
		$meter_Percent = 0
     EndIf
	 If StringMid($b, 3, 1)="1" Then
		$meter_Mega = 1
	 Else
		$meter_Mega = 0
     EndIf
	 If StringMid($b, 4, 1)="1" Then
		$meter_Beep = 1
	 Else
		$meter_Beep = 0
     EndIf
  Case 12
     If StringMid($b, 1, 1)="1" Then
		$meter_F = 1
	 Else
		$meter_F = 0
     EndIf
	 If StringMid($b, 2, 1)="1" Then
		$meter_Ohm = 1
	 Else
		$meter_Ohm = 0
     EndIf
	 If StringMid($b, 3, 1)="1" Then
		$meter_REL = 1
	 Else
		$meter_REL = 0
     EndIf
	 If StringMid($b, 4, 1)="1" Then
		$meter_Hold = 1
	 Else
		$meter_Hold = 0
     EndIf	 
  Case 13
     If StringMid($b, 1, 1)="1" Then
		$meter_A = 1
	 Else
		$meter_A = 0
     EndIf
	 If StringMid($b, 2, 1)="1" Then
		$meter_V = 1
	 Else
		$meter_V = 0
     EndIf
	 If StringMid($b, 3, 1)="1" Then
		$meter_Hz = 1
	 Else
		$meter_Hz = 0
     EndIf
	 If StringMid($b, 4, 1)="1" Then
		$meter_Batt = 1
	 Else
		$meter_Batt = 0
     EndIf	 
  Case 14
	 If StringMid($b, 2, 1)="1" Then
		$meter_C = 1
	 Else
		$meter_C = 0
     EndIf	 
	 EndSwitch
	; ConsoleWrite("$meter_AC="&$meter_AC&" $meter_DC="&$meter_DC&" $meter_AUTO="&$meter_AUTO&" $meter_RS232="&$meter_RS232&@CRLF&@CRLF)
    ; ConsoleWrite("$meter_Minus="&$meter_Minus&" $meter_4e="&$meter_4e&" $meter_4f="&$meter_4f&" $meter_4a="&$meter_4a&" $meter_4d="&$meter_4d&" $meter_4c="&$meter_4c&" $meter_4g="&$meter_4g&" $meter_4b="&$meter_4b&@CRLF&@CRLF)
	; ConsoleWrite("$meter_P3="&$meter_P3&" $meter_3e="&$meter_3e&" $meter_3f="&$meter_3f&" $meter_3a="&$meter_3a&" $meter_3d="&$meter_3d&" $meter_3c="&$meter_3c&" $meter_3g="&$meter_3g&" $meter_3b="&$meter_3b&@CRLF&@CRLF)
    ; ConsoleWrite("$meter_P2="&$meter_P2&" $meter_2e="&$meter_2e&" $meter_2f="&$meter_2f&" $meter_2a="&$meter_2a&" $meter_2d="&$meter_2d&" $meter_2c="&$meter_2c&" $meter_2g="&$meter_2g&" $meter_2b="&$meter_2b&@CRLF&@CRLF)
    ; ConsoleWrite("$meter_P1="&$meter_P1&" $meter_1e="&$meter_1e&" $meter_1f="&$meter_1f&" $meter_1a="&$meter_1a&" $meter_1d="&$meter_1d&" $meter_1c="&$meter_1c&" $meter_1g="&$meter_1g&" $meter_1b="&$meter_1b&@CRLF&@CRLF)
	; ConsoleWrite("$meter_u="&$meter_u&" $meter_n="&$meter_n&" $meter_K="&$meter_K&" $meter_Diode="&$meter_Diode&" $meter_m="&$meter_m&" $meter_Percent="&$meter_Percent&" $meter_Mega="&$meter_Mega&" $meter_Beep="&$meter_Beep&@CRLF&@CRLF)
	; ConsoleWrite("$meter_F="&$meter_F&" $meter_Ohm="&$meter_Ohm&" $meter_REL="&$meter_REL&" $meter_Hold="&$meter_Hold&" $meter_A="&$meter_A&" $meter_V="&$meter_V&" $meter_Hz="&$meter_Hz&" $meter_Batt="&$meter_Batt&" $meter_C="&$meter_C&@CRLF&@CRLF&@CRLF)
	 
EndFunc   ;==>IntToBin
 
Func ProcessDigit($segA=0,$segB=0,$segC=0,$segD=0,$segE=0,$segF=0,$segG=0)
   Local $Digit=""
   If $segF & $segA & $segB & $segC & $segD & $segE = "111111" Then ;Проверяем 8,0
	  If $segG="1" Then
		 $Digit=8
		 Return $Digit
	  Else
		 $Digit=0
		 Return $Digit
	  EndIf
   EndIf
   If $segB & $segC = "11" Then ;Проверяем 9,3,7,4,1
	  If $segA = "1" Then
		 If $segG = "1" Then
			If $segD = "1" Then
			   If $segF = "1" Then
				  $Digit=9
				  Return $Digit
			   Else
				  $Digit=3
				  Return $Digit
			   EndIf
			EndIf
		 Else
			$Digit=7
			Return $Digit
		 EndIf
	  Else
		 If	$segG & $segF = "11" Then
			$Digit=4
			Return $Digit
		 Else
			$Digit=1
			Return $Digit
		 EndIf
	  EndIf
   EndIf
   If $segA & $segB & $segG & $segE & $segD = "11111" Then ;Проверяем 2
	  $Digit=2
	  Return $Digit
   EndIf
   If $segA & $segF & $segG & $segC & $segD = "11111" Then ;Проверяем 5,6
	  If $segE = "1" Then
		 $Digit=6
		 Return $Digit
	  Else
		 $Digit=5
		 Return $Digit
	  EndIf
   EndIf
   If $segF & $segE & $segD = "111" Then ;Проверяем L и 0L
	  $Digit="L"
	  Return $Digit
   EndIf
   $Digit=-1
   Return $Digit
EndFunc

Func UpdateDisplay()
Local $Value=""
Local $Dig3=""
Local $Dig2=""
Local $Dig1=""
Local $Dig0=""
;Process the first digit
$Dig3 = ProcessDigit($meter_4a,$meter_4b,$meter_4c,$meter_4d,$meter_4e,$meter_4f,$meter_4g)
;Process the second digit
$Dig2 = ProcessDigit($meter_3a,$meter_3b,$meter_3c,$meter_3d,$meter_3e,$meter_3f,$meter_3g)
;Process the third digit
$Dig1 = ProcessDigit($meter_2a,$meter_2b,$meter_2c,$meter_2d,$meter_2e,$meter_2f,$meter_2g)
;Process the fourth digit
$Dig0 = ProcessDigit($meter_1a,$meter_1b,$meter_1c,$meter_1d,$meter_1e,$meter_1f,$meter_1g)
;ConsoleWrite("$Dig3="&$Dig3&" $Dig2="&$Dig2&" $Dig1="&$Dig1&" $Dig0="&$Dig0&@CRLF)
If $Dig2&$Dig1="0L" Then
   ;!!BAD DIGIT!!
   $Value = "OL"
   GUICtrlSetImage($Gif0,@ScriptDir & "\Images\Blank.gif")
   GUICtrlSetImage($Gif1,@ScriptDir & "\Images\Blank.gif")
   GUICtrlSetImage($Gif2,@ScriptDir & "\Images\ZeroDot.gif")
   GUICtrlSetImage($Gif3,@ScriptDir & "\Images\L.gif")
   GUICtrlSetImage($Gif5,@ScriptDir & "\Images\Blank.gif")
   UpdateSymbols()
   
Else
   ;Calculate the value
   $Value = Int($Dig3 & $Dig2 & $Dig1 & + $Dig0)
   If $meter_P3 = 1 Then
	  $Value = $Value/1000
   ElseIf  $meter_P2 = 1 Then
	  $Value = $Value/100
   ElseIf $meter_P1 = 1 Then
	  $Value = $Value/10
	  If $meter_Minus = 1 Then
		 $Value = -1
	  EndIf
   EndIf
   ;Update the graphic display
   UpdateDigit($Gif1, $Dig3, $meter_P3) ;позиция,знач цифра,точка
   UpdateDigit($Gif2, $Dig2, $meter_P2)
   UpdateDigit($Gif3, $Dig1, $meter_P1)
   UpdateDigit($Gif4, $Dig0, 0)
   ;Check the status of the battery
   If $meter_Minus=1 Then
	  GUICtrlSetImage($Gif0,@ScriptDir & "\Images\Bar.gif")
   Else
	  GUICtrlSetImage($Gif0,@ScriptDir & "\Images\Blank.gif")
   EndIf
   UpdateSymbols()
   ;Check the status of the battery
   If $meter_Batt = 1 Then
	   $StringFile = @ScriptDir & "\Images\battBad.gif"
   Else
	  ;If batteryStatus()="ok" Then
		; $StringFile = @ScriptDir & "\Images\battGood.gif"
	  ;Else
		 ;$StringFile = @ScriptDir & "\Images\BattYellow.gif"
	  ;EndIf
   ;ElseIf Then
	;Update the global reading value display
	;currentReading($value)
	;Update the statistics
	;updateStats()
	;Service the data recorder
	;recorderService()
   EndIf
EndIf
EndFunc

Func UpdateDigit($digitNum, $digitValue, $digitPoint)
Local $StringFile = ""
   If $digitValue < 0 Then
	  $StringFile = @ScriptDir & "\Images\Blank.gif"
	  Return
   EndIf
Switch $digitValue
   Case 0
	  If $digitPoint>0 Then
		 $StringFile = @ScriptDir & "\Images\ZeroDot.gif"
	  Else
		 $StringFile = @ScriptDir & "\Images\Zero.gif"
	  EndIf
   Case 1
	  If $digitPoint>0 Then
		 $StringFile = @ScriptDir & "\Images\OneDot.gif"
	  Else
		 $StringFile = @ScriptDir & "\Images\One.gif"
	  EndIf
   Case 2
	  If $digitPoint>0 Then
		 $StringFile = @ScriptDir & "\Images\TwoDot.gif"
	  Else
		 $StringFile = @ScriptDir & "\Images\Two.gif"
	  EndIf
   Case 3
	  If $digitPoint>0 Then
		 $StringFile = @ScriptDir & "\Images\ThreeDot.gif"
	  Else
		 $StringFile = @ScriptDir & "\Images\Three.gif"
	  EndIf
   Case 4
	  If $digitPoint>0 Then
		 $StringFile = @ScriptDir & "\Images\FourDot.gif"
	  Else
		 $StringFile = @ScriptDir & "\Images\Four.gif"
	  EndIf
   Case 5
	  If $digitPoint>0 Then
		 $StringFile = @ScriptDir & "\Images\FiveDot.gif"
	  Else
		 $StringFile = @ScriptDir & "\Images\Five.gif"
	  EndIf
   Case 6
	  If $digitPoint>0 Then
		 $StringFile = @ScriptDir & "\Images\SixDot.gif"
	  Else
		 $StringFile = @ScriptDir & "\Images\Six.gif"
	  EndIf
   Case 7
	  If $digitPoint>0 Then
		 $StringFile = @ScriptDir & "\Images\SevenDot.gif"
	  Else
		 $StringFile = @ScriptDir & "\Images\Seven.gif"
	  EndIf
   Case 8
	  If $digitPoint>0 Then
		 $StringFile = @ScriptDir & "\Images\EightDot.gif"
	  Else
		 $StringFile = @ScriptDir & "\Images\Eight.gif"
	  EndIf
   Case 9
	  If $digitPoint>0 Then
		 $StringFile = @ScriptDir & "\Images\NineDot.gif"
	  Else
		 $StringFile = @ScriptDir & "\Images\Nine.gif"
	  EndIf
   Case "L"
	  $StringFile = @ScriptDir & "\Images\L.gif"
   Case Else 
	  $StringFile = @ScriptDir & "\Images\Bar.gif"
EndSwitch
GUICtrlSetImage($digitNum,$StringFile)
EndFunc

Func UpdateSymbols()
Local $meter
Local $meterImages
Local $units
Local $currentMode
   ;Temperature Mode
   If $meter_C=1 Then
	  GUICtrlSetImage($Gif5,@ScriptDir & "\Images\degreesC.gif")
	  $units = "C"
	  $currentMode = "Temperature"
	  Return
   EndIf
   ;Resistance Mode
   If $meter_Ohm = 1 Then
	  If $meter_Mega = 1 Then 
		GUICtrlSetImage($Gif5,@ScriptDir & "\Images\megaOhm.gif")
	  ElseIf  $meter_K = 1 Then
		 GUICtrlSetImage($Gif5,@ScriptDir & "\Images\kiloOhm.gif")
	  Else
		 If $meter_Beep = 1 Then
			GUICtrlSetImage($Gif5,@ScriptDir & "\Images\ohmBuzz.gif")
		 Else
			GUICtrlSetImage($Gif5,@ScriptDir & "\Images\ohmBuzz.gif")
		 EndIf
		 $units = "Ohm"
	  EndIf
		 $currentMode = "Resistance"
	  Return
   EndIf
   ;Voltage Mode
   If $meter_V = 1 Then
	  If $meter_AC Then
		 GUICtrlSetImage($Gif5,@ScriptDir & "\Images\VAC.gif")
		 $units = "V (AC)"
		 $currentMode = "AC Voltage"
	  ElseIf $meter_DC = 1 Then
		 If $meter_m = 1 Then
			GUICtrlSetImage($Gif5,@ScriptDir & "\Images\mVDC.gif")
			$units = "mV (DC)"
		 Else
			GUICtrlSetImage($Gif5,@ScriptDir & "\Images\VDC.gif")
			$units = "V (DC)"
		 EndIf
	  ElseIf $meter_Diode = 1 Then
		 GUICtrlSetImage($Gif5,@ScriptDir & "\Images\diodeV.gif")
		 $units = "V (Diode)"
		 $currentMode = "DC Voltage"
	  EndIf
	  Return
   EndIf
   ;Capacitance mode
   If $meter_F = 1 Then
	  If $meter_n = 1 Then
		 GUICtrlSetImage($Gif5,@ScriptDir & "\Images\nanoFarad.gif")
		 $units = "nF"
	  ElseIf $meter_u = 1 Then
		 GUICtrlSetImage($Gif5,@ScriptDir & "\Images\microFarad.gif")
		 $units = "uF"
	  EndIf
	  $currentMode = "Capacitance"
	  Return
   EndIf
   ;Frequency mode
   If $meter_Hz = 1 Then
	  If $meter_K = 1 Then
		 GUICtrlSetImage($Gif5,@ScriptDir & "\Images\kiloHz.gif")
		 $units = "kHz"
	  ElseIf $meter_Mega = 1 Then
		 GUICtrlSetImage($Gif5,@ScriptDir & "\Images\megaHz.gif")
		 $units = "MHz"
	  Else
		 GUICtrlSetImage($Gif5,@ScriptDir & "\Images\Hz.gif")
		 $units = "Hz"
	  EndIf
	  $currentMode = "Frequency"
	  Return
   EndIf
   ;Duty Cycle
   If $meter_Percent = 1 Then
	  GUICtrlSetImage($Gif5,@ScriptDir & "\Images\percent.gif")
	  $units = "%"
	  $currentMode = "Duty Cycle"
	  Return
   EndIf
   ;Current mode
   If $meter_A = 1 Then
	  If $meter_AC = 1 Then
		 If $meter_u = 1 Then
			GUICtrlSetImage($Gif5,@ScriptDir & "\Images\uAAC.gif")
			$units = "uA (AC)"
			$currentMode = "AC Current (uA)"
		 ElseIf $meter_m = 1 Then
			GUICtrlSetImage($Gif5,@ScriptDir & "\Images\maAC.gif")
			$units = "mA (AC)"
			$currentMode = "AC Current (mA)"
		 Else
			GUICtrlSetImage($Gif5,@ScriptDir & "\Images\aAC.gif")
			$units = "A (AC)"
			$currentMode = "AC Current (A)"
		 EndIf
	  ElseIf $meter_DC = 1 Then
		 If $meter_u = 1 Then
			GUICtrlSetImage($Gif5,@ScriptDir & "\Images\uADC.gif")
			$units = "uA (DC)"
			$currentMode = "DC Current (uA)"
		 ElseIf $meter_m = 1 Then
			GUICtrlSetImage($Gif5,@ScriptDir & "\Images\maDC.gif")
			$units = "mA (DC)"
			$currentMode = "DC Current (mA)"
		 Else
			GUICtrlSetImage($Gif5,@ScriptDir & "\Images\aDC.gif")
			$units = "A (DC)"
			$currentMode = "DC Current (A)"
		 EndIf
	  EndIf
	  Return
   EndIf
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
DemkaDV,
Или еще так, без картинок.
Код:
#include <APIConstants.au3>
#include <WinAPIEx.au3>;Yashied, http://autoit-script.ru/index.php/topic,47.0.html
#include <GUIConstantsEx.au3>

Opt('MustDeclareVars', 1)

Global $nPic, $hPic, $sTest

GUICreate('MyGUI', 300, 100)
GUISetBkColor(0xF5F5DC)
$nPic = GUICtrlCreatePic('', 5, 5, 290, 70, -1, $WS_EX_DLGMODALFRAME)
GUICtrlSetCursor(-1, 0)
$hPic = GUICtrlGetHandle($nPic)
GUISetState()
If Random(0, 1, 1) Then
	$sTest &= '-'
Else
	$sTest &= ' '
EndIf
For $i = 1 To 3
	$sTest &= Random(0, 9, 1)
Next
$sTest &= '.' & Random(0, 9, 1) & ' C' & Chr(176)
_Write_On_Pic($sTest, $hPic)
$sTest = ''
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nPic
			For $j = 1 To 10
				If Random(0, 1, 1) Then
					$sTest &= '-'
				Else
					$sTest &= ' '
				EndIf
				For $i = 1 To 3
					$sTest &= Random(0, 9, 1)
				Next
				$sTest &= '.' & Random(0, 9, 1) & ' C' & Chr(176)
				_Write_On_Pic($sTest, $hPic)
				$sTest = ''
				Sleep(500)
			Next
	EndSwitch
WEnd

;без проверок на ошибки
;На основе примера из справки WinAPIEx к _WinAPI_DrawShadowText()
Func _Write_On_Pic($s_Text, $h_Pic)
	Local $tRECT, $Width, $Height, $hDC, $hDestDC, $hBitmap, $hDestSv, $hSrcDC, $hSource, $hSrcSv, _
			$hFont, $hObj, $i_SizeFont = 50
	Local Const $STM_SETIMAGE_ = 0x0172, $STM_GETIMAGE_ = 0x0173

	$tRECT = _WinAPI_GetClientRect($h_Pic)
	$Width = DllStructGetData($tRECT, 3) - DllStructGetData($tRECT, 1)
	$Height = DllStructGetData($tRECT, 4) - DllStructGetData($tRECT, 2)
	$hDC = _WinAPI_GetDC($h_Pic)
	$hDestDC = _WinAPI_CreateCompatibleDC($hDC)
	$hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $Width, $Height)
	$hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)
	$hSrcDC = _WinAPI_CreateCompatibleDC($hDC)
	$hSource = _WinAPI_CreateCompatibleBitmapEx($hDC, $Width, $Height, 0x000000);_WinAPI_SwitchColor(_WinAPI_GetSysColor($COLOR_3DFACE)))
	$hSrcSv = _WinAPI_SelectObject($hSrcDC, $hSource)
	$hFont = _WinAPI_CreateFont($i_SizeFont, 0, 0, 0, $FW_NORMAL, 0, 0, 0, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $ANTIALIASED_QUALITY, $DEFAULT_PITCH, 'Lucida Console')
	_WinAPI_SelectObject($hSrcDC, $hFont)
	_WinAPI_DrawShadowText($hSrcDC, $s_Text, 0xFF0000, 0xB0E0E6, 0, 0, $tRECT, BitOR($DT_CENTER, $DT_SINGLELINE, $DT_VCENTER))
	_WinAPI_BitBlt($hDestDC, 0, 5, $Width, $Height, $hSrcDC, 0, 0, $MERGECOPY)
	_WinAPI_ReleaseDC($h_Pic, $hDC)
	_WinAPI_SelectObject($hDestDC, $hDestSv)
	_WinAPI_DeleteDC($hDestDC)
	_WinAPI_SelectObject($hSrcDC, $hSrcSv)
	_WinAPI_DeleteDC($hSrcDC)
	_WinAPI_DeleteObject($hSource)
	_WinAPI_DeleteObject($hFont)
	_SendMessage($h_Pic, $STM_SETIMAGE_, 0, $hBitmap)
	$hObj = _SendMessage($h_Pic, $STM_GETIMAGE_)
	If $hObj <> $hBitmap Then
		_WinAPI_DeleteObject($hBitmap)
	EndIf
EndFunc   ;==>_Write_On_Pic
 

xaker

Знающий
Сообщения
52
Репутация
16
DemkaDV
а еще можно код раза в 2 уменьшить.
 
Автор
D

DemkaDV

Новичок
Сообщения
16
Репутация
3
Можно наверное и более чем в 2 раза уменьшить, сколько людей столько и алгоритмов, для меня сейчас оптимизация кода не очень важна, а вот при написании кода на ASM для контроллера, идет борьба за каждый байт ;D

Огроменное спасибо за _WinAPIEx.au3 http://autoit-script.ru/index.php/topic,47.0.html !!!
 
Верх