Подключение экрана WINSTAR WH1602 по 4 битной шиной к микроконтроллеру PIC16F873A.

В данном уроке мы с Вами подключим к микроконтроллеру 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 */