vekt (17.03.2007 17:56, просмотров: 4384)
Никак не могу врубить HD44780 с MSP430. Отображает только первую строку пустых знакомест. Помогите кто может примером. #define DB4 0x01 // P3.0
#define DB5 0x02 // P3.1
#define DB6 0x04 // P3.2
#define DB7 0x08 // P3.3
#define WDT_1ms 1 // 0.5 мс * 1 = 0.5 мс
#define WDT_5ms 9 // 0.5 мс * 10 = 5 мс
#define WDT_20ms 39 // 0.5 мс * 40 = 20 мс
#define WDT_second 1999 // 0.5 мс * 2000 = 1 секунда
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P3DIR |= DB4 + DB5 + DB6 + DB7;
P2DIR |= LED + RS + RW + E;
P2OUT = 0;
Set_DCO();
timer = 0;
WDTCTL = WDT_MDLY_0_5; // 0,5 мс
IE1 |= WDTIE; // Разрешить прерывание от WDT
_BIS_SR(GIE);
WDT_interval = WDT_second*2;
_BIS_SR(LPM0_bits);
//----Инициализация LCD------
P3OUT &= 0x0F; //очистка
WDT_interval = WDT_20ms;
_BIS_SR(LPM0_bits); // ждем пока LCD загрузиится
P2OUT &= ~RS; //команда
Set_Bus(0x03); //команда 30
WDT_interval = WDT_5ms;
_BIS_SR(LPM0_bits);
P2OUT &= ~RS; //команда
Set_Bus(0x03); //команда 30
WDT_interval = WDT_5ms;
_BIS_SR(LPM0_bits);
P2OUT &= ~RS; //команда
Set_Bus(0x03); //команда 30
WDT_interval = WDT_5ms;
_BIS_SR(LPM0_bits);
P2OUT &= ~RS; //команда
Set_Bus(0x02); //команда 30
WDT_interval = WDT_5ms;
_BIS_SR(LPM0_bits);
//команда 20 из 4 разрядного режима
P2OUT &= ~RS; //команда
Set_Bus(0x02); //команда 20 старшая тетрада (шина 4 разряда)
WDT_interval = WDT_5ms;
_BIS_SR(LPM0_bits);
Set_Bus(0x08); //младшая тетрада (две строки)
WDT_interval = WDT_5ms;
_BIS_SR(LPM0_bits);
//Дисплей ВЫКЛ
P2OUT &= ~RS; //команда
Set_Bus(0x00); //команда 20 старшая тетрада
WDT_interval = WDT_5ms;
_BIS_SR(LPM0_bits);
Set_Bus(0x08); //младшая тетрада (включить дисплей)
WDT_interval = WDT_5ms;
_BIS_SR(LPM0_bits);
//Очистка дисплея
P2OUT &= ~RS; //команда
Set_Bus(0x00); //команда 20 старшая тетрада
WDT_interval = WDT_5ms;
_BIS_SR(LPM0_bits);
Set_Bus(0x01); //младшая тетрада (включить дисплей)
WDT_interval = WDT_5ms;
_BIS_SR(LPM0_bits);
//Дисплей, курсор - ВКЛ
P2OUT &= ~RS; //команда
Set_Bus(0x00); //команда 20 старшая тетрада
WDT_interval = WDT_1ms;
_BIS_SR(LPM0_bits);
Set_Bus(0x0e); //младшая тетрада (включить дисплей)
WDT_interval = WDT_1ms;
_BIS_SR(LPM0_bits);
//Выбор режима отображения
P2OUT &= ~RS; //команда
Set_Bus(0x00); //команда 20 старшая тетрада
WDT_interval = WDT_1ms;
_BIS_SR(LPM0_bits);
Set_Bus(0x06); //младшая тетрада (смещение)
WDT_interval = WDT_1ms;
_BIS_SR(LPM0_bits);
P2OUT &= ~RS; //команда
Set_Bus(0x08); //переход на первую строку
WDT_interval = WDT_1ms;
_BIS_SR(LPM0_bits);
Set_Bus(0x00);
WDT_interval = WDT_1ms;
_BIS_SR(LPM0_bits);
P2OUT |= RS; //данные
Set_Bus(0x05);
WDT_interval = WDT_1ms;
_BIS_SR(LPM0_bits);
Set_Bus(0x03);
WDT_interval = WDT_1ms;
_BIS_SR(LPM0_bits);
for (;;)
{
WDT_interval = WDT_5ms;
_BIS_SR(LPM0_bits);
P2OUT ^= LED;
}
}
#pragma vector = WDT_VECTOR
__interrupt void WDTISR(void)
{
timer++;
if (timer > WDT_interval)
{
timer = 0;
_BIC_SR_IRQ(LPM0_bits); //проснись
}
}
void Set_Bus(char data)
{
P3OUT &= 0x0F; //очистка
P2OUT |= E;
P3OUT |= data;
P2OUT &= ~E;
}