寻求一个用12864液晶显示DS18B20温度传感器的C程序。

寻求一个用12864液晶显示DS18B20温度传感器的C程序。,第1张

//并行连接,PSB引脚接电源正

#include <reg51h>

#include <intrinsh>

#define uint unsigned int

#define uchar unsigned char

sbit rs=P2^0; /数据\指令 选择/

sbit rw=P2^1; /读\写 选择/

sbit e=P2^2; /读\写使能/

sbit ds=P3^2; //18B20脚

uint temp;

float ftemp;

uchar code table[]="0123456789d";

void writecom(uchar com);

void writedat(uchar dat);

void initinal(void);

delay0(int k) //把你的延时函数改为以毫秒计时的一个延时函数,但是一个“非标准的”毫秒

{

int i,j;

for(i=k;i>0;i--) //i=xms即延时约xms毫秒

for(j=110;j>0;j--);

}

void dsreset() // ds18b20初始化函数

{

uint i;

ds=0; //拉低总线开始复位

i=103;

while(i>0)i--;

ds=1;//释放总线

i=4;

while(i>0)i--;

// 省去了等待芯片返回应答的过程 。。。。。。

}

bit readbit(void) //ds18b20读取一个二进制位,参照时序图

{

uint i;

bit dat;

ds=0;i++;

ds=1;i++,i++;

dat=ds;

i=8;while(i>0)i--;

return(dat);

}

uchar tempread(void) //ds18b20读取一个字节的数据

{

uchar i,j,dat;

dat=0;

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

{

j=readbit();

dat=(j<<7)|(dat>>1); //

}

return(dat);

}

void tempwrite(uchar dat) //ds18b20写入字节数据

{

uint i;uchar j;

bit testb;

for(j=1;j<=8;j++)

{

testb=dat&0x01;

dat=dat>>1;

if(testb==1) // 写1

{

ds=0; // 拉低总线以开始一个写时序

i++;i++;

ds=1; // 释放总线

i=8;while(i>0)i--;

}

else // 写0

{

ds=0;

i=8;while(i>0)i--;

ds=1;

i++;i++;

}

}

}

void tempchang(void) //

{

dsreset();

delay0(1);

tempwrite(0xcc); //

tempwrite(0x44); //

}

uint gettemp() //

{

uchar a,b;

dsreset();

delay0(1);

tempwrite(0xcc); //

tempwrite(0xbe); //

a=tempread(); //

b=tempread(); //

temp=b;

temp<<=8; //////

temp=temp|a;

ftemp=temp00625; //

temp=ftemp10+05; //

ftemp=ftemp+005; //

return temp; //

}

//12MHZ晶振 延时50微秒

void delay50us(uint t)

{

uchar j;

for(;t>0;t--)

for(j=19;j>0;j--);

}

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

//主函数

void main()

{

initinal();

while(1)

{

uint a,b,c,d;

tempchang();

a=gettemp();

b=a/100;

c=a%100/10;

d=a%100%10;

writecom(0x83);

writedat(table[b]);

delay50us(1);

writedat(table[c]);

delay50us(1);

writedat(table[10]);

delay50us(1);

writedat(table[d]);

delay50us(1);

writedat(table[11]);

delay50us(4);

writecom(0x83);

}

}

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

//12864写命令

void writecom(uchar com)

{

rw=0;

rs=0;

delay50us(1);

P0=com;

e=1;

delay50us(10);

e=0;

delay50us(10);

}

//12864写数据

void writedat(uchar dat)

{

rw=0;

rs=1;

delay50us(1);

P0=dat;

e=1;

delay50us(10);

e=0;

delay50us(10);

}

//12864初始化

void initinal(void)

{

delay50us(2);

writecom(0x30);

delay50us(4);

writecom(0x30);

delay50us(4);

writecom(0x0f);

delay50us(4);

writecom(0x01);

delay50us(240);

writecom(0x06);

delay50us(10);

}

买12864液晶屏时,厂家都会给测试程序的,就是C语言的。根据测试程序,改一下引脚定义就行了,编译一下测试程序,看能不能显示。如果能显示了,就可以自己根据测试程序一点点修改。

如果找不到厂家,就只好在网上找了,但不容易与你的晶屏相符。

实在不会,读一下测试程序,显示汉字的方法都是,用汉字取模软件,先取汉字点阵数据,用这些数据代替测试程序的点阵数据,看是不是能显示自己的取模的汉字了。

因液晶屏显示汉字,取模方式有多种,如果显示乱码,说明取模方式不对,再换一种,直到显示出汉字为止。这样就可以,对测试程序进行修改成自己看得懂,又实用的程序了。

#include <reg52h>

#include <intrinsh>

#define uint unsigned int

#define uchar unsigned char

#define Nop() _nop_()

