0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

12位AD DS1621与12864液晶的单片机程序概述

2oON_changxuemc 来源:未知 作者:易水寒 2018-07-19 16:46 次阅读

DS1621与lcd12864和单片机接口仿真原理图



//EDM12864B DRIVE//

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

PAGEADD为页地址起使

TIERADD为行地址起使

DIS_STARTADD为开始命令

CTABLE为汉字字库数组

ETABLE为英文字库数组

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

#include

#define uchar unsigned char

#define uint unsigned int

#define High 1

#define Low 0

#define _nop {}

#define PAGEADD 0xb8

#define TIERADD 0x40

#define DIS_STARADD 0xc0

uint key_value;

sbit DI=P1^4;

sbit E=P1^2;

sbit CS1=P1^1;

sbit CS2=P1^0;

sbit RW=P1^3;

sbit cs=P1^7;

sbit sclk=P1^6;

sbit dout=P1^5;

sbit I2C_SCL = P3^7;

sbit I2C_SDA = P3^6;

//uchar ntable[]={61,49,57,60,19,49,62,49,60,63,55,2,0,0,6,22,56,

//63,68,61,49,57,60,17,51,63,61};//email:analog2006@hotmail.com

uchar data voltage_display[8];

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

字符表

显示"Welcome Use"

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

