Я пытаюсь прочитать значения акселерометра на ЖК-дисплее 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
}
Некоторые части кода отключены из-за для тестирования (// код). С помощью этого кода мы получаем вывод из прикрепленного изображения. Есть идеи, в чем может быть проблема?