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

📄 液晶和按键.c

📁 这是一个用keil-51编写的C51程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg51.h> 
#include<stdio.h>
#include "FM12864.h"
#include <string.h>
#include<intrins.h>
#include<math.h>


#define uchar unsigned char
#define uint unsigned int

unsigned char counts[4]={0};   //时间寄存
extern unsigned char Data[4];  //实际温度寄存
unsigned char set_Data[4]={0}; //设定温度寄存
unsigned char time=0;		   //中断循环次数

/**********PWM部分***********/
sbit input1=P1^1;	//pwmP1^7  信号灯
sbit input2=P1^0;	//控制场管的方波输出
sbit dianji=P1^7;	//电机控制
//sbit add_pwm=P2^0;	//P3^2
//sbit sub_pwm=P2^1;	//P3^3
//unsigned char jj,aa=20;
/****************************/

/*************模式选择***************/
sbit k1=P2^0;
sbit k2=P2^1;

void moshi(void);
unsigned char flag_moshi=0;
void LCD_show2(uchar i,uchar p[],uchar m);
void show_message1(void);

/************************************/


/*************PID**********************************/
struct PID {
unsigned int SetPoint; // 设定目标 Desired Value
unsigned int Proportion; // 比例常数 Proportional Const
unsigned int Integral; // 积分常数 Integral Const
unsigned int Derivative; // 微分常数 Derivative Const
unsigned int LastError; // Error[-1]
unsigned int PrevError; // Error[-2]
unsigned int SumError; // Sums of Errors
};
struct PID spid; // PID Control Structure
unsigned int rout; // PID Response (Output)
unsigned int rin; // PID Feedback (Input)

unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint );
void compare_temper();
void con_temp();	 //发挥模式
void con_temp1();	 //基本模式
unsigned char high_time,low_time,count=0;//占空比调节参数
unsigned char temper; 

/****************************************************/




/**************************温度传感器申明函数*******************************/
void delay(uint t);
ow_reset(void);
void write_byte(uchar val);
uchar read_byte(void);
void read_temp();
void work_temp();
/**************************************************************************/

/***************************液晶显示函数申明******************************/
void display( uchar x_add, uchar *dat1, uchar *dat2 );	//显示2个数字
void display1( uchar x_add, uchar *dat1);	//显示 .数字
void display2( uchar x_add, uchar *dat1);   //显示 数字_
void LCD_show1(uchar i,uchar p[],uchar m);	 //显示汉字(m可以规定显示多少个汉字)
void Delay(int num); //对液晶显示汉字的延时
void show_data(void);//液晶显示温度数字	   
/*************************************************************************/

/*************************管脚定义****************************************/
sbit TMDAT=P3^7; 	//温度传感器 	
sbit RS=P2^4;		//液晶管脚定义 2^0
sbit RW=P2^5;		//液晶管脚定义 2^1
sbit EN=P2^6;		//液晶管脚定义 2^2
sbit PSB=P2^7;		//液晶管脚定义 2^3
sbit beep=P1^2;		//警报


/********************温度设定部分****************************************/
unsigned char begin=48; //温度初始值 
sbit add=P2^2;		//设定温度+
sbit sub=P2^3;		//设定温度-
void getkey();		//按键函数
void delay10ms(void);   //按键延时函数


/*************************************************************************/

/********************  液晶要显示的汉字  ********************************/
uchar code hanzi1[]={"℃"};
uchar code hanzi2[]={"程序温度控制系统"};
uchar code hanzi3[]={"设置"};
uchar code hanzi31[]={"温度"};
uchar code hanzi4[]={"实际"};
uchar code hanzi5[]={"时间"};
uchar code hanzi6[]={"秒"};


uchar code hanzi21[]={"按K1进入基本模式"};
uchar code hanzi22[]={"按K2进入发挥模式"};
/************************************************************************/
void main(void)
{
/*******************串口调试*********************** 
    TMOD=0x20;			
	SCON=0x52;
	TH1=0xfd;
	TL1=0xfd;
	PCON=0x00;
	TR1=1;
	ES  = 1;
	EA=1; 
/*************************************************/
	
/****************时间+外部中断********************/
          /*定时计数器0工作在 定时方式1*/


/*************************************************/
	TMOD=0x11;	
	TH0=0x4c;
  	TL0=0x00;
   
	ET0 = 1;
	TR0 = 1;

	ET1=1;
	TR1=1;

	EA = 1;	
/*****外部中断*** 
    EX0=1;	
	EX1=1;
	IT1=1;
	IT0=1;
/****************/
/************************************************/          
	
	PSB=1;
	SET_LCD();				/* 初始化LCD */						
//	show_message();	        /* 显示相应汉字 */	
	
/**********温度传感器*******************/
	 
	 write_byte(0xcc);
	 write_byte(0x44);
	 	
/**************************************/

/****************pid初始化*********************/

	high_time=50;                 
	low_time=50;
	spid.Proportion = 10; // Set PID Coefficients
	spid.Integral = 8;
	spid.Derivative =6;
	spid.SetPoint = begin; // Set PID Setpoint


	show_message1();
/**********************************************/
	 while(1)
	  {
		 
		 if(k2==0)
		  { 	
			 delay10ms();
			 if(k2==0)
			  {	
			    write_c(0x01);
			    while(1)
				  {
			   	  	 show_message();
					 show_data();
					 getkey();
			         con_temp(); 
			      }
			   }

		  }	while(k2==0);
		  
		  if(k1==0)
		   {

		   	  delay10ms();
			  if(k1==0)
			  {
			  	 write_c(0x01);
				 while(1)
				  {
				     show_message();
					 show_data();
					 getkey();
			         con_temp1(); 
				  }
			  }
		   }  while(k1==0);
		  
		  		  
	  }				  
						   
	
}