uchar code table1[]={

0x00,0x3e,0x51,0x49,0x45,0x3e,0x00,0x00,//0(0)

0x00,0x00,0x42,0x7f,0x40,0x00,0x00,0x00,//1

0x00,0x42,0x61,0x51,0x49,0x46,0x00,0x00,//2

0x00,0x21,0x41,0x45,0x4b,0x31,0x00,0x00,//3

0x00,0x18,0x14,0x12,0x7f,0x10,0x00,0x00,//4

0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00,//5

0x00,0x3c,0x4a,0x49,0x49,0x30,0x00,0x00,//6

0x00,0x01,0x01,0x79,0x05,0x03,0x00,0x00,//7

0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00,//8

0x00,0x06,0x49,0x49,0x29,0x1e,0x00,0x00,//9

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// (10)

0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x00,//!

0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00,//%

0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00,//&

0x00,0x14,0x08,0x3e,0x08,0x14,0x00,0x00,//*

0x00,0x08,0x08,0x3e,0x08,0x08,0x00,0x00,//+

0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00,//-

0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,//.

0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00,///

0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,//:(19)

0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00,//=

0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00,//?

0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00,//@(22)

0x00,0x7e,0x11,0x11,0x11,0x7f,0x00,0x00,//A

0x00,0x41,0x7f,0x49,0x49,0x36,0x00,0x00,//B

0x00,0x3e,0x41,0x41,0x41,0x22,0x00,0x00,//C

0x00,0x41,0x7f,0x41,0x41,0x3e,0x00,0x00,//D

0x00,0x7f,0x49,0x49,0x49,0x49,0x00,0x00,//E

0x00,0x7f,0x09,0x09,0x09,0x01,0x00,0x00,//F

0x00,0x3e,0x41,0x41,0x49,0x7a,0x00,0x00,//G(29)

0x00,0x7f,0x08,0x08,0x08,0x7f,0x00,0x00,//H

0x00,0x00,0x41,0x7f,0x41,0x00,0x00,0x00,//I

0x20,0x40,0x41,0x3f,0x01,0x01,0x00,0x00,//J

0x00,0x7f,0x08,0x14,0x22,0x41,0x00,0x00,//K

0x00,0x7f,0x40,0x40,0x40,0x40,0x00,0x00,//L

0x00,0x7f,0x02,0x0c,0x02,0x7f,0x00,0x00,//M

0x00,0x7f,0x06,0x08,0x30,0x7f,0x00,0x00,//N

0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00,//O

0x00,0x7f,0x09,0x09,0x09,0x06,0x00,0x00,//P

0x00,0x3e,0x41,0x51,0x21,0x5e,0x00,0x00,//Q(39)

0x00,0x7f,0x09,0x19,0x29,0x46,0x00,0x00,//R

0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00,//S

0x00,0x01,0x01,0x7f,0x01,0x01,0x00,0x00,//T

0x00,0x3f,0x40,0x40,0x40,0x3f,0x00,0x00,//U

0x00,0x1f,0x20,0x41,0x20,0x1f,0x00,0x00,//V

0x00,0x7f,0x20,0x80,0x20,0x7f,0x00,0x00,//W

0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00,//X

0x00,0x07,0x08,0x70,0x08,0x07,0x00,0x00,//Y

0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00,//Z

0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00,//a(49)

0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00,//b

0x00,0x38,0x44,0x44,0x44,0x28,0x00,0x00,//c

0x00,0x38,0x44,0x44,0x48,0x7f,0x00,0x00,//d

0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00,//e

0x00,0x00,0x08,0x7e,0x09,0x02,0x00,0x00,//f

0x00,0x0c,0x52,0x52,0x4c,0x3e,0x00,0x00,//g

0x00,0x7f,0x08,0x04,0x04,0x78,0x00,0x00,//h

0x00,0x00,0x44,0x7d,0x40,0x00,0x00,0x00,//i

0x00,0x20,0x40,0x44,0x3d,0x00,0x00,0x00,//j

0x00,0x00,0x7f,0x10,0x28,0x44,0x00,0x00,//k(59)

0x00,0x00,0x41,0x7f,0x40,0x00,0x00,0x00,//l

0x00,0x7c,0x04,0x78,0x04,0x78,0x00,0x00,//m

0x00,0x7c,0x08,0x04,0x04,0x78,0x00,0x00,//n

0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x00,//o

0x00,0x7e,0x0c,0x12,0x12,0x0c,0x00,0x00,//p

0x00,0x0c,0x12,0x12,0x0c,0x7e,0x00,0x00,//q

0x00,0x7C,0x08,0x04,0x04,0x08,0x00,0x00,//r

0x00,0x58,0x54,0x54,0x54,0x64,0x00,0x00,//s

0x00,0x04,0x3f,0x44,0x40,0x20,0x00,0x00,//t

0x00,0x3c,0x40,0x40,0x3c,0x40,0x00,0x00,//u(69)

0x00,0x1c,0x20,0x40,0x20,0x1c,0x00,0x00,//v

0x00,0x3c,0x40,0x30,0x40,0x3c,0x00,0x00,//w

0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00,//x

0x00,0x1c,0xa0,0xa0,0x90,0x7c,0x00,0x00,//y

0x00,0x44,0x64,0x54,0x4c,0x44,0x00,0x00,//z(74)

};

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

中文字符表

显示"欢迎使用液晶模块"

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

uchar code table2[]={

0x14,0x24,0x44,0x84,0x64,0x1c,0x20,0x18,

0x0f,0xe8,0x08,0x08,0x28,0x18,0x08,0x00,

0x20,0x10,0x4c,0x43,0x43,0x2c,0x20,0x10,

0x0c,0x03,0x06,0x18,0x30,0x60,0x20,0x00,//欢(0)

0x40,0x41,0xce,0x04,0x00,0xfc,0x04,0x02,

0x02,0xfc,0x04,0x04,0x04,0xfc,0x00,0x00,

0x40,0x20,0x1f,0x20,0x40,0x47,0x42,0x41,

0x40,0x5f,0x40,0x42,0x44,0x43,0x40,0x00,//迎(1)

0x40,0x20,0xf0,0x1c,0x07,0xf2,0x94,0x94,

0x94,0xff,0x94,0x94,0x94,0xf4,0x04,0x00,

0x00,0x00,0x7f,0x00,0x40,0x41,0x22,0x14,

0x0c,0x13,0x10,0x30,0x20,0x61,0x20,0x00,//使(2)

0x00,0x00,0x00,0xfe,0x22,0x22,0x22,0x22,

0xfe,0x22,0x22,0x22,0x22,0xfe,0x00,0x00,

0x80,0x40,0x30,0x0f,0x02,0x02,0x02,0x02,

0xff,0x02,0x02,0x42,0x82,0x7f,0x00,0x00,//用(3)

0x10,0x61,0x06,0xe0,0x18,0x84,0xe4,0x1c,

0x84,0x65,0xbe,0x24,0xa4,0x64,0x04,0x00,

0x04,0x04,0xff,0x00,0x01,0x00,0xff,0x41,

0x21,0x12,0x0c,0x1b,0x61,0xc0,0x40,0x00,//液(4)

0x00,0x00,0x00,0x00,0x7e,0x2a,0x2a,0x2a,

0x2a,0x2a,0x2a,0x7e,0x00,0x00,0x00,0x00,

0x00,0x7f,0x25,0x25,0x25,0x25,0x7f,0x00,

0x00,0x7f,0x25,0x25,0x25,0x25,0x7f,0x00,//晶(5)

0x10,0xd0,0xff,0x50,0x90,0x04,0xf4,0x54,

0x5f,0x54,0x54,0x5f,0xf4,0x04,0x00,0x00,

0x03,0x00,0xff,0x00,0x00,0x84,0x85,0x45,

0x35,0x0f,0x15,0x25,0x65,0xc4,0x44,0x00,//模(6)

0x10,0x10,0xff,0x10,0x10,0x00,0x08,0x08,

0xff,0x08,0x08,0x08,0xf8,0x00,0x00,0x00,

0x08,0x18,0x0f,0x04,0x85,0x41,0x31,0x0d,

0x03,0x05,0x09,0x11,0x31,0x61,0x21,0x00,//块(7)

0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,

0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,

0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,

0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00,//电(8)

0x00,0x00,0xFE,0x02,0x42,0x42,0x42,0x42,

0xFA,0x42,0x42,0x42,0x62,0x42,0x02,0x00,

0x20,0x18,0x27,0x20,0x20,0x20,0x20,0x20,

0x3F,0x20,0x21,0x2E,0x24,0x20,0x20,0x00,//压(9)

0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,

0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00,

0x02,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,

0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00,//温(10)

0x00,0x00,0xFC,0x04,0x24,0x24,0xFC,0xA5,

0xA6,0xA4,0xFC,0x24,0x24,0x24,0x04,0x00,

0x80,0x60,0x1F,0x80,0x80,0x42,0x46,0x2A,

0x12,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00,//度(11)

0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,

0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,

0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,

0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,//测(12)

0x40,0x40,0x40,0xDF,0x55,0x55,0x55,0xD5,

0x55,0x55,0x55,0xDF,0x40,0x40,0x40,0x00,

0x40,0x40,0x40,0x57,0x55,0x55,0x55,0x7F,

0x55,0x55,0x55,0x57,0x50,0x40,0x40,0x00,//量(13)

};

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

显示用的延时函数

延时长度有参数 n 决定

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

Delay_nms(uchar n)

{ uchar a;

for(;n>0;n--)

{

for(a=0;a<100;a++)

{

_nop;

_nop;

_nop;

_nop;

};

};

}

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

DEM12864B状态检测,从EDM12864B读出数

据检测标志位BF

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

void LCD_Busy()

{

uchar busy;

E=Low;

DI=Low;

RW=High;

while(1)

{

E=High;

_nop;

_nop;

busy=P2;//读状态标志寄存器

_nop;

E=Low;

if((busy&0x90)==0)//检测BF和RES位,两者都为零时表示可进行写入

break;

};

}

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

写指令

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

void WRCommand_L(uchar command)

{

CS1=High;

CS2=Low;

LCD_Busy();

DI=Low;

_nop;

RW=Low;

_nop;

E=High;

_nop;

P2=command;

_nop;

E=Low;

_nop;

}

void WRCommand_R(uchar command)

{

CS1=Low;

CS2=High;

LCD_Busy();

DI=Low;

_nop;

RW=Low;

_nop;

E=High;

_nop;

P2=command;

_nop;

E=Low;

_nop;

}

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

写一个字节的显示数据

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

void WRdata_L(uchar ucdata)

{

CS1=High;

CS2=Low;

LCD_Busy();

DI=High;

_nop;

RW=Low;

_nop;

E=High;

_nop;

P2=ucdata;

_nop;

E=Low;

_nop;

}

void WRdata_R(uchar ucdata)

{

CS1=Low;

CS2=High;

LCD_Busy();

DI=High;

_nop;

RW=Low;

_nop;

E=High;

_nop;

P2=ucdata;

_nop;

E=Low;

_nop;

}

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

读显示数据

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

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

RDdata_L()

{

uchar receiver;

CS1=High;

CS2=Low;

LCD_Busy();

DI=High;

_nop;

WR=High;

_nop;

E=High;

_nop;

receiver=P0;

E=Low;

return(receiver);

}

RDdata_R()

{

uchar receiver;

CS1=Low;

CS2=High;

LCD_Busy();

DI=High;

_nop;

WR=High;

_nop;

E=High;

_nop;

receiver=P0;

E=Low;

return(receiver);

}

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

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

I2C时钟时序要求的数据建立时间,

nop_可以用其它短延时替代,比如喂狗

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

I2C_delay()

{

uchar n=5;

while(n--)

{

_nop;

_nop;

}

}

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

I2C的时钟信号可发送和接收.

接收时通过判断sample对寄存器的值加.

发送的时候只调用程序产生时序.

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

bit I2C_clock(void)

{

bit sample;

I2C_delay();

I2C_SCL=High;

I2C_delay();

sample=I2C_SDA;

I2C_SCL=Low;

I2C_delay();

return(sample);

}

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

I2C确定接收有效的应答信号Acknowledge

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

I2C_ACK()

{

I2C_SDA=Low;

I2C_clock();

I2C_SDA=High;

}

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

I2C的非应答信号

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

I2C_NACK()

{

I2C_SDA=High;

I2C_clock();

I2C_SDA=High;

}

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

I2C的开始信号.发送和接受数据时,必须先调用.

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

I2C_start()

{

I2C_SDA=High;

I2C_delay();

I2C_SCL=High;

I2C_delay();

I2C_SDA=Low;

I2C_delay();

I2C_SCL=Low;

I2C_delay();

}

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

I2C停止信号.发送和接受数据时结束时,需要调用.

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

I2C_stop()

{

I2C_SDA=Low;

I2C_delay();

I2C_SCL=High;

I2C_delay();

I2C_SDA=High;//产生停止控制信号,并且释放数据线

I2C_delay();

}

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

I2C初始化.在main函数中必须先调用它.

进行初始化后才能调用其他函数.

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

void I2C_init(void)

{

I2C_SDA=High;

I2C_SCL=High;

I2C_delay();

I2C_stop();

}

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

I2C总线写一个字节,即发送一个字节

发送结束后,需要返回一个检测应答位

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

bit I2C_send(uchar I2C_data)

{

uchar a;

for(a=0;a<8;a++)

{

I2C_SDA=(bit)(I2C_data&0x80);

I2C_data=I2C_data<<1;

I2C_clock();

};

I2C_SDA=High;

I2C_delay();

return(I2C_clock()); //返回应答信号

}

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

I2C总线读一个字节,即接收一个字节数据

接收结束后需要发送一个应答位acknowledge

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

uchar I2C_receive()

{

uchar a,receive_data;

for(a=0;a<8;a++)

{

receive_data=receive_data<<1;

if(I2C_clock())

{

receive_data++;

};

};

//I2C_ACK();

return(receive_data);

}

DS1621_start()

