В данном уроке мы с Вами подключим к микроконтроллеру PIC16F873 экран Winstar WH1602:

Алгоритм подключения данного экрана:
Переведем описанное в таблице в текстовый алгоритм действия:
1) Подаем питание на экран.
2) Ждем 50ms.
3) Выдать команду 00110000 при RS=0 RW=0
4) Выдержать паузу не менее 40мкс
5) Выдать команду 00110000 при RS=0 RW=0
6) Выдержать паузу не менее 40мкс
7) Выдать команду 00110000 при RS=0 RW=0
8) Выдержать паузу не менее 40мкс
9) Выдать команду 00111000 при RS=0 RW=0
10) Выдержать паузу не менее 40мкс
11) Выдать команду 00001000 при RS=0 RW=0
12) Выдержать паузу не менее 40мкс
13) Выдать команду 00000001 при RS=0 RW=0
14) Выдержать паузу не менее 1,5мс
15) Выдать команду 00000110 при RS=0 RW=0.
Подключать экран мы с Вами будем по 4 битной схеме:

Подключение по ножкам:
RS — RC4
R/W — RC5
EN — RC6
DB4 — RB4
DB5 — RB5
DB6 — RB6
DB7 — RB7
Единственно, Вам необходимо проверить по документации ножки к которым подключается питание. У меня два одинаковых экрана, но в одном +Vcc подключается на 1 ножку, а во втором на 2. При не верной подачи питания, можно спалить экран.
Далее мы с Вами напишем отдельно библиотеку для данного экрана, что бы при необходимости можно было быстро подключить данный экран к проекту.
Сначала напишем основной код, lcd.c:
#include "lcd.h"
#define rs RC4
#define rw RC5
#define e RC6
void LCD_delay(){
int i;
for(i=0;i<19;i++);
}
void LCD_PORT_init(){
TRISC4=0;
TRISC5=0;
TRISC6=0;
TRISB4=0;
TRISB5=0;
TRISB6=0;
TRISB7=0;
}
void sendhalfbyte(unsigned char c){
c<<=4;
PORTB&=0b00001111;
PORTB|=c;
e=1;
__delay_us(1);
e=0;
__delay_us(50);
}
void sendbyte(unsigned char c, unsigned char mode) {
unsigned char hc=0;
if(mode==0)
rs=0;
else
rs=1;
hc=c>>4;
sendhalfbyte(hc);
sendhalfbyte(c);
}
void LCD_Init(){
__delay_ms(50);
PORTC &= ~0x70;
PORTB &= ~0xF0;
__delay_ms(100);
sendhalfbyte(0x03);
__delay_us(4500);
sendhalfbyte(0x03);
__delay_us(4500);
sendhalfbyte(0x03);
__delay_us(200);
sendhalfbyte(0x02);
__delay_ms(1);
sendbyte(0x28, 0);//mode 4 bit, 2 lines (from our large display is 4 lines, font 5x8
sendbyte(0x28, 0);//mode 4 bit, 2 lines (from our large display is 4 lines, font 5x8
sendbyte(0x0C,0);//Display ON, Cursor OFF, blink OFF
__delay_ms(1);
sendbyte(0x01,0);// Clear Display
__delay_ms(2);
sendbyte(0x06,0);// direction left to right
__delay_ms(1);
sendbyte(0x02,0);//Cursor reset
sendbyte(0X80,0);//SET POS LINE 0
__delay_ms(2);
}
void LCD_Clear(void){
sendbyte(0x01, 0);
__delay_us(1500);
}
void LCD_SetPos(unsigned char x, unsigned char y){
switch(y) {
case 0:
sendbyte((unsigned char)(x|0x80),0);
break;
case 1:
sendbyte((unsigned char)((0x40+x)|0x80),0);
break;
}
}
void LCD_String(char* st){
unsigned char i=0;
while(st[i]!=0){
sendbyte(st[i],1);
i++;
}
} Теперь пропишем заголовочный файл, lcd.h:
#ifndef LCD_H #define LCD_H #include <xc.h>
#include <stdio.h> #define _XTAL_FREQ 8000000 void LCD_PORT_init(); void LCD_Init(); void LCD_String(char* st); void LCD_SetPos(unsigned char x, unsigned char y); void LCD_Clear(void); #endif /* LCD_H */
Пример использования нашей библиотеки, main.c:
#include «main.h»
char str[30]={‘\0’};
void main() {
unsigned int i = 0;
LCD_PORT_init();
LCD_Init();
LCD_String((char*)»Hellow»);
LCD_SetPos(1,1);
LCD_String((char*)»word»);
__delay_ms(2000);
LCD_Clear();
while(1) {
i++;
sprintf(str,»%5u»,i);
LCD_SetPos(4,0);
LCD_String(str);
__delay_ms(200);
}
} А так же заголовочный файл нашего файла, main.h:
#ifndef MAIN_H #define MAIN_H #define _XTAL_FREQ 8000000 #include <pic16f873A.h> #include <xc.h> #include «lcd.h» //CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled) #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) #endif /* MAIN_H */