📄 csy.c
字号:
//深圳瑞特RT12864带M系列(控制器ST7920A),单片机:89S52,晶振:12M,
//并行连接方式,P2.7-RS,P2.1-RW,P2.2-E
//设计:TIMEN HUANG
#include<reg1210.h>
#include <intrins.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include "rom1210.h" //读写flash用
#define PAGE_SIZE 0x80 //读写flash用
extern long bipolar(void);//A/D转换用
#define LSB 298.0232e-9 //A/D转换用
//#include<syslib.h>
extern void autobaud(void);
sbit RS=P2^7;//串口时为CS
sbit RW=P2^1; //串口为SID
sbit E=P2^2; //串口为时钟SCLK
//D0---D7=P1
sbit up=P2^3;
sbit down=P2^4;
sbit enter=P2^5;
sbit retu=P2^6;
sbit TMDAT=P2^0; //温度数据引脚
/*sbit start=P2^7;
sbit run=P2^6;
sbit display=P3^3;
sbit close=P3^1;
*/
#define BF 0x80 //用于检测LCM状态字中的Busy标识
typedef unsigned int Uint;
typedef unsigned char Uchar;
//读写flash变量
char xdata *pFlashPage;
unsigned int xdata buffer[PAGE_SIZE];
//上为读写flash变量
//汉字,直接可以写入字形
//第一屏
float ph;
char sph[6];
int b;//行号
int s;//屏号
//xiao=modf(ph,*iptr1);
//zheng=floor(ph);
unsigned char code chinese1[] = {"pH 值"};
const Uchar lengthCF1=3;
unsigned char code chinese2[] = {"溶解氧"};
const Uchar lengthCF2=3;
unsigned char code chinese3[] = {"氟离子"};
const Uchar lengthCF3=3;
unsigned char code chinese4[] = {"温度值"};
const Uchar lengthCF4=3;
//pH第二屏显示内容
unsigned char code chinese5[] = {"不校验"};
const Uchar lengthCF5=3;
unsigned char code chinese6[] = {"酸性校验"};
const Uchar lengthCF6=4;
unsigned char code chinese7[] = {"碱性校验"};
const Uchar lengthCF7=4;
unsigned char code chinese8[] = {"返回上级菜单"};
const Uchar lengthCF8=6;
//DO第二屏显示内容,氟离子第二屏内容和DO相同
//unsigned char code chinese5[] = {"不校验"};
//const Uchar lengthCF5=3;
unsigned char code chinese9[] = {"校验"};
const Uchar lengthCF9=2;
//unsigned char code chinese7[] = {"碱性校验"};
//const Uchar lengthCF7=4;
//unsigned char code chinese8[] = {"返回上级菜单"};
//const Uchar lengthCF8=6;
//T第二屏显示内容
//unsigned char code chinese5[] = {"不校验"};
//const Uchar lengthCF5=3;
unsigned char code chinese10[] = {"开始温度测量"};
const Uchar lengthCF10=6;
unsigned char code chinese11[] = {"℃"};
const Uchar lengthCF11=1;
//unsigned char code chinese7[] = {"碱性校验"};
//const Uchar lengthCF7=4;
//unsigned char code chinese8[] = {"返回上级菜单"};
//const Uchar lengthCF8=6;
const Uchar delay=250; //延时时间常数
const Uchar delay1=1; //延时时间常数
static void Wait1ms1(void)//延迟1 ms
{
Uchar cnt=0;
while (cnt<delay1) cnt++;
}
static void Wait1ms(void)//延迟1 ms
{
Uchar cnt=0;
while (cnt<delay) cnt++;
}
//延迟n ms
void WaitNms(int n)
{
Uchar i;
for(i=1;i<=n;i++)
Wait1ms();
Wait1ms();
Wait1ms();
Wait1ms();
}
//**************************************************************************//
//以下是并口时才开的
//读忙标志,
void RDBF(void)
{
Uchar temp;
RS=0; // RS=0
RW=1; // RW=1
WaitNms(3);
while(1)
{
P1=0xFF; //数据线为输入
E=1;
WaitNms(3);
temp=P1;
// E=1;
// E=1;
Wait1ms1();
// WaitNms(3);
E=0; // E=0
//printf("调用完判忙函数\r\n");
if ((temp&0x80)==0) break;
// break;}
}
}
//写数据到指令寄存器
void WRCommand(Uchar comm)
{
//printf("调用WRcommd函数\r\n");
RDBF();
//printf("调用WRcommd函数\r\n");
RW=0;
E=1;
WaitNms(3);
P1=comm;
Wait1ms1();
E=0;
//printf("调用完WRcommd函数\r\n");
}
//写数据到数据寄存器
void WRData(Uchar TEMP)
{
RDBF();
RS=1;
RW=0;
E=1;
WaitNms(3);
P1=TEMP;
Wait1ms1();
E=0;
}
//初始化LCD-8位接口
void LCDInit(void)
{ // PSB=0; //串口
//PSB=1;//并口时选这个,上一行取消
//REST=1;
//REST=0;
// REST=1;
WRCommand(0x30); //基本指令集,8位并行
Wait1ms();
WRCommand(0x06); //启始点设定:光标右移
Wait1ms();
WRCommand(0x01); //清除显示DDRAM
Wait1ms();
WRCommand(0x0D); //显示状态开关:整体显示开,光标显示关,光标显示反白开
Wait1ms();
WRCommand(0x02); //地址归零
Wait1ms();
}
//显示数组字符串(显示半宽字型16*8点阵)
void ShowQQChar(Uchar addr,Uchar *english,Uchar count)
{
Uchar i;
WRCommand(addr); //设定DDRAM地址
for(i=0;i<count;)
{
WRData(english[i*2]);
Wait1ms();
WRData(english[i*2+1]);
Wait1ms();
i++;
}
}
//读flash存储器子程序
//page为页数取值范围0-7,byte_num为字节数,取值范围为0-127
int flash_read(int page,int byte_num)
{
unsigned int read_add;
read_add=0x400+0x80*page+byte_num; //实际地址
pFlashPage=(char xdata*)read_add;
buffer[0]=*pFlashPage;
if(buffer[0]>128)
buffer[0]+=256;
printf("buffer[0]=%d\n",buffer[0]);
return buffer[0];
}
//写flash存储器子程序
//page为页数取值范围0-7,byte_num为字节数,取值范围为0-127,write_data为要写入的数据
void flash_write(int page,int byte_num,int write_data)
{
unsigned int m,lead_add;
lead_add=0x400+0x80*page; //页首地址
pFlashPage=(char xdata*)lead_add;
for(m=0;m<128;m++)
buffer[m]=*pFlashPage++;
page_erase(lead_add,0x0ff,DATA_FLASH);
buffer[byte_num]=write_data;
for(m=0;m<128;m++)
write_flash_byte(lead_add+m,buffer[m],DATA_FLASH);
}
//温度显示开始
/*----------------------------------------------------
* 整型转换成字符型子程序
*----------------------------------------------------*/
unsigned inttochar(unsigned int int1)
{
unsigned char ch1;
switch(int1)
{
case(0):ch1='0';break;
case(1):ch1='1';break;
case(2):ch1='2';break;
case(3):ch1='3';break;
case(4):ch1='4';break;
case(5):ch1='5';break;
case(6):ch1='6';break;
case(7):ch1='7';break;
case(8):ch1='8';break;
case(9):ch1='9';break;
default:break;
}
return(ch1);
}
/*----------------------------------------------------
* 整型转换成浮点型子程序
*----------------------------------------------------*/
float inttofloat(unsigned int int1)
{
float ch1;
switch(int1)
{
case(0):ch1=0;break;
case(1):ch1=1;break;
case(2):ch1=2;break;
case(3):ch1=3;break;
case(4):ch1=4;break;
case(5):ch1=5;break;
case(6):ch1=6;break;
case(7):ch1=7;break;
case(8):ch1=8;break;
case(9):ch1=9;break;
default:break;
}
return(ch1);
}
/*----------------------------------------------------
* delay N count c里的一个while语句相当于汇编里的一个DJNZ语句,即两个机器周期
*----------------------------------------------------*/
void Delay_Count (unsigned char Count ) //延时时间为:(Count*2+5)*0.362 us
{
while(--Count);
}
/*----------------------------------------------------
* HEX->BCD查表程序,小数部分
*----------------------------------------------------*/
unsigned char hextobcd1(unsigned char tab)
{
unsigned int tab1;
switch(tab)
{
case(0x00): tab1=0x000; break;
case(0x01): tab1=0x001; break;
case(0x02): tab1=0x001; break;
case(0x03): tab1=0x002; break;
case(0x04): tab1=0x003; break;
case(0x05): tab1=0x003; break;
case(0x06): tab1=0x004; break;
case(0x07): tab1=0x004; break;
case(0x08): tab1=0x005; break;
case(0x09): tab1=0x006; break;
case(0x0A): tab1=0x006; break;
case(0x0B): tab1=0x007; break;
case(0x0C): tab1=0x008; break;
case(0x0D): tab1=0x008; break;
case(0x0E): tab1=0x009; break;
case(0x0F): tab1=0x009; break;
default: tab1=0x00;break;
}
return(tab1);
}
/*----------------------------------------------------
* start Reset Pulse
----------------------------------------------------*/
void tmreset(void)
{
TMDAT=0;
Delay_Count(255);
Delay_Count(255);
Delay_Count(255);
Delay_Count(255);
TMDAT=1;
Delay_Count(70);
while(TMDAT);
// printf("已调用完判忙函数3\r\n");
while(~TMDAT);
// printf("已调用完判忙函数2\r\n");
Delay_Count(255);
}
/*----------------------------------------------------
* start Reset Pulse
----------------------------------------------------/
void tmreset()
{
// P0=0xfe;
// FLAG1=0;
TMDAT=1;
Delay_Count(1); //2.5us
TMDAT=0;
Delay_Count(250); //505us
Delay_Count(250); //505us
Delay_Count(250); //505us
TMDAT=1;
Delay_Count(28); //61us
Delay_Count(28); //61us
Delay_Count(28); //61us
while(TMDAT);
// printf("初始化成功\n");
while(~TMDAT);
//printf("初始化成功1\n");
Delay_Count(110); //225us
Delay_Count(110); //225us
Delay_Count(110); //225us
}
/*----------------------------------------------------
* Read a bit from 1820
*----------------------------------------------------*/
bit tmrbit(void)
{
int i=0;
bit dat;
TMDAT=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TMDAT=1;
_nop_();
_nop_();
_nop_();
_nop_();
dat = TMDAT;
Delay_Count(30);
Delay_Count(30);
Delay_Count(30);
Delay_Count(30);
TMDAT=1;
return dat;
}
/*----------------------------------------------------
* Read a byte from 1820
*----------------------------------------------------*/
unsigned char tmrbyte()
{
unsigned char i,j,dat=0;
for(i=1;i<=8;i++)
{
j=tmrbit();
dat=(j<<7)|(dat>>1);
}
return dat;
}
/*----------------------------------------------------
* Write a byte from 1820
*----------------------------------------------------*/
void tmwbyte(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
TMDAT=0;
_nop_();
_nop_();
_nop_();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -