📄 prtcl.c
字号:
#include "hdr.h"
//#include "prtcl.h"
//==================================================================================
// standard I2C function description
//==================================================================================
//#define DVC_PG0 0
//#define DVC_PG1 1
//#define DVC_PG2 2
//
//#define TW2835 (0x80|0x35) // [7]:I2C_ASIC_SDA = 1, [6:1]:Slave Address of TW2824 = 0x40
//#define TW9901 0x44 // Slave Address of TW9901 (SIAD1/SIAD0 : GND)
//#define KS0123 0x0c // Slave Address of KS0123
//==================================================================================
// standard I2C function description
//==================================================================================
//*
#if defined(__WTH_VGA__)
void SetI2CStart(void)
{
I2C_SDA = 1;
I2C_SCL = 1;
I2C_SDA = 0;
I2C_SCL = 0;
}
//==================================================================================
void SetI2CStop(void)
{
I2C_SDA = 0;
I2C_SCL = 1;
I2C_SDA = 1;
}
//==================================================================================
void SetI2CAck(U8 _tgl)
{
U8 _t1_;
if(_tgl){ //... drive ack signal(control both SCL and SDA)
I2C_SDA = 0;
for(_t1_=0;_t1_<1;_t1_++);
I2C_SCL = 1;
for(_t1_=0;_t1_<1;_t1_++);
I2C_SCL = 0;
for(_t1_=0;_t1_<1;_t1_++);
I2C_SDA = 1; //... SDA input mode
}
else{ //... just provide SCL signal
I2C_SDA = 1; //... SDA input mode
I2C_SCL = 1;
for(_t1_=0;_t1_<1;_t1_++);
I2C_SCL = 0;
}
}
//==================================================================================
void SetI2CP2S(U8 _wdat)
{
U8 _t1_;//, _t2_;
for(_t1_=0;_t1_<8;_t1_++){
(_wdat&BIT7) ? (I2C_SDA=1) : (I2C_SDA=0);
// for(_t2_=0;_t2_<3;_t2_++);
I2C_SCL = 1;
_wdat<<=1;
I2C_SCL = 0;
}
}
//==================================================================================
//void WriteI2CByte(U8 _dvc, U8 _addr, U8 _wdat)
//{
//#if defined(__EN_ISR__)
// EA = 0;
//#endif
//
// SetI2CStart();
// SetI2CP2S(_dvc<<1); // I2C write mode
// SetI2CAck(0);
// SetI2CP2S(_addr);
// SetI2CAck(0);
// SetI2CP2S(_wdat);
// SetI2CAck(0);
// SetI2CStop();
//
//#if defined(__EN_ISR__)
// EA = 1;
//#endif
//}
//==================================================================================
//void WriteI2CTable(U8 _dvc, U8 _addr, U8 code *_tbl_ptr, U8 _tbl_cnt)
//{
// U8 _cnt_;
//
//#if defined(__EN_ISR__)
// EA = 0;
//#endif
//
// SetI2CStart();
// SetI2CP2S(_dvc<<1); // I2C write mode
// SetI2CAck(0);
// SetI2CP2S(_addr);
// SetI2CAck(0);
// for(_cnt_=0;_cnt_<_tbl_cnt;_cnt_++){
// SetI2CP2S(_tbl_ptr[_cnt_]);
// SetI2CAck(0);
// }
// SetI2CStop();
//
//#if defined(__EN_ISR__)
// EA = 1;
//#endif
//}
//==================================================================================
U8 GetI2CS2P(void)
{
U8 _rdat_=0, _t1_;//, _t2_;
I2C_SDA = 1; // ... SDA input mode
for(_t1_=1;_t1_<=8;_t1_++){
// for(_t2_=0;_t2_<10;_t2_++);
I2C_SCL = 1;
if(I2C_SDA == 1) _rdat_ |= 0x01;
I2C_SCL = 0;
if(_t1_==8) continue; // 8锅掳俊急 shift 扒呈盾.
_rdat_<<=1;
}
return _rdat_;
}
////==================================================================================
//U8 ReadI2CByte(U8 _dvc, U8 _addr)
//{
// U8 _rdat_=0;
//
//#if defined(__EN_ISR__)
// EA = 0;
//#endif
//
// SetI2CStart();
// SetI2CP2S(_dvc<<1); // I2C write mode
// SetI2CAck(0);
// SetI2CP2S(_addr);
// SetI2CAck(0);
//
// SetI2CStart(); // write -> read 困秦 restart
// SetI2CP2S((_dvc<<1)|0x01); // I2C read mode
// SetI2CAck(0);
// _rdat_ = GetI2CS2P();
// SetI2CAck(0);
//
// SetI2CStop();
//
//#if defined(__EN_ISR__)
// EA = 1;
//#endif
//
// return _rdat_;
//}
//==================================================================================
void WriteI2CWord(U8 _dvc, U16 _addr, U16 _wdat)
{
#if defined(__EN_ISR__)
EA = 0;
#endif
SetI2CStart();
SetI2CP2S(_dvc<<1); // I2C write mode
SetI2CAck(0);
SetI2CP2S(_addr>>8);
SetI2CAck(0);
SetI2CP2S(_addr&0xff);
SetI2CAck(0);
SetI2CStart();
SetI2CP2S(_dvc<<1); // I2C write mode
SetI2CAck(0);
SetI2CP2S(_wdat>>8);
SetI2CAck(0);
SetI2CP2S(_wdat&0xff);
SetI2CAck(0);
SetI2CStop();
#if defined(__EN_ISR__)
EA = 1;
#endif
}
//==================================================================================
U16 ReadI2CWord(U8 _dvc, U16 _addr)
{
U16 _rdat_=0;
#if defined(__EN_ISR__)
EA = 0;
#endif
SetI2CStart();
SetI2CP2S(_dvc<<1); // I2C write mode
SetI2CAck(0);
SetI2CP2S(_addr>>8);
SetI2CAck(0);
SetI2CP2S(_addr&0xff);
SetI2CAck(0);
SetI2CStart(); // write -> read 困秦 restart
SetI2CP2S((_dvc<<1)|0x01); // I2C read mode
SetI2CAck(0);
_rdat_ = GetI2CS2P();
_rdat_ <<= 8;
SetI2CAck(1);
_rdat_ |= GetI2CS2P();
SetI2CAck(0);
SetI2CStop();
#if defined(__EN_ISR__)
EA = 1;
#endif
return _rdat_;
}
#endif
// */
//==================================================================================
//==================================================================================
//==================================================================================
//==================================================================================
/*
void SetAsicI2CStart(void)
{
I2C_ASIC_SDA = 1;
I2C_ASIC_SCL = 1;
I2C_ASIC_SDA = 0;
I2C_ASIC_SCL = 0;
}
//==================================================================================
void SetAsicI2CStop(void)
{
I2C_ASIC_SDA = 0;
I2C_ASIC_SCL = 1;
I2C_ASIC_SDA = 1;
}
//==================================================================================
void SetAsicI2CAck(void)
{
U8 _t1_;
I2C_ASIC_SDA = 1; //... SDA input mode
I2C_ASIC_SCL = 1;
for(_t1_=0;_t1_<1;_t1_++);
I2C_ASIC_SCL = 0;
}
//==================================================================================
void SetAsicI2CP2S(U8 _wdat)
{
U8 _t1_;//, _t2_;
for(_t1_=0;_t1_<8;_t1_++){
(_wdat&BIT7) ? (I2C_ASIC_SDA=1) : (I2C_ASIC_SDA=0);
// for(_t2_=0;_t2_<3;_t2_++);
I2C_ASIC_SCL = 1;
_wdat<<=1;
I2C_ASIC_SCL = 0;
}
}
//==================================================================================
void WriteAsicI2CByte(U8 _dvc, U8 _pg, U8 _addr, U8 _wdat)
{
// U8 _t1_;
#if defined(__EN_ISR__)
EA = 0;
#endif
HSPB = 1; //... I2C interface
// for(_t1_=0;_t1_<100;_t1_++);
HWRB = 0;
HRDB = 0;
HCSB1 = 0;
P0 = TW2824; //... slave addr[6:1]
// P0_7 = 1;
HCSB0 = 0; //... slave addr[0]
SetAsicI2CStart();
SetAsicI2CP2S(TW2824<<1); // I2C write mode
SetAsicI2CAck();
SetAsicI2CP2S(_pg);
SetAsicI2CAck();
SetAsicI2CP2S(_addr);
SetAsicI2CAck();
SetAsicI2CP2S(_wdat);
SetAsicI2CAck();
SetAsicI2CStop();
// HSPB = 0; //... Parallel interface
// for(_t1_=0;_t1_<100;_t1_++);
#if defined(__EN_ISR__)
EA = 1;
#endif
}
//==================================================================================
U8 GetAsicI2CS2P(void)
{
U8 _rdat_=0, _t1_;//, _t2_;
I2C_ASIC_SDA = 1; // ... SDA input mode
for(_t1_=1;_t1_<=8;_t1_++){
// for(_t2_=0;_t2_<10;_t2_++);
I2C_ASIC_SCL = 1;
if(I2C_ASIC_SDA == 1) _rdat_ |= 0x01;
I2C_ASIC_SCL = 0;
if(_t1_==8) continue; // 8锅掳俊急 shift 扒呈盾.
_rdat_<<=1;
}
return _rdat_;
}
//==================================================================================
U8 ReadAsicI2CByte(U8 _dvc, U8 _pg, U8 _addr)
{
U8 _rdat_=0;
#if defined(__EN_ISR__)
EA = 0;
#endif
HSPB = 1; //... I2C interface
HWRB = 0;
HRDB = 0;
HCSB1 = 0;
P0 = TW2824; //... slave addr[6:1]
// P0_7 = 1;
HCSB0 = 0; //... slave addr[0]
SetAsicI2CStart();
SetAsicI2CP2S(TW2824<<1); // I2C write mode
SetAsicI2CAck();
SetAsicI2CP2S(_pg);
SetAsicI2CAck();
SetAsicI2CP2S(_addr);
SetAsicI2CAck();
SetAsicI2CStart(); // write -> read 困秦 restart
SetAsicI2CP2S((TW2824<<1)|0x01); // I2C read mode
SetAsicI2CAck();
_rdat_=GetAsicI2CS2P();
SetAsicI2CAck();
SetAsicI2CStop();
#if defined(__EN_ISR__)
EA = 1;
#endif
return _rdat_;
}
// */
//==================================================================================
/*
void WriteAsicI2CTable(U8 _dvc, U8 _pg, U8 _addr, U8 *_tbl_ptr, U8 _tbl_cnt)
{
U8 _t1_;
#if defined(__EN_ISR__)
EA = 0;
#endif
HSPB = 1; //... I2C interface
HWRB = 0;
HRDB = 0;
HCSB1 = 0;
P0 = TW2824; //... slave addr[6:1]
// P0_7 = 1;
HCSB0 = 0; //... slave addr[0]
SetAsicI2CStart();
SetAsicI2CP2S(TW2824<<1); // I2C write mode
SetAsicI2CAck();
SetAsicI2CP2S(_pg);
SetAsicI2CAck();
SetAsicI2CP2S(_addr);
SetAsicI2CAck();
for(_t1_=0;_t1_<_tbl_cnt;_t1_++){
SetAsicI2CP2S(*_tbl_ptr);
SetAsicI2CAck();
_tbl_ptr++;
}
SetAsicI2CStop();
#if defined(__EN_ISR__)
EA = 1;
#endif
}
// */
//==================================================================================
//==================================================================================
// Parallel function description
//==================================================================================
//==================================================================================
/*
void ChipSelAllOff(void)
{
HCSB1 = 1;
HCSB0 = 1;
}
//==================================================================================
void ChipSelPage0(void)
{
ChipSelAllOff();
HCSB0 = 0;
HCSB1 = 0;
}
//==================================================================================
void ChipSelPage1(void)
{
ChipSelAllOff();
HCSB0 = 1;
HCSB1 = 0;
}
//==================================================================================
void ChipSelPage2(void)
{
ChipSelAllOff();
HCSB0 = 0;
HCSB1 = 1;
}
// */
//==================================================================================
//void ChipSelAllOff(void)
//{
// HCSB1 = 1;
// HPSB_M = 1;
//
// HCSB0 = 1;
// HPSB_D = 1;
//}
////==================================================================================
//void ChipSelPage0(void)
//{
// ChipSelAllOff();
//
// HCSB0 = 0;
// HPSB_D = 0;
//
// HCSB1 = 1;
// HPSB_M = 1;
//}
////==================================================================================
//void ChipSelPage1(void)
//{
// ChipSelAllOff();
//
// HCSB0 = 1;
// HPSB_D = 1;
//
// HCSB1 = 1;
// HPSB_M = 0;
//}
////==================================================================================
//void ChipSelPage2(void)
//{
// ChipSelAllOff();
//
// HCSB0 = 1;
// HPSB_D = 1;
//
// HCSB1 = 0;
// HPSB_M = 1;
//}
//==================================================================================
void WriteAsicByteOSD(U8 _dvc, U8 _addr, U8 _wdat)
{
// U8 _t1_;
// if(_pg == DVC_PG0){
// WriteI2CByte(0x28,_addr,_wdat);
// }
// else{
#if defined(__EN_ISR__)
EA = 0;
#endif
// HCSB0=1;
// HCSB1=1;
P1 = 0xf6; //... initial state
// //... P[7:4]:INT[5:2], P1_3:HALE, P1_2:HRDB, P1_1:HWRB, P1_0:HSPB
#if defined(__4CH__)
_dvc = 0; //... temporal
HCSB0=0;
HCSB1=1;
#elif defined(__16CH__)
P2 = (_dvc^0xff)|0xaa;
#endif
MDATA = _addr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -