Для MSP430. Игру с понижением-повышением частот можно выкинуть и вообще лишнее
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Elektronik 20 января 2004 г. 11:37
В ответ на: tut nedavno probigal C cod raboty s LCD 4bit mode podska*ite esho raz Pliz отправлено KA 20 января 2004 г. 10:49


#include

#define MAX_CPU BCSCTL2 &= ~DIVM_3
#define MIN_CPU BCSCTL2 |= DIVM_3
unsigned int save_CPU;

void delay(unsigned int mks)
{
unsigned int cikl;
save_CPU = BCSCTL2;
MIN_CPU;
mks = mks >> 3;
for(cikl = 0; cikl < mks; cikl++);
BCSCTL2 = save_CPU;
}
cmd_not_bf_4(unsigned char tetr)
{
P5DIR = P5DIR | 0x0f; // Данные наружу
P5OUT = P5OUT & ~0x0f;
P5OUT = P5OUT | tetr; // Установить данные
P1OUT = P1OUT | 0x80; // E = 1
P1OUT = P1OUT & ~0x80; // E = 0

}

void cmd_not_bf(void)
{
cmd_not_bf_4(0x02); // старшая тетрада от 0x20
cmd_not_bf_4(0x00); // младшая тетрада от 0x20
P5OUT = P5OUT | 0x0f;
P5DIR = P5DIR & ~0x0f; // Данные вовнутрь
}

wait_cmd(void)
{
volatile unsigned char hi, lo;
P1OUT = P1OUT & ~0xe0;
P5DIR = P5DIR & ~0x0f;
P1OUT = P1OUT | 0x40; // R/W = 1 - чтение
save_CPU = BCSCTL2;
MIN_CPU;
do{
P1OUT = P1OUT | 0x80; // E = 1
hi = P5IN;
P1OUT = P1OUT & ~0x80; // E = 0
P1OUT = P1OUT | 0x80; // E = 1
lo = P5IN;
P1OUT = P1OUT & ~0x80; // E = 0
}while((hi & 0x08) != 0);
BCSCTL2 = save_CPU;
}

void wrc_lcd(unsigned char lcd_to)
{
wait_cmd();
save_CPU = BCSCTL2;
MAX_CPU;
P1OUT = P1OUT & ~0xe0;
P5DIR = P5DIR | 0x0f;
P5OUT = P5OUT & ~0x0f;
P5OUT = P5OUT | (0x0f & (lcd_to >>4));
P1OUT = P1OUT | 0x80; // E = 1
P1OUT = P1OUT & ~0x80; // E = 0
P5OUT = P5OUT & ~0x0f;
P5OUT = P5OUT | (0x0f & lcd_to);
P1OUT = P1OUT | 0x80; // E = 1
P1OUT = P1OUT & ~0x80; // E = 0
P1OUT = P1OUT & ~0xe0;
P5DIR = P5DIR & ~0x0f; // Шина данных вовнутрь
P5OUT = P5OUT | 0x0f;
BCSCTL2 = save_CPU;
}

void set_pos_str1(unsigned char pos)
{
wrc_lcd(0x80 | pos);
}

void set_pos_str2(unsigned char pos)
{
wrc_lcd(0xc0 | pos);
}


void wrd_lcd(unsigned char lcd_to)
{
wait_cmd();
save_CPU = BCSCTL2;
MAX_CPU;
P1OUT = P1OUT & ~0xe0;
P5DIR = P5DIR | 0x0f;
P5OUT = P5OUT & ~0x0f;
P1OUT = P1OUT | 0x20;
P5OUT = P5OUT | (0x0f & (lcd_to >>4));
P1OUT = P1OUT | 0x80; // E = 1
P1OUT = P1OUT & ~0x80; // E = 0
P5OUT = P5OUT & ~0x0f;
P5OUT = P5OUT | (0x0f & lcd_to);
P1OUT = P1OUT | 0x80; // E = 1
P1OUT = P1OUT & ~0x80; // E = 0
P1OUT = P1OUT & ~0xe0;
P5DIR = P5DIR & ~0x0f; // Шина данных вовнутрь
P5OUT = P5OUT | 0x0f;
BCSCTL2 = save_CPU;
}

void clr_str1(void)
{
unsigned char ind_clr;
set_pos_str1(0);
for(ind_clr = 0; ind_clr < 16; ind_clr++) wrd_lcd(' ');
}

void clr_str2(void)
{
unsigned char ind_clr;
set_pos_str2(0);
for(ind_clr = 0; ind_clr < 16; ind_clr++) wrd_lcd(' ');
}

void clr_lcd(void)
{
clr_str1();
clr_str2();
}

void str_to_lcd(const unsigned char *msg)
{
unsigned char ind_lcd;
ind_lcd = 0;
while(msg[ind_lcd] != 0xff)
{
wrd_lcd(msg[ind_lcd]);
ind_lcd++;
}
}

void set_dop_sym(void)
{
wrc_lcd(0x40);
// стрелка вверх - 0
wrd_lcd(4);
wrd_lcd(14);
wrd_lcd(21);
wrd_lcd(4);
wrd_lcd(4);
wrd_lcd(4);
wrd_lcd(4);
wrd_lcd(0);
// стрелка вниз - 1
wrd_lcd(4);
wrd_lcd(4);
wrd_lcd(4);
wrd_lcd(4);
wrd_lcd(21);
wrd_lcd(14);
wrd_lcd(4);
wrd_lcd(0);
// дельта (треугольник) - 2
wrd_lcd(0);
wrd_lcd(0);
wrd_lcd(0);
wrd_lcd(4);
wrd_lcd(10);
wrd_lcd(17);
wrd_lcd(31);
wrd_lcd(0);
// лямбда - 3
// переделал на разряженную батарею
/* wrd_lcd(0);
wrd_lcd(0);
wrd_lcd(12);
wrd_lcd(18);
wrd_lcd(6);
wrd_lcd(10);
wrd_lcd(17);
wrd_lcd(0); */
wrd_lcd(0);
wrd_lcd(0);
wrd_lcd(31);
wrd_lcd(19);
wrd_lcd(23);
wrd_lcd(31);
wrd_lcd(0);
wrd_lcd(0);

// кружок перед цельсием - 4
wrd_lcd(6);
wrd_lcd(9);
wrd_lcd(9);
wrd_lcd(6);
wrd_lcd(0);
wrd_lcd(0);
wrd_lcd(0);
wrd_lcd(0);
// знак номера - 5
wrd_lcd(0);
wrd_lcd(0);
wrd_lcd(3);
wrd_lcd(18);
wrd_lcd(26);
wrd_lcd(22);
wrd_lcd(18);
wrd_lcd(0);
// плюс / минус - 6
wrd_lcd(0);
wrd_lcd(8);
wrd_lcd(29);
wrd_lcd(10);
wrd_lcd(4);
wrd_lcd(11);
wrd_lcd(16);
wrd_lcd(0);
// два подстрочное - 7
wrd_lcd(0);
wrd_lcd(12);
wrd_lcd(18);
wrd_lcd(2);
wrd_lcd(4);
wrd_lcd(8);
wrd_lcd(16);
wrd_lcd(30);
}

void lcd_init(void)
{
P1OUT = P1OUT & ~0xe0; // Исходное состояние
delay(15000);
cmd_not_bf();
delay(4100);
cmd_not_bf();
delay(100);
cmd_not_bf();
delay(100);
wrc_lcd(0x28); // 4 бит 2 строки
wrc_lcd(0x0c); // дисплей включен, курсор погашен, моргание отключено
wrc_lcd(0x06); // двигать курсор вправо
wrc_lcd(0x01); // очистить экран
delay(4100);
set_dop_sym();
}


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru