Pages: [1]   Go Down
Author Topic: Clear LCD but only once a loop  (Read 1327 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello folks. I want to use the large fonts to display a rotor heading of an antenna, eventually. But for now I have a button connected so that if I push it, it displays a "1" and if not a "0". Problem is if I don't clear the lcd when you display the 1 it still displays part of the 0 because it's bigger. So I thought , well I'll just clear the lcd. Yes but then all you get is a flickering 1 as it is trying to clear the display each time through the loop. How do I just get it to clear it off to display the 1 while pushing the button, so I get a nice solid 1?
Thank you.

Code..

Code:
/*
A set of custom made large numbers for a 16x2 LCD using the
LiquidCrystal librabry. Works with displays compatible with the
Hitachi HD44780 driver.

The Cuicuit:
  LCD RS pin to D12
  LCD Enable pin to D11
  LCD D4 pin to D5
  LCD D5 pin to D4
  LCD D6 pin to D3
  LCD D7 pin to D2
  LCD Vee tied to a pot to control brightness
  LCD Vss and R/W tied to ground
  LCD Vcc to +5V
  LCD pin 15 tied to pushbutton for control of backlight
 
Made by Michael Pilcher
2/9/2010
*/

// include the library
#include <LiquidCrystal.h>
const int buttonPin = 7;
int buttonState = 0;
// initialize the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// the 8 arrays that form each segment of the custom numbers
byte LT[8] =
{
  B00111,
  B01111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};
byte UB[8] =
{
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};
byte RT[8] =
{
  B11100,
  B11110,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};
byte LL[8] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B01111,
  B00111
};
byte LB[8] =
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111
};
byte LR[8] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11110,
  B11100
};
byte UMB[8] =
{
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111
};
byte LMB[8] =
{
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111
};

// loop counter
int x = 0;

 
void setup()
{
  // assignes each segment a write number
  lcd.createChar(0,LT);
  lcd.createChar(1,UB);
  lcd.createChar(2,RT);
  lcd.createChar(3,LL);
  lcd.createChar(4,LB);
  lcd.createChar(5,LR);
  lcd.createChar(6,UMB);
  lcd.createChar(7,LMB);
 
 pinMode(buttonPin, INPUT);
 
  // sets the LCD's rows and colums:
  lcd.begin(16, 2);
       
}

void custom0()
{ // uses segments to build the number 0
  lcd.setCursor(x, 0); // set cursor to column 0, line 0 (first row)
  lcd.write((byte)0);  // call each segment to create
  lcd.write(1);  // top half of the number
  lcd.write(2);
  lcd.setCursor(x, 1); // set cursor to colum 0, line 1 (second row)
  lcd.write(3);  // call each segment to create
  lcd.write(4);  // bottom half of the number
  lcd.write(5);
}

void custom1()
{
  lcd.setCursor(x,0);
  lcd.write(1);
  lcd.write(2);
  lcd.setCursor(x+1,1);
  lcd.write(5);
}

void custom2()
{
  lcd.setCursor(x,0);
  lcd.write(6);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(7);
  lcd.write(7);
}

void custom3()
{
  lcd.setCursor(x,0);
  lcd.write(6);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(7);
  lcd.write(7);
  lcd.write(5);
}

void custom4()
{
  lcd.setCursor(x,0);
  lcd.write(3);
  lcd.write(4);
  lcd.write(2);
  lcd.setCursor(x+2, 1);
  lcd.write(5);
}

void custom5()
{
  lcd.setCursor(x,0);
  lcd.write((byte)0);
  lcd.write(6);
  lcd.write(6);
  lcd.setCursor(x, 1);
  lcd.write(7);
  lcd.write(7);
  lcd.write(5);
}

void custom6()
{
  lcd.setCursor(x,0);
  lcd.write((byte)0);
  lcd.write(6);
  lcd.write(6);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(7);
  lcd.write(5);
}

void custom7()
{
  lcd.setCursor(x,0);
  lcd.write(1);
  lcd.write(1);
  lcd.write(2);
  lcd.setCursor(x+1, 1);
  lcd.write((byte)0);
}

void custom8()
{
  lcd.setCursor(x,0);
  lcd.write((byte)0);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(7);
  lcd.write(5);
}

void custom9()
{
  lcd.setCursor(x,0);
  lcd.write((byte)0);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x+2, 1);
  lcd.write(5);
}

 void loop(){
   
  buttonState = digitalRead(buttonPin);
  if (buttonState==HIGH){
    lcd.clear(); 
    custom1();
     
     }
  else {
    custom0();
      }
}
/code]
Logged

