极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12305|回复: 4

大家看看这个程序是在怎么回事呀?

[复制链接]
发表于 2016-4-29 19:42:30 | 显示全部楼层 |阅读模式
是用DS18b20采集温度数据显示到lcd1602;没有用相关的元件库,自己写的函数。用的是arduino pro mini LCD1602 8位接口。  有大神帮看看么。。。。。。
编译的时候   老是出现 错误:

exit status 1
a function-definition is not allowed here before '{' token


程序如下:
#define PortEn  3    //Enable
#define PortRS  13    //R/S
#define PortBL  12  //backlight
#define PortRW  2   //R/W
#define PortDs  A1  //PortDs
char str0[]="HELLO WORLD!!!";

//Write Data
void lcdDat(uint8_t value)
{
    read_busy();
    digitalWrite(PortRW,LOW);
    digitalWrite(PortRS,HIGH);
    digitalWrite(PortEn,LOW);
    /*for(int i = 4;i < 8;i++)       //high 4bit
    digitalWrite(i,(value >> i) & 0x01);
    digitalWrite(PortEn,HIGH);
    digitalWrite(PortEn,LOW);
    for(int i = 4;i < 8;i++)      //low 4bit
    digitalWrite(i,(value >> i - 4) & 0x01);  */
    for(int i=4;i<12;i++)
       digitalWrite(i,(value>>i-4)&0x01);
    digitalWrite(PortEn,HIGH);
    digitalWrite(PortEn,LOW);
  }

//Write Command
void lcdCmd(uint8_t value)
{
    read_busy();
    digitalWrite(PortRW,LOW);
    digitalWrite(PortRS,LOW);
    digitalWrite(PortEn,LOW);

    /*for(int i = 4;i < 8;i++)       //high 4bit
    digitalWrite(i,(value >> i) & 0x01);
    digitalWrite(PortEn,HIGH);
    digitalWrite(PortEn,LOW);
    for(int i = 4;i < 8;i++)      //low 4bit
    digitalWrite(i,(value >> i - 4) & 0x01);   */

    for(int i=4;i<12;i++)
       digitalWrite(i,(value>>i-4)&0x01);
    digitalWrite(PortEn,HIGH);
    digitalWrite(PortEn,LOW);   
  }

//LCD init
void lcdInit()
{
    delay(100);
    lcdCmd(0x38);    //4-wire mode 2line display
    delay(64);
    lcdCmd(0x38);    //4-wire mode 2line display
    delay(50);
    lcdCmd(0x38);    //4-wire mode 2line display
    delay(20);
    lcdCmd(0x06);
    delay(20);
    lcdCmd(0x0E);
    delay(20);
    lcdCmd(0x01);//clear diaplay
    delay(100);
    lcdCmd(0x80);     // no cruser
    delay(20);
  }

void lcdDisplay(uint8_t pos,uint8_t data)
{
    lcdCmd(pos | 0x80);  //DDRAM address
    delay(10);
    lcdDat(data);
    delay(10);
  }


void read_busy()
{
    digitalWrite(11,HIGH);      //set to 1
    digitalWrite(PortRS,LOW);   
    digitalWrite(PortRW,HIGH);
    digitalWrite(PortEn,HIGH);
    pinMode(11,INPUT);  
    while(digitalRead(11));
    digitalWrite(PortEn,LOW);   //set to 0
    pinMode(11,OUTPUT);
  }


void printStr(uint8_t pos,char *s)
{
  while(*s)
  {
     lcdDisplay(pos,*s);
     s++;
     pos++;
    }
}   

//**********************************************************************
//init DS18B20
uint8_t init_ds18b20()
{
  digitalWrite(PortDs,HIGH);
  digitalWrite(PortDs,LOW);
  delayMicroseconds(500);
  pinMode(PortDs,INPUT);
  delayMicroseconds(100);
  uint8_t value = digitalRead(PortDs);
  delayMicroseconds(400);
  return(value);
   }

//write 1-byte to DS18B20
void write_ds18b20(uint8_t s)
{
  for(int i = 0;i < 8;i++)
  {
    digitalWrite(PortDs,HIGH);
    delayMicroseconds(2);
    digitalWrite(PortDs,LOW);
    delayMicroseconds(2);
    if((s>>i)&0x01==1)
     digitalWrite(PortDs,HIGH);
    else
     digitalWrite(PortDs,LOW);
    delayMicroseconds(45);
    digitalWrite(PortDs,HIGH);
  }




//read 1-byte from DS18B20
int read_ds18b20()         <<<<<提示错误在这行
{

  uint8_t m;
  uint8_t n=0;
  for(int i = 0;i < 8;i++)
  {

    digitalWrite(PortDs,HIGH);
    delayMicroseconds(2);
    digitalWrite(PortDs,LOW);
    delayMicroseconds(2);
    pinMode(PortDs,INPUT);
    delayMicroseconds(5);
    m = digitalRead(PortDs);
    n = (m<<7)|(n>>1);
  }
    pinMode(PortDs,OUTPUT);   
    return n;
}


void temp_convert()
{
  while(init_ds18b20());
  write_ds18b20(0xCC);
  write_ds18b20(0x44);
}

uint8_t temp_read()
{
  while(init_ds18b20());
  write_ds18b20(0xCC);
  write_ds18b20(0xBE);
  uint8_t low = read_ds18b20();
  uint8_t high = read_ds18b20();
  int value = high;
  value <<= 8;
  value |= low;
  float tt = value*0.0625;
  uint8_t temp = tt*10 + 0.5;
  return temp;  
}

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

void setup() {
  // put your setup code here, to run once:
    pinMode(2,OUTPUT);
    pinMode(3,OUTPUT);
    pinMode(4,OUTPUT);
    pinMode(5,OUTPUT);
    pinMode(6,OUTPUT);
    pinMode(7,OUTPUT);
    pinMode(8,OUTPUT);
    pinMode(9,OUTPUT);
    pinMode(10,OUTPUT);
    pinMode(11,OUTPUT);
    pinMode(12,OUTPUT);
    pinMode(13,OUTPUT);
    pinMode(A1,OUTPUT);
    lcdInit();
  }


void loop() {                                     <<<<<提示错误在这行
  // put your main code here, to run repeatedly:
    temp_convert();
    uint8_t temp = 4;
    uint8_t temp = temp_read();
    uint8_t a1 = temp/100;
    uint8_t a2 = temp%100/10;
    uint8_t a3 = temp%10;
    lcdDisplay(0x40,str0);
    lcdDisplay(0,a1);
    lcdDisplay(1,a2);
    lcdDisplay(2,'.');
    lcdDisplay(3,a3);
    digitalWrite(PortBL,HIGH);
    delay(5000);
    digitalWrite(PortBL,LOW);
    delay(5000);      
}
回复

使用道具 举报

发表于 2016-4-29 23:43:51 | 显示全部楼层
void write_ds18b20(uint8_t s)少了个反括号“}”
回复 支持 反对

使用道具 举报

发表于 2016-4-30 06:13:20 | 显示全部楼层
看提示也是括号问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-30 16:04:46 | 显示全部楼层
328522073 发表于 2016-4-29 23:43
void write_ds18b20(uint8_t s)少了个反括号“}”

仔细检查了下,没有漏{或}呀,帮函数里的一些语句注释屏蔽掉就不会出错误了,郁闷。。。。。
回复 支持 反对

使用道具 举报

发表于 2016-4-30 17:46:14 | 显示全部楼层
jim4714 发表于 2016-4-30 16:04
仔细检查了下,没有漏{或}呀,帮函数里的一些语句注释屏蔽掉就不会出错误了,郁闷。。。。。

提議先離開冷靜一下,回來再仔細檢查,就應能發現了。努力!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 01:57 , Processed in 0.037846 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表