{

do

{

I2C_start();

}

while(I2C_send(0x90));//发送数据完地址字节的数据时,检测从机的应答位

if(I2C_send(0xee)==0)

{

I2C_stop();

return 1;

}

else

return 0;

}

DS1621_stop()

{

do

{

I2C_start();

//I2C_send(0x90);

}

while(I2C_send(0x90));

if(I2C_send(0x22)==0)

{

I2C_stop();

return 1;

}

else

return 0;

}

char read_count_remain()

{

char temp_remain=0;

do

{

I2C_start();

}

while(I2C_send(0x90));//是否应答

if(I2C_send(0xa8)==0)

{

I2C_start();

if(I2C_send(0x91)==0)

{

temp_remain=I2C_receive();

I2C_NACK();

I2C_stop();

return temp_remain;

}

else

return 0;

}

else

return 0;

}

char read_count_c()

{

char temp_c=0;

do

{

I2C_start();

}

while(I2C_send(0x90));//是否应答

if(I2C_send(0xa9)==0)

{

I2C_start();

if(I2C_send(0x91)==0)

{

temp_c=I2C_receive();

I2C_NACK();

I2C_stop();

return temp_c;

}

else

return 0;

}

else

return 0;

}

bit read_temperature(char *point1)

{

do

{

I2C_start();

}

while(I2C_send(0x90));

if(I2C_send(0xaa)==0)

{

do{

I2C_start();

}

while(I2C_send(0x91));

(*point1)=I2C_receive();

I2C_ACK();

(*(point1+1))=I2C_receive();

I2C_NACK();

I2C_stop();

return 1;

}

else

return 0;

}

DS1621_state()

{

do

{

I2C_start();

}

while(I2C_send(0x90));

if(I2C_send(0xac)==0)

{

do

{

I2C_start();

}

while(I2C_send(0x90));

if(I2C_send(0x00)==0)

//if(I2C_send(0x01)==0)

{

I2C_stop();

return 1;

}

else

return 0;

}

else

return 0;

}

DS1621_th()

{

}

DS1621_tl()

{

}

DS1621_init()

{

while(DS1621_stop()==0)

{};

while(DS1621_state()==0)

{};

DS1621_th();

DS1621_tl();

}

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

字符为16*16显示,分为两个部分写入32个字节

前16个字节写入第一页(16*8),后16个字节写入

第二页(16*8)

左侧写入"欢迎",右侧写入"使用"

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

C_display_L(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp)

{

uchar k;

C_Pagenum=PAGEADD|C_Pagenum;

C_Tiernum=TIERADD|C_Tiernum;

WRCommand_L(C_Pagenum);

WRCommand_L(C_Tiernum);

for(k=0;k<16;k++)

{

WRdata_L(table2[C_Temp*32+k]);

};

C_Pagenum=C_Pagenum+1;

WRCommand_L(C_Pagenum);

WRCommand_L(C_Tiernum);

for(k=0;k<16;k++)

{

WRdata_L(table2[C_Temp*32+k+16]);

};

}

C_display_R(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp)

{

uchar k;

C_Pagenum=PAGEADD|C_Pagenum;

C_Tiernum=TIERADD|C_Tiernum;

WRCommand_R(C_Pagenum);

WRCommand_R(C_Tiernum);

for(k=0;k<16;k++)

{

WRdata_R(table2[C_Temp*32+k]);

};

C_Pagenum=C_Pagenum+1;

WRCommand_R(C_Pagenum);

WRCommand_R(C_Tiernum);

for(k=0;k<16;k++)

{

WRdata_R(table2[C_Temp*32+k+16]);

};

}

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

写入西文字符,共11个字符,左侧写入6个

右侧写入5个,左侧起始从16开始,右侧从

0开始

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

E_Display_L(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp)

{

uchar k;

WRCommand_L(PAGEADD|E_Pagenum);

WRCommand_L(TIERADD|E_Tiernum);

for(k=0;k<8;k++)

{

WRdata_L(table1[E_Temp*8+k]);

};

}