The Netherlands
Offline Offline
Edison Member
*
Karma: 47
Posts: 1552
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Not that hard.
Remember to always keep track of where you are.
So create an extra variable.
Call it oldState or something you like better.
Compare buttonState with oldState.
If they are the same, do nothing.
If they aren't the same, clear the LCD and update oldState.

That's all.
Logged

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ah ha, OK that sounds good. I'l give that a try. Thanks!!

Upon trying it, I am not sure how to code it. I get the concept, which I think is a good one.

This new comparison has to be outside of my loop to update?

I am not sure what to put in there yet.

« Last Edit: April 29, 2013, 09:27:35 am by Antennas » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

While we are at it, I figured out how to read my analog pot and print the result on the LCD. But how do I take my value and print it using the large fonts?

The values of 1 and 0 were a little easier, but how do I print 155 for example?

Logged

The Netherlands
Offline Offline
Edison Member
*
Karma: 47
Posts: 1552
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

No, it is inside the loop.
Declare the new variable in void.setup.
And before you write anyhting to the display, check if it's not already there.
This would result in something like this:

Code:
/*
A set of custom made large numbers for a 16x2 LCD using the
LiquidCrystal librabry. Works with displays compatible with the
Hitachi HD44780 driver.

The Cuicuit:
  LCD RS pin to D12
  LCD Enable pin to D11
  LCD D4 pin to D5
  LCD D5 pin to D4
  LCD D6 pin to D3
  LCD D7 pin to D2
  LCD Vee tied to a pot to control brightness
  LCD Vss and R/W tied to ground
  LCD Vcc to +5V
  LCD pin 15 tied to pushbutton for control of backlight
 
Made by Michael Pilcher
2/9/2010
*/

// include the library
#include <LiquidCrystal.h>
const int buttonPin = 7;
int buttonState = 0;
int oldState = 0;                                  //<- new line
// initialize the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// the 8 arrays that form each segment of the custom numbers
byte LT[8] =
{
  B00111,
  B01111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};
byte UB[8] =
{
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};
byte RT[8] =
{
  B11100,
  B11110,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};
byte LL[8] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B01111,
  B00111
};
byte LB[8] =
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111
};
byte LR[8] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11110,
  B11100
};
byte UMB[8] =
{
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111
};
byte LMB[8] =
{
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111
};

// loop counter
int x = 0;

 
void setup()
{
  // assignes each segment a write number
  lcd.createChar(0,LT);
  lcd.createChar(1,UB);
  lcd.createChar(2,RT);
  lcd.createChar(3,LL);
  lcd.createChar(4,LB);
  lcd.createChar(5,LR);
  lcd.createChar(6,UMB);
  lcd.createChar(7,LMB);
 
 pinMode(buttonPin, INPUT);
 
  // sets the LCD's rows and colums:
  lcd.begin(16, 2);
       
}

void custom0()
{ // uses segments to build the number 0
  lcd.setCursor(x, 0); // set cursor to column 0, line 0 (first row)
  lcd.write((byte)0);  // call each segment to create
  lcd.write(1);  // top half of the number
  lcd.write(2);
  lcd.setCursor(x, 1); // set cursor to colum 0, line 1 (second row)
  lcd.write(3);  // call each segment to create
  lcd.write(4);  // bottom half of the number
  lcd.write(5);
}

void custom1()
{
  lcd.setCursor(x,0);
  lcd.write(1);
  lcd.write(2);
  lcd.setCursor(x+1,1);
  lcd.write(5);
}

void custom2()
{
  lcd.setCursor(x,0);
  lcd.write(6);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(7);
  lcd.write(7);
}

void custom3()
{
  lcd.setCursor(x,0);
  lcd.write(6);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(7);
  lcd.write(7);
  lcd.write(5);
}

void custom4()
{
  lcd.setCursor(x,0);
  lcd.write(3);
  lcd.write(4);
  lcd.write(2);
  lcd.setCursor(x+2, 1);
  lcd.write(5);
}

void custom5()
{
  lcd.setCursor(x,0);
  lcd.write((byte)0);
  lcd.write(6);
  lcd.write(6);
  lcd.setCursor(x, 1);
  lcd.write(7);
  lcd.write(7);
  lcd.write(5);
}

void custom6()
{
  lcd.setCursor(x,0);
  lcd.write((byte)0);
  lcd.write(6);
  lcd.write(6);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(7);
  lcd.write(5);
}

void custom7()
{
  lcd.setCursor(x,0);
  lcd.write(1);
  lcd.write(1);
  lcd.write(2);
  lcd.setCursor(x+1, 1);
  lcd.write((byte)0);
}

void custom8()
{
  lcd.setCursor(x,0);
  lcd.write((byte)0);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(7);
  lcd.write(5);
}

void custom9()
{
  lcd.setCursor(x,0);
  lcd.write((byte)0);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x+2, 1);
  lcd.write(5);
}

 void loop(){
   
  buttonState = digitalRead(buttonPin);
  if (buttonState==HIGH){
    if (buttonState!=oldState){             //<-
    oldState=buttonState;                   //   New or
    lcd.clear();                            //   altered lines
    custom1();}                             //<-
     
     }
  else {
    if (buttonState!=oldState){             //<-
    oldState=buttonState;                   //   New or
    lcd.clear();                            //   altered lines
    custom0();}                             //<-
      }
}


Logged

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wow that works like a charm, of course you knew that! ha..
I didn't understand that you could put an if then another if right after it.

So does that translate into IF the buttonstate is HIGH then AND if buttonstate not equal to oldState or is that more like an OR...???
So also this only happens if it's HIGH then it skips and goes to the next ELSE. But what is happening when you ask if buttonstate is not equal to oldState but then you right away make it equal to it? What is that doing in plain language?
I don't know if that's clear but I hope so.

Thanks



 
Code:
buttonState = digitalRead(buttonPin);
  if (buttonState==HIGH){
    if (buttonState!=oldState){             //<-
    oldState=buttonState;                   //   New or
    lcd.clear();                            //   altered lines
    custom1();}                             //<-
     
     }
  else {
    if (buttonState!=oldState){             //<-
    oldState=buttonState;                   //   New or
    lcd.clear();                            //   altered lines
    custom0();}                             //<-
      }
}/code]
Logged

The Netherlands
Offline Offline
Edison Member
*
Karma: 47
Posts: 1552
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

This is an AND, not an OR situation.
If you see a pressed button, AND  you haven't processed it before, process it now.
As you are ending that processing with the accolade } twice ,the ELSE belongs to the first IF statement, not to the second one.
You can easily keep track of that by using the indents, with which the IDE helps you by automaticly using those.
IDE also helps you with the () parentheses and {} accolades by showing you which pair belong together.
« Last Edit: May 04, 2013, 02:27:23 pm by MAS3 » Logged

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok I think I understand that. The fog is clearing a little.  smiley-wink

Any thoughts on the large font for my pot value? I suspect that might be more complicated??

I really don't have any ideas on that at this point. I will keep at it and keep searching.

Thanks again!!

Logged

Western New York, USA
Offline Offline
Faraday Member
**
Karma: 32
Posts: 4261
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

There's another technique that doesn't involve as much programming.

Instead of clearing the entire screen all you have to do is cover up the old number with spaces before writing the new number.

This involves positioning the cursor twice as many times but is still faster than clearing the whole screen and typically doesn't cause screen flicker.


Don
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok that sounds like a good idea as well and I did see something like that in a search awhile ago.

Anyone have ideas on the best way to convert my sensor reading value to the large font text?


Thanks.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Could I take my sensor reading which I converted to 0-360 then make it a string, grab the values from it and make them variables to print the large font character that I have set up to use those variables to print. See down below where it uses custom(1) for example to print a large font 1.

Such as potValue = 145 so A=1 B=4 C=5 Then use my custom(A) to print a 1? Can I insert a variable in there??

I have this code to read my pot,

Code:
// These constants won't change.  They're used to give names
// to the pins used:
const int analogInPin = A0;  // Analog input pin that the potentiometer is attached to

int sensorValue = 0;        // value read from the pot
int outputValue = 0; // value output to the PWM (analog out)
char outputValueChar[3];

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600);
  lcd.begin(16,2);
}

void loop() {
  // read the analog in value:
  sensorValue = analogRead(analogInPin);           
  // map it to the range of the analog out:
  outputValue = map(sensorValue, 0, 1023, 0, 360); 
 
  // print the results to the serial monitor:
  Serial.print("sensor = " );                       
  Serial.print(sensorValue);     
  Serial.print("\t output = ");     
  Serial.println(outputValue);
  lcd.setCursor(0,1); 
  lcd.print(outputValue);
  delay(250);
  lcd.clear();
  // wait 2 milliseconds before the next loop
  // for the analog-to-digital converter to settle
  // after the last reading:
  delay(10);   

  Serial.print

}


and I have this code that so far will print large fonts when I push my button. Now I need to combine them to print my pot reading in large font.
This is the code for the large font..

Code:
/*
A set of custom made large numbers for a 16x2 LCD using the
LiquidCrystal librabry. Works with displays compatible with the
Hitachi HD44780 driver.

Made by Michael Pilcher
2/9/2010
*/

// include the library
#include <LiquidCrystal.h>
const int buttonPin = 7;
int buttonState = 0;
int oldState = 0;
int pot = A0;
int potval = 0;

// initialize the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// the 8 arrays that form each segment of the custom numbers
byte LT[8] =
{
  B00111,
  B01111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};
byte UB[8] =
{
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};
byte RT[8] =
{
  B11100,
  B11110,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};
byte LL[8] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B01111,
  B00111
};
byte LB[8] =
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111
};
byte LR[8] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11110,
  B11100
};
byte UMB[8] =
{
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111
};
byte LMB[8] =
{
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111
};

// loop counter
int x = 0;

 
void setup()
{
  Serial.begin(9600);
  // assignes each segment a write number
  lcd.createChar(0,LT);
  lcd.createChar(1,UB);
  lcd.createChar(2,RT);
  lcd.createChar(3,LL);
  lcd.createChar(4,LB);
  lcd.createChar(5,LR);
  lcd.createChar(6,UMB);
  lcd.createChar(7,LMB);
 
 pinMode(buttonPin, INPUT);
 
  // sets the LCD's rows and colums:
  lcd.begin(16, 2);
       
}

void custom0()
{ // uses segments to build the number 0
  lcd.setCursor(x, 0); // set cursor to column 0, line 0 (first row)
  lcd.write((byte)0);  // call each segment to create
  lcd.write(1);  // top half of the number
  lcd.write(2);
  lcd.setCursor(x, 1); // set cursor to colum 0, line 1 (second row)
  lcd.write(3);  // call each segment to create
  lcd.write(4);  // bottom half of the number
  lcd.write(5);
}

void custom1()
{
  lcd.setCursor(x,0);
  lcd.write(1);
  lcd.write(2);
  lcd.setCursor(x+1,1);
  lcd.write(5);
}

void custom2()
{
  lcd.setCursor(x,0);
  lcd.write(6);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(7);
  lcd.write(7);
}

void custom3()
{
  lcd.setCursor(x,0);
  lcd.write(6);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(7);
  lcd.write(7);
  lcd.write(5);
}

void custom4()
{
  lcd.setCursor(x,0);
  lcd.write(3);
  lcd.write(4);
  lcd.write(2);
  lcd.setCursor(x+2, 1);
  lcd.write(5);
}

void custom5()
{
  lcd.setCursor(x,0);
  lcd.write((byte)0);
  lcd.write(6);
  lcd.write(6);
  lcd.setCursor(x, 1);
  lcd.write(7);
  lcd.write(7);
  lcd.write(5);
}

void custom6()
{
  lcd.setCursor(x,0);
  lcd.write((byte)0);
  lcd.write(6);
  lcd.write(6);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(7);
  lcd.write(5);
}

void custom7()
{
  lcd.setCursor(x,0);
  lcd.write(1);
  lcd.write(1);
  lcd.write(2);
  lcd.setCursor(x+1, 1);
  lcd.write((byte)0);
}

void custom8()
{
  lcd.setCursor(x,0);
  lcd.write((byte)0);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x, 1);
  lcd.write(3);
  lcd.write(7);
  lcd.write(5);
}

void custom9()
{
  lcd.setCursor(x,0);
  lcd.write((byte)0);
  lcd.write(6);
  lcd.write(2);
  lcd.setCursor(x+2, 1);
  lcd.write(5);
}

 void loop(){
 
  potval=analogRead(pot);
 
  buttonState = digitalRead(buttonPin);
  if (buttonState==HIGH){
    if (buttonState!=oldState){             //<-
    oldState=buttonState;                   //   New or
    lcd.clear();                            //   altered lines
    custom1();}                             //<-
     
     }
  else {
    if (buttonState!=oldState){             //<-
    oldState=buttonState;                   //   New or
    lcd.clear();                            //   altered lines
    custom0();}                             //<-
      }

}

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Anyone??
Logged

The Netherlands
Offline Offline
Edison Member
*
Karma: 47
Posts: 1552
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I'll have a shot at it.
You've got a pot that reads 361 degrees ?
You are mapping it from 0 (the first value) to 360, and that results in 361 values.
Most pots can be turned about 270 degrees.
If you are going to convert, make sure you've got it right.
But that's not what your question was about.

You want to break down your value to separate characters.
I'm not sure as i haven't played with that yet, but i think you can convert your value to a string.
Once you've done that, you can break the reuslt down into separate characters.
Those are then sent to your printing routine.
You can find extensive information about String (capital S) in the reference part of this site.
It will take some reading and studying, but i think this is a way to do what you're after.
Logged

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Well the pot doesn't go 361 degrees of course, but it's position will indicate a direction from 0-360 degrees. I mapped the input to 0-360. It's for a position sensor on an antennas rotor. The needle is too small to see and I want to make large 7 seg displays to display it.

I have started to look at the String info but still have to get through it.

Thanks.

Anyone with some code that does this?
Logged

Pages: [1]   Go Up
Jump to: