📄 lcd_main.c
字号:
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 + -