E_Display_R(uchar E_Pagenum,uchar E_Tiernum,uchar E_Temp)

{

uchar k;

WRCommand_R(PAGEADD|E_Pagenum);

WRCommand_R(TIERADD|E_Tiernum);

for(k=0;k<8;k++)

{

WRdata_R(table1[E_Temp*8+k]);

};

}

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

清除所有显示RAM内容

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

CLR_DisplayRAM()

{

uchar C_page,i,k;

for(i=0;i<8;i++)

{

C_page=PAGEADD|i;//清除起始页为0

WRCommand_L(C_page);//清除起始页写入

WRCommand_L(TIERADD);//清除起始行地址写入

WRCommand_R(C_page);

WRCommand_R(TIERADD);

for(k=0;k<64;k++)

{

WRdata_L(0x00);

WRdata_R(0x00);//lcm的ram自动加一,只许循环64次即可

};

};

}

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

初始化 设置启使行

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

void Init_LCD(void)

{

CLR_DisplayRAM();//清除所有显示寄存器

WRCommand_L(DIS_STARADD);

WRCommand_R(DIS_STARADD);//设置显示起始行地址

WRCommand_L(0x3f);

WRCommand_R(0x3f);//开显示

}

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

max1241读转换结果

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

uint read_max1241()

{

uint voltage_temp=0;

uchar ucloop=12;

cs=High;

//dout=low;

sclk=Low;

cs=Low;

while(dout==0);//EOC信号为高表示转换结束

sclk=High;

sclk=Low;

while(ucloop--)

{

sclk=High;//上升沿数据稳定并读出

voltage_temp<<=1;

if(dout==1)

voltage_temp+=1;

sclk=Low;

};

//sclk=low;

cs=High;

return voltage_temp;

}

main()

