⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_main.c

📁 LCD显示温控器制作成功 参考了明浩的温度控制器V1.5和使用1602液晶显示和PS/2键盘的示例
💻 C
📖 第 1 页 / 共 2 页
字号:

				cur_temper_set[6]=LCD_One_set;		//把温度值的ASCII码放入cur_temper_set的6,7,8位
				cur_temper_set[7]=LCD_Two_set;		
				cur_temper_set[8]=LCD_Three_set;	

}

//写数据
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在这后加小的延时
LCM_E = 0; //延时
LCM_E = 1;
}

//写指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); //根据需要检测忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0; 
LCM_E = 0;
LCM_E = 0;
LCM_E = 1; 
}

//读数据
unsigned char ReadDataLCM(void)
{
LCM_RS = 1; 
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}

//读状态
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF; 
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); //检测忙信号
return(LCM_Data);
}

void LCMInit(void) //LCM初始化
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
Delay5Ms(); 
WriteCommandLCM(0x38,0);
Delay5Ms(); 
WriteCommandLCM(0x38,0);
Delay5Ms(); 

WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); //关闭显示
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0C,1); // 显示开及光标设置
}

//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码
WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCM(DData);
}

//按指定位置显示一串字符 (***原来的遇到空格0x20就不显示***)
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
	unsigned char ListLength, j;
	ListLength = strlen(DData);	//计算要显示的字符串长度
	Y &= 0x1;
	X &= 0xF; //限制X不能大于15,Y不能大于1
			if (X <= 0xF) //X坐标应小于0xF
				{
					for (j=0;j<ListLength;j++)
						{
							DisplayOneChar(X, Y, DData[j]); //显示单个字符
							X++;
						}
				}
}

//5ms延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}

//400ms延时
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}


void InitDS1820(void)		//初始化DS1820
{
	TMPort = 1;		//拉高TMPort
	_nop_();      //保持一个周期
	TMPort = 0;		//拉低TMPort
  Delay_510();  //延时  DS1820复位时间要500us的低电平
  TMPort = 1;   //拉高TMPort
	_nop_();      //保持  
	_nop_();
	_nop_();

  Delay_110();  //延时110us 等待DS1820回应
  if (!TMPort)  //回应信号为低电平
    DS1820ON = 1;
  else
    DS1820ON = 0;
  Delay_110();  //延时
  Delay_110();
  TMPort = 1;   //拉高TMPort
}

void ROMDS1820(void)  //跳过ROM匹配
{
#pragma asm
  MOV A,#0CCH
  MOV R2,#8
  CLR C
  WR1:
  CLR P2_7
  MOV R3,#6
  DJNZ R3,$
  RRC A
  MOV P2_7,C
  MOV R3,#23
  DJNZ R3,$
  SETB P2_7
  NOP
  DJNZ R2,WR1
  SETB P2_7
#pragma endasm
}

void TMVDS1820(void)  //温度转换指令
{
#pragma asm
  MOV A,#44H
  MOV R2,#8
  CLR C
  WR2:
  CLR P2_7
  MOV R3,#6
  DJNZ R3,$
  RRC A
  MOV P2_7,C
  MOV R3,#23
  DJNZ R3,$
  SETB P2_7
  NOP
  DJNZ R2,WR2
  SETB P2_7
#pragma endasm
}

void TMRDS1820(void)  //读出温度指令
{
#pragma asm
  MOV A,#0BEH
  MOV R2,#8
  CLR C
  WR3:
  CLR P2_7
  MOV R3,#6
  DJNZ R3,$
  RRC A
  MOV P2_7,C
  MOV R3,#23
  DJNZ R3,$
  SETB P2_7
  NOP
  DJNZ R2,WR3
  SETB P2_7
#pragma endasm
}

void TMWDS1820(void)  //写入温度限制指令
{
#pragma asm
  MOV A,#04EH
  MOV R2,#8
  CLR C
  WR13:
  CLR P2_7
  MOV R3,#6
  DJNZ R3,$
  RRC A
  MOV P2_7,C
  MOV R3,#23
  DJNZ R3,$
  SETB P2_7
  NOP
  DJNZ R2,WR13
  SETB P2_7
#pragma endasm
}

void TMREDS1820(void)		//COPY RAM to E2PRAM
{
#pragma asm
  MOV A,#48H
  MOV R2,#8
  CLR C
  WR33:
  CLR P2_7
  MOV R3,#6
  DJNZ R3,$
  RRC A
  MOV P2_7,C
  MOV R3,#23
  DJNZ R3,$
  SETB P2_7
  NOP
  DJNZ R2,WR33
  SETB P2_7
#pragma endasm
}

void TMERDS1820(void)		//COPY E2PRAM to RAM
{
#pragma asm
  MOV A,#0B8H
  MOV R2,#8
  CLR C
  WR43:
  CLR P2_7
  MOV R3,#6
  DJNZ R3,$
  RRC A
  MOV P2_7,C
  MOV R3,#23
  DJNZ R3,$
  SETB P2_7
  NOP
  DJNZ R2,WR43
  SETB P2_7
#pragma endasm
}

void WriteDS1820(void)	//写入温度限制值
{
#pragma asm
	MOV A,26H					//发出4EH写ROM指令后连发两个字节分别为上下限
  MOV R2,#8
  CLR C
  WR23:
  CLR P2_7
  MOV R3,#6
  DJNZ R3,$
  RRC A
  MOV P2_7,C
  MOV R3,#23
  DJNZ R3,$
  SETB P2_7
  NOP
  DJNZ R2,WR23
  SETB P2_7       
#pragma endasm
}

void ReadDS1820(void) //读出温度值
{
#pragma asm
  MOV R4,#3 ; 将温度高位和低位,高温限制位从DS18B20中读出
  MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H),高温限制位存入27H(TMRomV)
  RE00:
  MOV R2,#8
  RE01:
  CLR C
  SETB P2_7
  NOP
  NOP
  CLR P2_7
  NOP
  NOP
  NOP
  SETB P2_7
  MOV R3,#09
  RE10: 
  DJNZ R3,RE10
  MOV C,P2_7
  MOV R3,#23
  RE20: 
  DJNZ R3,RE20
  RRC A
  DJNZ R2,RE01
  MOV @R1,A
  DEC R1
  DJNZ R4,RE00
#pragma endasm
}

void Delay_510(void)	//延时510微秒
{
#pragma asm
	MOV R0,#7DH
	MOV R1,#02H
	TSR1:
	DJNZ R0,TSR1
	MOV R0,#7DH
	DJNZ R1,TSR1
#pragma endasm
}

void Delay_110(void)	//延时110微秒
{
#pragma asm
	MOV R0,#19H
	MOV R1,#02H
	TSR2:
	DJNZ R0,TSR2
	MOV R0,#19H
	DJNZ R1,TSR2
#pragma endasm
}

void Delay_10ms(void)	//延时10ms
{
#pragma asm
	MOV R0,#19H
	MOV R1,#0C8H
	TSR3:
	DJNZ R0,TSR3
	MOV R0,#19H
	DJNZ R1,TSR3
#pragma endasm
}

void Delay_4s(void)	//延时4s
{
#pragma asm
  MOV R2,#28H
  TSR5:
	MOV R0,#0FAH
	MOV R1,#0C8H
	TSR4:
	DJNZ R0,TSR4
	MOV R0,#0FAH
	DJNZ R1,TSR4
  DJNZ R2,TSR5
#pragma endasm
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -