|
LCD через регистр сдвига, Как реализовать? |
|
|
|
Jun 8 2005, 14:25
|

Местный
  
Группа: Свой
Сообщений: 323
Регистрация: 13-05-05
Пользователь №: 4 986

|
Цитата Наверное неправильно пишу. Наверное... Трудно сказать, не видя кода Простите за глупый вопрос  , а как пишете, если даже не знаете, с контроллером ЖК или без? Или я чего-то не понимаю?
--------------------
О сколько нам открытий чудных ...
|
|
|
|
|
Jun 8 2005, 14:47
|

Участник

Группа: Свой
Сообщений: 68
Регистрация: 1-05-05
Из: Снежинск
Пользователь №: 4 654

|
Вот примеры Для Пика (как в книге) Код // Глобальные переменные volatile unsigned int RTC = 0; //Счетчик реального времени
int Dlay; //длительность задержки static volatile bit Clock @ (unsigned)&PORTB*8+1; static volatile bit ClockTRIS @ (unsigned)&TRISB*8+1; static volatile bit Data @ (unsigned)&PORTB*8+2; static volatile bit DataTRIS @ (unsigned)&TRISB*8+2;
char Message[13] = "Hello World!"; //строка сообщения выводимая на //дисплей
// Служебные подпрограммы LCDNybble(char Nybble, char RS){ // запись полубайта в ЖКИ unsigned int i; Data = 0; // очистка сдвигового регистра for (i = 0;i < 6; i++){ Clock = 1; //строб clock Clock = 0; //для записи нулевых разрядов } Data = 1; // строб Е Clock = 1; // строб clock Clock = 0; Data = RS; // бит RS Clock = 1; Clock = 0; for (i = 0; i < 4; i++){ // запись 4 бита if ((Nybble & 0x008) != 0) Data = 1; else Data = 0; Clock = 1; Clock = 0; Nybble = Nybble << 1; // сдвиг влево перед записью нового } //полубайта Data = 1; // строб Е Data = 0; } // конец подпрограммы LSDNybble
LCDByte(char Byte, char RS){ //запись байта в ЖКИ int LBDlay; LCDNybble((Byte >> 4)& 0x00F, RS); // старшая тетрада LCDNybble( Byte & 0x00F, RS); // младшая тетрада if ((Byte < 4) && (RS == 0)) LBDlay = RTC + 6; else LBDlay = RTC + 2; while (LBDlay != RTC); } // конец LCDByte
//Обработчик прерываний от таймера: void interrupt tmr0_int(void) { char temp; //TMR0 = 0x0F0; if (T0IF) //если запрос на прерывание поступил от таймера TMR0 { T0IF = 0; //то сбросить флаг прерывания RTC++; //и выполнить инкремент счетчика времени } }
//Главная программа void main(void) { int i; TMR0 = 0;//x0F0; //Начальное значение счетчика //реального времени OPTION = 0x0D1; //использовать предделитель совместно // с таймером TMR0, коэффициент деления 4 T0IE = 1; // Разрешить прерфывание от таймера GIE = 1; // Разрешить обработку прерываний Dlay = RTC + 20; while (Dlay != RTC); LCDNybble(0x003, 0); Dlay = RTC + 6; while (Dlay != RTC); LCDNybble(0x003, 0); Dlay = RTC + 1; while (Dlay != RTC); LCDNybble(0x003, 0); Dlay = RTC + 1; while (Dlay != RTC); LCDNybble(0x002, 0); Dlay = RTC + 1; while (Dlay != RTC); LCDByte(0x028, 0); LCDByte(0x008, 0); LCDByte(0x001, 0); LCDByte(0x006, 0); LCDByte(0x00E, 0); for (i = 0; i < 12; i++) LCDByte(Message[i], 1); while (1 == 1) // Бесконечный цикл { } } Для АВР (тупое копирование с небольшой коррекцией) Код #include <90s8515.h>
#include <delay.h>
char Message[13] = "Hello World!"; // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // Place your code here
}
// Declare your global variables here
LCDNybble(char Nybble, char RS) { unsigned int i; PORTA.0 = 0; for (i=0; i<6; i++) { PORTA.1 = 1; PORTA.1 = 0; } PORTA.0 = 1; PORTA.1 = 1; PORTA.1 = 0;
PORTA.0 = RS; PORTA.1 = 1; PORTA.1 = 0; for (i=0; i<4; i++) { if ((Nybble & 0x08) != 0) PORTA.0 = 1; else PORTA.0 = 0; PORTA.1 = 1; PORTA.1 = 0; Nybble = Nybble << 1; } PORTA.0 = 1; PORTA.0 = 0; }
LCDByte(char Byte, char RS) { //int LBDlay; LCDNybble((Byte >> 4) & 0x0F, RS); LCDNybble(Byte & 0x0F, RS); if ((Byte < 4) & (RS ==0)) //LBDlay = RTC + 6; delay_ms(5); else //LBDlay = RTC + 2; delay_ms(1); } void main(void) { // Declare your local variables here int i; // Input/Output Ports initialization // Port A initialization PORTA=0x00; DDRA=0x03;
// Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00;
// Port C initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00;
// Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x00;
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 3,906 kHz TCCR0=0x05; TCNT0=0x00;
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00;
// External Interrupt(s) initialization // INT0: Off // INT1: Off GIMSK=0x00; MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x02;
// Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80;
// LCD module initialization
PORTA.1 = 0; PORTA.0 = 0;
delay_ms(20); LCDNybble(0x03,0); delay_ms(5); LCDNybble(0x03,0); delay_ms(1); LCDNybble(0x03,0); delay_ms(1); LCDNybble(0x02,0); delay_ms(1); LCDByte(0x28,0); LCDByte(0x08,0); LCDByte(0x01,0); LCDByte(0x06,0); LCDByte(0x0E,0);
// Global enable interrupts #asm("sei")
for (i=0; i<12; i++) LCDByte(Message[i],1); while (1) { // Place your code here
}; } Ни один пример реально не работает если надо могу кинуть схему подключения
|
|
|
|
|
Jun 8 2005, 15:21
|

Участник

Группа: Свой
Сообщений: 68
Регистрация: 1-05-05
Из: Снежинск
Пользователь №: 4 654

|
[/quote] Вот ее-то как раз желательно увидеть. [/quote] немогу воткнуть картинку
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|