📄 lcd_12864.h
字号:
//lcd头文件.
#define L_on PORTB&=~(1<<PORTB0)
#define L_off PORTB|=(1<<PORTB0)
#define R_on PORTB&=~(1<<PORTB1)
#define R_off PORTB|=(1<<PORTB1)
#define Selcom PORTB&=~(1<<PORTB2)
#define Seldata PORTB|=(1<<PORTB2)
#define Rw_w PORTB&=~(1<<PORTB3)
#define Rw_r PORTB|=(1<<PORTB3)
#define E_on PORTB|=(1<<PORTB4)
#define E_off PORTB&=~(1<<PORTB4)
#define iodata PORTA
#define status_busy 0x80; //忙状态.
#define disp_start_set 0xc0 //显示起始行设置.
#define page_addr_set 0xb8 //页面地址设置.
#define col_addr_set 0x40 //列地址设置.
#define disp_on 0x3f //打开显示.
/********************分别为读忙信号写指令写数据.******************************************/
void chkbusy(void) //检查忙信号.等待LCD内部操作完成.
{
// iodata=0xff; //因为要读状态,所以先使IO口输出高电平.
E_on;
Selcom;
Rw_r;
// while(iodata&status_busy);//读入LCD状态,1=忙,一直等LCD内部操作完成.
}
void send_comm(uchar command) //左右屏在调用函数中处理.
{
chkbusy();
E_on; //使能LCD
Selcom;
Rw_w;
iodata=command; //发送命令到数据总线.
E_on;
E_off; //发送完,关闭使能.
}
void send_data(uchar dat)
{
chkbusy();
E_on;
Seldata;
Rw_w;
iodata=dat; //发送数据到数据总线.
E_off;
}
/********************LCD初始化******************************************/
void lcd_init(void) //LCD初始化.
{
send_comm(disp_start_set); //设置显示起始行为第一行.
send_comm(page_addr_set); //页地址设为0
send_comm(col_addr_set); //列地址设为0
send_comm(disp_on); //打开显示.
}
/********************LCD清屏******************************************/
void lcd_clr(void) //LCD清屏.
{
uchar page,col;
L_off; //对右边控制器操作.
R_on;
for (page=0;page<8;page++)
{
send_comm(page_addr_set | page);
send_comm(col_addr_set);
for (col=0;col<64;col++)
{
send_data(0x00); //列地址自动加一.
}
}
L_on;
R_off; //对左边控制器进行操作
for (page=0;page<8;page++)
{
send_comm(page_addr_set | page);
send_comm(col_addr_set);
for (col=0;col<64;col++)
{
send_data(0x00); //列地址自动加一.
}
}
}
/********************************************************************************
画一个图.页地址是page,列地址是col,图形宽度为width,高固定为16,bmp是图形指针.
是否反向标志为mod,mod=0为正常,mod=1表示需要反向显示,一般用在菜单上.取模方式为字节倒序.
********************************************************************************/
void draw_bmp(uchar page,uchar col,uchar width,uchar mod,const uchar *bmp)
{
uchar x,address;
uchar window=0;
uchar p=0; //p表示宽度的索引,即它的值为0到width之间.
for(x=col;x<col+width;x++) //列地址自动加一,但对于x,一个循环后必须加一才能与列地址保持同步.
{
//每一个循环显示同一列的两个字节(连续两页).
if (x>127) return; //若列坐标大于127,则为无效数据,硬返回,防止显示乱码.
if (x>63) //若列地址大于63,则表示要显示在右半区.
{
window=1; //表示在右窗口显示.
address=x%64;
}
else
{
window=0; //左窗口显示.
address=x;
}
if(window) //发送是在左屏还是右屏.
{
L_on;
R_off;
}
else
{
L_off;
R_on;
}
send_comm(page_addr_set | page); //发送页面地址.
send_comm(col_addr_set | address); //发送列地址.
if (mod) send_data(~bmp[p]);
else send_data(bmp[p]); //发送数据.
if(window)
{
L_on;
R_off;
}
else
{
L_off;
R_on;
}
send_comm((page_addr_set | page)+1); //页地址加一.
send_comm(col_addr_set | address); //列地址不变.
if (mod) send_data(~bmp[p+width]);
else send_data(bmp[p+width]); //第二排数据.
p++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -