DS1621與lcd12864和單片機(jī)接口的仿真原理圖:
單片機(jī)源程序:
- //EDM12864B DRIVE//
- /**************************************
- PAGEADD為頁地址起使
- TIERADD為行地址起使
- DIS_STARTADD為開始命令
- CTABLE為漢字字庫數(shù)組
- ETABLE為英文字庫數(shù)組
- ***************************************/
- #include <reg51.h>
- #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)
- };
- /********************************
- 顯示用的延時函數(shù)
- 延時長度有參數(shù) n 決定
- *********************************/
- Delay_nms(uchar n)
- { uchar a;
- for(;n>0;n--)
- {
- for(a=0;a<100;a++)
- {
- _nop;
- _nop;
- _nop;
- _nop;
- };
- };
- }
- /*****************************************
- DEM12864B狀態(tài)檢測,從EDM12864B讀出數(shù)
- 據(jù)檢測標(biāo)志位BF
- ******************************************/
- void LCD_Busy()
- {
- uchar busy;
- E=Low;
- DI=Low;
- RW=High;
- while(1)
- {
- E=High;
- _nop;
- _nop;
- busy=P2;//讀狀態(tài)標(biāo)志寄存器
- _nop;
- E=Low;
- if((busy&0x90)==0)//檢測BF和RES位,兩者都為零時表示可進(jìn)行寫入
- 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;
- }
- /***********************************
- 寫一個字節(jié)的顯示數(shù)據(jù)
- ************************************/
- 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;
- }
- /************************************
- 讀顯示數(shù)據(jù)
- *************************************/
- /********************************************
- 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時鐘時序要求的數(shù)據(jù)建立時間,
- nop_可以用其它短延時替代,比如喂狗
- ***************************************/
- I2C_delay()
- {
- uchar n=5;
- while(n--)
- {
- _nop;
- _nop;
- }
- }
- /*********************************************
- I2C的時鐘信號可發(fā)送和接收.
- 接收時通過判斷sample對寄存器的值加.
- 發(fā)送的時候只調(diào)用程序產(chǎn)生時序.
- **********************************************/
- bit I2C_clock(void)
- {
- bit sample;
- I2C_delay();
- I2C_SCL=High;
- I2C_delay();
- sample=I2C_SDA;
- I2C_SCL=Low;
- I2C_delay();
- return(sample);
- }
- /********************************************
- I2C確定接收有效的應(yīng)答信號Acknowledge
- *********************************************/
- I2C_ACK()
- {
- I2C_SDA=Low;
- I2C_clock();
- I2C_SDA=High;
- }
- /*****************************************
- I2C的非應(yīng)答信號
- ******************************************/
- I2C_NACK()
- {
- I2C_SDA=High;
- I2C_clock();
- I2C_SDA=High;
- }
- /*************************************************
- I2C的開始信號.發(fā)送和接受數(shù)據(jù)時,必須先調(diào)用.
- *************************************************/
- I2C_start()
- {
- I2C_SDA=High;
- I2C_delay();
- I2C_SCL=High;
- I2C_delay();
- I2C_SDA=Low;
- I2C_delay();
- I2C_SCL=Low;
- I2C_delay();
- }
- /***************************************************
- I2C停止信號.發(fā)送和接受數(shù)據(jù)時結(jié)束時,需要調(diào)用.
- ****************************************************/
- I2C_stop()
- {
- I2C_SDA=Low;
- I2C_delay();
- I2C_SCL=High;
- I2C_delay();
- I2C_SDA=High;//產(chǎn)生停止控制信號,并且釋放數(shù)據(jù)線
- I2C_delay();
- }
- /*****************************************
- I2C初始化.在main函數(shù)中必須先調(diào)用它.
- 進(jìn)行初始化后才能調(diào)用其他函數(shù).
- ******************************************/
- void I2C_init(void)
- {
- I2C_SDA=High;
- I2C_SCL=High;
- I2C_delay();
- I2C_stop();
- }
- /*****************************************
- I2C總線寫一個字節(jié),即發(fā)送一個字節(jié)
- 發(fā)送結(jié)束后,需要返回一個檢測應(yīng)答位
- ******************************************/
- 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()); //返回應(yīng)答信號
- }
- /***********************************************
- I2C總線讀一個字節(jié),即接收一個字節(jié)數(shù)據(jù)
- 接收結(jié)束后需要發(fā)送一個應(yīng)答位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));//發(fā)送數(shù)據(jù)完地址字節(jié)的數(shù)據(jù)時,檢測從機(jī)的應(yīng)答位
- 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));//是否應(yīng)答
- 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));//是否應(yīng)答
- 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個字節(jié)
- 前16個字節(jié)寫入第一頁(16*8),后16個字節(jié)寫入
- 第二頁(16*8)
- 左側(cè)寫入"歡迎",右側(cè)寫入"使用"
- *****************************************************/
- 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個字符,左側(cè)寫入6個
- 右側(cè)寫入5個,左側(cè)起始從16開始,右側(cè)從
- 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內(nèi)容
- **********************************/
- 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自動加一,只許循環(huán)64次即可
- };
- };
- }
- /*********************************
- 初始化 設(shè)置啟使行
- **********************************/
- void Init_LCD(void)
- {
- CLR_DisplayRAM();//清除所有顯示寄存器
- WRCommand_L(DIS_STARADD);
- WRCommand_R(DIS_STARADD);//設(shè)置顯示起始行地址
- WRCommand_L(0x3f);
- WRCommand_R(0x3f);//開顯示
- }
- /***************************************
- max1241讀轉(zhuǎn)換結(jié)果
- ****************************************/
- uint read_max1241()
- {
- uint voltage_temp=0;
- uchar ucloop=12;
- cs=High;
- //dout=low;
- sclk=Low;
- cs=Low;
- while(dout==0);//EOC信號為高表示轉(zhuǎn)換結(jié)束
- sclk=High;
- sclk=Low;
- while(ucloop--)
- {
- sclk=High;//上升沿數(shù)據(jù)穩(wěn)定并讀出
- 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();//開始溫度采集
- /***************************************
- 利用開機(jī)顯示時間(大概三秒)空讀一次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);//在轉(zhuǎn)到下一個顯示界面之前空讀一次
- 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);//讀溫度值(兩字節(jié)有符數(shù)),并檢測應(yīng)答位,只使用第一字節(jié)
- count_remain=read_count_remain();//讀斜率
- count_c=read_count_c();//讀計數(shù)器
- temp_buffer = temperature_buf[0] -0.75 + (count_c-count_remain) / (double)count_c;
- DS1621_start();//讀完數(shù)據(jù)后,重新開始一次溫度轉(zhuǎn)化
- temperature_display[0]=19;
- if(temp_buffer<0)
- {
- temperature_display[1]=16;//顯示負(fù)號
- temperature_display[2]=(-temp_buffer)/10;//十位
- temperature_display[3]=((uchar)(-temp_buffer))%10;
- temperature_display[4]=17;//小數(shù)點
- temperature_display[5]=(int)((-temp_buffer)*10)%10;
- temperature_display[6]=(int)((-temp_buffer)*100)%10;//小數(shù)點后兩位
- }
- 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;//小數(shù)點后兩位
- }
- // 測試從max1241讀出的原始數(shù)據(jù)
- /***************************
- //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;//小數(shù)點后1位
- voltage_display[3]=(uchar)(voltage/100)%10;//小數(shù)點后2位
- voltage_display[1]=(uchar)(voltage/1000)%10;//小數(shù)點后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++)
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
下載:
0001、12位AD_DS1621與12864液晶.zip
(33.59 KB, 下載次數(shù): 37)
2017-4-30 12:34 上傳
點擊文件名下載附件
|