📄 12232.c
字号:
/*
2007,3,8拷贝后修改成显示16*16BMP和取模汉字的任意行显示的子程序。
母版为KE文件夹中的12232.C
2007.3.9修改目标为任意行和可以读改写。
*/
#include<reg52.h>
//#include<LCD_code.h>
#include<intrins.h>
//
sbit RS=P3^6;
sbit RW=P0^2;
sbit E1=P0^0;
sbit E2=P0^1;
#define lcd_data P1
//
#define disp_on 0xAf
#define disp_off 0xAe
#define disp_start_line 0xC0
#define page_addr_set 0xB8 //显示起始地址(后五位表示0~31行)
#define col_addr_set 0x00
#define mode_write 0xEE //写模式
#define status_busy 0x80
#define dynamic_driver 0xA4 // 动态驱动
#define adc_select 0xA0 //CLOCKWISE
#define clk32 0xA9
#define clk16 0xA8
#define reset 0xE2 //软件复位
#define u_char unsigned char
#define u_int unsigned int
void lcd_init(void);
void lcd_clr(void);
void wait_ready(void);
void draw_bmp(u_char col,u_char y,u_char width,u_char *bmp);
// 全局变量及标志位定义
/****************************************************************************/
/* 函数名:send_mi */
/* 功 能:发指令instruction到主窗口 */
/* 作 者:spot */
/* 输 入:instruction */
/* 输 出:无 */
/* */
/* 历史记录: */
/* spot 2005-06-28 Creat Inital version. (Version 1.0) */
/****************************************************************************/
void send_mi(u_char instruction)
{
E2 = 0;
E1 = 1;
// wait_ready();
RS = 0; /* 指令 */
RW = 0; /* 写触发 */
_nop_();
lcd_data = instruction; /* 指令码 */
_nop_();
E1 = 0; /* 关M */
_nop_();
}
/****************************************************************************/
/* 函数名:send_md */
/* 功 能:发数据data到主窗口 */
/* 作 者:spot */
/* 输 入:c_data */
/* 输 出:无 */
/* */
/* 历史记录: */
/* spot 2005-06-28 Creat Inital version. (Version 1.0) */
/****************************************************************************/
void send_md(u_char c_data)
{
E2 = 0;
E1 = 1;
// wait_ready();
_nop_();
RS = 1; /* 数据 */
RW = 0; /* 写触发 */
_nop_();
lcd_data = c_data; /* 数据 */
_nop_();
E1 = 0; /* 关M */
_nop_();
}
/****************************************************************************/
/* 函数名:send_si */
/* 功 能:发指令instruction到从窗口 */
/* 作 者:spot */
/* 输 入:instruction */
/* 输 出:无 */
/* */
/* 历史记录: */
/* spot 2005-06-28 Creat Inital version. (Version 1.0) */
/****************************************************************************/
void send_si(u_char instruction)
{
E1=0;
E2 = 1;
// wait_ready();
_nop_();
RS = 0; /* 指令 */
RW = 0; /* 写触发 */
_nop_();
lcd_data=instruction; /* 指令码 */
_nop_();
E2 = 0; /* 关S */
_nop_();
}
/****************************************************************************/
/* 函数名:send_sd */
/* 功 能:发数据data到从窗口 */
/* 作 者:spot */
/* 输 入:c_data */
/* 输 出:无 */
/* */
/* 历史记录: */
/* spot 2005-06-28 Creat Inital version. (Version 1.0) */
/****************************************************************************/
void send_sd(u_char c_data)
{
E1=0;
E2 = 1;
// wait_ready();
_nop_();
RS = 1; /* 数据 */
RW = 0; /* 写触发 */
_nop_();
lcd_data=c_data;
_nop_();
E2 = 0;
_nop_();
}
/****************************************************************************/
/* 函数名:wait_ready */
/* 功 能:等待ready:等待LCD内部操作完成 */
/* 作 者:spot */
/* 输 入:无 */
/* 输 出:无 */
/* */
/* 历史记录: */
/* spot 2005-06-28 Creat Inital version. (Version 1.0) */
/****************************************************************************/
void wait_ready(void)
{
RS = 0;/*指令*/
RW = 1;/*读*/
_nop_();
while(lcd_data & status_busy); /*读入LCD状态,1=忙,一直等待LCD内部操作完成*/
}
/****************************************************************************/
/* 函数名:lcd_clr */
/* 功 能:LCD清屏 */
/* 作 者:spot */
/* 输 入:无 */
/* 输 出:无 */
/* */
/* 历史记录: */
/* spot 2005-06-28 Creat Inital version. (Version 1.0) */
/****************************************************************************/
void lcd_clr(void)
{
u_char i, page;
for (page=0; page<4; page++)
{
send_mi(page_addr_set|page);
send_si(page_addr_set|page);
send_mi(col_addr_set); /* 主窗口设置为0列 */
for (i=0; i<62; i++)
{
send_md(0x00);
}
send_si(col_addr_set); /* 从窗口设置为0列 */
for (i=0; i<62; i++)
{
send_sd(0x00);
}
}
}
/****************************************************************************/
/* 函数名:lcd_init */
/* 功 能:122x32LCD初始化,开机后仅调用一次 */
/* 作 者:spot */
/* 输 入:无 */
/* 输 出:无 */
/* */
/* 历史记录: */
/* spot 2005-06-28 Creat Inital version. (Version 1.0) */
/****************************************************************************/
void lcd_init(void)
{
send_mi(reset); /* 复位m-left,s-right */
send_si(reset);
send_mi(disp_off); /* 关闭显示 */
send_si(disp_off);
send_mi(dynamic_driver);
send_si(dynamic_driver);
send_mi(clk32);
send_si(clk32);
send_mi(adc_select); /* clockwise */
send_si(adc_select);
send_mi(mode_write);
send_si(mode_write);
send_mi(col_addr_set);
send_mi(disp_start_line); /* 归回零列,设定显示起始行首 */
send_si(col_addr_set);
send_si(disp_start_line);
send_mi(disp_on); /* 开显示 */
send_si(disp_on);
lcd_clr();
}
/****************************************************************************/
/* 函数名:set_page */
/* 功 能:同时设置主(左)从(右)显示页为0-1页 */
/* 作 者:spot */
/* 输 入:page */
/* 输 出:无 */
/* */
/* 历史记录: */
/* spot 2005-06-28 Creat Inital version. (Version 1.0) */
/****************************************************************************/
void set_page(u_char page)
{
send_mi(page_addr_set|page);
send_si(page_addr_set|page);
}
/****************************************************************************/
/* 函数名:set_address */
/* 功 能:同时设置主从列地址为0-61列 */
/* 作 者:spot */
/* 输 入:address */
/* 输 出:无 */
/* */
/* 历史记录: */
/* spot 2005-06-28 Creat Inital version. (Version 1.0) */
/****************************************************************************/
void set_address(u_char address)
{
send_mi(address&0x7F); /* &0x7F,考虑到防止越限 */
send_si(address&0x7F);
}
/****************************************************************************/
/* 函数名:putchar_l */
/* 功 能:在左页(主窗口)当前地址画一个字节(8点) */
/* 作 者:spot */
/* 输 入:c */
/* 输 出:无 */
/* */
/* 历史记录: */
/* spot 2005-06-28 Creat Inital version. (Version 1.0) */
/****************************************************************************/
void putchar_l(u_char c)
{
send_md(c);
}
/****************************************************************************/
/* 函数名:putchar_r */
/* 功 能:在右页(从窗口)当前地址画一个字节(8点) */
/* 作 者:spot */
/* 输 入:c */
/* 输 出:无 */
/* */
/* 历史记录: */
/* spot 2005-06-28 Creat Inital version. (Version 1.0) */
/****************************************************************************/
void putchar_r(u_char c)
{
send_sd(c);
}
//----------------------------------------------------------
//--------设置读写改--------
//----------------------------------------------------------
u_char read_data()
{
u_char d=0;
RS = 0;
_nop_();
_nop_();
RS = 1;
_nop_();
RW=1;
_nop_();
d=lcd_data;
return d;
}
//----------------------------------------------------------
//--------设置读写改--------
//----------------------------------------------------------
void read_write_l(u_char ubyte)
{
send_mi(0xe0);
send_si(0xe0);
ubyte=ubyte|read_data();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -