|

楼主 |
发表于 2023-3-15 08:32:57
|
显示全部楼层
没错的,用的SPI总线的:
ST7565.h:
/*
模块名称:ST7565驱动(头文件)
作者:LiZi
制作时间:2017.2.18
*/
#ifndef _ST7565_H
#define _ST7565_H
#include <reg52.h>
extern void delayms(unsigned int ms);
void Lcd_write_byte(unsigned char Byte);
void Lcd_write_cmd(unsigned char cmd);
void Lcd_write_dat(unsigned char dat);
void Lcd_set_pos(unsigned char x,y);
void Lcd_cls();
void Lcd_init();
void Lcd_point(unsigned char x,y);
void Lcd_line(unsigned char x1,y1,x2,y2);
void Lcd_pic(unsigned char x0,y0,x1,y1,unsigned char *pic);
void Lcd_P8x16char(unsigned char x,y,char_,bit b);
void Lcd_P8x16Str(unsigned char x,y,unsigned char *ch,bit b);
void Lcd_P16x16Ch(unsigned char x, y, N);
#endif
ST7565.c
/*
模块名称:ST7565驱动
作者:LiZi
制作时间:2017.2.18
*/
#include "ST7565.h"
#include "zm.h"
#include <reg52.h>
#include <intrins.h>
sbit cs = P1 ^ 3;//8
sbit rst = P1 ^ 7;//9
sbit A0 = P1 ^ 6;//10
sbit SCL = P1 ^ 5;//11
sbit SDA = P1 ^ 4;//12
/*********************************
函数名称:Lcd_write_byte
功能:Lcd写一个字节
输入:写入内容
输出:无
备注:
*********************************/
void delay_IIC()
{
//unsigned char i = 0;
//for (i = 0; i < 2; i++)
_nop_();_nop_();
}
void Lcd_write_byte(unsigned char Byte)
{
unsigned char i = 0;
for (i = 0; i < 8; i++)
{
SCL = 0;
delay_IIC();
if (Byte & 0x80)
SDA = 1;
else
SDA = 0;
delay_IIC();
Byte <<= 1;
SCL = 1;
delay_IIC();
}
}
/*********************************
函数名称:Lcd_write_cmd
功能:Lcd写指令
输入:写入指令
输出:无
备注:
*********************************/
void Lcd_write_cmd(unsigned char cmd)
{
A0 = 0;//delay_IIC();
Lcd_write_byte(cmd);
}
/*********************************
函数名称:Lcd_write_dat
功能:Lcd写数据
输入:写入数据
输出:无
备注:
*********************************/
void Lcd_write_dat(unsigned char dat)
{
A0 = 1;//delay_IIC();
Lcd_write_byte(dat);
}
/*********************************
函数名称:Lcd_set_pos
功能:Lcd设置坐标
输入:x坐标,y坐标
输出:无
备注:
*********************************/
void Lcd_set_pos(unsigned char x, y)
{
Lcd_write_cmd(0xb0 + y); // 页地址
Lcd_write_cmd(((x & 0xf0) >> 4) | 0x10); // 低地址
Lcd_write_cmd((x & 0x0f) | 0x00); // 高地址
}
/*********************************
函数名称:Lcd_cls
功能:Lcd清屏
输入:无
输出:无
备注:
*********************************/
void Lcd_cls()
{
unsigned char y, x;
for (y = 0; y < 8; y++)
{
Lcd_write_cmd(0xb0 + y); // 页地址
Lcd_write_cmd(0x00); // 低地址
Lcd_write_cmd(0x10); // 高地址
for (x = 0; x < 128; x++)
Lcd_write_dat(0x00);
}
}
/*********************************
函数名称:Lcd_Init
功能:Lcd初始化
输入:无
输出:无
备注:
*********************************/
void Lcd_init()
{
//SCL =1;
//SDA = 0; //
cs =0;
rst = 0; //硬复位
delayms(10);
rst = 1; //复位结束
delayms(10);
Lcd_write_cmd(0xe2); //软件复位
delayms(200);
Lcd_write_cmd(0x2f); //内部电源控制模式:VC,VR,VF=111
delayms(100);
//Lcd_write_cmd(0x24); //对比度粗调 0x20-0x27 数值越大,对比越强
Lcd_write_cmd(0x81); //对比度细调指令,下一行输入对比度值0-3f
Lcd_write_cmd(0x3f); //修改这个值可以改变对比度
Lcd_write_cmd(0xa2); //设置偏压0xa2:LCD BIAS=1/9;0xa3:LCD BIAS=1/7
Lcd_write_cmd(0xa0); //列扫描方向:从左到右,ADC=0(SEG1->SEG132)
Lcd_write_cmd(0xc8); //页扫描方向:从上到下,SHL=1(COM64->COM1)
Lcd_write_cmd(0x40); //起始行
Lcd_write_cmd(0xe0); //写入数据时列地址自动加1,读时不变
Lcd_write_cmd(0xaf); //开显示
/*
SDA = 0;
cs = 0;
rst = 0; // 硬复位
delayms(15);
rst = 1;
Lcd_write_cmd(0xE2); // 软复位
Lcd_write_cmd(0xA2); // 1/9 bias 不懂这个
Lcd_write_cmd(0xA0); // 垂直镜像关,0xa0关 0xa1开
Lcd_write_cmd(0xc8); // 水平镜像关,0xc8关 0x19开
Lcd_write_cmd(0xAe); // 关全部显示,0xa4关,0xa5开
Lcd_write_cmd(0xA6); // 关反显,0xa6关,0xa7开
//Lcd_write_cmd(0x24);//v0电阻设4 升压关
Lcd_write_cmd(0x81);
Lcd_write_cmd(0x0f); // v0输出设 对比度
Lcd_write_cmd(0xF8);
Lcd_write_cmd(0x00); // 升压比设2x- 不懂这个
//Lcd_write_cmd(0x2C);//电源控制设4
//delayms(22);
//Lcd_write_cmd(0x2E);//电源控制设6
//delayms(22);
Lcd_write_cmd(0x2f); // 电源控制设8
delayms(8);
Lcd_write_cmd(0x40); // 显存起始设0
Lcd_write_cmd(0xAF); // 开显示,0xae关,0xaf开
*/
Lcd_cls(); // 清屏
//Lcd_set_pos(0, 0); // 坐标归位
delayms(22);
}
/*********************************
函数名称:Lcd_point
功能:Lcd画点
输入:x坐标,y坐标
输出:无
备注:x<=128,y<=64
*********************************/
void Lcd_point(unsigned char x, y)
{
unsigned char y1;
y1 = y >> 3;
Lcd_set_pos(x, y1);
y &= 0x07;
Lcd_write_dat(1 << y);
if (y > 0)
Lcd_write_dat(3 << (y - 1));
else
{
Lcd_write_dat(1 << y);
if (y1 > 0)
{
Lcd_set_pos(x, y1 - 1);
Lcd_write_dat(0x80);
}
}
}
|
|