 |  |  |
 | Код: #include "msp430F1101.h" #define LCM_DIR1 P1DIR #define LCM_OUTD P1OUT #define LCM_DIR2 P2DIR #define LCM_OUTC P2OUT
// дефиниране на линии те за данни #define LCM_PIN_D0 BIT0 // P1.0 #define LCM_PIN_D1 BIT1 // P1.1 #define LCM_PIN_D2 BIT2 // P1.2 #define LCM_PIN_D3 BIT3 // P1.3 #define LCM_PIN_D4 BIT4 // P1.4 #define LCM_PIN_D5 BIT5 // P1.5 #define LCM_PIN_D6 BIT6 //P1.6 #define LCM_PIN_D7 BIT7 // P1.7 // дефиниране на управляващите изводи #define LCM_PIN_E BIT0 //P2.0 #define LCM_PIN_RS BIT1 //P2.1
// Създава необходимата маска чрез побитово ИЛИ LCM_PIN_MASK=0x1F=0001 1111 #define LCM_PIN_DMASK ((LCM_PIN_D0 | LCM_PIN_D1 | LCM_PIN_D2 | LCM_PIN_D2 | LCM_PIN_D3 | LCM_PIN_D4 | LCM_PIN_D5 | LCM_PIN_D6 | LCM_PIN_D7))
// маска за управлващите пинове #define LCM_PIN_CMASK (( LCM_PIN_E | LCM_PIN_RS )) #define FALSE 0 #define TRUE 1
// функция която кара дисплея да сканира изводите си void PulseLcm() {
LCM_OUTC &= ~LCM_PIN_E; // EN=0 __delay_cycles(200);
LCM_OUTC |= LCM_PIN_E; // EN=1 __delay_cycles(200);
LCM_OUTC &= (~LCM_PIN_E); // EN=0 __delay_cycles(200); }
// функция за изпращане на байт void SendByte( char ByteToSend, int IsData) { LCM_OUTD &= (~LCM_PIN_DMASK); //нулираме всички портовете LCM_OUTD |= ByteToSend; // изпращаме данни
//проверка за това команда или символ се праща /if (IsData == TRUE) { LCM_OUTC |= LCM_PIN_RS; // изпраща ме символ , определеният за RS извод се активизира, изпращаме TRUE-->данни } else { LCM_OUTC &= ~LCM_PIN_RS; // нулира се извода определен за RS единствено и само той , изпращаме FALSE--> команди } PulseLcm();
} // функция за управлението на курсора void LcmSetCursorPosition(char Row, char Col) // определяне на позицита на курсора { char address; if (Row == 0) { address = 0; } else { address = 0x40; }
address |= Col;
SendByte(0x80 | address, FALSE); // изпращаме команда за изпозициониране на курсора }
void ClearLcmScreen() // изчистане на дисплея { SendByte(0x01, FALSE); SendByte(0x02, FALSE); } // функция за инициализиране на дисплея void InitializeLcm(void) { LCM_DIR1 |= LCM_PIN_DMASK; //определяне на посоката на изводите на контролера LCM_DIR2 |= LCM_PIN_CMASK; LCM_OUTD &= ~(LCM_PIN_DMASK); __delay_cycles(100000); LCM_OUTC &= ~LCM_PIN_RS; // нулира се RS LCM_OUTC |= LCM_PIN_E; // нулира се EN
P1OUT = 0x3F; //Би трябвало да останови в 8-битов режим PulseLcm(); LCM_OUTC = LCM_PIN_E; PulseLcm(); SendByte(0x06, FALSE); // автоматично инкрементиране на курсора } // функция за извличане на текст void PrintStr(char *Text) { char *c; c = Text; while ((c != 0) && (*c != 0)) { SendByte(*c, TRUE); c++; } } void main(void) { WDTCTL = WDTPW + WDTHOLD; // Спиране на таймера InitializeLcm(); ClearLcmScreen(); PrintStr("Hello World!"); while (1) { __delay_cycles(1000); }
} |  |
 |  |  |
0. Използвай винаги и навсякъде stdint.h . Ако една променлива няма да има стойност повече от 255, обяви я като 8 битова, не използвай int. Size Matters.
1. Не ти трябва 8 битов режим.
2.
коментара не е правилен.
3.
коментара не е правилен.
4.
не е правилно
5.
това смуче.
Ползвай това след като го преработиш.
6.
Провери точно, как се рестартира дисплея с инструкции в документацията.
това е излишно
това е много малко, процесора ти тръгва много по-рано от дисплея.
инструкцията е ненужна защото имаш PulseLcm();, комантара също е сгрешен.
това не е правилно използвай LCM_OUTD = 0x3F;
това не е правилно, трябва да е LCM_OUTC &= ~LCM_PIN_E; , освен това не е нужна, защото имаш команда PulseLcm(); която прави същото.
7.
Не ми харесва функцията ти. Използвай само тази, които са одобрени от ЦК на КПСС:
8.
коментара не е правилен.
9.
Това не е правилно. Използвай: