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

📄 tempdisplay.c

📁 温度控制系统的C程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*--------------------------------------------------------------------------
;     温度显示程序
;     程序最后修改于:2004年2月29日  21:20
----------------------------------------------------------------------------*/

/*------------------------------头文件说明----------------------------------*/
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>      //_nop_()
#include <absacc.h>       // XBYTE
#include <datastruct1.h>

#define uchar unsigned char
#define uint unsigned int

#define N     10
//#define TMAX  100
//#define TMIN   0
#define Umax   0x7fff
#define Uf    0x8000
#define a1    1.114e-12
#define a2    -3.8071e-8
#define a3    0.0023857
#define a4    0.092139
/*------------------------------CPU引脚定义---------------------------------*/
//t6963引脚分配
#define CWADD XBYTE[0x8100]                  //写指令代码地址
#define DWADD XBYTE[0x8000]                  //写数据通道地址
//MAX1169引脚分配
sbit SCL = P1^0; //定义串行时钟线所在口 使用时根据自己的需要来定义
sbit SDA = P1^1; //定义串行数据线所在口 使用时根据自己的需要来定义
//MAX5541引脚分配
sbit SCLK = P1^3; //定义串行时钟线所在口 使用时根据自己的需要来定义
sbit DIN  = P1^4; //定义串行数据线所在口 使用时根据自己的需要来定义
sbit DA_CS= P1^5; //MAX5541片选端


/*----------------------------全局变量定义---------------------------------*/
 uchar SystemError;
 uint  counter;           //中断次数
 float temp_data;
 float s;
 uint yk;
 signed int ek;


/*----------------------------功能子程序段---------------------------------*/
/*-------------------------------------------------------------------------
;定时器中断服务子程序
---------------------------------------------------------------------------*/
//定时器计数初值为50000
//定时100ms,中断30次
timer0() interrupt 1 using 1             
{
  counter++;
  TH0 = -100000/256;
  TL0 = -100000%256;
}

/*--------------------------------------------------------------------------
;t6963
---------------------------------------------------------------------------*/
//液晶显示器地址:p27--CS  P26--C/D  WR--WR  RD--RD 则
//                00 00 0000 0000 0000(数据通道)
//                01 00 0000 0000 0000(指令通道)
//               ;
//g6963.c--图形方式下的汉字、字符显示程序

void sta01(void)                           //判断状态位
{
   while((CWADD&3)!=3);

    }

void sta3(void)
{

while((CWADD&8)!=8);

	 }


//写指令和写数据子程序

void writecode(unsigned char com)             //写无参数指令
{  
   sta01();
   CWADD=com;
   }
void write1byte(unsigned char dat1,unsigned char com)    //写单字节参数指令
{  
   sta01();
   DWADD=dat1;
   sta01();
   CWADD=com;
   }

void write2byte(unsigned char dat1,unsigned char dat2,unsigned char com)
{                                                        //写双字节参数指令 
   
   sta01();
   DWADD=dat1;

   sta01();
   DWADD=dat2;

   sta01();
   CWADD=com;
   }


void disp_ini(void)                //显示屏初始化子程序
{
    write2byte(0x00,0x00,0x40);//设置显示区域首地址0000h
 	write2byte(0x10,0x00,0x41);//设置文本显示的宽度,即一行所占的字节数(12864t,16个8X8点阵字符)
	write2byte(0x00,0x08,0x42);//设置图形显示区域首地址0800h,或为文本属性区域首地址
	write2byte(0x10,0x00,0x43);//设置图形显示区域宽度,或为文本属性区域宽度(12864t,16个8x8点阵字符)

	writecode(0xa7);//光标形状设置
	writecode(0x9c);//显示开关设置,g\t all on!
	writecode(0x80);//显示方式设置,逻辑或合成

	}

void clearram(void)                //清屏程序
{   
    unsigned int  i;

    write2byte(0x00,0x00,0x24);//设置显示ram首地址0000h

	writecode(0xb0);           //设置自动写方式

	for(i=8192;i>0;i--)   //往显示区域写0;区域大小8k
	{
	   sta3();
	   DWADD=0;
	   };

	writecode(0xb2);              //关闭自动写指令

	}

/*-----------------------------------------------------------------------------------------------------
   汉字点阵,存储在程序存储器中
   点阵:16x16
   提取点阵方向:横向(先上->下, 再左->右)
   字节掉转:否
   字节方式:C语言 
-------------------------------------------------------------------------------------------------------*/

unsigned char code wen[32]={
0x00,0x43,0x32,0x12,0x83,0x62,0x22,0x0B,    // 温
0x10,0x27,0xE4,0x24,0x24,0x24,0x2F,0x20,
0x08,0xFC,0x08,0x08,0xF8,0x08,0x08,0xF8,
0x00,0xFC,0xA4,0xA4,0xA4,0xA4,0xFE,0x00};

unsigned char code du[32]={
0x01,0x00,0x3F,0x22,0x22,0x3F,0x22,0x23,    // 度
0x20,0x2F,0x22,0x21,0x20,0x43,0x8C,0x30,
0x00,0x84,0xFE,0x20,0x28,0xFC,0x20,0xE0,
0x00,0xF0,0x20,0x40,0x80,0x60,0x1E,0x04};

