|
楼主 |
发表于 2019-7-15 12:44:43
|
显示全部楼层
#ifndef __ST7565_12864_H__
#define __ST7565_12864_H__
#include <STM8S003F3P.h>
#include "ziku.h"
#define uchar unsigned char
#define uint unsigned int
/*
//LCD接口配置
#define CS0 PC_ODR_ODR3 // 片选
#define RST PC_ODR_ODR5 // 液晶复位,低电平复位
#define CD PC_ODR_ODR4 // 数据=高,指令=低
#define SCK PC_ODR_ODR6
#define SDA PC_ODR_ODR7
*/
//LCD接口配置
#define CS0 PC_ODR_ODR7 // 片选
#define RST PC_ODR_ODR3 // 液晶复位,低电平复位
#define CD PC_ODR_ODR4 // 数据=高,指令=低
#define SCK PC_ODR_ODR5
#define SDA PC_ODR_ODR6
// Define the register command /
#define Page_Add 0xb0 // Page Address Start
#define Row_Add 0x40 // Scroll Line Start
//LCD接口GPIO初始化
void GPIO_Init(void) //GPIO初始化
{
PA_DDR = 0<<1|0<<2|0<<3|0<<4|0<<5|0<<6;
PA_CR1 = 0<<1|0<<2|1<<3|0<<4|0<<5|0<<6;
PA_CR2 = 0<<1|0<<2|0<<3|0<<4|0<<5|0<<6;
// PA_ODR = 0<<1|0<<2|0<<3|0<<4|0<<5|0<<6;
PB_DDR = 0<<0|0<<1|0<<2|0<<3|0<<4|0<<5|0<<6|0<<7;
PB_CR1 = 0<<0|0<<1|0<<2|0<<3|0<<4|0 <<5|0<<6|0<<7;
PB_CR2 = 0<<0|0<<1|0<<2|0<<3|0<<4|0<<5|0<<6|0<<7;
PB_ODR = 0<<0|0<<1|0<<2|0<<3|0<<4|0<<5|0<<6|0<<7;
PC_DDR = 1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7;
PC_CR1 = 1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7;
PC_CR2 = 0<<1|0<<2|0<<3|0<<4|0<<5|0<<6|0<<7;
PC_ODR = 0<<1|0<<2|0<<3|0<<4|0<<5|0<<6|0<<7;
PD_DDR = 1<<0|1<<1|1<<2|1<<3|1<<4|0<<5|0<<6|1<<7;
PD_CR1 = 1<<0|1<<1|1<<2|1<<3|1<<4|0<<5|0<<6|1<<7;
PD_CR2 = 0<<0|0<<1|0<<2|0<<3|0<<4|0<<5|0<<6|0<<7;
PD_ODR = 0<<0|0<<1|0<<2|0<<3|0<<4|0<<5|0<<6|0<<7;
/*
PC_DDR |= 0xf0;
PC_CR1 |= 0xf0;
PB_DDR |= 0x30;
PB_CR1 |= 0x30;
PA_CR1 |= 0x08;
*/
}
uchar busy_bit=0;
uchar rev_bit=0;
typedef enum
{
FONT_5X8 = 1,
FONT_8X16,
FONT_16X16,
FONT_128X64,
SCRIBING
}Typeface;
void Delay1(uint j) //长延时
{
uint i=0;
while(j--)
{
for(i=0;i<1310;i++);
}
}
void Delay(uint x) //短延时
{
uint a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}
//------------------写命令到LCD-----------------------------/
void Write_Com(uchar cmd )
{
int i;
SCK=0;
CS0=0;
CD=0;
for (i=0;i<8;i++)
{
SCK=0;
if (cmd &0x80)
SDA=1;
else
SDA=0;
cmd =cmd <<1;
SCK=1;
}
CS0=1;
}
//-------------------写数据到LCD----------------------------/
void Write_Data(uchar data)
{
int i;
SCK=0;
CS0=0;
CD=1;
for (i=0;i<8;i++)
{
SCK=0;
if (data&0x80)
SDA=1;
else
SDA=0;
data=data<<1;
SCK=1;
}
CS0=1;
}
//———————— LCD数据指针位置程序————————/
//带 入参 数::pag,col
//列地址范围:0<col<128
//页地址范围:0<pag<8
void Setadd(uchar pag,uchar col)
{
Write_Com(Page_Add+pag); //页地址的命令 0xb0+? , 第?页地址的设置 0-7
Write_Com(0x10+(col>>4&0x0f)); //设置列地址的命令:0x1?和0x0?。命令0x1?的?是列地址的“高四位” 0-127
Write_Com(col&0x0f); //0x0?的?是列地址的“低四位”
}
//———————— LCD全屏填充————————/
void ClearScreen(void)
{
uchar i,j;
for(i=0;i<8;i++)
{
Write_Com(0xb0+i); //从第0页开始
Write_Com(0x10); //从每页的0列开始
Write_Com(0x00);
for(j=0;j<132;j++)
{
Write_Data(0x00);
}
}
}
//————————LCD初始化设定 ————————/
void Lcd_Init()
{
RST=0; //复位 复位时为 display off
Delay(50); //最少2us
RST=1;
Delay(20);
Write_Com(0xe2); //软件复位
Write_Com(0xa3); ////设置LCD 的偏压比 0xa2 1/9, 0xa3 1/7
Write_Com(0xa1); //ADC seg镜像选择 0xa0正常,0xA1左右镜像
Write_Com(0xc0); // com镜像选择 0xc0正常,0xC8上下镜像
Write_Com(0x40); //从首行开始显示
Write_Com(0xa6); //0xa6:正常 0xa7:反白
Write_Com(0xa4); //全屏 0xa4:normal display 0xa5:all points ON
Write_Com(0x2f); //设置开关内部电路的电源 0x2f 全开
Write_Com(0x26); //电压调整寄存器高位 粗调对比度 范围:0x21-0x27 ,值越大,显示效果越浓(底影越浓)
Write_Com(0x81); //1:细调对比度 亮度调节 进入Electronic Volume Mode
Write_Com(0x20); //电压调整寄存器低位 细调对比度 亮度调节 范围:0x00-0x3f
Write_Com(0xaf); //显示开
ClearScreen(); //清除屏幕
//当同时执行“0xa5 Display All Points ON(命令10)”和“0xae Display OFF”命令时,模块进入省电模式
//当 display all points ON 和display OFF 同时作用时,进入省电模式。如果进入省电模式时,第19 项STATIC
//INDICATOR 为ON 时,系统是待机模式(Standby Mode), 如果进入省电模式时,第19 项STATIC INDICATOR
//为OFF,那么系统将是睡眠模式(Sleep Mode),睡眠模式比待机模式要更省电。由于本模块的STATIC
//INDICATOR 没有使用,因此在初始化时将第19 项设置为OFF 即可。要退出省电模式并显示数据,需要 执
//行display all points OFF 和 display ON 两个命令。
}
//---显示5*8点阵图像、ASCII, 或5x8点阵的自造字符、其他图标---/
void Disp5x8(uchar pag,uchar col, uchar const *ptr)
{
uint col_cnt;
Setadd(pag,col);
for (col_cnt=0;col_cnt<5;col_cnt++)
{
Write_Data(*ptr);
ptr++;
}
}
//---显示ASCII, 半角字符8×16汉字或8x16点阵图像、自造字符----/
//带 入参 数:col, pag, *ptr字符串首地址
//列地址范围:0<col<128
//页地址范围:0<pag<8
void Disp8x16(uchar pag,uchar col, uchar const *ptr)
{
uchar j=0,i=0;
for (j=0;j<2;j++) // 整个字符分上下半部分字符
{
Setadd(pag+j,col);
for (i=0;i<8;i++)
{
Write_Data(*ptr); //写数据到LCD,每写完一个8位的数据后列地址自动加1/
ptr++;
}
}
}
//---显示16x16点阵图像、全角字符16×16汉字、生僻字或16x16点阵的其他图标----------/
//带 入参 数:col, pag, *ptr字符串首地址
//列地址范围:0<col<128
//页地址范围:0<pag<8
void Disp16x16(uchar pag,uchar col, uchar const *ptr)
{
uint i,j;
for(j=0;j<2;j++) // 整个字符分上下半部分字符
{
Setadd(pag+j,col);
for (i=0;i<16;i++)
{
Write_Data(*ptr); //写数据到LCD,每写完一个16位的数据后列地址自动加1/
ptr++;
}
}
}
//------全屏显示128x64点阵图像------/
void Disp128x64(uchar const *ptr)
{
uint i,j;
for(j=0;j<8;j++)
{
Setadd(j+1,1);
for (i=0;i<128;i++)
{
Write_Data(*ptr); //写数据到LCD,每写完一个8位的数据后列地址自动加1/
ptr++;
}
}
}
//------画线128列------/
void Scribing(void)
{
uint i;
Setadd(2, 1);
for (i=0; i<128; i++)
{
Write_Data(0x08);
}
}
void DisplayFont(uchar pag, uchar col, uchar typeface, uchar No)
{
uchar const *ptr;
switch (typeface)
{
case FONT_5X8:
ptr = font5x8[No];
Disp5x8(pag, col, ptr);
break;
case FONT_8X16:
ptr = font8x16[No];
Disp8x16(pag, col, ptr);
break;
case FONT_16X16:
ptr = font16x16[No];
Disp16x16(pag, col, ptr);
break;
case FONT_128X64:
ptr = IMG128x64;
Disp128x64(ptr);
break;
case SCRIBING:
Scribing();
break;
default:
break;
}
}
/*
//-------------半角字符8×8点阵码----------------
void disp8(uchar pag,uchar col, uchar *k)
{
uchar j=0,i=0;
uchar lie;
lie=col&0xf0;
lie>>=4;
write_com(Page_Add+pag);
write_com(0x10+lie);
write_com(0x00+col&0x0f);
for (i=0;i<8;i++)
{
write_data(*k);
}
}
void dispfull(uchar *p)
{
uint i,j,k;
uchar *q;
for (i=0;i<8;i++)
{
write_com(i+0xb0); //SET PAGE ADDRESS
write_com(0x10); //SET Column Address MSB
write_com(0x00); //SET Column Address LSB
for (j=0;j<16;j++)
{
q=p;
for (k=0;k<8;k++)
write_data(*q++);
}
}
}
//----------------------一个字符串的输出------------------/
void Putstr(uchar *str,uchar i,uchar page,uchar lie)
{
uchar j,X;
for (j=0;j<i;j++)
{
col = lie+8*j; // 换列
row = page;
X = str[j];
Putedot(X-0x20); // ascii码表从0x20开始
}
}
//-------------半角字符8×16点阵码数据输出----------------/
void Putedot(uchar Order)
{
uchar j=0,i=0;
uchar lie,cbyte;
int x;
x = Order * 0x10; // 如字符!,在Ezk[]中的位置为1,对应Order=1,但其第1个点阵字节在Ezk[16]中,将Order乘以0x10的值x作为该字符在Ezk[]中的第一个点阵码的下标
for (j=0;j<2;j++) // 整个字符分上下半部分字符
{
lie=col&0xf0;
lie>>=4;
write_com(Page_Add+row+j);
write_com(0x10+lie);
write_com(0x00+col&0x0f);
for (i=0;i<8;i++)
{
cbyte = Ezk[x];
write_data(cbyte); // 输出一字节
x++;
}
}
}
*/
#endif |
|