כללי:
הפרויקט
הבא משלב בפרויקט אחד מעגל אחד בן 16 מוצאים דיגיטליים 8 כניסות דיגיטליות וכניסה
אנלוגית אחת.
שלבי
העבודה:
1.
בנה את המעגל האלקטרוני הבא: הקובץ All_In_One.pdf
2.
הורד את הקובץ model_lpt.zip
3.
הפעל את הקובץ LPTIO.vbp.
4.
גש לחלון הטופס והוסף לו את הפקדים הבאים:
5.
גש לכתיבת הקוד של Form1 וכתוב בו את הקוד הבא:
Private Sub Command2_Click()
out_595 Val(Text2.Text), Val(Text3.Text)
End Sub
Private Sub Timer1_Timer()
Text1.Text = In_165
Text4.Text = Analog_In_165
End Sub
6.
גש לכתיבת הקוד של Modules וכתוב בו את הקוד הבא:
Const OutAddres = &H378
Const InAddres = &H379
Dim OutRegister As Byte
Declare Sub Outport Lib "vbio32.dll"
(ByVal portID As Integer,
ByVal nByte As Integer)
Declare Function Inport Lib "vbio32.dll"
(ByVal portID As Integer)
As Integer
Sub OutBit(number As Integer, state As Byte)
If state = 0 Then
Select Case number
Case 0
OutRegister = OutRegister
Or 1
Case 1
OutRegister = OutRegister
Or 2
Case 2
OutRegister = OutRegister
Or 4
Case 3
OutRegister = OutRegister
Or 8
Case 4
OutRegister = OutRegister
Or 16
Case 5
OutRegister = OutRegister
Or 32
Case 6
OutRegister = OutRegister
Or 64
Case 7
OutRegister = OutRegister
Or 128
End Select
End If
If state = 1 Then
Select Case number
Case 0
OutRegister = OutRegister
And 254
Case 1
OutRegister = OutRegister
And 253
Case 2
OutRegister = OutRegister
And 251
Case 3
OutRegister = OutRegister
And 247
Case 4
OutRegister = OutRegister
And 239
Case 5
OutRegister = OutRegister
And 223
Case 6
OutRegister = OutRegister
And 191
Case 7
OutRegister = OutRegister
And 127
End Select
End If
Outport OutAddres,
OutRegister
End Sub
Function InBit(pin_number As Integer) As Byte
Dim In_Num As Integer
In_Num = Inport(InAddres)
If pin_number = 3 Then
If (In_Num And &H8)
= &H8 Then
InBit = 0
Else
InBit = 1
End If
End If
If pin_number = 4 Then
If (In_Num And &H10)
= &H10 Then
InBit = 0
Else
InBit = 1
End If
End If
If pin_number = 5 Then
If (In_Num And &H20)
= &H20 Then
InBit = 0
Else
InBit = 1
End If
End If
If pin_number = 6 Then
If (In_Num And &H40)
= &H40 Then
InBit = 0
Else
InBit = 1
End If
End If
If pin_number = 7 Then
If (In_Num And &H80)
= &H80 Then
InBit = 1
Else
InBit = 0
End If
End If
End Function
Function In_165() As Byte
Dim a, c As Byte
c = 0
OutBit 4, 1 'shift/load down -convert
OutBit 4, 0 'shift/load up -stops conv
For a = 1 To 8
OutBit 3, 1 'clock down
If InBit(7) = 1 Then
c = c * 2
Else
c = (c * 2) + 1
End If
OutBit 3, 0 'clock up
Next a
In_165 = c
End Function
Sub out_595(byte_H As
Byte, byte_L As Byte)
Dim aa As Byte
Dim bb As Byte
bb = 1
For aa = 1 To 8
If (byte_L And bb) =
bb Then
OutBit 0, 1
OutBit 1, 1
OutBit 1, 0
OutBit 0, 0
Else
OutBit 0, 0
OutBit 1, 1
OutBit 1, 0
End If
bb = bb And &H7F
bb = bb * 2
Next aa
bb = 1
For aa = 1 To 8
If (byte_H And bb) =
bb Then
OutBit 0, 1
OutBit 1, 1
OutBit 1, 0
OutBit 0, 0
Else
OutBit 0, 0
OutBit 1, 1
OutBit 1, 0
End If
bb = bb And &H7F
bb = bb * 2
Next aa
OutBit 2, 1
OutBit 2, 0
End Sub
Function Analog_In_165() As Byte
Dim a, c As Byte
c = 0
OutBit 5, 1 'shift/load down -convert
OutBit 5, 0 'shift/load up -stops conv
For a = 1 To 8
OutBit 6, 1 'clock down
If InBit(6) = 1 Then
c = c * 2
Else
c = (c * 2) + 1
End If
OutBit 6, 0 'clock up
Next a
Analog_In_165 = c
End Function
הסבר
התוכנית:
אין הבדל
משמעותי בין התוכנית הנ"ל לתוכנות בפרויקטים הקודמים פרט לשני דברים שונים
שעשיתי כדי להדגים גישה של שילוב בין הגורמים:
1.
כל חלקי התוכנית הפכו לפונקציות בתוך ה- Module כך שניתן
לקרא לפונקציות מכל מקום בתוכנית.
הפונקציה Function In_165()
As Byte :
מטפלת בקליטה של 8 ביט דיגיטלי דרך הרכיב U5.
השגרה Sub out_595(byte_H
As Byte, byte_L As Byte) :מטפלת בשליחה של 16
ביטים לשני אוגרי ההזזה U3 , U4.
הפונקציה Function Analog_In_165()
As Byte :
מטפלת בקבלת אות אנלוגי דרך הרכיב U6.
2.
הוספתי שתי פונקציות שמטפלות בכל ביט בנפרד ללא השפעה
על שאר הביטים באוגר היציאה והכניסה. כלומר בעזרת הפונקציה OutBit ניתן לשנות מצב של כל
ביט ללא השפעה על שאר הביטים באוגר היציאה 378H.
הפונקציה מקבלת שני ערכים האחד מספר הביט בין 0 ל- 7 ואת המצב שיש לשנות אותו
0 או 1 .
לדוגמה OutBit 6,1 משמע, שנה את הביט השביעי ל- 1 ללא שינוי שאר הביטים.
לדוגמה OutBit 2,0 משמע, שנה את הביט השלישי ל- 0 ללא שינוי שאר הביטים.
כמו כן כתבתי פונקציה בשם InBit מקבלת מספר ביט בין 3
ל- 7 ומחזירה את מצב ההדק 0 או 1.
|