lcd12864显串STC89串RS485通讯温度OK制作出来的实物图如下:
单片机源程序如下:
- #include <reg51.h>
- #include "ds18b20.h"
- #define uchar unsigned char
- #define uint unsigned int
- /***************************功能定义***************************/
- #define LCD12864_W_COM 0xF8 //写指令
- #define LCD12864_R_COM 0xFC //读指令
- #define LCD12864_W_DAT 0xFA //写数据
- #define LCD12864_R_DAT 0xFE //读数据
- #ifndef __LCD12864_H__
- #define __LCD12864_H__
- #define LCD12864_COM 0 //输入指令
- #define LCD12864_DAT 1 //输入数据
- #define LCD12864_CLEAR 0x01 //清除显示
- #define LCD12864_CURSOR 0x02 //位址归位,游标回原点
- #define LCD12864_CURSOR_RLF 0x04 //光标左移,整体显示不移动
- #define LCD12864_CURSOR_RRF 0x06 //光标右移,整体显示不移动
- #define LCD12864_CURSOR_RLN 0x05 //光标左移,整体显示移动
- #define LCD12864_CURSOR_RRN 0x07 //光标右移,整体显示移动
- #define LCD12864_DIS_OFF 0x08 //显示状态全关
- #define LCD12864_DIS_ON 0x0E //显示状态开
- #define LCD12864_DIS_CUR_ON 0x0E //游标显示开
- #define LCD12864_DIS_CURS_ON 0x0F //游标位置显示开
- #define LCD12864_CURSOR_RL 0x10 //游标左移
- #define LCD12864_CURSOR_RR 0x14 //游标右移
- #define LCD12864_CURDIS_RL 0x18 //整体显示左移,光标跟随
- #define LCD12864_CURDIS_RR 0x1C //整体显示又移,光标跟随
- #define LCD12864_COM_BASIC 0x30 //基本指令集动作
- #define LCD12864_COM_PLOT_ON 0x36 //扩展指令集动作,绘图显示ON
- #define LCD12864_COM_PLOT_OFF 0x34 //扩展指令集动作,绘图显示OFF
- #define LCD12864_STAND_TO 0x31 //进入待命模式
- #define LCD12864_PLACE_ROLL 0x03 //允许输入卷动位址
- #define LCD12864_PLACE_IRAM 0x02 //允许输入IRAM位址
- #define LCD12864_REVERES_13 0x04 //选择一、三行同时作反白显示
- #define LCD12864_REVERES_24 0x05 //选择二、四行同时作反白显示
- #define LCD12864_REST_ON 0x08 //进入睡眠模式
- #define LCD12864_REST_OFF 0x0C //脱离睡眠模式
- #define LCD12864_W_COM 0xF8 //写指令
- #define LCD12864_R_COM 0xFC //读指令
- #define LCD12864_W_DAT 0xFA //写数据
- #define LCD12864_R_DAT 0xFE //读数据
- //======串口模式=======
- sbit LCD12864_CS = P2^7; //片选信号输入
- sbit LCD12864_STD = P2^6; //串行数据输入
- sbit LCD12864_SCLK = P2^5; //串行移位脉冲输入
- sbit LCD12864_PSB = P2^4; //串并模式选择 0:串口,1:并口
- sbit LCDRST = P2^3;
- unsigned char code tabe[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//查表法//0-9数字
- //--定义全局变量--//
- unsigned char TP[8];//显示用的本地和接收温度共8位。各个位数
- int Temp;
- int i;
- int j = -1;
- int receiveData;
- unsigned char receive[2];
- sbit EN = P2^0;//RS485使能 0接收, 1发送
- void UsartConfiguration();
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- /*****************************向12864写入8位数据*************************************/
- void LCD12864_Wbyte(uchar byte)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- LCD12864_SCLK = 0;
- byte <<= 1; //左移待写入数据,使最高位移至CY
- LCD12864_STD = CY; //写入一位数据
- LCD12864_SCLK = 1;
- LCD12864_SCLK = 0;
- }
- }
- /***************************从12864读出8位数据***返回:sdat************************************/
- uchar LCD12864_Rbyte(void)
- {
- uchar i,sdat,temp1,temp2;
- temp1 = 0;
- temp2 = 0;
- //==========12864的串行数据输出形式是D7-D6-D5-D4-0-0-0-0-D3-D2-D1-D0-0-0-0-0,故要度两个八位整合==============
- for(i=0;i<8;i++)
- {
- temp1=temp1 << 1;
- LCD12864_SCLK = 0;
- LCD12864_SCLK = 1;
- LCD12864_SCLK = 0;
- if( LCD12864_STD ) temp1|=0x01; //tempe1:D7-D6-D5-D4-0-0-0-0
- }
- for(i=0;i<8;i++)
- {
- temp2=temp2 << 1;
- LCD12864_SCLK = 0;
- LCD12864_SCLK = 1;
- LCD12864_SCLK = 0;
- if( LCD12864_STD ) temp2|=0x01; //tempe2:D3-D2-D1-D0-0-0-0-0
- }
- sdat = ((temp1 & 0xf0)|(temp2 >> 4)); //取出D7\D6\D5\D4\D3\D2\D1\D0
- return sdat; //返回一个值(sdat)
- }
- /****************************读忙状态**************************************/
- void LCD12864_busy( void )
- {
- do LCD12864_Wbyte( LCD12864_R_COM ); //LCD12864_RW=11111,RW(1),RS(0),0
- while( LCD12864_Rbyte() & 0x80 ); //读BF,直到BF == 0
- }
- /*************************dat_com=0写指令,dat_com=1写数据*****************************************/
- void LCD12864_W (bit dat_com,uchar byte)
- {
- uchar temp;
- if(dat_com == 0) //为零,写入指令
- temp = LCD12864_W_COM; //11111,RS(0),RW(0),0
- else //否则,写入数据
- temp = LCD12864_W_DAT; //11111,RS(1),RW(0),0
- LCD12864_CS = 1; //片选使能
- LCD12864_busy(); //LCD忙检测
- LCD12864_Wbyte(temp); //写入模式选择,指令还是数据
- LCD12864_Wbyte(byte&0xf0); //写入字节
- LCD12864_Wbyte((byte<<4)&0xf0); //写入字节
- LCD12864_CS = 0; //片选关闭
- }
- /****************************LCD12864初始化**************************************/
- void LCD12864_Init(void)
- {
- LCDRST=1;
- LCD12864_PSB = 0; //选择串口模式
- LCD12864_W(LCD12864_COM,0x30); //基本指令功能.
- LCD12864_W(LCD12864_COM,0x03); //允许输入卷动位址
- LCD12864_W(LCD12864_COM,0x0c); //脱离随眠状态,显示打开,关光标,反白关.
- LCD12864_W(LCD12864_COM,0x01); //清屏指令.
- LCD12864_W(LCD12864_COM,0x06); //AC自动加一,光标右移,整体显示不移动
- }
- /**************************LCD12864字符位置自定义显示****************************************/
- void LCD12864_WPoss(uchar x,uchar y,uchar *buff)
- {
- uchar addr,i=0;
- switch (x)
- {
- case 0:addr=0x80;break;
- case 1:addr=0x90;break;
- case 2:addr=0x88;break;
- case 3:addr=0x98;break;
- }
- addr=addr+y;
- LCD12864_W(LCD12864_COM,LCD12864_COM_BASIC); //8BitMCU,基本指令集合
- LCD12864_W(LCD12864_COM,addr); //显示在自定义位置
- while(buff[i]!='\0')
- {
- LCD12864_W(LCD12864_DAT,buff[i++]);
- if(++y==16)
- {
- y=0;
- if(++x==4) x=0;
- switch (x)
- {
- case 0:addr=0x80;break;
- case 1:addr=0x90;break;
- case 2:addr=0x88;break;
- case 3:addr=0x98;break;
- }
- addr=addr+y;
- LCD12864_W(LCD12864_COM,addr);
- }
-
- }
- }
- void Disp_img(unsigned char *img) //图形方式12864显示字模221 横向取膜
- {
- unsigned char i,j;
- unsigned int k = 0;
- LCD12864_W(0,0x36); //图形方式
- for(i=0;i<32;i++)
- {
- LCD12864_W(0,0x80+i);
- LCD12864_W(0,0x80);
- for(j=0;j<16;j++)
- {
- LCD12864_W(1,img[k++]);
- }
- }
- for(i=0;i<32;i++)
- {
- LCD12864_W(0,0x80+i);
- LCD12864_W(0,0x88);
- for(j=0;j<16;j++)
- {
- LCD12864_W(1,img[k++]);
- }
- }
- }
- /************************显示11************************************/
- void display1(long temp)
- {
- uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
- //temp=12345678;
- dt1 = temp%10;//1位
- dt2 = temp%100/10;//2位
- dt3 = temp%1000/100;//3位
- dt4 = temp%10000/1000;//4位
- dt5 = temp%100000/10000;//5位
- dt6 = temp%1000000/100000;//6位
- dt7 = temp%10000000/1000000;//7位
- dt8 = temp/10000000;//8位 最高位
- LCD12864_WPoss(3,0,"本地温度:");//第1行显示表1
- // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****) 0写指令 1写数据
- //LCD12864_W(1,tabe[dt8]);//6位
- //LCD12864_W(1,tabe[dt7]);//5位
- //LCD12864_W(1,tabe[dt6]);//4位
- //LCD12864_W(1,tabe[dt5]);//3位
- //LCD12864_W(1,0x2e);
- LCD12864_W(1,tabe[dt4]);//4位
- LCD12864_W(1,tabe[dt3]);//3位
- LCD12864_W(1,tabe[dt2]);//4位
- LCD12864_W(1,0x2e);
- LCD12864_W(1,tabe[dt1]);//3位
- LCD12864_WPoss(3,7,"C");//第1行显示表1
- }
- /************************显示2************************************/
- void display2(long temp)
- {
- uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
- //temp=12345678;
- dt1 = temp%10;//1位
- dt2 = temp%100/10;//2位
- dt3 = temp%1000/100;//3位
- dt4 = temp%10000/1000;//4位
- dt5 = temp%100000/10000;//5位
- dt6 = temp%1000000/100000;//6位
- dt7 = temp%10000000/1000000;//7位
- dt8 = temp/10000000;//8位 最高位
- LCD12864_WPoss(2,0,"接收温度:");//第1行显示表1
- // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****) 0写指令 1写数据
- //LCD12864_W(1,tabe[dt8]);//6位
- //LCD12864_W(1,tabe[dt7]);//5位
- //LCD12864_W(1,tabe[dt6]);//4位
- //LCD12864_W(1,tabe[dt5]);//3位
- //LCD12864_W(1,0x2e);
- LCD12864_W(1,tabe[dt4]);//4位
- LCD12864_W(1,tabe[dt3]);//3位
- LCD12864_W(1,tabe[dt2]);//4位
- LCD12864_W(1,0x2e);
- LCD12864_W(1,tabe[dt1]);//3位
- LCD12864_WPoss(2,7,"C");//第1行显示表1
- LCD12864_WPoss(0,0,"485 串口通讯温度");//第1行显示表1
- }
- void main()
- {
- float tp;
- UsartConfiguration();
- LCD12864_Init(); //
- EN = 0;//RS485使能 0接收, 1发送
- while(1)
- {
- Temp = Ds18b20ReadTemp();
- if(Temp< 0) //当温度值为负数
- {
- Temp=Temp-1;
- tp=~Temp;
- Temp=tp*0.0625*10+0.5;
- //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
- //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
- //算由?.5,还是在小数点后面。
- TP[4] = (Temp%1000)/100;
- TP[5] = ((Temp%1000)%100)/10;
- TP[6] = Temp%10;
- TP[7] = 12;
- display1(Temp);//显示时间 //Ok
- }
- else
- {
- tp = Temp;
- Temp=tp*0.0625*10+0.5;
- //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
- //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
- //算加上0.5,还是在小数点后面。
- TP[4] = (Temp%1000)/100;
- TP[5] = ((Temp%1000)%100)/10;
- TP[6] = Temp%10;
- TP[7] = 12;
- display1(Temp);//显示时间 //Ok
- }
-
-
-
-
- if(RI == 1) //查看是否接收到数据
- {
- j++;
- receive[j] = SBUF; //读取数据
- if(j==2)
- {
- j = 0;
- receiveData = 256*receive[0]+receive[1];
- receive[0] = SBUF;
- TP[0] = (receiveData%1000)/100;
- TP[1] = ((receiveData%1000)%100)/10;
- TP[2] = receiveData%10;
- TP[3] = 12;
- }
- RI = 0;
-
- }
-
- display2(receiveData);//显示时间 //Ok
-
-
- }
- }
- /*******************************************************************************
- * 函 数 名 :UsartConfiguration()
- * 函数功能 :设置串口
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void UsartConfiguration()
- {
- SCON=0X50; //设置为工作方式1
- TMOD=0X20; //设置计数器工作方式2
- //PCON=0X80; //波特率加倍
- PCON=0x00; //波特率未加倍
- TH1=0XFA; //计数器初始值设置,注意波特率是4800的
- TL1=0XFA;
- TR1=1; //打开计数器
- }
复制代码
所有资料51hei提供下载:
128显串STC89串RS485通讯温度OK.zip
(98.73 KB, 下载次数: 95)
|