//并行连接,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液晶屏的简单程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)