Подключение PIC16F1827 к ЖК-монитору SPLC780D - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь прочитать значения акселерометра на ЖК-дисплее SPL780D. Однако перед этим я проверяю, чтобы считывать значения непосредственно с PI C на ЖК-дисплей, чтобы убедиться, что он работает правильно. Похоже, что с программой есть некоторые проблемы: напечатанные символы иногда смещаются вправо, а ЖК-дисплей не печатает символы, запрошенные в коде. Я использую MPLAB XC8 для программирования PI C.

Вот изображение ЖК-дисплея: ЖК-дисплей при попытке печати "123"

Вот изображение макета: Соединения макета

Pin(LCD)         PIC
16               gnd
15               +5V
14               RA3
13               RA2
12               RA1
11               RA0
10
.
.
6                RA4
5                GND
4                RA6
3                RES to GND
2                +5V
1                GND

Вот код MPLAB XC8:

#include <xc.h>
#include "lcd.h"
#define _XTAL_FREQ 4000000
#define D4 LATAbits.LATA0 //LCD Databit D4
#define D5 LATAbits.LATA1 //LCD Databit D5
#define D6 LATAbits.LATA2 //LCD Databit D6
#define D7 LATAbits.LATA3 //LCD Databit D7
#define EN LATAbits.LATA4 //LCD Enable
#define RS LATAbits.LATA6 //LCD Register Select
#define LCD_STROBE() {EN=1; __delay_us(1); EN=0;}

/*void lcd_write(unsigned char c)
{
if(c & 0x80) D7=1; else D7=0;
if(c & 0x40) D6=1; else D6=0;
if(c & 0x20) D5=1; else D5=0;
if(c & 0x10) D4=1; else D4=0;
LCD_STROBE();
if(c & 0x08) D7=1; else D7=0;
if(c & 0x04) D6=1; else D6=0;
if(c & 0x02) D5=1; else D5=0;
if(c & 0x01) D4=1; else D4=0;
LCD_STROBE();
__delay_us(50);
}*/


void Lcd_SetBit(char data_bit) //Based on the Hex value Set the Bits of the Data Lines
{
    if(data_bit& 0x01) 
        D4 = 1;
    else
        D4 = 0;

    if(data_bit& 0x02)
        D5 = 1;
    else
        D5 = 0;

    if(data_bit& 0x04)
        D6 = 1;
    else
        D6 = 0;

    if(data_bit& 0x08) 
        D7 = 1;
    else
        D7 = 0;

    __delay_us(50);
}

void Lcd_Cmd(char a)
{
    char Lower_Nibble,Upper_Nibble;
    Lower_Nibble = a&0x0F;
    Upper_Nibble = a&0xF0;

    Lcd_SetBit(Upper_Nibble>>4);       //Send upper half by shifting by 4
    RS = 0;             // => RS = 1
    LCD_STROBE();
    __delay_ms(2);
    Lcd_SetBit(Lower_Nibble); //Send Lower half
    LCD_STROBE();
    __delay_ms(5);
}


void Lcd_Clear()
{
    RS = 0;
    Lcd_Cmd(1); //Clear the LCD
    //Lcd_Cmd(2); //Move the cursor to first position
    RS = 1;
    __delay_ms(2);
}

void Lcd_Set_Cursor(char a, char b)
{
    char temp,z,y;
    if(a== 1)
    {
      temp = 0x80 + b-1; //80H is used to move the cursor
        z = temp & 0x0F; //Lower 8-bits
        y = temp & 0xF0; //Upper 8-bits
        Lcd_Cmd(z); //Set Row
        Lcd_Cmd(y); //Set Column
    }
    else if(a== 2)
    {
        temp = 0xC0 + b-1;
        z = temp & 0x0F; //Lower 8-bits
        y = temp & 0xF0; //Upper 8-bits
        Lcd_Cmd(z); //Set Row
        Lcd_Cmd(y); //Set Column
    }


}

void lcd_goto(char line, char column)
{
    unsigned char z,y;
    unsigned char data = 0x80;
    if(line == 2)
        data = 0xC0;
    data += column;

    y = data & 0xF0; //Upper 8-bits
    z = data>>4; //Lower 8-bits


    Lcd_Cmd(y); //Set Column
    Lcd_Cmd(z); //Set Row
}


