Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Проблем с ks0066u 2х16 и CCS компилатор?
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=1903
Страница 1 от 1

Автор:  PIC [ Вто Фев 28, 2006 11:32 am ]
Заглавие:  Проблем с ks0066u 2х16 и CCS компилатор?

Странно нещо се случва с ЛСД-то. На асемблер имам десетки програми , които използват почти всичките функции на дисплея и всичко върви добре. Но при писане на инициализацията на дисплея на С компилатор едва го докарах да потегли на едноредов режим , двуредов въобще не ще:x и не мога да си обясня какво става? Ето и сорса:
Режима е 4-битов , RB7-RB4-Data, RB1=RS, RB3=E

#define LCD_STROBE ((PORTB.F3 = 1),(PORTB.F3 = 0))

/* write a byte to the LCD in 4 bit mode */

void LCD_write(unsigned char c)
{
PORTB = c*0xF0;
LCD_STROBE;
PORTB = c << 4;
PORTB = PORTB*0xF0;
LCD_STROBE;
Delay_us(50);
}

/* Go to the specified position */

void LCD_goto(unsigned char pos)
{
PORTB.F1 = 0; // RS control byte
LCD_write(0x80+pos);
}

/* write a string of chars to the LCD */

void LCD_send(const char * s) // write characters
{
PORTB.F1 = 1; // RS control byte
while(*s)
LCD_write(*s++);
}

/* initialise the LCD - put into 4 bit mode */

void Init_LCD(void)
{
PORTB.F1 = 0; // RS control byte
Delay_ms(35); /* Initialize LCD connected to PORTB*/
PORTB = 0x20*0xF0; /* Function Set*/
LCD_STROBE;
Delay_us(50);
LCD_write(0x2C); // B'11000010'
LCD_write(0x0F); // Display on/off control B'00001100'
PORTB = 0x00*0xF0; // Display clear B'00000001'
LCD_STROBE;
Delay_us(50);
PORTB = 0x10*0xF0;
LCD_STROBE;
Delay_ms(2);
LCD_write(0x06); // Entry mode set B'00000110'
} /* Initialization end*/

/*----------------------------------------------------*/

void main() {
TRISB = 0; /* set port_b to be outputs */
PORTB = 0; /* initialize All port_b outp/uts to be zero */
TRISA = 0;
PORTA = 0;
OPTION_REG = 0xC7; /*prescaler with TMR0, 1/256 mode*/
INTCON = 0x00;

Init_LCD();
LCD_send("LCD KS0066u");
LCD_goto(0x40);
LCD_send("microE");
}

Автор:  evc [ Вто Фев 28, 2006 12:15 pm ]
Заглавие: 

Тоя макрос дето си го сложил VCD_STROBE, въобще не ми харесва!
Като гледам колко често се използва, по-добре си го дефинирай като функция.
Освен това продължителността на инейбъла ще ти зависи от тактовата на процесора
така че може да ти дойде къс. И въобще - огледай си внимателно времената.
Това им е голяма мъка на LCD-тата.
А защо не използваш готовата библиотечна функция на mikroE?

Автор:  PIC [ Вто Фев 28, 2006 12:29 pm ]
Заглавие: 

С готови библиотечни функции не става , защото всички са за HD44780 и за това се налага да пиша собствени за ks0066u. Относно времето на инейбъла мисля , че е добре /при 4MHz е 1uS/ , а и на асемблер върви точно така. По принцип времената съм завишил почти двойно спрямо дадените за всяка команда :( .

Автор:  Bezmozachen [ Вто Фев 28, 2006 12:32 pm ]
Заглавие: 

офф:Извинявай за въпроса, но немога да разбера следните редове:
Код:
PORTB = c*0xF0;
PORTB = PORTB*0xF0;
PORTB = 0x20*0xF0;
.......

* небеше ли за умножение? Или това е нещо специфично за CCS. Позабравил съм Ц-то.

Иначе един съвет за инициализацията. Аз винаги отначало подавам 3 команди за конфигуриране в 8 битов интерфейс и след това 1 за установяване в 4 битов. Това се прави с цел, ако примерно ти се е ресетнал професора, а ЛЦД-то не е. При такъв случай в началото го заварваш конфигуриран за 4 битов интерфейс и инициализацията няма да протече както трябва. С 3-те първи комнди ще си сигурен че вече е в 8-битов и ще изпълни правилно последната за преминаване към 4-битов интерфейс.

Автор:  [ Вто Фев 28, 2006 12:43 pm ]
Заглавие: 

Код:
void LCD_write(unsigned char c)
{
PORTB = c*0xF0;
LCD_STROBE;
PORTB = c << 4;
PORTB = PORTB*0xF0;
LCD_STROBE;
Delay_us(50);
}


правилното е така да го кодираш:

Код:
void LCD_write(unsigned char c)
{
PORTB = c & 0xF0;
LCD_STROBE;
PORTB = c << 4;
/* PORTB = PORTB*0xF0; - това е излишно, пък и не е вярно */
LCD_STROBE;
Delay_us(50);
}


'*' не е еквивалетно на '&', оттук ти идват проблемите. Примерно с
Код:
PORTB = 0x20*0xF0; /* Function Set*/


на PORTB записваш нула, вместо 0x20, както очакваш.
Прегледай и листинга на асемблер и ще си откриеш сам всички грешки.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/