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