📄 液晶和按键.c
字号:
#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 + -