📄 lcm6059b12864.h
字号:
/****************128*64液晶驱动程序*******************/
/*DEVICE:LM6059BCW 128*64 IC:ST7565P
/*MCU: AVR M128 7.3728M(8M)
/*DATA: 2008.07.23
/*AUTHOR: JOE YUAN QQ:16693799
/***********************************************************/
#include <iom128v.h>
#include <macros.h>
#include "delay.h"
#include "ascii8x16.h"
#include "HZK_GB16.h"
#include "define.h"
#include "tupian.h"
void Write_Com_12864( unsigned char cmdcode );//写控制字
void Write_Data_12864 ( unsigned char Dispdata );//写数据到LCD
void Clr_Scr_12864(void);//清屏
void Set_Scr_12864(void);//全显示程序
void Hz_Display16_12864//指定位置显示汉字16*16
(
unsigned char y, //显示的Y坐标
unsigned char x, //显示的X坐标
unsigned char const *hz_code
);
#define CTRL_PORT_12864 PORTC
#define CS12864 PC0//片选
#define RST12864 PC1//复位端
#define RS12864 PC2//寄存器选择H :数据区 L:控制区
#define RW12864 PC3//读写选择
#define E12864 PC4//
#define CS12864_H CTRL_PORT_12864 |= BIT(CS12864);
#define CS12864_L CTRL_PORT_12864 &=~ BIT(CS12864);
#define RST12864_H CTRL_PORT_12864 |= BIT(RST12864);
#define RST12864_L CTRL_PORT_12864 &=~ BIT(RST12864);
#define RS12864_H CTRL_PORT_12864 |= BIT(RS12864);
#define RS12864_L CTRL_PORT_12864 &=~ BIT(RS12864);
#define RW12864_H CTRL_PORT_12864 |= BIT(RW12864);
#define RW12864_L CTRL_PORT_12864 &=~ BIT(RW12864);
#define E12864_H CTRL_PORT_12864 |= BIT(E12864);
#define E12864_L CTRL_PORT_12864 &=~ BIT(E12864);
#define DATA_PORT_12864 PORTA//输出口
#define DATA_DDR_12864 DDRA//数据口方向
#define DATA_PIN_12864 PINA//输入口
#define DISP_ON 0xAf
#define DISP_OFF 0xAe
#define COL_ADDRESS 0xB0//列首地址
#define PAGE_ADDRESS 0xB0//业首地址
//#define START_LINE 0xc0//启始行
unsigned char col_address;//列地址
unsigned char page_address;//页地址
unsigned char lcd_ram_12864[8][128];//刷屏缓冲区8*128
/***********************************************************************
/*直接写入lcd12864数据区方式
/**********************************************************************/
void Hz_Display16x16_12864//指定位置显示汉字16*16
(
unsigned char y, //显示的Y坐标
unsigned char x, //显示的X坐标
unsigned char const *p
)
{
unsigned char j,i ;
for(j=0;j<2;j++)
{
Write_Com_12864(PAGE_ADDRESS+y+j);//写入汉字显示地址
Write_Com_12864(0x10|((x&0xf0)>>4));
Write_Com_12864(0x00|(x&0x0f));
for(i=0;i<16;i++)
{
Write_Data_12864(p[16*j+i]);
}
}
}
void Lcd_Ascii8x16_12864//指定位置显示字符8*16
(
unsigned char y, //显示的Y坐标
unsigned char x, //显示的X坐标
unsigned char *p//字符指针
)
{
unsigned char j=0,i=0,k=0;
unsigned char sizeb=0,cow_num;
while(*(p+sizeb) != '\0')//字符串长度
{
sizeb++;
}
cow_num = sizeb/16+2;
for(j=0;j<cow_num;j++)//字符高度为16 需要刷新2行
{
Write_Com_12864(PAGE_ADDRESS+y+j);//写入显示地址
Write_Com_12864(0x10|((x&0xf0)>>4));
Write_Com_12864(0x00|(x&0x0f));
for(k=0;k<sizeb;k++)//纵向的总的长度
{
for(i=0;i<8;i++)//一个字符纵向8 次
{
Write_Data_12864(asciidot8x16[*(p+k)-0x20][8*j+i]);
}
}
}
}
/*************************************************************************/
/*************************************************************************/
/*写入单片机RAM缓冲区刷屏方式
/*************************************************************************/
void Ram_12864(void)//刷屏
{
unsigned char i,j;
for(i=0;i<8;i++)
{
Write_Com_12864(0X10);//SET COLUMN ADDRESS = 0X00 UPPER-4BIT
Write_Com_12864(0X00);//SET COLUMN ADDRESS = 0X00 LOWER-4BIT
Write_Com_12864(0xB0|(i&0X0F));
for(j=0;j<128;j++)
{
Write_Data_12864(lcd_ram_12864[i][j]);
}
}
}
void Ram_Ascii8x16_12864//指定位置显示字符串8*16 到ram
(
unsigned char y, //显示的Y坐标
unsigned char x, //显示的X坐标
unsigned char *p//字符指针
)
{
unsigned char j=0,i=0,k=0;
unsigned char sizeb=0,cow_num;
while(*(p+sizeb) != '\0')//字符串长度
{
sizeb++;
}
//cow_num = sizeb/16+2;
for(i=0;i<2;i++)
{
for(j=0;j<sizeb;j++)
{
for(k=0;k<8;k++)
{
lcd_ram_12864[y+i][x+k+8*j] = asciidot8x16[*(p+j)-0x20][k+8*i];
}
}
}
Ram_12864();
}
void Ram_Hz16x16_12864//指定位置显示汉字16*16 到ram
(
unsigned char y, //显示的Y坐标
unsigned char x, //显示的X坐标
unsigned char *p//字符指针
)
{
unsigned char j=0,i=0,k=0;
unsigned char sizeb=0,cow_num;
unsigned char index_num =0;//汉字索引号
unsigned char const *lcd_p;
while(*(p+sizeb) != '\0')//字符串长度
{
sizeb++;
}
for(i=0;i<sizeb/2;i++)
{
while((*(p+2*i) != GB_16[index_num].Index[0]) //查出索引号
|| (*(p+1+2*i) != GB_16[index_num].Index[1]))
{
index_num ++;
}
lcd_p = GB_16[index_num].Msk;
for(j=0;j<2;j++)//刷新先上后下
{
for(k=0;k<16;k++)
{
lcd_ram_12864[y+j][x+k+16*i] = *(lcd_p+k+16*j);
}
}
}
Ram_12864();
}
void Reverse_16x16_12864(unsigned char y)//反显示一行
{
unsigned char j=0,i=0;
for(i=0;i<2;i++)
{
for(j=0;j<128;j++)
{
lcd_ram_12864[y+i][j] = ~lcd_ram_12864[y+i][j];
}
}
Ram_12864();
}
void Ram_Bmp_12864(unsigned char const *p)//显示图片
{
unsigned char j=0,i=0;
for(i=0;i<8;i++)
{
for(j=0;j<128;j++)
{
lcd_ram_12864[i][j] = *(p+128*i+j);
}
}
Ram_12864();
}
/**********************************************************************/
void Write_Com_12864( unsigned char cmdcode )//写控制字
{
CS12864_H;
RS12864_L;//写控制字RS = 0 ; RW = 0 ; E :H->L
RW12864_L;
Delay_1us();
CS12864_L;
DATA_PORT_12864 = cmdcode ;
Delay_1us();
E12864_H;
Delay_1us();
E12864_L;
Delay_1us();
CS12864_H;
}
void Write_Data_12864 ( unsigned char Dispdata )//写数据到LCD
{
CS12864_H;
RS12864_H;//写控制字RS = H ; RW = 0 ; E :H->L
RW12864_L;
Delay_1us();
CS12864_L;
DATA_PORT_12864 = Dispdata ;
Delay_1us();
E12864_H;
Delay_1us();
E12864_L;
Delay_1us();
CS12864_H;
}
void Clr_Scr_12864(void)//清屏
{
unsigned char col,page; //12864 占据128行8页每页128列
for(page=0;page<8;page++)
{
Write_Com_12864(0X10);//SET COLUMN ADDRESS = 0X00 UPPER-4BIT
Write_Com_12864(0X00);//SET COLUMN ADDRESS = 0X00 LOWER-4BIT
Write_Com_12864(0xB0|(page&0X0F));
for(col=0;col<128;col++)
{
Write_Data_12864(0x00);
}
}
}
void Set_Scr_12864(void)//全显示程序
{
unsigned char col,page; //12864 占据128行8页每页128列
for(page=0;page<8;page++)
{
Write_Com_12864(0X10);//SET COLUMN ADDRESS = 0X00 UPPER-4BIT
Write_Com_12864(0X00);//SET COLUMN ADDRESS = 0X00 LOWER-4BIT
Write_Com_12864(0xB0|(page&0X0F));
for(col=0;col<128;col++)
{
Write_Data_12864(0xFF);
}
}
}
void Init_12864( void )
{
RST12864_L; //复位LCD
Delay_Us(10);
RST12864_H;
Delay_Us(10);
Write_Com_12864(0XA2);//LCDBIAS = 1/9
Write_Com_12864(0XA0);//LCDADC = NORMAL
Write_Com_12864(0XC8);//SHL = REVERSE
Write_Com_12864(0X40);//初始化LINE=0;
Write_Com_12864(0X2C);//POWER CONTRAL
Delay_Ms(100);
Write_Com_12864(0X2E);
Delay_Ms(100);
Write_Com_12864(0X2F);
Delay_Ms(100);
Write_Com_12864(0X26);//REGULATOR RESISTOR SELECT
Write_Com_12864(0X81);//SET REFERENCE VOLATAG MODE
Write_Com_12864(0X1A);
Write_Com_12864(0XAF);//DISPLAY ON
Write_Com_12864(0XB0);//SET PAGE ADDRESS = 0
Write_Com_12864(0X10);//SET COLUMN ADDRESS = 0X00 UPPER-4BIT
Write_Com_12864(0X00);//SET COLUMN ADDRESS = 0X00 LOWER-4BIT
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -