📄 hsb.c
字号:
#include <reg51.h>
#include <types.h>
#include <intrins.h>
// 6MHz
//#define TIMEOUT_VAL_200MS 6110
//#define TIMEOUT_VAL_5MS 152 // time out is about 10ms
// 12.288MHz
#define TIMEOUT_VAL_200MS 20485
#define TIMEOUT_VAL_5MS 512 // time out is about 10ms
WORD gHSBWord;
sbit PIN_HSB_HOLD = P3^3;
sbit PIN_HSB_SDA = P3^4;
sbit PIN_HSB_BCK = P3^5;
//-------------------------------------------------------------------------
// Read_HSB
//-------------------------------------------------------------------------
BOOL Read_HSB(void){
register BYTE i;
WORD j;
PIN_HSB_HOLD=1; // set HOLD to input
PIN_HSB_SDA=1; // set PIN_HSB_SDA to input
if(!PIN_HSB_HOLD){
gHSBWord=0;
for(i=8; i>0; --i){
// Fall
PIN_HSB_BCK = 0;
_nop_(); _nop_(); _nop_(); _nop_();
for(j=TIMEOUT_VAL_200MS; (j>0) && (!PIN_HSB_HOLD); --j);// Wait HOLD to high
if(j==0){PIN_HSB_BCK = 1; return 0;} // if time out, return fail
_nop_(); _nop_(); _nop_(); _nop_();
gHSBWord <<= 1; if(PIN_HSB_SDA){gHSBWord |= 0x0001;}
// Rise
PIN_HSB_BCK = 1;
_nop_(); _nop_(); _nop_(); _nop_();
for(j=TIMEOUT_VAL_200MS; (j>0) && (PIN_HSB_HOLD); --j); // Wait HOLD to low
if(j==0){PIN_HSB_BCK = 1; return 0;} // if time out, return fail
_nop_(); _nop_(); _nop_(); _nop_();
gHSBWord <<= 1; if(PIN_HSB_SDA){gHSBWord |= 0x0001;}
}
PIN_HSB_BCK=0;
for(j=TIMEOUT_VAL_200MS; (j>0) && (!PIN_HSB_HOLD); --j); // Wait HOLD to high
PIN_HSB_BCK=1;
if(j>0){ // not timeout, save to the RX queue
return 1;
}
else {
return 0;
}
} // if
else {
return 0;
}
}
//-------------------------------------------------------------------------
// Write_HSB
//-------------------------------------------------------------------------
BOOL Write_HSB(WORD hsbword){
register BYTE i;
WORD j;
PIN_HSB_BCK = 1; // release BCK
PIN_HSB_HOLD = 0;
for(j=TIMEOUT_VAL_200MS / 2.5; (j>0) && (PIN_HSB_BCK); --j); // Wait BCK to low
if (j==0) {PIN_HSB_HOLD=1; PIN_HSB_SDA=1; return 0;} // Time out, exit
// 16 bits
for(i=8; i>0; --i){
if (hsbword & 0x8000) PIN_HSB_SDA=1; else PIN_HSB_SDA=0; hsbword <<= 1;
_nop_(); _nop_(); _nop_(); _nop_();
// Rise
PIN_HSB_HOLD = 1;
_nop_(); _nop_(); _nop_(); _nop_();
for(j=TIMEOUT_VAL_200MS; (j>0) && (!PIN_HSB_BCK); --j); // Wait BCK to high
if (j==0) {PIN_HSB_HOLD=1; PIN_HSB_SDA=1; return 0;} // Time out, exit
if (hsbword & 0x8000) PIN_HSB_SDA=1; else PIN_HSB_SDA=0; hsbword <<= 1;
_nop_(); _nop_(); _nop_(); _nop_();
// Fall
PIN_HSB_HOLD = 0; //
_nop_(); _nop_(); _nop_(); _nop_();
for(j=TIMEOUT_VAL_200MS; (j>0) && (PIN_HSB_BCK); --j); // Wait BCK to low
if (j==0) {PIN_HSB_HOLD=1; PIN_HSB_SDA=1; return 0;} // Time out, exit
}
PIN_HSB_HOLD=1; PIN_HSB_SDA=1; // release HOLD and SDA
_nop_(); _nop_(); _nop_(); _nop_();
for(j=TIMEOUT_VAL_200MS; (j>0) && (!PIN_HSB_BCK); --j); // Wait BCK to high
if (j==0) return 0;
else return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -