PC控制单片机LED之汇编

单片机增加LED状态的发送部分,上位机加了接收下位机回传的LED亮灭状态,并在界面上显示。

这次学会了SHAPE控件的使用。

VB的 形状(Shape)控件

作用:可以在Form中显示矩形、圆、椭圆等图形。

它就在默认控件里

在4 个按钮上方对应画出4 个指示灯

更改一些属性。FillColor 填充颜色 ,Heigh 高度改为300,比默认的小点,这样大小合适。Shape 形状 选3是圆形,其实这条是最先改的。
其中,0 长方形,1 正方形,2 椭圆,3 圆形,4 圆角长方形,5 圆角正方形 。这里选 的是3,画出圆形指示灯。

控件安好,就可以写代码了。( E:\DPJ\上下位机\VB\上下位机收发.vbp  )

‘11.03.18

Private Sub Command1_Click()
MSComm1.Output = “1”
End Sub

Private Sub Command2_Click()
MSComm1.Output = “2”
End Sub

Private Sub Command3_Click()
MSComm1.Output = “3”
End Sub

Private Sub Command4_Click()
MSComm1.Output = “4”
End Sub

Private Sub Form_Load()
MSComm1.CommPort = 4 ‘设置串口为com1
MSComm1.Settings = “9600,n,8,1″ ‘通讯参数 波特率 奇偶校验 数据位 停止位
MSComm1.InputMode = comInputModeBinary ‘二进制接收
MSComm1.PortOpen = True ‘打开串口
MSComm1.InBufferCount = 0 ‘清空接收缓冲区
MSComm1.RThreshold = 1 ‘缓冲区中接收到一个字符,就产生一次OnComm事件
End Sub

Private Sub MSComm1_OnComm() ‘有数据传送时触发
Dim indata As Variant ‘定义变量
Dim arr(0) As Byte ‘定义字节数组
Select Case MSComm1.CommEvent  ‘CommEvent属性:返回最近的通讯事件或错误。通过对它具体属性值的查询,我们就可以获得通讯事件和通 讯错误的完整信息。当其值是comEvReceive时表示接收到数据。
Case comEvReceive         ‘有接收事件
indata = MSComm1.Input ‘接收到的数据存放到indata里
arr(0) = AscB(indata) ‘返回indata的值
MSComm1.InBufferCount = 0 ‘清空接收缓冲区
End Select

If arr(0) = 49 Then                     ‘很不明白,上位机发的是”1″,收到的却是49
Shape1.FillColor = &HFF&     ‘红色,表示灯亮
ElseIf arr(0) = 0 Then              ‘这里如不用0 ,则下位机不能灭灯,不知何故
Shape1.FillColor = &HE0E0E0   ‘灰色,表示灯灭

ElseIf arr(0) = 50 Then             ‘上位机发”2″,收到的是49+1=50 。以下同此
Shape2.FillColor = &HFF&
ElseIf arr(0) = 10 Then
Shape2.FillColor = &HE0E0E0
ElseIf arr(0) = 51 Then
Shape3.FillColor = &HFF&
ElseIf arr(0) = 20 Then
Shape3.FillColor = &HE0E0E0
ElseIf arr(0) = 52 Then
Shape4.FillColor = &HFF&
ElseIf arr(0) = 30 Then
Shape4.FillColor = &HE0E0E0
End If

End Sub

单片机程序:(E:\DPJ\上下位机\SXWJ收发.ASM)

;2011.03.18 完成
;PC控制单片机LED并返回上位机

ORG   00H
AJMP  MAIN
ORG   23H
AJMP  URT
ORG   30H
MAIN:
LCALL  URTINIT      ;调用串口初始化子程序
AJMP  $

URTINIT:
MOV  SCON,#50H    ;串口工作方式1
MOV  TMOD,#20H    ;T1工作方式2
MOV  TL1,#0FDH    ;11.0592MHz,9600
MOV  TH1,#0FDH
SETB  TR1     ;开启定时器
SETB  ES      ;开启串口中断
SETB  EA      ;开总中断
RET

URT:   ;串口中断子程序
MOV  A,SBUF   ;单片机接收
CJNE A,#”1″,U1 ;收到ASCII码 1,P1.0 求反
CPL P1.0
JNB 90H,U1  ;90H~93H为P1.0~P1.3的地址,为1时,LED灭 。
MOV A,#0  ;同时送 0 到A,待送SBUF发送

U1:
CJNE A,#”2″,U2
CPL P1.1
JNB 91H,U2
MOV A,#10
U2:
CJNE A,#”3″,U3
CPL P1.2
JNB 92H,U3
MOV A,#20
U3:
CJNE A,#”4”,U4
CPL P1.3
JNB 93H,U4
MOV A,#30
U4:
CLR  RI  ;清接收中断标志
SEND:
CLR  TI
MOV  SBUF,A    ;单片机执行这条写数据发送缓冲器SBUF的指令,就启动发送,数据通过串口发送出去
JNB  TI,$  ;未发完,等待发完
CLR  TI
RTI: RETI
END