📄 tempdisplay.c
字号:
/*--------------------------------------------------------------------------
; 温度显示程序
; 程序最后修改于: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 + -