Article directory
Nokia5110
Nokia is the screen removed from Nokia. Control using SPI
- 84x48 dot matrix LCD can display 4 lines of Chinese characters.
- A serial interface is used to communicate with the main processor, and the number of interface signal lines is greatly reduced. There are only 9 signal lines including power supply and ground. Supports a variety of serial communication protocols (such as SPI of AVR microcontroller, serial port mode 0 of MCS51, etc.), with a transmission rate up to 4Mbps, and can write display data at full speed without waiting time.
- The module can be connected to the printed board through conductive glue instead of connecting cables. The module can be fixed to the printed board with metal hooks on the module, making it very easy to install and replace.
- The LCD controller/driver chip has been bound to the LCD chip, and the module size is very small.
- Using low voltage power supply, the operating current during normal display is below 200μA, and it has a power-down mode.
- These features of the LPH7366 are ideally suited for use in battery-operated portable communications equipment and test equipment
Physical map
Pinout and schematic
More information such as corresponding data sheets are available.
51 microcontroller example software simulates SPI to control Nokia5110 display characters
My pin configuration
sbit SCLK = P2^5; // pin 2 header 5
sbit SDIN = P2^4; // pin 3 header 4
sbit LCD_DC = P2^3; // pin 4 header 3
sbit LCD_CE = P2^2; // pin 5 header 2
sbit LCD_RST = P2^1; // pin 9 header 1
Sending byte timing diagram (there are too many pictures, the key pictures have been cut out)
Take a closer look to understand how to transfer data to facilitate subsequent code writing.
Initialization requires configuration
Example writing
Review wiring
sbit SCLK = P2^5; // pin 2 header 5
sbit SDIN = P2^4; // pin 3 header 4
sbit LCD_DC = P2^3; // pin 4 header 3
sbit LCD_CE = P2^2; // pin 5 header 2
sbit LCD_RST = P2^1; // pin 9 header 1
First is main.c
#include <reg51.h>
#include "nokia5110.h"
int main()
{
LCD_init(); //初始化lcd
LCD_clear(); //清屏
// LCD_write_chinese_string(0,0,12,7,0,0);汉字函数已删除,不是很完善
// LCD_write_chinese_string(0,2,12,7,0,0);
// LCD_write_chinese_string(0,4,12,7,0,0);
//显示字符
LCD_write_english_string(1,0,"--ShunGe51--");
LCD_write_english_string(1,1,"************");
LCD_write_english_string(1,2,"distance is ");
LCD_write_english_string(1,3,"************");
LCD_write_english_string(1,4," flag = off ");
while(1);
}
The above is the main function. We see three functions. They are included in nokia5110.h
the file. Next, continue to look at nokia5110.h
the file
nokia5110.h .
#ifndef __NOKIA5110_H__
#define __NOKIA5110_H__
#include <reg51.h>
sbit SCLK = P2^5; // pin 2 header 5
sbit SDIN = P2^4; // pin 3 header 4
sbit LCD_DC = P2^3; // pin 4 header 3
sbit LCD_CE = P2^2; // pin 5 header 2
sbit LCD_RST = P2^1; // pin 9 header 1
void LCD_init(void);
void LCD_clear(void);
//void LCD_move_chinese_string(unsigned char X, unsigned char Y, unsigned char T);
void LCD_write_english_string(unsigned char X,unsigned char Y,char *s);
//void LCD_write_chinese_string(unsigned char X, unsigned char Y,
// unsigned char ch_with,unsigned char num,
// unsigned char line,unsigned char row);
//void chinese_string(unsigned char X, unsigned char Y, unsigned char T);
void LCD_write_char(unsigned char c);
//void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map,
// unsigned char Pix_x,unsigned char Pix_y);
void LCD_write_byte(unsigned char dat, unsigned char dc);
void LCD_set_XY(unsigned char X, unsigned char Y);
#endif /* __NOKIA5110_H__ */
It’s a dense bunch, but it doesn’t matter. This is just a function declaration and some pin definitions. For details on how to use it, continue to see
nokia5110.c
#include <reg51.h>
#include <intrins.h>
#include "nokia5110.h"
#include "english_6x8_pixel.h"
//#include "write_chinese_string_pixel.h"
void Delay1us() //@11.0592MHz
{
_nop_();
_nop_();
_nop_();
}
/*-----------------------------------------------------------------------
LCD_init : 3310LCD初始化
编写日期 :2023-8-12
最后修改日期 :2023-8-12
-----------------------------------------------------------------------*/
void LCD_init(void)
{
// 产生一个让LCD复位的低电平脉冲
LCD_RST = 0;
Delay1us();
LCD_RST = 1;
// 关闭LCD
LCD_CE = 0;
Delay1us();
// 使能LCD
LCD_CE = 1;
Delay1us();
LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式
LCD_write_byte(0xc8, 0); // 设置偏置电压
LCD_write_byte(0x06, 0); // 温度校正
LCD_write_byte(0x13, 0); // 1:48
LCD_write_byte(0x20, 0); // 使用基本命令
LCD_clear(); // 清屏
LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示
// 关闭LCD
LCD_CE = 0;
}
/*-----------------------------------------------------------------------
LCD_clear : LCD清屏函数
编写日期 :2023-8-12
最后修改日期 :2023-8-12
-----------------------------------------------------------------------*/
void LCD_clear(void)
{
unsigned int i;
LCD_write_byte(0x0c, 0);
LCD_write_byte(0x80, 0);
for (i=0; i<504; i++)
LCD_write_byte(0, 1);
}
void LCD_write_byte(unsigned char dat, unsigned char command)
{
unsigned int i;
LCD_CE = 0; //片选信号
LCD_DC = command;//传送命令 or 传输数据
for(i = 0;i<8;i++){
SDIN = dat & 0x80; //最高位给数据
Delay1us(); //这里包括下面可以不用等待,为了保险我还是加了一丢丢
SCLK = 0; //拉低表示我已经修改好数据并上传了
Delay1us();
dat = dat << 1; //继续下一位
Delay1us();
SCLK = 1; //拉高准备传输
Delay1us();
}
LCD_CE = 1;
}
/*-----------------------------------------------------------------------
LCD_write_char : 显示英文字符
输入参数:c :显示的字符;
编写日期 :2023-8-12
最后修改日期 :2023-8-12
-----------------------------------------------------------------------*/
void LCD_write_char(unsigned char c)
{
unsigned char line;
c -= 32;
for (line=0; line<6; line++)
LCD_write_byte(font6x8[c][line], 1);
}
/*-----------------------------------------------------------------------
LCD_write_english_String : 英文字符串显示函数
输入参数:*s :英文字符串指针;
X、Y : 显示字符串的位置,x 0-83 ,y 0-5
编写日期 :2023-8-12
最后修改日期 :2023-8-12
-----------------------------------------------------------------------*/
void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
{
LCD_set_XY(X,Y);
while (*s)
{
LCD_write_char(*s);
s++;
}
}
english_6x8_pixel.h
// 6 x 8 font
// 1 pixel space at left and bottom
// index = ASCII - 32
//字模软件而已啦
code unsigned char font6x8[][6] =
{
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp
{
0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // !
{
0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // "
{
0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // #
{
0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $
{
0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, // %
{
0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, // &
{
0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, // '
{
0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, // (
{
0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, // )
{
0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 }, // *
{
0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 }, // +
{
0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 }, // ,
{
0x00, 0x08, 0x08, 0x08, 0x08, 0x08 }, // -
{
0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, // .
{
0x00, 0x20, 0x10, 0x08, 0x04, 0x02 }, // /
{
0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0
{
0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1
{
0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2
{
0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3
{
0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4
{
0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5
{
0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6
{
0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7
{
0x00, 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8
{
0x00, 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9
{
0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, // :
{
0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, // ;
{
0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, // <
{
0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, // =
{
0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, // >
{
0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ?
{
0x00, 0x32, 0x49, 0x59, 0x51, 0x3E }, // @
{
0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, // A
{
0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B
{
0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C
{
0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D
{
0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E
{
0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F
{
0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G
{
0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H
{
0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I
{
0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J
{
0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K
{
0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L
{
0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M
{
0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N
{
0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O
{
0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P
{
0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q
{
0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R
{
0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // S
{
0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T
{
0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U
{
0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V
{
0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W
{
0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // X
{
0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y
{
0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z
{
0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [
{
0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55
{
0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ]
{
0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^
{
0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _
{
0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // '
{
0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, // a
{
0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b
{
0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c
{
0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, // d
{
0x00, 0x38, 0x54, 0x54, 0x54, 0x18 }, // e
{
0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f
{
0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C }, // g
{
0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h
{
0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i
{
0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 }, // j
{
0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k
{
0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l
{
0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m
{
0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n
{
0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o
{
0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 }, // p
{
0x00, 0x18, 0x24, 0x24, 0x18, 0xFC }, // q
{
0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r
{
0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s
{
0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t
{
0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u
{
0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v
{
0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w
{
0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x
{
0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y
{
0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z
{
0x14, 0x14, 0x14, 0x14, 0x14, 0x14 } // horiz lines
};
You should understand now! So I reviewed main
the function and got the result.
Why should I display this? In fact, learning this is to prepare for my future smart trash can project...
Finish
Welcome to make mistakes and make progress together.