本帖最后由 老鱼探戈 于 2010-10-21 19:24 编辑
一般用在单片机IO口有限,而需要3个器件ID的情况:
;--------------------------------------------------
;功 能: 定义外部变量
;内 容:
;用 法: 在主程序的.data处放入
;--------------------------------------------------
_DefData_ReadID macro
.data
;1口读3ID参数
PID EQU P0.0
MPID EQU P0M.0
ID_IOURD1 equ #00000001B ;上拉电阻值对应P0.0位改变
ID_IOURD0 equ #00000000B
PUR EQU P0UR
EdlyClk equ 1 ;1CPU=4,1/2CPU=2,1/4CPU=1
EdlyTm equ 6*EdlyClk
VBasicID ds 1 ;ID结果=0:接地,=1悬空,=2:接高.
/==================================================
//函数功能: 读ID号
//输入参数:
//输出参数: VBasicID =0,1,2
//使用说明: 在大循环中调用
//==================================================
ReadID: bts1 FClk_128ms ;128ms检测一次
ret
Movi PUR,ID_IOURD1 ;上拉使能
b0bclr MPID ;输入
DelayUs #(3*EdlyTm) ;延时时间需根据Fcpu定
clr VBasicID ;ID="0"
bts1 PID
ret
Movi PUR,ID_IOURD0 ;上拉禁止
DelayUs #EdlyTm
b0bset MPID ;输出
bclr PID
DelayUs #EdlyTm
b0bclr MPID ;输入
DelayUs #EdlyTm
incms VBasicID ;ID="1"
bts0 PID
incms VBasicID ;ID="2"
ret
该方**有短时间(极短)VDD和GND短路的现象,不过一般不会有什么大的问题。
不到万不得已,一般不要用这种方法 。 |