📄 drop_02.c
字号:
/* 返回值: void */
/*********************************************************/
void LCDInit(void) /*TM161A/B 液晶初始化 # */
{
Wait5MS();
Wait5MS();
Wait5MS();
Wait5MS();
EN=0;
WriteCommandToLCD(0x30,0);
Wait5MS();
WriteCommandToLCD(0x30,0);
Wait5MS();
WriteCommandToLCD(0x0C,0);
Wait5MS();
WriteCommandToLCD(0x01,1);
Wait5MS();
Wait5MS();
WriteCommandToLCD(0x06,1);
DisplayARowChar(0,1);
Wait1S();
Wait1S();
DisplayARowChar(1,1);
Wait1S();
Wait1S();
}
/*********************************************************/
/* 名称: void SetupExpandMode */
/* 功能: expand command */
/* 说明: */
/* 调用: WriteCommandToLCD() */
/* 输入: */
/* 返回值: void */
/*********************************************************/
void SetupExpandMode()
{
WriteCommandToLCD(0x34,1);
}
/*********************************************************/
/* 名称: void WriteAWordToGDRAM */
/* 功能: expand command */
/* 说明: */
/* 调用: WriteDataToLCM() WriteCommandToLCD() */
/* SetLCMRAMAddress() SetupExpandMode() */
/* 输入: byte adr_x,byte adr_y,byte data_h,byte data_l */
/* 返回值: void */
/*********************************************************/
void WriteAWordToGDRAM(byte adr_x,byte adr_y,byte data_h,byte data_l)
{
SetupExpandMode();
SetLCMRAMAddress(adr_y&0x3F);
SetLCMRAMAddress(adr_x&0X0F);
WriteDataToLCM(data_h);
WriteDataToLCM(data_l);
WriteCommandToLCD(0x36,1);
}
/*********************************************************/
/* 名称: ClearForGDRAM */
/* 功能: Clear ram of CDRAM */
/* 说明: */
/* 调用: WriteCommandToLCD() SetLCMRAMAddress() */
/* WriteDataToLCM() */
/* 输入: */
/* 返回值: void */
/*********************************************************/
void ClearForGDRAM()
{
int i,j;
WriteCommandToLCD(0x34,1);
for(i=0;i<64;i++)
{
for(j=0;j<16;j++)
{
SetLCMRAMAddress(i);
SetLCMRAMAddress(j);
WriteDataToLCM(0);
WriteDataToLCM(0);
}
}
WriteCommandToLCD(0x36,1);
}
/*********************************************************/
/* 名称: void ClearForDDRAM */
/* 功能: Clear ram of CDRAM */
/* 说明: */
/* 调用: WriteCommandToLCD() */
/* 输入: */
/* 返回值: void */
/*********************************************************/
void ClearForDDRAM()
{
WriteCommandToLCD(0x30,1);
WriteCommandToLCD(0x01,1);
WriteCommandToLCD(0x36,1);
WriteCommandToLCD(0x30,1);
}
/******************************************************************/
/* DS1302 Subprogram */
/* ~~~~~~~~~~~~~~~~~ */
/******************************************************************/
/*********************************************************/
/* 名称: void WriteAByteToDS1302 */
/* 说明: */
/* 功能: 从DS1302读取1Byte数据 */
/* 调用: */
/* 输入: */
/* 返回值: ACC */
/*********************************************************/
void WriteAByteToDS1302(byte ucDa)
{
byte i;
ACC = ucDa;
for(i=0; i<8; i++)
{
T_IO = ACC0; //相当于汇编中的 RRC
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/*********************************************************/
/* 名称: byte ReadAByteFromDS1302 */
/* 说明: */
/* 功能: 从DS1302读取1 Byte数据 */
/* 调用: */
/* 输入: */
/* 返回值: ACC */
/*********************************************************/
byte ReadAByteFromDS1302(void)
{
byte i;
for(i=0; i<8; i++)
{
ACC = ACC >>1; //相当于汇编中的 RRC
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/*********************************************************/
/* 名称: WriteAddressAndDataToDS1302 */
/* 说明: 先写地址,后写命令/数据 */
/* 功能: 往DS1302写入数据 */
/* 调用: WriteAByteToDS1302() */
/* 输入: ucAddr: DS1302地址, ucDa: 要写的数据 */
/* 返回值: 无 */
/*********************************************************/
void WriteAddressAndDataToDS1302(byte ucAddr, byte ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
WriteAByteToDS1302(ucAddr); //地址,命令
WriteAByteToDS1302(ucDa); //写1Byte数据
T_CLK = 1;
T_RST =0;
}
/*********************************************************/
/* 名称: WriteAddressAndReadDataFromDS1302 */
/* 说明: 先写地址,后读命令/数据 */
/* 功能: 读取DS1302某地址的数据 */
/* 调用: WriteAByteToDS1302() , ReadAByteFromDS1302() */
/* 输入: ucAddr: DS1302地址 */
/* 返回值: ucDa :读取的数据 */
/*********************************************************/
byte WriteAddressAndReadDataFromDS1302(byte ucAddr)
{
byte ucDa;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
WriteAByteToDS1302(ucAddr); //地址,命令
ucDa = ReadAByteFromDS1302(); //读1Byte数据
T_CLK = 1;
T_RST =0;
return(ucDa);
}
/*********************************************************/
/* 名称: WriteAddressAnd8ByteToDS1302 */
/* 说明: 先写地址,后写数据(时钟多字节方式) */
/* 功能: 往DS1302写入时钟数据(多字节方式) */
/* 调用: WriteAByteToDS1302() */
/* 输入: pSecDa: 时钟数据地址 */
/* 格式为: 秒 分 时 日 月 星期 年 控制 */
/* 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B */
/* 返回值: 无 */
/*********************************************************/
void WriteAddressAnd8ByteToDS1302(byte *pSecDa)
{
byte i;
WriteAddressAndDataToDS1302(0x8e,0x00); //控制命令,WP=0,写操作?
T_RST = 0;
T_CLK = 0;
T_RST = 1;
WriteAByteToDS1302(0xbe); //0xbe:时钟多字节写命令
for (i=0;i<8;i++) //8Byte = 7Byte 时钟数据 + 1Byte 控制
{
WriteAByteToDS1302(*pSecDa); //写1Byte数据
pSecDa++;
}
T_CLK = 1;
T_RST =0;
}
/*********************************************************/
/* 名称: WriteAddressAndRead8ByteFromDS1302 */
/* 说明: 先写地址,后读命令/数据(时钟多字节方式) */
/* 功能: 读取DS1302时钟数据 */
/* 调用: WriteAByteToDS1302() , ReadAByteFromDS1302() */
/* 输入: pSecDa: 时钟数据地址 格式为: */
/* 秒 分 时 日 月 星期 年 7Byte (BCD码) */
/* 1B 1B 1B 1B 1B 1B 1B */
/* 返回值: ucDa :读取的数据 */
/*********************************************************/
void WriteAddressAndRead8ByteFromDS1302(byte *pSecDa)
{
byte i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
WriteAByteToDS1302(0xbf); //0xbf:时钟多字节读命令
for (i=0; i<8; i++)
{
*pSecDa = ReadAByteFromDS1302(); //读1Byte数据
pSecDa++;
}
T_CLK = 1;
T_RST =0;
}
/*********************************************************/
/* 名称: WriteAddressAnd32ByteToDS1302 */
/* 说明: 先写地址,后写数据(寄存器多字节方式) */
/* 功能: 往DS1302寄存器数写入数据(多字节方式) */
/* 调用: WriteAByteToDS1302() */
/* 输入: pReDa: 寄存器数据地址 */
/* 返回值: 无 */
/*********************************************************/
void WriteAddressAnd32ByteToDS1302(byte *pReDa)
{
byte i;
WriteAddressAndDataToDS1302(0x8e,0x00); //控制命令,WP=0,写操作?
T_RST = 0;
T_CLK = 0;
T_RST = 1;
WriteAByteToDS1302(0xfe); //0xbe:时钟多字节写命令
for (i=0;i<32;i++) //31Byte 寄存器数据
{
WriteAByteToDS1302(*pReDa); //写1Byte数据
pReDa++;
}
T_CLK = 1;
T_RST =0;
}
/*********************************************************/
/* 名称: WriteAddressAndRead32ByteFromDS1302 */
/* 说明: 先写地址,后读命令/数据(寄存器多字节方式) */
/* 功能: 读取DS1302寄存器数据 */
/* 调用: WriteAByteToDS1302() , ReadAByteFromDS1302() */
/* 输入: pReDa: 寄存器数据地址 */
/* 返回值: 无 */
/*********************************************************/
void WriteAddressAndRead32ByteFromDS1302(byte *pReDa)
{
byte i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
WriteAByteToDS1302(0xff); //0xbf:时钟多字节读命令
for (i=0; i<32; i++) //31Byte 寄存器数据
{
*pReDa = ReadAByteFromDS1302(); //读1Byte数据
pReDa++;
}
T_CLK = 1;
T_RST =0;
}
/*********************************************************/
/* 名称: SetInitialTimeForDS1302 */
/* 说明: */
/* 功能: 设置初始时间 */
/* 调用: WriteAddressAndDataToDS1302() */
/* 输入: pSecDa: 初始时间地址。初始时间格式为: */
/* 秒 分 时 日 月 星期 年 */
/* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B */
/* 返回值: 无 */
/*********************************************************/
void SetInitialTimeForDS1302(byte *pSecDa)
{
byte i;
byte ucAddr = 0x80;
WriteAddressAndDataToDS1302(0x8e,0x00); //控制命令,WP=0,写操作?
for(i =0;i<8;i++)
{
WriteAddressAndDataToDS1302(ucAddr,*pSecDa); //秒 分 时 日 月 星期 年
pSecDa++;
ucAddr +=2;
}
WriteAddressAndDataToDS1302(0x8e,0x80); //控制命令,WP=1,写保护?
}
/*********************************************************/
/* 名称: TakeCurrentTimeFromDS1302 */
/* 功能: 读取DS1302当前时间 */
/* 说明: */
/* 调用: WriteAddressAndReadDataFromDS1302() */
/* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: */
/* 分 时 日 月 星期 年 */
/* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B */
/* 返回值: 无 */
/*********************************************************/
void TakeCurrentTimeFromDS1302(byte ucCurtime[])
{
byte i;
byte ucAddr = 0x81;
for (i=0;i<7;i++)
{
ucCurtime[i] = WriteAddressAndReadDataFromDS1302(ucAddr); //格式为: 秒 分 时 日 月 星期 年
ucAddr += 2;
}
}
/******************************************************************/
/* DS18B20 Subprogram */
/* ~~~~~~~~~~~~~~~~~~ */
/******************************************************************/
/*********************************************************/
/* 名称: void DelayN10us */
/* 功能: 用 useconds 决定延时时间 */
/* 说明: 可变延时子程: 延时 = useconds*10us */
/* 调用: */
/* 输入: useconds */
/* 返回值: 无 */
/*********************************************************/
void DelayN10us(word useconds)
{
for(;useconds>0;useconds--);
}
/*********************************************************/
/* 名称: byte ResetOfDS18B20 */
/* 功能: one wire device 复位 */
/* 说明: 主机主动: ^^^|___|^^^ 后等 one wire device 回答 */
/* 调用: */
/* 输入: byte channel :选择通道 */
/* 返回值:presence: 0 = 有器件, 1 = 无器件 */
/*********************************************************/
byte ResetOfDS18B20(byte channel)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -