|
|
Część 6 - Wyświetlacz LCD
Przykład 6.1.ASM
NAME P06_01_ASM_SRC
$INCLUDE (ATMEL/REG8252.INC)
P06_01_ASM SEGMENT CODE
RSEG P06_01_ASM
PORTLCD EQU P2
RS EQU PORTLCD.2
E EQU PORTLCD.3
D7 EQU PORTLCD.7
D6 EQU PORTLCD.6
D5 EQU PORTLCD.5
D4 EQU PORTLCD.4
CLEAR EQU 01H
HOME EQU 02H
INCREMENT EQU 04H
DECREMENT EQU 06H
SHIFTRIGHT EQU 07H
SHIFTLEFT EQU 05H
BLINK EQU 09H
NOBLINK EQU 08H
CURON EQU 0AH
CUROFF EQU 08H
DISPON EQU 0CH
DISPOFF EQU 08H
SHIFT_CURSOR_LEFT EQU 10H
SHIFT_CURSOR_RIGHT EQU 14H
SHIFT_DISPLAY_LEFT EQU 18H
SHIFT_DISPLAY_RIGHT EQU 1CH
START:
ACALL LCD_INIT
MOV DPTR,#NAPIS1
ACALL WRITE_TEXT
SJMP $
WRITE_TO_LCD:
PUSH ACC ;zapamiętaj zawartość akumulatora na stosie
SETB E ;ustaw na linii E stan wysoki
ORL PORTLCD,#0F0H ;ustaw 4 starsze bity portu P1
ORL A,#0FH ;ustaw 4 młodsze bity akumulatora
ANL PORTLCD,A ;iloczyn logiczny portu P1 i akumulatora
;powoduje zmianę tylko 4 starszych bitów portu 4
młodsze bez zmian
CLR E;opadające zbocze na E zapisuje do rejestru
wyświetlacza
POP ACC ;przywróć początkową zawartość akumulatora
SWAP A ;zamień miejscami połówki akumulatora
SETB E ;ustaw na linii E stan wysoki
ORL PORTLCD,#0F0H ;ustaw 4 starsze bity portu P1
ORL A,#0FH ;ustaw 4 młodsze bity akumulatora
ANL PORTLCD,A ;iloczyn logiczny portu P1 i akumulatora
;powoduje zmianę tylko 4 starszych bitów portu 4
młodsze bez zmian
CLR E ;opadające zbocze na E zapisuje do rejestru
wyświetlacza
MOV A,#1 ;opóˇnienie
ok. 1ms
LCALL DELAY
RET
WRITE_COMMAND:
CLR RS ;0 na RS -> zapis do rejestru rozkazów
LCALL WRITE_TO_LCD ;zapis bajtu do rejestru wyświetlacza
RET
WRITE_CHAR:
SETB RS ;1 na RS -> zapis do pamięci obrazu
LCALL WRITE_TO_LCD ; zapis bajtu do rejestru wyświetlacza
RET
WRITE_TEXT:
MOV R7,#0 ;wyzeruj rejestr r7
M0:
MOV A,R7 ;przenieś do akumulatora rejestr r7
MOVC A,@A+DPTR ;prześlij bajt z pamięci kodu do
akumulatora
JZ M1 ;jeśli ten bajt jest zerem to skocz do końca
procedury
LCALL WRITE_CHAR ;wyświetl znak na wyświetlaczu
INC R7 ;zwiększ adres znaku o 1
AJMP M0 ;skocz na początek pętli
M1:
RET
DEFINE_CHARACTERS:
MOV A,#40H ;ustaw tryb zapisu znaków do pamięci
generatora znaków
LCALL WRITE_COMMAND
MOV DPTR,#CHAR_PL ;do DPTR wpisz adres tablicy z
definicjami znaków
LCALL WRITE_TEXT ;i zapisz te znaki do pamięci generatora
znaków
MOV A,#80H ;powróć do trybu zapisu znaków do pamięci
obrazu
LCALL WRITE_COMMAND
RET
LCD_CLS:
MOV A,#CLEAR ;do akumulatora zapisz kod rozkazu
czyszczenia ekranu
LCALL WRITE_COMMAND
RET
LCD_LOWERLINE:
MOV A,#0A8H
LCALL WRITE_COMMAND
RET
LCD_SHIFT_LEFT:
MOV A,#SHIFT_DISPLAY_LEFT
LCALL WRITE_COMMAND
RET
LCD_SHIFT_RIGHT:
MOV A,#SHIFT_DISPLAY_RIGHT
LCALL WRITE_COMMAND
RET
CURSOR_SHIFT_LEFT:
MOV A,#SHIFT_CURSOR_LEFT
LCALL WRITE_COMMAND
RET
CURSOR_SHIFT_RIGHT:
MOV A,#SHIFT_CURSOR_RIGHT
LCALL WRITE_COMMAND
RET
LCD_INIT:
MOV A,#0FH
LCALL DELAY
CLR E
CLR RS
MOV R0,#3
LL:
SETB E
ANL PORTLCD, #3FH
CLR E ;zapis do wyświetlacza
MOV A,#5
LCALL DELAY ;czekaj ok. 5 ms
DJNZ R0,LL ;powtórz inicjalizację 3 razy
SETB E
ANL PORTLCD, #2FH
CLR E
MOV A,#01H
LCALL DELAY
MOV A,#28H
LCALL WRITE_COMMAND
MOV A,#08H
LCALL WRITE_COMMAND
MOV A,#01H
LCALL WRITE_COMMAND
MOV A,#06H
LCALL WRITE_COMMAND
MOV A,#0CH
LCALL WRITE_COMMAND
;LCALL DEFINE_CHARACTERS
RET
DELAY:
MOV R3,A
L1:
MOV R2,#10
L2:
MOV R1,#47
L3:
DJNZ R1,L3
DJNZ R2,L2
DJNZ R3,L1
RET
CHAR_PL:
DB 32, 32, 14, 1, 15, 17, 15 , 2, ;ą (8)
DB 2, 4, 14, 16, 16, 17, 14 , 32, ;ć (9)
DB 32, 32, 14, 17,31, 16, 14 , 4, ;ę (10)
DB 12, 4, 6, 12, 4, 4, 14, 32, ;ł (11)
DB 2, 4, 22, 25, 17, 17, 17, 32, ;ń (12)
DB 2, 4, 15, 16, 14, 1, 30, 32, ;ś (13)
DB 32, 4, 31, 2, 4, 8, 31, 32, ;ż (14)
DB 2, 4, 31, 2, 4, 8, 31, 32, ;ˇ (15)
DB 0
NAPIS1:
DB "ABCDEFGHIJKLMNO",0
END
Przykład 6.1.C
#include <ATMEL/REG8252.H>
#define PORT P2
sbit RS = PORT^2;
sbit E = PORT^3;
sbit D4 = PORT^4;
sbit D5 = PORT^5;
sbit D6 = PORT^6;
sbit D7 = PORT^7;
void Delay(char k)
{
char x,y;
while(k)
{
k--;
for (x = 248; x > 0 ; x--);
for (y = 248; y > 0 ; y--);
}
}
void WriteToLcd(char X)
{
E = 1;
PORT |= 0xF0;
PORT &= (X | 0x0F);
E = 0;
E = 1;
X <<= 4;
PORT |= 0xF0;
PORT &= (X | 0x0F);
E = 0;
Delay(1);
}
void WriteCommand(char X)
{
RS = 0;
WriteToLcd(X);
}
void WriteChar(char X)
{
RS = 1;
WriteToLcd(X);
}
void WriteText(char *S)
{
while(*S)
{
WriteChar(*S);
S++;
}
}
void DefineCharacters(char *znaki)
{
WriteCommand(0x40);
WriteText(znaki);
WriteCommand(0x80);
}
void LcdInit(void)
{
char i;
Delay(15);
PORT = 0x0F;
for (i = 0; i<3; i++)
{
E = 1;
PORT &= 0x3F;
E = 0;
Delay(5);
}
E = 1;
PORT &= 0x2F;
E = 0;
Delay(1);
WriteCommand(0x28);
WriteCommand(0x08);
WriteCommand(0x01);
WriteCommand(0x06);
WriteCommand(0x0C);
}
void main(void)
{
LcdInit();
WriteText("ABCDEFGHIJKLMNO");
while(1);
}
Przykład 6.1.BAS
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = P2.4 , Db5 = P2.5 , Db6 = P2.6 , Db7 = P2.7
, E = P2.3 , Rs = P2.2
Cursor Off
Cls
Lcd "ABCDEFGHIJKLMNO"
Do
Loop
End
|
Ostatnio na forum:
|