|
|
View previous topic :: View next topic |
Author |
Message |
armma
Joined: 30 Apr 2016 Posts: 7
|
custom character number 8 not display on lcd |
Posted: Sun Sep 02, 2018 4:34 am |
|
|
Hi,
I'm trying to display custom characters on 2 by 16 lcd.
I wrote a code to display 8 custom characters. All characters displayed on the lcd except char #8.
Code: |
#include <18f4520.h>
#device *= 16
#fuses NOWDT, HS, PROTECT, CPD, NOWRT, BROWNOUT, NODEBUG, NOLVP, PUT
#use delay (clock = 4MHz)
#include "lcd.c"
#define DEGREES 0
#define THERMO1 1
#define THERMO2 2
#define BELL_ACTIVE 3
#define MENU_R 4
#define MENU_L 5
#define CANCEL 6
#define OK 7
//!
void lcd_load_custom_chars(void);
void main()
{
lcd_init();
DELAY_MS(500);
lcd_load_custom_chars();
lcd_putc('\f');lcd_putc(DEGREES);lcd_putc(THERMO1); lcd_putc(THERMO2); lcd_putc(BELL_ACTIVE);lcd_putc(CANCEL);lcd_putc(OK);LCD_GOTOXY(1,2);lcd_putc(MENU_L);LCD_GOTOXY(16,2);lcd_putc(MENU_R);
while(TRUE)
{
}
}
const int8 lcd_custom_chars[] =
{
// Char Number 1 -- Degrees
0b00001100, // ....OO..
0b00010010, // ...O..O.
0b00010010, // ...O..O.
0b00001100, // ....OO..
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
// Char Number 2 -- thermo1
0B00100,
0B01010,
0B01010,
0B01110,
0B01110,
0B11111,
0B11111,
0B01110,
// Char Number 3 -- thermo2
0B00100,
0B01010,
0B01010,
0B01010,
0B01010,
0B10001,
0B10001,
0B01110,
//bell active
4,14,14,14,31,0,4,0,
//menu right
0B10000,
0B11000,
0B11100,
0B11110,
0B11100,
0B11000,
0B10000,
0B00000,
//menu left
0B00001,
0B00011,
0B00111,
0B01111,
0B00111,
0B00011,
0B00001,
0B00000,
//cancel
0B00000,
0B10001,
0B01010,
0B00100,
0B01010,
0B10001,
0B00000,
0B00000,
//character number 7 ... ok
0B00000,
0B00001,
0B00011,
0B10110,
0B11100,
0B01000,
0B00000,
0B00000,
};
void lcd_load_custom_chars(void)
{
int8 i;
// Set address counter pointing to CGRAM address 0.
lcd_send_byte(0, 0x40);
// Load custom lcd character data into CGRAM.
// It can only hold a maximum of 8 custom characters.
for(i = 0; i < sizeof(lcd_custom_chars); i++)
{
lcd_send_byte(1, lcd_custom_chars[i]);
}
// Set address counter pointing back to the DDRAM.
lcd_send_byte(0, 0x80);
}
|
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19549
|
|
Posted: Sun Sep 02, 2018 8:51 am |
|
|
The reason is simple. You can't send the 07 character with the standard lcd_putc. This is the ASCII '\a' character which is trapped by the driver. Add 8, and use 0xF for the character 7 (the CGRAM characters appear at 0 to 7, and then repeated at 8 to 15).
Or use flex_lcd, which does not trap the \a character. |
|
|
armma
Joined: 30 Apr 2016 Posts: 7
|
|
Posted: Tue Sep 04, 2018 4:59 pm |
|
|
Ttelmah wrote: | The reason is simple. You can't send the 07 character with the standard lcd_putc. This is the ASCII '\a' character which is trapped by the driver. Add 8, and use 0xF for the character 7 (the CGRAM characters appear at 0 to 7, and then repeated at 8 to 15).
Or use flex_lcd, which does not trap the \a character. |
thank you |
|
|
E_Blue
Joined: 13 Apr 2011 Posts: 417
|
|
Posted: Wed Sep 05, 2018 8:26 am |
|
|
Ttelmah wrote: | The reason is simple. You can't send the 07 character with the standard lcd_putc. This is the ASCII '\a' character which is trapped by the driver. Add 8, and use 0xF for the character 7 (the CGRAM characters appear at 0 to 7, and then repeated at 8 to 15).
Or use flex_lcd, which does not trap the \a character. |
There's any table that shows the byte value of each of those special codes \a \f \n etc?
I know \r\n and that's all. _________________ Electric Blue |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19549
|
|
Posted: Wed Sep 05, 2018 9:06 am |
|
|
The power of Wikipedia:
<https://en.wikipedia.org/wiki/Escape_sequences_in_C>
You'll see that the /a sequence was only added in C89. Didn't exist in original K&R.
It's actually treated as a 'back to origin' code in the CCS driver. Think I prefer flex_lcd, which just ignores it... |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9245 Location: Greensville,Ontario
|
|
Posted: Wed Sep 05, 2018 10:36 am |
|
|
It's too bad CCS used \a for their 'home' code.
\a is supposed to be 'alert' or bell.....
sigh.
I just checked the link and \h is NOT defined so it could have been used as the 'home' code ( top left position). That would make logical sense to me.... |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|