用32个LED(第三方控件),LED的属性value=1时LED亮,=0时暗,我想做出某几个LED闪一闪然后全亮的效果,编了如下程序:
Option ExplicitDim tempVal As Long
Dim i As Integer
Dim times As Integer
Const m_chCount As Long = 32 '通道数Private Sub Form_Load()
tempVal = &H7FFFFFFF '8个十六进制等于32个二进制,表示32个LED的亮暗情况
times = 0
End SubPrivate Sub Timer1_Timer()
If times = 0 Then
For i = 0 To m_chCount - 1
Led1(i).AllValue = tempVal
Next i
ElseIf times = 1 Then
For i = 0 To m_chCount - 1
Led1(i).AllValue = &H0
Next i
Else
For i = 0 To m_chCount - 1
Led1(i).AllValue = tempVal
Next i
End If
times = times + 1
End Sub
tempval的值小于等于&H7FFFFFFF时程序可以正常运行,大于&H7FFFFFFF时LED全暗,无变化无效果。似乎是不能控制INDEX值最大的那个LED,郁闷!可能是哪里出问题了?而且按我这个程序的编法不能让LED一直保持闪烁的,如果要它们一直保持闪烁该怎么编?如果要它们先依次亮再闪烁又该怎么编?我头大了,都是老师给我出的难题 -_-#
Option ExplicitDim tempVal As Long
Dim i As Integer
Dim times As Integer
Const m_chCount As Long = 32 '通道数Private Sub Form_Load()
tempVal = &H7FFFFFFF '8个十六进制等于32个二进制,表示32个LED的亮暗情况
times = 0
End SubPrivate Sub Timer1_Timer()
If times = 0 Then
For i = 0 To m_chCount - 1
Led1(i).AllValue = tempVal
Next i
ElseIf times = 1 Then
For i = 0 To m_chCount - 1
Led1(i).AllValue = &H0
Next i
Else
For i = 0 To m_chCount - 1
Led1(i).AllValue = tempVal
Next i
End If
times = times + 1
End Sub
tempval的值小于等于&H7FFFFFFF时程序可以正常运行,大于&H7FFFFFFF时LED全暗,无变化无效果。似乎是不能控制INDEX值最大的那个LED,郁闷!可能是哪里出问题了?而且按我这个程序的编法不能让LED一直保持闪烁的,如果要它们一直保持闪烁该怎么编?如果要它们先依次亮再闪烁又该怎么编?我头大了,都是老师给我出的难题 -_-#
而且换成 dim tempval as double 一样无效果。
正整数:x07FFFFFFF--0 :2147483647--0
负整数:x0FFFFFFFF--80000000 : -1--2147483648
1.你的最大值也就是所有灯全亮的tempval =&H7FFFFFFF,你把它转化成二进制看了么,是一个31位都为1的二进制数,每一位代表一盏灯的话你有32盏灯阿。所以自然就出现溢出了。你的第三方控件allvalue这个属性以外,没有别的属性,单单设置这一盏灯么。从代码看来你得allvalue属性其实是一个整体的控制,也就是说已经把32个led编成组了你可以解决的方法就是
1.在硬件连接部分,每16个分成一组然后进行控制。二就是用value来代替allvalue还有你在亮与灭控制中我们来做个例子,index=2的那盏灯(我用二进制来描述)
led(2).allvalue=xx1.... '亮
led(2).allvalue=xx0....'灭而这个二进制的转换,在16进制的转换中是如何变化的,你要多考虑一下。这个题目你要多想想二进制到16进制的转化
Private Sub cmdDO_Click()
'开关量输出
'改变输出显示灯
Dim tempVal As Double, tempStr As String
tempVal = Val(cobDO.Text)
tempVal = IIf(tempVal < 0, tempVal + 65536, tempVal)
tempStr = Trim(cobDO.Text)
For i = 0 To m_DOchCount - 1
ledDO(i).AllValue = tempStr
Next i
ZT8403_DOAll m_cardNO, CLng(tempStr)
If ZT8403_GetLastErr <> 0 Then Me.Caption = "PCI8403测试程序(错误号: " & ZT8403_GetLastErr & ")" '返回函数执行的状态
End Sub例程32盏灯都能亮的,它只把tempstr定义为string(我改成string依然无效)32盏灯是一个组,单个控制的话,led(2).value=1时灯亮,=0时灯灭。我试试单个控制。
还有&h7fffffff是可以正常显示的,显示31盏灯亮,比这个数大就不能显示了,如我要的&HF084210F
tempval="&HF084210F"
就行了
另外
For i = 0 To 11
Led1(arrLight(i)).Value = 1
这样也可以余下两个问题:
怎么让它保持闪烁?
怎么让它依次亮然后再闪?
为什么要有这句? 你的是32位长整形 +65536 也不见得变正数