{

uchar a=0,temp=0,b=0,number=0,pagenum=0;

uchar etable[]={0,0,0,0,0,45,53,60,51,63,61,53,10,69,67,53};//Welcome use

uchar ttable[]={42,57,61,53,19,10,2,0,0,6,18,1,1,18,0,7};//Time:2006/11/07

char count_remain=0,count_c=0;

bit flag=1;

char temperature_buf[2]={0};

uchar temperature_display[8]={0};

//uchar voltage=0; //测试0831时使用

double voltage=0;

double temp_buffer=0;

cs=High;

sclk=High;

Init_LCD();

I2C_init();

DS1621_init();//初始化

DS1621_start();//开始温度采集

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

利用开机显示时间(大概三秒)空读一次DS1621

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

for(b=0;b<2;b++)

{

for(number=0;number<20;number++)

{

//中文显示:欢迎使用液晶模块

pagenum=1;//在第二行开始显示

for(a=0;a<4;a++)

{

C_display_L(pagenum,a*16,a);

C_display_R(pagenum,a*16,a+4);

};

//英文显示:Welcome use

pagenum=5;//在第六行显示

for(a=0;a<3;a++)

{

E_Display_L(pagenum,(a+5)*8,etable[a+5]);

};

for(a=0;a<8;a++)

{

E_Display_R(pagenum,a*8,etable[a+8]);

};

//显示制作时间:Time:2006/11/07

pagenum=7;//在第八行显示

for(a=0;a<8;a++)

{

E_Display_L(pagenum,a*8,ttable[a]);

E_Display_R(pagenum,a*8,ttable[a+8]);

}

Delay_nms(100);

};

if(flag)

{

read_temperature(temperature_buf);//在转到下一个显示界面之前空读一次

read_count_remain();

read_count_c();

DS1621_start();

flag=0;

};

};

WRCommand_L(0x3e);

WRCommand_R(0x3e);

CLR_DisplayRAM(); //清除显示ram

WRCommand_L(0x3f);

WRCommand_R(0x3f);

while(1)

{

while(read_temperature(temperature_buf)==0);//读温度值(两字节有符数),并检测应答位,只使用第一字节

count_remain=read_count_remain();//读斜率

count_c=read_count_c();//读计数器

temp_buffer = temperature_buf[0] -0.75 + (count_c-count_remain) / (double)count_c;

DS1621_start();//读完数据后,重新开始一次温度转化

temperature_display[0]=19;

if(temp_buffer<0)

{

temperature_display[1]=16;//显示负号

temperature_display[2]=(-temp_buffer)/10;//十位

temperature_display[3]=((uchar)(-temp_buffer))%10;

temperature_display[4]=17;//小数点

temperature_display[5]=(int)((-temp_buffer)*10)%10;

temperature_display[6]=(int)((-temp_buffer)*100)%10;//小数点后两位

}

else

{

temperature_display[1]=temp_buffer/100;//百位

temperature_display[2]=((uchar)temp_buffer)/10%10;

temperature_display[3]=((uchar)temp_buffer)%10;

temperature_display[4]=17;

temperature_display[5]=((int)(temp_buffer*10))%10;

temperature_display[6]=((int)(temp_buffer*100))%10;//小数点后两位

}

// 测试从max1241读出的原始数据

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

//pagenum=3;

voltage=read_max1241();

voltage_display[0]=19;

voltage_display[1]= voltage/1000;

voltage_display[2]=(voltage/100)%10;

voltage_display[3]=(voltage/10)%10;

voltage_display[4]= voltage%10;

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

//LCD显示第二部分

for(b=0;b<40;b++)

{

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

//更新max1241显示值

voltage=(double)read_max1241();

voltage=5000*voltage/4095;

voltage_display[0]=19;

voltage_display[5]=(uint)voltage %10;//个位

voltage_display[2]=17;

voltage_display[4]=(uint)(voltage/10)%10;//小数点后1位

voltage_display[3]=(uchar)(voltage/100)%10;//小数点后2位

voltage_display[1]=(uchar)(voltage/1000)%10;//小数点后3位

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

//显示文字:电压测量

pagenum=2;

for(a=0;a<2;a++)

C_display_L(pagenum,a*16,a+8);

for(a=0;a<2;a++)

C_display_L(pagenum,(a+2)*16,a+12);

//显示文字:温度测量

pagenum=5;

for(a=0;a<2;a++)

C_display_L(pagenum,a*16,a+10);

for(a=0;a<2;a++)

C_display_L(pagenum,(a+2)*16,a+12);

//显示1241采样值

pagenum=3;

for(a=0;a<6;a++)

{

E_Display_R(pagenum,a*8,voltage_display[a]);

}

//显示ds1621采样值

pagenum=6;

for(a=0;a<7;a++)

{

E_Display_R(pagenum,a*8,temperature_display[a]);

}

};

};

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43970

    浏览量

    620771
  • AD
    AD
    +关注

    关注

    27

    文章

    854

    浏览量

    149370
  • 12864
    +关注

    关注

    0

    文章

    124

    浏览量

    44581
  • DS1621
    +关注

    关注

    1

    文章

    16

    浏览量

    11532

原文标题:51单片机实例:12位AD_DS1621与12864液晶(程序)

文章出处:【微信号:changxuemcu,微信公众号:畅学单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    谁有12864显示ds1261采集的温度程序啊,请各位帮帮忙

    在Proteus中ds1621只能虚拟显示,要在12864显示,该怎么写程序,求一个程序
    发表于 11-28 14:08

    12位AD_DS162112864液晶

    12位AD_DS162112864液晶,很实用的资料,快来学习吧。
    发表于 05-12 16:25 18次下载

    基于8051的Proteus仿真-DS1621温度传感器实验

    基于8051的Proteus仿真-DS1621温度传感器实验
    发表于 05-12 10:16 49次下载

    DS1621温度传感器论文

    DS1621温度传感器protues仿真
    发表于 03-01 11:59 17次下载

    反向的DS1721数字温度传感器DS1621的兼容性

    配置登记 有DS1621DS1721配置寄存器的几点区别。一个主要的区别是在配置登记DS1621一定位存储在EEPROM。图1和图2显示,DS1721
    发表于 04-10 09:57 4次下载
    反向的<b class='flag-5'>DS</b>1721数字温度传感器<b class='flag-5'>DS1621</b>的兼容性

    使用51单片机实现12864液晶的显示程序免费下载

    本文档的主要内容详细介绍的是使用51单片机实现12864液晶的显示程序免费下载。
    发表于 08-29 17:28 16次下载
    使用51<b class='flag-5'>单片机</b>实现<b class='flag-5'>12864</b><b class='flag-5'>液晶</b>的显示<b class='flag-5'>程序</b>免费下载

    DS1621温度传感器的仿真电路图免费下载

    本文档的主要内容详细介绍的是DS1621温度传感器的仿真电路图免费下载
    发表于 01-14 16:48 28次下载
    <b class='flag-5'>DS1621</b>温度传感器的仿真电路图免费下载

    LCD12864DS1621数字温度传感器的使用仿真资料和工程文件

    本文档的主要内容详细介绍的是LCD12864DS1621数字温度传感器的使用仿真资料和工程文件。
    发表于 07-24 17:30 8次下载
    LCD<b class='flag-5'>12864</b>和<b class='flag-5'>DS1621</b>数字温度传感器的使用仿真资料和工程文件

    DS1621温度传感器实验的程序和工程文件免费下载

     本文档的主要内容详细介绍的是DS1621温度传感器实验的程序和工程文件免费下载。
    发表于 09-08 18:07 11次下载
    <b class='flag-5'>DS1621</b>温度传感器实验的<b class='flag-5'>程序</b>和工程文件免费下载

    使用单片机实现DS1621测温的仿真文件免费下载

    本文档的主要内容详细介绍的是使用单片机实现DS1621测温的仿真文件免费下载。
    发表于 03-19 13:48 17次下载

    使用单片机实现12位AD DS162112864液晶C语言实例免费下载

    本文档的主要内容详细介绍的是使用单片机实现12位AD DS162112864液晶C语言实例免费下载。
    发表于 03-30 14:11 16次下载

    使用单片机实现I2C接口温度传感器DS1621应用测试的C语言实例

    本文档的主要内容详细介绍的是使用单片机实现I2C接口温度传感器DS1621应用测试的C语言实例免费下载。
    发表于 03-31 14:45 10次下载

    008基于单片机DS1621+MAX1241(12位串口ADC)电压温度采样Proteus仿真设计

    008基于单片机DS1621+MAX1241(12位串口ADC)电压温度采样Proteus仿真设计(220转5v电源方案)-008基于单片机DS16
    发表于 07-26 12:15 18次下载
    008基于<b class='flag-5'>单片机</b><b class='flag-5'>DS1621</b>+MAX1241(<b class='flag-5'>12</b>位串口ADC)电压温度采样Proteus仿真设计

    DS1621 DS1621 - (Maxim Integrated) - 温度传感器 - 模拟和数字输出

    电子发烧友网为你提供()DS1621相关产品参数、数据手册,更有DS1621的引脚图、接线图、封装手册、中文资料、英文资料,DS1621真值表,DS1621管脚等资料,希望可以帮助到广
    发表于 11-02 08:23
    <b class='flag-5'>DS1621</b> <b class='flag-5'>DS1621</b> - (Maxim Integrated) - 温度传感器 - 模拟和数字输出

    DS1721数字温度传感器与DS1621的反向兼容性

    由于许多应用不需要DS0 5线数字温度传感器的±1621.2°C精度,因此设计了精度为±1.0°C的DS1721温度传感器IC,以提供DS1621的低成本替代方案。在大多数方面,DS1621
    的头像 发表于 05-16 11:25 564次阅读
    <b class='flag-5'>DS</b>1721数字温度传感器与<b class='flag-5'>DS1621</b>的反向兼容性