void show_data(void)
{
	    ow_reset();
		read_temp();
        work_temp();
		display(0x8c,&Data[2],&Data[1]);	    //显示实际温度整数部分
		display1(0x8d,&Data[0]);			    //显示实际温度小数部分
        
		set_Data[0]=begin%100/10;
		set_Data[1]=begin%10;
		display(0x94,&set_Data[0],&set_Data[1]); //显示设定温度整数部分
		display1(0x95,&set_Data[2]);		    //显示设定温度小数部分

		display(0x9a,&counts[0],&counts[1]);		
		display(0x9b,&counts[2],&counts[3]);		
}

void SET_LCD(void)							/* 初始化函数 */
{
		EN=0;
		write_c(0x34);							/* 扩充指令操作 */
		write_c(0x30);							/* 基本指令操作 */
		write_c(0x0c);//0x0c不显示光标0x0e显示光标位置但不闪烁;开显示,开光标 开游标0x0f 
		write_c(0x01);							/* 清除LCM显示屏 */
		write_c(0x14);							 //反白显示
	
}

void write_c(uchar cmd)						/* 写指令函数 */
{
		P0=cmd;
		RS=0;
		RW=0;
		EN=1;
		Delay();
		EN=0;	
}


void write_d(uchar dat)						/* 写数据函数 */
{
		P0=dat;
		RS=1;
		RW=0;
		EN=1;
		Delay();
		EN=0;
}

void Delay(void)							  /* 延时函数 */
{
		uchar i;
		
		for(i=0;i<250;i++)
		{
				;
		} 	
}
 
void show_message(void)					       	/* 显示汉字信息 */
{
		
		
		LCD_show1(1,hanzi2,16);	     //程序温度控制系统 
		Delay();
		LCD_show1(2,hanzi3,4);	     //设置
		Delay();
		LCD_show1(21,hanzi31,4);	 //温度
		Delay();
		LCD_show1(3,hanzi4,4);	     //实际
		Delay();
		LCD_show1(31,hanzi31,4);	 //温度
		Delay();
		LCD_show1(4,hanzi5,4);	     //时间
		Delay();
		LCD_show1(5,hanzi6,2);	     //秒
		Delay();
		LCD_show1(6,hanzi1,2);	     //℃
		Delay();
		LCD_show1(7,hanzi1,2);	     //℃
		Delay();
}


/************************************************************/

void show_message1(void)
{
	   LCD_show2(1,hanzi21,16);	     //按K1进入基本模式
	   Delay();	

	   LCD_show2(2,hanzi22,16);	     //按K2进入发挥模式
	   Delay();	
}


void LCD_show1(uchar i,uchar p[],uchar m)				/* LCD显示多个汉字函数 */
{
		uchar dizi,daima;
	
		uchar k;
		uchar j;
	
		k=i;
		switch(k)
		{
			 
				case 1:  dizi=0x80; break;	  //程序温度控制系统
				case 2:  dizi=0x90; break;     //设置
				case 21: dizi=0x92; break;	  //温度
			    case 3:  dizi=0x88; break;	  //实际
				case 31: dizi=0x8a; break;	  //温度
				case 4:  dizi=0x98; break;	  //时间
			    case 5:  dizi=0x9c; break;     //秒
				case 6:  dizi=0x96; break;	  //℃
				case 7:  dizi=0x8e; break;	  //℃

				default : break;
		}

		write_c(dizi);
		CLR_line(dizi);
		write_c(dizi);

		for(j=0;j<m;j++)
		{
				daima=p[j];
				write_d(daima);
		}
}
/*******************************************************************/
void LCD_show2(uchar i,uchar p[],uchar m)				/* LCD显示多个汉字函数 */
{
		uchar dizi,daima;
	
		uchar k;
		uchar j;
	
		k=i;
		switch(k)
		{
			 
				case 1:  dizi=0x80; break;	   //按K1进入基本模式
				case 2:  dizi=0x90; break;     //按K2进入发挥模式
                default : break;
		}

		write_c(dizi);
		CLR_line(dizi);
		write_c(dizi);

		for(j=0;j<m;j++)
		{
				daima=p[j];
				write_d(daima);
		}
}


void display( uchar x_add, uchar *dat1, uchar *dat2 ) //显示2个数字
{
     write_c( x_add );//1xxx,xxxx 设定DDRAM 7位地址xxx,xxxx到地址计数器AC
     write_d( 0x30+  *dat1 );
     write_d( 0x30+  *dat2 );
	 // 	 write_d(0x2e);
	//	 write_d(0x03);

⌨️ 快捷键说明

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