📄 s6b0108.c
字号:
#include "sfr_r82b.h"
#include "s6b0108.h"
#include "disp_definel.h"
void Delay(int); /* 延时子程序 */
void Long_Delay(int); /* 长延时子程序 */
void Write_0108_Reg(unsigned char); /* KS0108寄存器写入函数 */
void Write_0108_Data(unsigned char); /* KS0108显示数据写入函数 */
void Set_XY(unsigned char, unsigned char); /* 设置地址,X方向以点为单位,Y方向以page为单位 */
void Init_0108(); /* KS0108寄存器初始化函数 */
void Clr_Screen_0(); /* 清除KS0108显示存储器 */
void Clr_Screen_1();
void Clr_Screen_2();
void Set_Screen3(); /* 清除KS0108显示存储器 */
void Set_Screen(unsigned char, unsigned char far *);
void Comp_Set_Screen(unsigned char, unsigned char, unsigned char, unsigned char far *);
//void Set_Page(unsigned char, unsigned char, unsigned char *);
void Set_Caracter(unsigned char, unsigned char, unsigned char, unsigned char far *);
void Set_Char(unsigned char, unsigned char, unsigned char, unsigned char far *);
void FSH_Set_Two_Page(unsigned char, unsigned char, unsigned char far *);
unsigned char Read_0108_Data(); /* 读取KS0108显示数据函数 */
unsigned char Data_Convert(unsigned char); /* 对数据按总线排列进行转换 */
/****************************************************************
union lcd_byte_def{
unsigned char lcd_byte;
struct{
unsigned char lb0:1;
unsigned char lb1:1;
unsigned char lb2:1;
unsigned char lb3:1;
unsigned char lb4:1;
unsigned char lb5:1;
unsigned char lb6:1;
unsigned char lb7:1;
}lcd_bit;
};
union lcd_byte_def Lcd_Byte_0;
union lcd_byte_def Lcd_Byte_1;
union lcd_byte_def Lcd_Byte_2;
****************************************************************/
/****************************************************************
延时子程序
****************************************************************/
void Delay(int t)
{
while(--t);
}
/****************************************************************
长延时子程序
****************************************************************/
void Long_Delay(int t)
{
int n = 0xff;
while(--t)
{
while(--n);
n = 0xff;
}
}
/****************************************************************
unsigned char Data_Convert(unsigned char lcd_data)
数据总线转换函数,根据硬件线路特点调整LCD显示输出数据
****************************************************************/
unsigned char Data_Convert(unsigned char lcd_data)
{
Lcd_Data_0 = lcd_data;
Lcd_Data_1 = lcd_data;
Lcd_Data_0 &= 0x0f;
Lcd_Data_1 &= 0xf0;
Lcd_Bit_7 = Lcd_Bit_0; /* LCD显示输出数据高低位调整 */
Lcd_Bit_6 = Lcd_Bit_1;
Lcd_Bit_5 = Lcd_Bit_2;
Lcd_Bit_4 = Lcd_Bit_3;
Lcd_Data_0 &= 0xf0;
Lcd_Data_0 = Lcd_Data_0 >> 4;
Lcd_Data_2 = Lcd_Data_0 | Lcd_Data_1; /* 生成调整后的LCD显示输出数据 */
return Lcd_Data_2; /* 返回LCD输出数据 */
}
/****************************************************************
void Write_0108_Reg(unsigned char Reg_Code)
KS0108寄存器写入函数,用于控制对LCD的操作
****************************************************************/
void Write_0108_Reg(unsigned char Reg_Code)
{
unsigned char bus_low;
unsigned char bus_high;
bus_low = bus_high = Data_Convert(Reg_Code); /* 输出LCD控制命令:Reg_Code */
bus_low &= 0x0f; /* 调整数据位 */
bus_high &= 0xf0;
bus_high = bus_high >> 4;
DI = 0; /* 控制命令输出 */
// RW = 0;
Lcd_Bus_L &= 0xf0;
Lcd_Bus_H &= 0xf0;
Lcd_Bus_L |= bus_low;
Lcd_Bus_H |= bus_high;
E = 1;
E = 0;
}
/****************************************************************
void Write_0108_Data(unsigned char Bus_Data)
KS0108显示数据写入函数
****************************************************************/
void Write_0108_Data(unsigned char Bus_Data)
{
unsigned char bus_low;
unsigned char bus_high;
bus_low = bus_high = Data_Convert(Bus_Data); /* 输出LCD显示数据:Bus_Data */
bus_low &= 0x0f;
bus_high &= 0xf0;
bus_high = bus_high >> 4;
DI = 1; /* 显示数据输出 */
// E = 1;
// RW = 0;
Lcd_Bus_L &= 0xf0;
Lcd_Bus_H &= 0xf0;
Lcd_Bus_L |= bus_low;
Lcd_Bus_H |= bus_high;
E = 1;
// asm("nop");
E = 0;
}
/****************************************************************
unsigned char Read_0108_Data()
读取KS0108显示数据函数,
****************************************************************/
unsigned char Read_0108_Data()
{
unsigned char Bus_Data_0;
unsigned char Bus_Data_1;
DI = 1;
// RW = 1;
Lcd_Bus_L &= 0xf0;
Lcd_Bus_H &= 0xf0;
E = 1; /* 数据地址输出 */
Bus_Data_1 = Lcd_Bus_H;
Bus_Data_0 = Lcd_Bus_L;
E = 0; /* 显示数据读入 */
Bus_Data_1 = Bus_Data_1 << 4;
Bus_Data_0 &= 0xf0;
Bus_Data_0 |= Bus_Data_1;
return Bus_Data_0;
}
/****************************************************************
void Set_XY(unsigned char X_Column, unsigned char Y_Page)
设置地址,X方向以点为单位,Y方向以page为单位
****************************************************************/
void Set_XY(unsigned char X_Column, unsigned char Y_Page)
{
Write_0108_Reg(Set_Page+Y_Page);
Write_0108_Reg(Set_Column+X_Column);
}
/****************************************************************
void Init_0108()
KS0108寄存器初始化函数
****************************************************************/
void Init_0108()
{
Delay(100);
CSA=0; /* 初始化显示屏0 */
CSB=0;
Delay(100);
Write_0108_Reg(Set_Disp_Off);
Write_0108_Reg(Set_Start_Line);
Write_0108_Reg(Set_Page);
Write_0108_Reg(Set_Column);
Write_0108_Reg(Set_Disp_On);
Delay(100);
CSA=0; /* 初始化显示屏1 */
CSB=1;
Delay(100);
Write_0108_Reg(Set_Disp_Off);
Write_0108_Reg(Set_Start_Line);
Write_0108_Reg(Set_Page);
Write_0108_Reg(Set_Column);
Write_0108_Reg(Set_Disp_On);
Delay(100);
CSA=1; /* 初始化显示屏2 */
CSB=0;
Delay(100);
Write_0108_Reg(Set_Disp_Off);
Write_0108_Reg(Set_Start_Line);
Write_0108_Reg(Set_Page);
Write_0108_Reg(Set_Column);
Write_0108_Reg(Set_Disp_On);
}
/****************************************************************
void Clr_Screen_0()
清除KS0108显示屏 0 存储器
****************************************************************/
void Clr_Screen_0()
{
unsigned char j, k;
unsigned int n=0;
CSA=0;
CSB=0;
Delay(100);
for(k=0;k<8;k++)
{
Write_0108_Reg(Set_Page+k); /* 设置起始页 */
Write_0108_Reg(Set_Column); /* 设置起始列 */
Write_0108_Reg(Set_Start_Line_0); /* 设置起始行 */
for(j=0;j<64;j++)
{
Write_0108_Data(0x00); /* 清屏时,写入值为0 */
n++;
}
}
}
/****************************************************************
void Clr_Screen_1()
清除KS0108显示屏 1 存储器
****************************************************************/
void Clr_Screen_1()
{
unsigned char j, k;
unsigned int n=0;
CSA=0;
CSB=1;
Delay(100);
for(k=0;k<8;k++)
{
Write_0108_Reg(Set_Page+k);
Write_0108_Reg(Set_Column);
Write_0108_Reg(Set_Start_Line_0);
for(j=0;j<64;j++)
{
Write_0108_Data(0x00);
n++;
}
}
}
/****************************************************************
void Clr_Screen_2()
清除KS0108显示屏 2 存储器
****************************************************************/
void Clr_Screen_2()
{
unsigned char j, k;
unsigned int n=0;
CSA=1;
CSB=0;
Delay(100);
for(k=0;k<8;k++)
{
Write_0108_Reg(Set_Page+k);
Write_0108_Reg(Set_Column);
Write_0108_Reg(Set_Start_Line_0);
for(j=0;j<64;j++)
{
Write_0108_Data(0x00);
n++;
}
}
}
/******************************************************************************************************
void Set_Char(unsigned char cs, unsigned char page, unsigned char num, unsigned char far * bitmap)
字符输入程序:
cs: 需要输入字符的液晶屏,CS1, CS2 或 CS3;
page: 需要输入字符的起始页
num: 输入字符前的空格数,单位为列
bitmap:点阵数据表地址
******************************************************************************************************/
void Set_Char(unsigned char cs, unsigned char page, unsigned char num, unsigned char far * bitmap) // num = 0,7;
{
unsigned char j, k;
unsigned int n=0;
unsigned int i;
unsigned char a,b;
if (cs == CS1)
{
CSA=0;
CSB=0;
}
else if (cs == CS2)
{
CSA=0;
CSB=1;
}
else if (cs == CS3)
{
CSA=1;
CSB=0;
}
Delay(100);
Write_0108_Reg(Set_Page + page); /* 设起始页 */
Write_0108_Reg(Set_Column + num); /* 设起始列 */
Write_0108_Reg(Set_Start_Line_0); /* 设起始行 */
if (page == 2) /* 当需要显示的页为第2页时,由于需要保留菜单边框,需要将字符数据与 0x01 进行或运算 */
{
for(j=0;j<8;j++)
{
b = bitmap[n];
a = b | 0x01;
Write_0108_Data(a);
n++;
}
}
else
{
for(j=0;j<8;j++)
{
Write_0108_Data(bitmap[n]);
n++;
}
}
page += 1;
Write_0108_Reg(Set_Page + page);
Write_0108_Reg(Set_Column + num);
if (page == 7) /* 当需要显示的页为第7页时,由于需要保留菜单边框,需要将字符数据与 0x08 进行或运算 */
{
for(j=0;j<8;j++)
{
b = bitmap[n];
a = b | 0x80;
Write_0108_Data(a);
n++;
}
}
else
{
for(j=0;j<8;j++)
{
Write_0108_Data(bitmap[n]);
n++;
}
}
}
/********************************************************************************************************
void Set_Caracter(unsigned char cs, unsigned char page, unsigned char num, unsigned char far * bitmap)
汉字显示程序:正常显示一个汉字
cs: 需要输入字符的液晶屏,CS1, CS2 或 CS3;
page: 需要输入字符的起始页
num: 输入字符前的空格数,单位为列
bitmap:点阵数据表地址
********************************************************************************************************/
void Set_Caracter(unsigned char cs, unsigned char page, unsigned char num, unsigned char far * bitmap)
{
unsigned char j, k;
unsigned int n=0;
unsigned int i;
if (cs == CS1)
{
CSA=0;
CSB=0;
}
else if (cs == CS2)
{
CSA=0;
CSB=1;
}
else if (cs == CS3)
{
CSA=1;
CSB=0;
}
Delay(100);
Write_0108_Reg(Set_Page + page); /* 设起始页 */
Write_0108_Reg(Set_Column + num * 8); /* 设起始列 */
Write_0108_Reg(Set_Start_Line_0); /* 设起始行 */
for(j=0;j<16;j++)
{
Write_0108_Data(bitmap[n]);
n++;
}
page += 1;
Write_0108_Reg(Set_Page + page); /* 设第二页 */
Write_0108_Reg(Set_Column + num * 8);
for(j=0;j<16;j++)
{
Write_0108_Data(bitmap[n]);
n++;
}
}
/****************************************************************
两页同时显示程序:一次显示两页内容
cs: 需要输入字符的液晶屏,CS1, CS2 或 CS3;
page: 需要输入字符的起始页
bitmap:点阵数据表地址
****************************************************************/
void Set_Two_Page(unsigned char cs, unsigned char page, unsigned char far * bitmap)
{
unsigned char j, k;
unsigned int n=0;
unsigned int i;
if (cs == CS1)
{
CSA=0;
CSB=0;
}
else if (cs == CS2)
{
CSA=0;
CSB=1;
}
else if (cs == CS3)
{
CSA=1;
CSB=0;
}
Delay(100);
Write_0108_Reg(Set_Page + page);
Write_0108_Reg(Set_Column);
Write_0108_Reg(Set_Start_Line_0);
for(j=0;j<64;j++)
{
if (j<63)
Write_0108_Data(bitmap[n]);
else
Write_0108_Data(~bitmap[n]); /* 当需要显示的行为第63行时,由于需要保留菜单边框 */
n++;
}
page += 1;
Write_0108_Reg(Set_Page + page);
Write_0108_Reg(Set_Column);
for(j=0;j<64;j++)
{
if (j<63)
Write_0108_Data(bitmap[n]);
else
Write_0108_Data(~bitmap[n]); /* 当需要显示的行为第63行时,由于需要保留菜单边框 */
n++;
}
}
/****************************************************************
两页闪烁显示程序:一次显示两个空白页
cs: 需要输入字符的液晶屏,CS1, CS2 或 CS3;
page: 需要输入字符的起始页
bitmap:点阵数据表地址
****************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -