C++でLCDに文字を表示
LCD1602はカナも表示できるので、その実験をしよう
/********************************************************************************************
*Filename : i2c_lcd.cpp
*Description : test iic 1602 lcd
*Author : Alan
*Website : www.osoyoo.com
*Update : 2017/07/03->2019/5/21 cpp update
********************************************************************************************/
#include <iostream>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#include <cstring>
using namespace std;
int LCDAddr = 0x27;//IIc LCD address
int BLEN = 1;//1--open backlight.0--close backlight
int fd;//linux file descriptor
//writ a word(16 bits) to LCD
void write_word(int data){
int temp = data;
if ( BLEN == 1 )
temp |= 0x08;
else
temp &= 0xF7;
wiringPiI2CWrite(fd, temp);
}
//send command to lcd
void send_command(int comm){
int buf;
// Send bit7-4 firstly
buf = comm & 0xF0;
buf |= 0x04; // RS = 0, RW = 0, EN = 1
write_word(buf);
delay(2);
buf &= 0xFB; // Make EN = 0
write_word(buf);
// Send bit3-0 secondly
buf = (comm & 0x0F) << 4;
buf |= 0x04; // RS = 0, RW = 0, EN = 1
write_word(buf);
delay(2);
buf &= 0xFB; // Make EN = 0
write_word(buf);
}
//send data to lcd
void send_data(int data){
int buf;
// Send bit7-4 firstly
buf = data & 0xF0;
buf |= 0x05; // RS = 1, RW = 0, EN = 1
write_word(buf);
delay(2);
buf &= 0xFB; // Make EN = 0
write_word(buf);
// Send bit3-0 secondly
buf = (data & 0x0F) << 4;
buf |= 0x05; // RS = 1, RW = 0, EN = 1
write_word(buf);
delay(2);
buf &= 0xFB; // Make EN = 0
write_word(buf);
}
//initialize the lcd
void init(){
send_command(0x33); // Must initialize to 8-line mode at first
delay(5);
send_command(0x32); // Then initialize to 4-line mode
delay(5);
send_command(0x28); // 2 Lines & 5*7 dots
delay(5);
send_command(0x0C); // Enable display without cursor
delay(5);
send_command(0x01); // Clear Screen
wiringPiI2CWrite(fd, 0x08);
}
//clear screen
void clear(){
send_command(0x01); //clear Screen
}
//Print the message on the lcd
void write(int x, int y, char* data){
int addr, i;
int tmp;
if (x < 0) x = 0;
if (x > 15) x = 15;
if (y < 0) y = 0;
if (y > 1) y = 1;
// Move cursor
addr = 0x80 + 0x40 * y + x;
send_command(addr);
//tmp = strlen(data);
for (; *data != '\0'; data++){
send_data(*data);
}
}
//Print the message on the lcd
void writekana(int x, int y, char* data){
int addr, i;
int tmp;
if (x < 0) x = 0;
if (x > 15) x = 15;
if (y < 0) y = 0;
if (y > 1) y = 1;
// Move cursor
addr = 0x80 + 0x40 * y + x;
send_command(addr);
//tmp = strlen(data);
for (; *data != '\0'; data++){
*data |= 0x80;
send_data(*data);
}
}
void print_info()
{
cout << "\n";
cout << "|***************************|\n";
cout << "| I2C 1602 LCD test |\n";
cout << "| --------------------------|\n";
cout << "| | LCD | | Pi |\n";
cout << "| --------------------------|\n";
cout << "| | GND | connect to | GND |\n";
cout << "| | VCC | connect to | 5V |\n";
cout << "| | SDA | connect to | SDA.1|\n";
cout << "| | SCL | connect to | SCL.1|\n";
cout << "| --------------------------|\n";
cout << "| OSOYOO|\n";
cout << "|***************************|\n";
cout << "Program is running...\n";
cout << "Press Ctrl+C to end the program\n";
}
int main(){
//init I2C
char sdata[100];
fd = wiringPiI2CSetup(LCDAddr);
init();
print_info();
strcpy(sdata,"6@6E");
writekana(0, 0, sdata);
strcpy(sdata,"VRY6E");
writekana(0, 1, sdata);
delay(3000);
clear();
while(1){
strcpy(sdata,"This is Lesson13");
write(0,0,sdata);
strcpy(sdata,"IIC LCD Test");
write(0,1,sdata);
delay(1000);
}
return 0;
}
ASCIIで指定した文字に0x80をORしてむりやりカナに変えてみました