void LCD_String_xy(char row,char pos,char *a)
{
    if(row==0)
        Lcd_Cmd((pos & 0x0F)| 0x80);
    else if (row==1)
        Lcd_Cmd((pos & 0x0F)|0xC0);
    Lcd_Print_String(a);
}

void Lcd_Start(void)
{   
    RS = 0;
    EN = 0;
    __delay_ms(20);
    Lcd_Cmd(0x02);
    __delay_ms(5);
    Lcd_Cmd(0x02);      //according to datasheet
    __delay_us(200);
    Lcd_Cmd(0x28);      //4-bit, 2-line, 5x8 dots
    Lcd_Cmd(0x0C);      //Display on, cursor off, blink off
    Lcd_Cmd(0x06);      //entry mode   
    Lcd_Clear();
}

void Lcd_Print_Char(char data)  //Send 8-bits through 4-bit mode
{
   char Lower_Nibble,Upper_Nibble;
   Lower_Nibble = data&0x0F;
   Upper_Nibble = data&0xF0;

   Lcd_SetBit(Upper_Nibble>>4);             //Send upper half by shifting by 4
   RS = 1;             // => RS = 1
   LCD_STROBE();
   //for(unsigned long i=2130483; i<=0; i--)  NOP(); 
   __delay_ms(1);
   Lcd_SetBit(Lower_Nibble); //Send Lower half
   RS = 1;
   LCD_STROBE();
   __delay_ms(1);
   //for(unsigned long i=2130483; i<=0; i--)  NOP();
   //__delay_ms(50);
   __delay_ms(5);
}

void Lcd_Print_String(char *a)
{
    int i;
    for(i=0;a[i]!='\0';i++)
       Lcd_Print_Char(a[i]);  //Split the string using pointers and call the Char function 
}

Здесь мы вызываем функции:

//Configuration Bits-------------------------------------------------------
#define _XTAL_FREQ 4000000
#pragma config FOSC=INTOSC, CLKOUTEN=ON //InternOscillator, ClockOut ON
#pragma config IESO=OFF, FCMEN=OFF //FCM/IESO OFF
#pragma config STVREN=ON, MCLRE=ON //StackOverflowReset ON,MasterClear ON
#pragma config WDTE=OFF, CP=OFF //Watchdog OFF,CodeProtection OFF
#pragma config PWRTE=ON, WRT=OFF //PowerUpTimer ON, WriteProtection OFF
#pragma config PLLEN=OFF, LVP=ON //PLL OFF, Low-Voltage Programming OFF
#pragma config CPD=OFF, BOREN=OFF, BORV=LO //DataProtection OFF,Brownout OFF
//Headerfiler----------------------------------------------------------------
#include <xc.h>
#include "lcd.h"
//Huvudprogram----------------------------------------------------------------
void init(void);
void main()
{
    Lcd_Start();
    init(); //Initiera pic

    while(1) //Oändlig huvudloop
    {
        Lcd_Set_Cursor(1,1);
        //lcd_goto(1,1);
        Lcd_Clear();
        Lcd_Print_String("123");
        __delay_ms(2000);
    }
}

void init(void)
{
    OSCCON = 0b01101000;        //intern klocka 4MHz
    ANSELA = 0b00000000;        //alla bitar RA0-RA7 digitala
    ANSELB = 0b00000000;        //alla bitar RB0-RB7 digitala
    TRISA = 0x00;               //alla A-bitar utgångar
    TRISB = 0x00;               //alla B-bitar utgångar
    CCP3CON = 0b00001100;       //ccp3 i pwm
    CCPTMRS = 0b01001010;       //ccp3 i timer2
    //PR2 = 254;
    T2CON = 0b00000100;         //timer 2 på, prescaler 1, ger fpwm = 4kHz
}

Некоторые части кода отключены из-за для тестирования (// код). С помощью этого кода мы получаем вывод из прикрепленного изображения. Есть идеи, в чем может быть проблема?

...