/引脚端口定义/

sbit LCD12864_RS_PORT = P1^7; /LCD12864引脚定义/

sbit LCD12864_RW_PORT = P1^6;

sbit LCD12864_E_PORT = P2^3;

#define LCD12864_DA_PORT P0

sbit led_en_port = P2^5; /发光二极管寄存器LE引脚/

sbit sled_en_port = P3^6; /数码管寄存器LE引脚/

uchar hanzi_buff1[]={" 液晶显示 "};

//////////////////以下是LCD12864驱动程序////////////////

void LCD12864_WaitIdle()

//LCD12864 忙 信号检测

{

LCD12864_DA_PORT = 0xff;

LCD12864_RS_PORT = 0;

LCD12864_RW_PORT = 1;

LCD12864_E_PORT = 1;

while((LCD12864_DA_PORT&0x80)==1); /等待BF 不为1/

LCD12864_E_PORT = 0;

}

void LCD12864_COM_Write( uchar com_da)

/ 检测忙信号写入命令字

com_da 为待写入的命令字/

{

LCD12864_WaitIdle();

LCD12864_RS_PORT = 0;

LCD12864_RW_PORT = 0;

LCD12864_DA_PORT = com_da;

LCD12864_E_PORT = 1;

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

LCD12864_E_PORT = 0;

}

void LCD12864_NoWaitIdle_COM_Write(uchar com_da)

/ 不检测忙信号写入命令字

com_da 为待写入的命令字/

{

LCD12864_RS_PORT = 0;

LCD12864_RW_PORT = 0;

LCD12864_DA_PORT = com_da;

LCD12864_E_PORT = 1;

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

LCD12864_E_PORT = 0;

}

void LCD12864_Data_Write(uchar da)

/ 数据写入

da 为待写入的8位数据/

{

LCD12864_WaitIdle(); /检测忙信号/

LCD12864_RS_PORT = 1;

LCD12864_RW_PORT = 0;

LCD12864_DA_PORT = da;

LCD12864_E_PORT = 1;

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

LCD12864_E_PORT = 0;

}

void lcd_delay_ms(uchar x)

{

uchar j;

while(x--){

for(j=0;j<125;j++)

{;}

}

}

void LCD12864_Reset()

/LCD12864初始化/

{

lcd_delay_ms(100); /适当延时待LCD自动复位完成/

LCD12864_NoWaitIdle_COM_Write(0x30); /使用8位并口通讯/

lcd_delay_ms(10);

LCD12864_NoWaitIdle_COM_Write(0x30); /使用8位并口通讯/

lcd_delay_ms(10);

LCD12864_NoWaitIdle_COM_Write(0x0c); /显示开及光标设置/

lcd_delay_ms(10);

LCD12864_NoWaitIdle_COM_Write(0x01); /显示清屏/

lcd_delay_ms(30);

LCD12864_NoWaitIdle_COM_Write(0x06); /DDRAM的地址计数器(AC)加1/

lcd_delay_ms(30);

}

void LCD12864_HANZI_WRITE(uchar xpos,uchar ypos,uchar daH,uchar daL)

//ST7920 汉字字符写入

//参数说明: xpos 待写入的X位置

//ypos 待写入的Y位置

//daH 待写入的汉字的高八位 daL待写入的汉字的低八位

{

uchar xy_pos;

if((xpos>=8)||(ypos>=4) ) return; /X位置超出显示范围退出/

if(ypos==0) xy_pos = 0x80 + xpos;

else if(ypos==1) xy_pos = 0x90 + xpos; /计算转换地址/

else if(ypos==2) xy_pos = 0x88 + xpos;

else if(ypos==3) xy_pos = 0x98 + xpos;

LCD12864_COM_Write(xy_pos); /写地址/

lcd_delay_ms(1);

LCD12864_Data_Write(daH); /写高八位数据/

lcd_delay_ms(1);

LCD12864_Data_Write(daL); /写低八位数据/

lcd_delay_ms(1);

}

//////////////////以上是LCD12864驱动程序////////////////

void main()

{

uchar i;

LCD12864_Reset(); /LCD初始化/

LCD12864_DA_PORT = 0xff; /释放P0端口/

led_en_port = 0;/关闭发光二极管显示/

sled_en_port = 0;/关闭数码管显示/

while(1)

{

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

LCD12864_HANZI_WRITE(i,0,hanzi_buff1[i2],hanzi_buff1[i2+1]);

}

}

以上就是关于寻求一个用12864液晶显示DS18B20温度传感器的C程序。全部的内容,包括:寻求一个用12864液晶显示DS18B20温度传感器的C程序。、不带中文字库的12864液晶怎么用C写程序然后通过51单片机控制、求个51单片机控制KNY12864M液晶屏的简单程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9470736.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存