📄 display.c
字号:
//cs1=0,cs2=1选左
#include <reg51.h>
#include <intrins.h>
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sbit button1=P0^0;
sbit button2=P0^1;
sbit button3=P0^2;
sbit button4=P0^3;
sbit DataPortDS1820 = P1^6;
#define button P0;
#define LCD_DATA P2
#define LCD_RS P10
#define LCD_RW P11
#define LCD_E P12
#define LCD_CS1 P13
#define LCD_CS2 P14
#define LCD_RST P15
#define SELECTCS 0
char code wen[]= //温
{0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00,
0x02,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00,
};
char code du[]= //度
{
0x00,0x00,0xFC,0x04,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x24,0x24,0x04,0x00,
0x80,0x60,0x1F,0x80,0x80,0x42,0x46,0x2A,0x12,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00,
};
char code shuzi[10][16]=
{ //
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},//0
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},//1
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00}, //2
{0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00}, //3
{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},//4
{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},//5
{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},//6
{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},//7
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},//8
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00}//9
};
char code Han[]=
{ 0x10,0x60,0x01,0x86,0x60,0x04,0x1C,0xE4,0x04,0x04,0x04,0xE4,0x1C,0x04,0x00,0x00,
0x04,0x04,0x7E,0x01,0x40,0x20,0x20,0x10,0x0B,0x04,0x0B,0x10,0x30,0x60,0x20,0x00,
/*0x00,0x10,0x61,0x06,0xC0,0x30,0x02,0x3E,0xC2,0x02,0x82,0x62,0x1F,0x02,0x00,0x00,
0x00,0x02,0x02,0x3F,0x20,0x20,0x10,0x08,0x05,0x02,0x05,0x08,0x10,0x30,0x10,0x00, */
};
/*-- 文字: 字 --*/
char code Zi[]=
{
0x00,0x00,0x10,0x0C,0x14,0x14,0x14,0x15,0xD6,0x54,0x34,0x14,0x14,0x8C,0x00,0x00,
0x00,0x01,0x01,0x01,0x01,0x01,0x11,0x21,0x1F,0x01,0x01,0x01,0x01,0x01,0x01,0x00,
};
void LCD_Check_Busy1(void)
{
while(1)
{
LCD_E = 0;
LCD_RS = 0;
LCD_RW = 1;
LCD_DATA = 0xff;
LCD_E = 1;
if(!(LCD_DATA&0X80)) break;
}
LCD_E = 0;
}
void LCD_Check_Busy2(void)
{
while(1)
{
LCD_E = 0;
LCD_RS = 0;
LCD_RW = 1;
LCD_DATA = 0xff;
LCD_E = 1;
if(!(LCD_DATA&0X80)) break;
}
LCD_E = 0;
}
void LCD_SELECT1(void)
{
LCD_CS1=0;
LCD_CS2=1;
}
void LCD_SELECT2(void)
{
LCD_CS1=1;
LCD_CS2=0;
}
void LCD_WriteCommand1(char ch)
{ LCD_SELECT1();
LCD_Check_Busy1(); //判断LCD是否处于忙状态
LCD_RW=0;
LCD_RS=0;
LCD_DATA=ch;
LCD_E=1;
LCD_E=0;
}
void LCD_WriteCommand2(char ch)
{
LCD_SELECT2();
LCD_Check_Busy2();
LCD_RW=0;
LCD_RS=0;
LCD_DATA=ch;
LCD_E=1;
LCD_E=0;
}
void LCD_WriteData1(char ch)
{
LCD_SELECT1();
LCD_Check_Busy1();
LCD_RW=0;
LCD_RS=1;
LCD_DATA=ch;
LCD_E=1;
LCD_E=0;
}
void LCD_WriteData2(char ch)
{
LCD_SELECT2();
LCD_Check_Busy2();
LCD_RW=0;
LCD_RS=1;
LCD_DATA=ch;
LCD_E=1;
LCD_E=0;
}
void Delay1ms(unsigned char T)
{
unsigned char i,j;
for(i=0;i<T;i++)
for(j=0;j<250;j++)
_nop_();_nop_();_nop_();
}
void Delay1s(unsigned char T)
{
while (T)
{
Delay1ms(200);
Delay1ms(200);
Delay1ms(200);
Delay1ms(200);
Delay1ms(200);
T--;
}
}
void LCD_WriteHZ(char x,char y,char *Dot)
{
char i;
for (i=0;i<32;i++)
{
if ((x+i%16)<64) //横向坐标小于64时在左屏显示汉字
{
LCD_WriteCommand1(0xB8+y+i/16);
LCD_WriteCommand1(0x40+x+i%16);
LCD_WriteData1(Dot[i]);
}
else //横向坐标大于64时在右屏显示汉字
{
LCD_WriteCommand2(0xB8+y+i/16);
LCD_WriteCommand2(0x40+x-64+i%16);
LCD_WriteData2(Dot[i]);
}
}
}
void LCD_WriteSZ(char x,char y,char *Dot)
{
char i;
for (i=0;i<16;i++)
{
if ((x+i%8)<64) //横向坐标小于64时在左屏显示汉字
{
LCD_WriteCommand1(0xB8+y+i/8);
LCD_WriteCommand1(0x40+x+i%8);
LCD_WriteData1(Dot[i]);
}
else //横向坐标大于64时在右屏显示汉字
{
LCD_WriteCommand2(0xB8+y+i/8);
LCD_WriteCommand2(0x40+x-64+i%8);
LCD_WriteData2(Dot[i]);
}
}
}
void DispBmp(char *buf) //显示一幅位图
{
int i,j;
for (j=0;j<8;j++) //显示位图
{
LCD_WriteCommand1(0xB8+j);
LCD_WriteCommand1(0x40);
for (i=0;i<64;i++)
LCD_WriteData1(buf[(j*2)*64+i]);
LCD_WriteCommand2(0xB8+j);
LCD_WriteCommand2(0x40);
for (i=0;i<64;i++)
LCD_WriteData2(buf[(j*2+1)*64+i]);
}
}
void InitLCD(void)
{
char i,j;
LCD_RST=0;
Delay1ms(2);
LCD_RST=1;
LCD_WriteCommand1(0xc0);
LCD_WriteCommand2(0xc0);
LCD_WriteCommand1(0x3f); //开显示
LCD_WriteCommand2(0x3f);
for (j=0;j<8;j++) //清屏
{
LCD_WriteCommand1(0xB8+j); //清左半屏
LCD_WriteCommand1(0x40);
for (i=0;i<64;i++)
LCD_WriteData1(0x00);
LCD_WriteCommand2(0xB8+j); //清右半屏
LCD_WriteCommand2(0x40);
for (i=0;i<64;i++)
LCD_WriteData2(0x00);
}
}
//-=====================================================================
void Delay1us(unsigned char us) //延时
{
while (--us) ;//参数为1是延时6US 2时为8US依次递增
}
void Delay15us(void)
{
Delay1us(13); //延时15秒
}
void Delay10us(void)
{
Delay1us(8);
}
bit RstDS1820(void) //返回0-有设备连接1-无设备连接
{
unsigned char i;
bit RstFlag;
RstFlag=1;
DataPortDS1820=0;
for (i=0;i<40;i++) //480us 延时
Delay15us();
DataPortDS1820=1;
for(i=0;i<4;i++) //15us-60us 延时
{
Delay15us();
}
for (i=0;i<16;i++) //60us-240us 延时
{
Delay15us();
if (DataPortDS1820==0) RstFlag=0;
}
for (i=0;i<16;i++) //240us
{
Delay15us();
}
return RstFlag;
}
void WriteDS1820(unsigned char ch)
{
unsigned char i;
DataPortDS1820=1;
Delay1us(1);
for (i=0;i<8;i++)
{
EA=0;
DataPortDS1820=0;
Delay15us();
DataPortDS1820=ch&0x1;
EA=1;
Delay15us();Delay15us();Delay15us();
DataPortDS1820=1;
ch=ch>>1;
Delay1us(1);
}
}
unsigned char ReadDS1820(void)
{
unsigned char i,ch;
ch=0;
DataPortDS1820=1;
Delay1us(1);
for (i=0;i<8;i++)
{
EA=0;
DataPortDS1820=0;
Delay10us();
DataPortDS1820=1;
Delay1us(2);
ch=ch>>1;
if (DataPortDS1820==1)
{
ch=ch+0x80;
}
EA=1;
Delay15us();Delay15us();Delay15us();
}
return ch;
}
void SkipROMCode(void) //主机发跳过读序列号的操作命令:0xcc
{
// RstDS1820();
WriteDS1820(0xcc);
}
void StartADC(void)
{
// RstDS1820(); //复位
// WriteDS1820(0xcc); //广播
WriteDS1820(0x44); //启动温度转换转换 12bit700ms
}
unsigned int GetTempValue(void)//读取温度值的程序
{
unsigned char i,j;
unsigned int T;
RstDS1820();
SkipROMCode();
WriteDS1820(0xBE); //发布读取温度值的命令(0xBE)
i=ReadDS1820();
j=ReadDS1820();
StartADC();
T=i+j*256;
if (T==0xffff) return 0xffff;
if (T>0x8000) //温度为负号
{
T=-T;
return(0x8000+T*5/8); //计算温度值
}
else //温度为正号
return(T*5/8);
}
void sleep_ms(unsigned int count) //延时
{
unsigned char ii,jj;
for(ii=0;ii<count;ii++)
{
for(jj=0;jj<250;jj++)
_nop_();
}
}
/*void Init18b20(void)
{
SkipROMCode(); //主机发跳过读序列号的操作命令:0xcc
WriteDS1820(0x44); //启动温度转换
} */
//=================================================================================
void oxy(void)
{ unsigned char temp;
unsigned int w;
RstDS1820();
SkipROMCode();
StartADC();
Delay1s(1);
InitLCD(); //清屏
w = GetTempValue(); //读出温度值的原始数据存入W
Delay1s(1);
LCD_WriteHZ(0,0,wen);
LCD_WriteHZ(16,0,du);
temp = (w%1000)/100;
LCD_WriteSZ(32,0,shuzi[temp]);
temp = (w%100)/10;
LCD_WriteSZ(40,0,shuzi[temp]); //个位
temp = (w%10);
LCD_WriteSZ(48,0,shuzi[temp]); //小数位
}
//===============================================================================
void presskey() interrupt 0 using 0
{
EA=0;
if(button1==0)
{
Delay1ms(100);
if(button1==0)
oxy();
}
if(button2==0)
{
Delay1ms(100);
if(button2==0)
oxy();
}
if(button3==0)
{
Delay1ms(100);
if(button3==0)
oxy();
}
if(button4==0)
{
Delay1ms(100);
if(button4==0)
oxy();
}
EA=1;
}
void main (void)
{
InitLCD();
Delay1ms(1);
EA=1;
EX0=1;
while(1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -