?? ds18b20driver_io.asm
字號(hào):
//======================================================================
// 文件名稱: DISP.ASM
// 功能描述: 在LED上顯示DS18B20測(cè)量的溫度值
// 維護(hù)記錄:
//======================================================================
//======================================================
// 文件名稱: DS18B20Driver_IO.asm
// 功能描述: DS18B20底層驅(qū)動(dòng)程序,主要是與時(shí)序有關(guān)的代碼
//======================================================
.DEFINE P_IOA_Data 0x7000
.DEFINE P_IOA_Buffer 0x7001
.DEFINE P_IOA_Dir 0x7002
.DEFINE P_IOA_Attrib 0x7003
.DEFINE P_IOA_Latch 0x7004
.DEFINE P_IOB_Data 0x7005
.DEFINE P_IOB_Buffer 0x7006
.DEFINE P_IOB_Dir 0x7007
.DEFINE P_IOB_Attrib 0x7008
.DEFINE P_SystemClock 0x7013
//以下重復(fù)定義用于端口的定義,如用戶需要針對(duì)自用的設(shè)計(jì)選擇端口時(shí),可以更改
//以下宏定義中的東東
.DEFINE Port_Data P_IOB_Data
.DEFINE Port_Buffer P_IOB_Buffer
.DEFINE Port_Dir P_IOB_Dir
.DEFINE Port_Attrib P_IOB_Attrib
.external _temp
//M_DQ用于定義具體連接DS18B20的DQ線的端口
.DEFINE M_DQ 0x0040 //
//由于DS18B20的驅(qū)動(dòng)程序需要修改CPU主頻,為了讓用戶設(shè)用DS18B20 的API函數(shù)后,能
//恢復(fù)到原來(lái)的系統(tǒng)時(shí)鐘、CPU主頻設(shè)置,用戶可以在下面的常量R_SystemClock中定義
//用戶設(shè)計(jì)需要的值
.DATA
R_SystemClock:
.DW 0x0018 //buffer of save the system clock
.CODE
//======================================================
// 匯編格式: _F_18B20_Initial_IO
// C格式: void F_18B20_Initial_IO(void);
// 實(shí)現(xiàn)功能: 端口初始化子程序
// 入口參數(shù): 無(wú)
// 出口參數(shù): 無(wú)
// 破壞寄存器: r1
//======================================================
.PUBLIC _F_18B20_Initial_IO
_F_18B20_Initial_IO:
r1 = [Port_Dir] //set the prot connected DQ to float input mode
r1 = r1&(~M_DQ)
[Port_Dir] = r1
r1 = [Port_Attrib]
r1 = r1|M_DQ
[Port_Attrib] = r1
r1 = [Port_Buffer]
r1 = r1|M_DQ
[Port_Buffer] = r1
retf
//======================================================
// 匯編格式: _F_18B20_Reset
// C格式: unsigned int F_18B20_Reset(void);
// 實(shí)現(xiàn)功能: 一線總線復(fù)位及從設(shè)備應(yīng)答控制程序
// 入口參數(shù): 無(wú)
// 出口參數(shù): 0表示復(fù)位失敗 1表示復(fù)位成功
// 破壞寄存器: r2 r3
//======================================================
.PUBLIC _F_18B20_Reset
_F_18B20_Reset:
r3 = [Port_Dir]
r3 = r3|M_DQ
[Port_Dir] = r3 //Set Port connect DQ as Ouput
r2 = [Port_Buffer]
r2 = r2&(~M_DQ)
[Port_Buffer] = r2 //Set DQ to Low
r1 = 600
call _F_18B20_Delay //Delay 600us for DS18B20 Reset
r2 = r2|M_DQ
[Port_Buffer] = r2
r3 = r3&(~M_DQ)
[Port_Dir] = r3 //resume the port as floatting input
r1 = 30
call _F_18B20_Delay //Delay 30us
r2 = 1000
?F_18B20_Reset_L:
r2 -=1
jz ?F_18B20_Reset_E //Timer overflow Erro
r1 = [Port_Data]
r1 = r1&M_DQ
jnz ?F_18B20_Reset_L
r2 = 1000
?F_18B20_Reset_L2:
r2-=1
jz ?F_18B20_Reset_E //Timer overflow Erro
r1 = [Port_Data]
r1 = r1&M_DQ
jz ?F_18B20_Reset_L2
r1 = 1
jmp ?F_18B20_Reset_Exit
?F_18B20_Reset_E:
r1 = 0
?F_18B20_Reset_Exit:
retf
//======================================================
// 匯編格式: _F_18B20_Write_1
// C格式: void F_18B20_Write_1(void);
// 實(shí)現(xiàn)功能: 向一線總線寫1
// 入口參數(shù): 無(wú)
// 出口參數(shù): 無(wú)
// 破壞寄存器: r1 r2 r3
//======================================================
.PUBLIC _F_18B20_Write_1
_F_18B20_Write_1:
r3 = [Port_Dir]
r3 = r3|M_DQ
[Port_Dir] = r3 //Set Port connect DQ as Ouput
r2 = [Port_Buffer]
r2 = r2&(~M_DQ)
[Port_Buffer] = r2 //Set DQ to Low
r1 = 10
call _F_18B20_Delay //Delay 10us
r2 = r2|M_DQ
[Port_Buffer] = r2
r1 = 25
call _F_18B20_Delay //Delay 40us
r3 = r3&(~M_DQ)
[Port_Dir] = r3 //resume the port as floatting input
retf
//======================================================
// 匯編格式: _F_18B20_Write_0
// C格式: void F_18B20_Write_0(void);
// 實(shí)現(xiàn)功能: 向一線總線寫0
// 入口參數(shù): 無(wú)
// 出口參數(shù): 無(wú)
// 破壞寄存器: r1 r2 r3
//======================================================
.PUBLIC _F_18B20_Write_0
_F_18B20_Write_0:
r3 = [Port_Dir]
r3 = r3|M_DQ
[Port_Dir] = r3 //Set Port connect DQ as Ouput
r2 = [Port_Buffer]
r2 = r2&(~M_DQ)
[Port_Buffer] = r2 //Set DQ to Low
r1 = 40
call _F_18B20_Delay //Delay 40us
r2 = r2|M_DQ
[Port_Buffer] = r2
r1 = 1
call _F_18B20_Delay //Delay 1us
r3 = r3&(~M_DQ)
[Port_Dir] = r3 //resume the port as floatting input
retf
//======================================================
// 匯編格式: _F_18B20_Read_DQ
// C格式: unsigned int F_18B20_Read_DQ(void);
// 實(shí)現(xiàn)功能: 讀一位一線總線的數(shù)據(jù)
// 入口參數(shù): 無(wú)
// 出口參數(shù): 當(dāng)前讀回的位的值0/1
// 破壞寄存器: r1 r2 r3
//======================================================
.PUBLIC _F_18B20_Read_DQ
_F_18B20_Read_DQ:
r3 = [Port_Dir]
r3 = r3|M_DQ
[Port_Dir] = r3 //Set Port connect DQ as Ouput
r2 = [Port_Buffer]
r2 = r2&(~M_DQ)
[Port_Buffer] = r2 //Set DQ to Low
r1 = 10
call _F_18B20_Delay //Delay 40us
r3 = r3&(~M_DQ)
[Port_Dir] = r3 //resume the port as floatting input
r1 = 3
call _F_18B20_Delay //Delay 40us
r3 = [Port_Data]
r3 = r3&M_DQ
jz ?L18B20_Read_0
r3 = 0x80
?L18B20_Read_0:
r1 = 30
call _F_18B20_Delay
r2 = r2|M_DQ
[Port_Buffer] = r2
r1 = 1
call _F_18B20_Delay //Delay 1us
r1 = r3
retf
//======================================================
// 匯編格式: _F_18B20_Delay
// C格式: void F_18B20_Delay(unsigned int Timers);
// 實(shí)現(xiàn)功能: 在49MHz的主頻下的uS延時(shí)程序
// 入口參數(shù): 需要延時(shí)的時(shí)長(zhǎng)(以u(píng)S為單位)
// 出口參數(shù): 無(wú)
// 破壞寄存器: r1
//======================================================
.PUBLIC _F_18B20_Delay
_F_18B20_Delay:
cmp r1,1
jna ?Delay_Exit
?Delay_Loop:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
r1-=1
jnz ?Delay_Loop
?Delay_Exit:
retf
//======================================================
// 匯編格式: _F_18B20_SetSystemCLK
// C格式: F_18B20_SetSystemCLK(void);
// 實(shí)現(xiàn)功能: 將CPU主頻設(shè)置為49MHz,為的是在時(shí)序控制時(shí)
// 可以獲取到較精確的延時(shí)
// 入口參數(shù): 無(wú)
// 出口參數(shù): 無(wú)
// 破壞寄存器: r1
//======================================================
.PUBLIC _F_18B20_SetSystemCLK
_F_18B20_SetSystemCLK:
r1 = 0x88
[P_SystemClock] = r1 //set system clock upto 49MHz
retf
//======================================================
// 匯編格式: _F_18B20_RsuSystemCLK
// C格式: void F_18B20_RsuSystemCLK(void);
// 實(shí)現(xiàn)功能: 恢復(fù)系統(tǒng)及CPU主頻,而至于恢復(fù)為多少,則
// 由前面定義的變量R_SystemClock的值確定,用
// 戶可根據(jù)各自的程序設(shè)計(jì)需求進(jìn)行改動(dòng)
// 入口參數(shù): 無(wú)
// 出口參數(shù): 無(wú)
// 破壞寄存器: r1
//======================================================
.PUBLIC _F_18B20_RsuSystemCLK
_F_18B20_RsuSystemCLK:
r1 = [R_SystemClock]
[P_SystemClock] = r1
retf
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -