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

📄 lcd_main.c

📁 89c51的一个小程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		LCD_Two = LCDDis[LCD_Two];		
	else
		{
			if (LCD_Two == 0)
				LCD_Two = LCDDis[10];
			else
				LCD_Two = LCDDis[LCD_Two];
		}
	if (Sign)
		LCD_One = LCDDis[11];
	else
		{
			if (LCD_One == 0)
				LCD_One = LCDDis[10];
			else
				LCD_One = LCDDis[LCD_One];
		}
	LCD_Three = LCDDis[LCD_Three];


				cur_temper[13]=LCD_One;		//把温度值的ASCII码放入cur_temper的13,14,15位
				cur_temper[14]=LCD_Two;		
				cur_temper[15]=LCD_Three;	


//转LCD字段  设置值	
	if (LCD_One_set) //超过百时十位的处理
		LCD_Two_set = LCDDis[LCD_Two_set];		
	else
		{
			if (LCD_Two_set == 0)
				LCD_Two_set = LCDDis[10];
			else
				LCD_Two_set = LCDDis[LCD_Two_set];
		}
	if (Sign_Set)
		LCD_One_set = LCDDis[11];
	else
		{
			if (LCD_One_set == 0)
				LCD_One_set = LCDDis[10];
			else
				LCD_One_set = LCDDis[LCD_One_set];
		}
	LCD_Three_set = LCDDis[LCD_Three_set];


				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 dtod(void)
{
	
    		//count_One = cj / 100;							//转换百位值		
    		count_Two = cj/10;// - count_One * 100)/10;
			  count_Three = cj-count_Two * 10;// - count_One * 100 - count_Two * 10;
				count_Two = LCDDis[count_Two];
				count_Three = LCDDis[count_Three];
		    count_cj2		= LCDDis[cj2];  //把记数值的ASCII码放入cur_count的13,14,15位
				cur_count[12]=count_Two;		
				cur_count[13]=count_Three;		
				cur_count[11]=count_cj2;
	
	}
//写数据
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==1) X |= 0x40; //当要显示第二行时地址码+0x40;
if (Y==2) X |= 0x10;
if (Y==0) X |= 0x00;
if (Y==3) X |= 0x50;
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);	//计算要显示的字符串长度
	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 TMPort
  MOV R3,#6
  DJNZ R3,$
  RRC A
  MOV TMPort,C
  MOV R3,#23
  DJNZ R3,$
  SETB TMPort
  NOP
  DJNZ R2,WR1
  SETB TMPort
#pragma endasm
}

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

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

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

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

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

void WriteDS1820(void)	//写入温度限制值
{
#pragma asm
	MOV A,26H					//发出4EH写ROM指令后连发两个字节分别为上下限
  MOV R2,#8
  CLR C
  WR23:
  CLR TMPort
  MOV R3,#6
  DJNZ R3,$
  RRC A
  MOV TMPort,C
  MOV R3,#23
  DJNZ R3,$
  SETB TMPort
  NOP
  DJNZ R2,WR23
  SETB TMPort       
#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 TMPort
  NOP
  NOP
  CLR TMPort
  NOP
  NOP
  NOP
  SETB TMPort
  MOV R3,#09
  RE10: 
  DJNZ R3,RE10
  MOV C,TMPort
  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,#74H
	MOV R1,#02H
	TSR1:
	DJNZ R0,TSR1
	MOV R0,#74H
	DJNZ R1,TSR1
#pragma endasm
}

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

void Delay_10ms(void)	//延时10ms
{
#pragma asm
	MOV R0,#18H
	MOV R1,#0C8H
	TSR3:
	DJNZ R0,TSR3
	MOV R0,#18H
	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 + -