文章目录
Nokia5110
Nokia是诺基亚拆下来的屏幕。使用SPI控制
- 84x48 的点阵 LCD,可以显示 4 行汉字,
- 采用串行接口与主处理器进行通信,接口信号线数量大幅度减少,包括电源和地在内的信号线仅有 9 条。支持多种串行通信协议(如 AVR 单片机的SPI、MCS51 的串口模式0等),传输速率高达 4Mbps,可全速写入显示数据,无等待时间。
- 可通过导电胶连接模块与印制版,而不用连接电缆,用模块上的金属钩可将模块固定到印制板上,因而非常便于安装和更换。
- LCD 控制器/驱动器芯片已绑定到 LCD 晶片上,模块的体积很小。
- 采用低电压供电,正常显示时的工作电流在 200μA 以下,且具有掉电模式。
- LPH7366 的这些特点非常适合于电池供电的便携式通信设备和测试设备中
实物图
引脚和原理图
更具对应数据手册等资料得知
51单片机实例软件模拟SPI实现控制Nokia5110显示字符
我的引脚配置
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
发送字节时序图(图片太多了,关键图片已截取出来)
细细看理解如何传递数据,方便后面代码编写
初始化需要配置
实例编写
回顾接线
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
首先是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);
}
上面是main函数,看到了三个函数,他们被包含在nokia5110.h
文件当中接下来继续看nokia5110.h
文件
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__ */
密密麻麻的一堆,不过没关系,这只是函数申明和一些管脚定义,具体怎么使用继续看
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
};
这下应该明白了吧!于是乎回顾main
函数,得出结果
为什么要显示这个呢,其实学习这个是为我后面的智能垃圾桶项目做准备的……
结束
欢迎提出错误,共同进步。