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

📄 yejin.c

📁 单片机驱动LCD显示程序
💻 C
字号:
#include <reg52.h>
#include <intrins.h>
sbit di=P2^5;
sbit rw=P2^6;
sbit e=P2^7;
sbit csa=P3^4;
sbit csb=P3^3;
sbit res=P3^2;
#define displayon 0x3f
#define start0     0xc0
#define startx0     0x40
#define starty0     0xb8
#define V_TH0   0xd8
#define V_TL0   0xf0
#define V_TMOD  0x01
#define uchar unsigned char 
sbit TMDAT = P3^5;	//根据实实际情况设定
uchar TMP;		//读取后温度值存于TMP中,将其除以2即可得出实际温度;	
unsigned char a,b;						//
void dmsec (unsigned int count)	; 
void tmreset (void)	;
void tmpre (void);
bit tmrbit (void);
unsigned char tmrbyte (void);
void tmwbyte (unsigned char dat);
void tmstart (void)	;
void tmrtemp (void);
unsigned char code ai16[]={
/* 点阵:16x16
   提取点阵方向:纵向
   字节掉转:是
   字节方式:C语言 */
0x40,0xB0,0x92,0x96,0x9A,0x92,0xF2,0x9E,    // 爱
0x92,0x91,0x99,0x95,0x91,0x50,0x30,0x00,
0x00,0x00,0x40,0x30,0x8C,0x83,0x46,0x2A,
0x12,0x2A,0x26,0x42,0xC0,0x40,0x00,0x00
};
unsigned char code dang16[]={
/* 点阵:16x16
   提取点阵方向:纵向
   字节掉转:是
   字节方式:C语言 */
0x00,0x40,0x42,0x44,0x4C,0x40,0x40,0x7F,    // 当
0x40,0x40,0x48,0x44,0xE6,0x40,0x00,0x00,
0x00,0x40,0x44,0x44,0x44,0x44,0x44,0x44,
0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00
};
unsigned char code qian16[]={
/* 点阵:16x16
   提取点阵方向:纵向
   字节掉转:是
   字节方式:C语言 */
0x08,0x08,0xE8,0x29,0x2A,0x2E,0xE8,0x08,    // 前
0x08,0xCC,0x0A,0x0B,0xE8,0x0C,0x08,0x00,
0x00,0x00,0xFF,0x09,0x49,0x89,0x7F,0x00,
0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,0x00
};
unsigned char code wen16[]={
/* 点阵:16x16
   提取点阵方向:纵向
   字节掉转:是
   字节方式:C语言 */
0x10,0x22,0x64,0x0C,0x80,0x00,0xFE,0x92,    // 温
0x92,0x92,0x92,0x92,0xFF,0x02,0x00,0x00,
0x04,0x04,0xFE,0x01,0x40,0x7E,0x42,0x42,
0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00
};
unsigned char code du16[]={
/* 点阵:16x16
   提取点阵方向:纵向
   字节掉转:是
   字节方式:C语言 */
0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0xA5,    // 度
0xA6,0xA4,0xFC,0x24,0x34,0x26,0x04,0x00,
0x40,0x20,0x9F,0x80,0x42,0x42,0x26,0x2A,
0x12,0x2A,0x26,0x42,0x40,0xC0,0x40,0x00
};
unsigned char code zero8[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
unsigned char code maohao8[]={
/*--  文字:  :  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00
};
unsigned char code num8[]={
/*--  文字:  0  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,

/*--  文字:  1  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,

/*--  文字:  2  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,

/*--  文字:  3  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,

/*--  文字:  4  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,

/*--  文字:  5  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,

/*--  文字:  6  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,

/*--  文字:  7  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,

/*--  文字:  8  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,

/*--  文字:  9  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00
};
unsigned char dot8[]={
/*--  文字:  .  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00
};
/*******************************************************************************************************/
void delay50ms(void)
{unsigned int TempCyc=5552;
while(TempCyc--);
}
/*******************************************************************************************************/
void wrc(unsigned char command)
{
P0=command;
di=0;
rw=0;
e=1;
e=0;

}
/*******************************************************************************************************/
void wrd(unsigned char dat)
{ 
P0=dat;
di=1;
rw=0;
e=1;
e=0;
}
/*******************************************************************************************************/
void cls()
{
unsigned char i,j;
for(i=0;i<8;i++)
	{
	wrc(startx0);
	wrc(starty0+i);	
	for(j=0;j<64;j++)
		{					
			wrd(0);
		}
	}
}
/*******************************************************************************************************/
void sys_init()
{ 
TMOD=V_TMOD;TH0=V_TH0;TL0=V_TL0;
	 TR0=1;ET0=1;EA=1;
}
/*******************************************************************************************************/
void lcd_init()
{
rw=0;
wrc(displayon);
wrc(0xc0);
csa=1;
csb=0;
cls();
csa=0;
csb=1;
cls();
}
/*******************************************************************************************************/
void lcd_show16(unsigned char x,unsigned char y,unsigned char *p,unsigned char blackin)
{
unsigned char i;
	x-=1;
	y-=1;
	x=x<<4;
	if(x<64)
		{
			csa=1;
    		csb=0;
		}
	else
		{
			csa=0;
			csb=1;
			x-=64;
		}
    y=y<<1;
	wrc(startx0+x);
	wrc(starty0+y);
	for(i=0;i<16;i++)
	{
	if(blackin) 
		wrd(~*p);
 	else		
		wrd(*p);
	p++;
	}
	wrc(startx0+x);
	wrc(starty0+y+1);
	for(i=0;i<16;i++)
	{
	if(blackin) 
		wrd(~*p);
 	else		
		wrd(*p);
	p++;
	}
}
/*******************************************************************************************************/
void lcd_show8(unsigned char x,unsigned char y,unsigned char *p,unsigned char blackin)
{
unsigned char i;
	x-=1;
	y-=1;
	x=x<<3;
	if(x<64)
		{
			csa=1;
    		csb=0;
		}
	else
		{
			csa=0;
			csb=1;
			x-=64;
		}
    y=y<<1;
	wrc(startx0+x);
	wrc(starty0+y);
	for(i=0;i<8;i++)
	{
	if(blackin) 
		wrd(~*p);
 	else		
		wrd(*p);
	p++;
	}
	wrc(startx0+x);
	wrc(starty0+y+1);
	for(i=0;i<8;i++)
	{
	if(blackin) 
		wrd(~*p);
 	else		
		wrd(*p);
	p++;
	}
}
/*******************************************************************************************************/
void show_ai(bit black)
{
unsigned char i;
cls();
 	lcd_show16(3,1,&ai16[0],black);
	lcd_show16(6,1,&ai16[0],black);
	lcd_show16(2,2,&ai16[0],black);
	lcd_show16(4,2,&ai16[0],black);
	lcd_show16(5,2,&ai16[0],black);
	lcd_show16(7,2,&ai16[0],black);
	lcd_show16(3,3,&ai16[0],black);
	lcd_show16(6,3,&ai16[0],black);
	lcd_show16(4,4,&ai16[0],black);
	lcd_show16(5,4,&ai16[0],black);
	for(i=0;i<100;i++)
		delay50ms();
		csa=1;csb=1;
		cls();
}
/*******************************************************************************************************/
void main()
{
unsigned char temp,m,n;
unsigned int temp1;
	lcd_init();	
	sys_init();
	show_ai(0);
	
	lcd_show16(1,1,&dang16[0],0);
	lcd_show16(2,1,&qian16[0],0);
	lcd_show16(3,1,&wen16[0],0);
	lcd_show16(4,1,&du16[0],0);
	lcd_show8(9,1,&maohao8[0],0);
	while(1)
	{ 
		tmstart();						//
		//dmsec(100);	//如果是不断地读取的话可以不延时	//
		tmrtemp();	
		temp=(a>>4)|(b<<4);
		temp&=0x7f;
		m=temp/100;
		temp%=100;
		n=temp/10;
		temp%=10;
		if(m==0)
			lcd_show8(10,1,&zero8[0],0);
		else
			lcd_show8(10,1,&num8[m<<4],0);
		lcd_show8(11,1,&num8[n<<4],0);
		lcd_show8(12,1,&num8[temp<<4],0);
		lcd_show8(13,1,&dot8[0],0);
		temp1=a&0x0f;
		temp1*=1000;
		temp1/=16;
		m=temp1/100;
		temp1%=100;
		n=temp1/10;
		temp1%=10;
		lcd_show8(14,1,&num8[m<<4],0);
		lcd_show8(15,1,&num8[n<<4],0);
		lcd_show8(16,1,&num8[temp1<<4],0);
	}

}
/*********************************************************************************************************/
void timer0() interrupt 1
{
   TH0=V_TH0;TL0=V_TL0;
}
/*********************************************************************************************************/
//国内网站上读取DS1820的C51源程序不多,基本上都是那几篇,我试过都不行
//后来我买了本书,按照上面照抄,连编译都通不过,后来经过多次测试,终于可以顺利读取了
//若有问题可与我联系jqdz2000@163.com

// 前面是单个DS1820温度读取程序,后面是四个DS1820温度读取程序。
//推荐用11.0592Mhz晶振,经试验用12M到24M都可以,6M就不行了。		

////////////////////////////////////////延时部分//////////////////////////
void dmsec (unsigned int count)	 					//
{									//
	unsigned int i;		       					//	
	while (count)							//
	{								//
		i = 115;						//
		while (i>0) i--;					//
		count--;						//
    }									//
}									//
//////////////////////////////////////////////////////////////////////////


/////////////////////////////////////// 发送复位//////////////////////////
void tmreset (void)							//
{		                  		 			//
	unsigned int i;							//
	TMDAT = 0;							//
	i = 103;							//
	while (i>0) i--;         	// 延时 900 uS(11.0592Mhz时)	//
	TMDAT = 1;							//
	i = 4;								//
	while (i>0) i--;						//
}									//
//////////////////////////////////////////////////////////////////////////

//判断DS1820是否存在的子程序。最好不要用,因为当器件不存在时将会进入死循环

////////////////////////////////////// 等待存在脉冲///////////////////////
void tmpre (void)			//判断器件是否存在		//
{                     							//
	unsigned int i;							//
	while (TMDAT);							//
	while (~TMDAT);							//
	i = 4; while (i>0) i--;						//
}									//
//////////////////////////////////////////////////////////////////////////


///////////////////////////////////// 读一位//////////////////////////////
bit tmrbit (void)							//
{                   							//  
	unsigned int i;							//
	bit dat;							//
	TMDAT = 0; i++;							//
	TMDAT = 1; i++; i++;		//微量延时			//
	dat = TMDAT;							//
	i = 8; while (i>0) i--;		// 延时				//
	return (dat);							//
}									//
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////// 读一个字节///////////////////////
unsigned char tmrbyte (void) 			 			//
{         								//
	unsigned char i,j,dat;						//
	dat = 0;							//
	for (i=1;i<=8;i++)						//
	{								//
		j = tmrbit ();						//
		dat = (j << 7) | (dat >> 1);				//
	}								//
	return (dat);							//
}									//
//////////////////////////////////////////////////////////////////////////

/////////////////////////////////////// 写一个字节////////////////////////
void tmwbyte (unsigned char dat)					//
{                							//
	unsigned int i;							//
	unsigned char j;						//
	bit testb;							//
	for (j=1;j<=8;j++)						//
	{								//
		testb = dat & 0x01;					//
		dat = dat >> 1;						//
		if (testb)						//
		{							//
			TMDAT = 0;                           // 写0 	//
			i++; i++;                            		//
			TMDAT = 1;					//
			i = 8; while (i>0) i--;              		//
		}							//
		else							//
		{							//
			TMDAT = 0;                           // 写0 	//
			i = 8; while (i>0) i--;              		//
			TMDAT = 1;					//
			i++; i++;                            		//
		}							//
	}								//
}									//
//////////////////////////////////////////////////////////////////////////

/////////////////////////////////发送ds1820 开始转换//////////////////////
void tmstart (void)							//
{                   							//
	tmreset ();		//复位					//
	//tmpre ();		//等待存在脉冲				//
	dmsec (1);		//延时					//
	tmwbyte (0xcc);		//跳过序列号命令			//
	tmwbyte (0x44); 	//发转换命令 44H,			//
}									//
//////////////////////////////////////////////////////////////////////////

/////////////////////////////////// 读取温度//////////////////////////////
void tmrtemp (void)							//
{                   							//	
	tmreset ();		//复位					//
	//tmpre ();		//等待存在脉冲				//
	dmsec (1);		//延时					//
	tmwbyte (0xcc); 	//跳过序列号命令			//
	tmwbyte (0xbe); 	//发送读取命令 				//
	a = tmrbyte ();		//读取低位温度				//
	b = tmrbyte ();  	//读取高位温度				//
}									//
//////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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