unsigned char code wei[32]={
0x00,0x10,0x0C,0x04,0x00,0xFF,0x01,0x01,    // 为
0x02,0x02,0x04,0x08,0x10,0x20,0x40,0x00,
0x80,0x80,0x80,0x80,0x84,0xFE,0x04,0x04,
0x04,0x84,0x64,0x24,0x04,0x04,0x28,0x10};

unsigned char code clearchar[16] = {            //擦除一个字符
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

unsigned char code dot[16]={ 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00
};

//本文件为8×16点阵西文字库文件,字的横向8点构成一字节,左边点在字节的高位,字符点阵四角按左上角→右上角→左下角→右下角取字*/
/*0    */
unsigned char code ch0[16]={
0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6,
0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00};

/*1    */
unsigned char code ch1[16]={
0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,
0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00};

/*2    */
unsigned char code ch2[16]={
0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30,
0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00};

/*3    */
unsigned char code ch3[16]={
0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06,
0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00};

/*4    */
unsigned char code ch4[16]={
0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE,
0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00};

/*5    */
unsigned char code ch5[16]={
0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E,
0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00};

/*6    */
unsigned char code ch6[16]={
0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6,
0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00};

/*7    */
unsigned char code ch7[16]={
0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18,
0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00};

/*8    */
unsigned char code ch8[16]={
0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6,
0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00};

/*9    */
unsigned char code ch9[16]={
0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06,
0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00
};




void gshowword(unsigned char y,unsigned char x,unsigned char *w_no) //图形方式下显示一个汉字字符(分为左右两半字模)
{        //128*64dots,x--显示在第x(0~15)字符列!,y--显示在第y(0~63)点阵!行,w_no为tab代码   
         //调用示例:gshowword(2,4,hao)  在第二行第四列显示"好" ----gshowword(点阵行,字符列,数组首地址)  
   unsigned int num;
   unsigned char d1,d2,i=16;
   num=y*16+x+0x800;                 //16--每行显示宽度为16个字符;0--图形显示区首地址为0800h
  
   
   
 for(i=16;i>0;i--)
  {    d1=num/256;                       //得到显示屏上汉字显示的相对位置
       d2=num%256;
       write2byte(d2,d1,0x24);
       write1byte(*w_no,0xc0);            //写汉字左代码
       write1byte(*(w_no+16),0xc0);       //写汉字右代码
       w_no++;
       num+=0x10;                         //显示ram地址修正

    	}

  }

void gshowchar(unsigned char y,unsigned char x,unsigned char *w_no) //图形方式下显示一个字符(分为左右两半字模)
{                    //128*64dots,x--显示在第x(0~15)字符列!,y--显示在第y(0~63)点阵!行,w_no为tab代码   
                     //调用示例:gshowword(2,4,hao)  在第二点阵行第四字符列显示"好"   
   unsigned int num;
   unsigned char d1,d2,i=16;
   num=y*16+x+0x800;                 //16--每行显示宽度为16个字符;0--图形显示区首地址为0800h
 
   for(i=16;i>0;i--)
    {   
       d1=num/256;                       //得到显示屏上汉字显示的相对位置
       d2=num%256;
       write2byte(d2,d1,0x24);
	   write1byte(*w_no,0xc0);            //写汉字左代码
  //     write1byte(*(w_no+16),0xc0);       //写汉字右代码
       w_no++;
	   num+=0x10;                         //显示ram地址修正
    	}

  }

 
//////////////////////////////////////////////////////////////////////////////////////////////

void disp5ch(unsigned char y,unsigned char x,unsigned long var) 
{           //带灭零处理及小数点的五位数显示子程序(可显示0.000~99.999),var指要显示的数据
    uchar d4,d3,d2,d1,d0;
    d4=var/10000;d3=(var%10000)/1000;d2=(var%1000)/100;d1=(var%1000)%100/10;d0=(var%1000)%100%10;
   
    if(d4==0)  gshowchar(y,x,clearchar);                   
    else gshowchar(y,x,ch0+0x10*d4);      //显示万位 
         
    if((d4==0)&&(d3==0)) {gshowchar(y,x,clearchar);gshowchar(y,x+1,clearchar);} 
    else gshowchar(y,x+1,ch0+0x10*d3);    //显示千位
    	
    gshowchar(y,x+2,dot);                    //显示小数点

     gshowchar(y,x+3,ch0+0x10*d2);    //显示百位

    gshowchar(y,x+4,ch0+0x10*d1);    //显示十位

    gshowchar(y,x+5,ch0+0x10*d0);         //显示个位
}


void disp()
{     
      float filter();
      double  temptrans(float x);
      s = filter();
	  temp_data = temptrans(s);

      disp_ini();
      clearram();	

      gshowword(2,4,wen);
      gshowword(2,6,du);
      gshowword(2,8,wei);
 
      disp5ch(36,6,(unsigned long )(temp_data*1000)) ;
      //  _nop_();
}


///////////////////////////////////////////////////////////////////////////////////////////////


⌨️ 快捷键说明

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