📄 lcd.c.bak
字号:
};
/****************************************************************************/
/* 函数名:send_mi */
/* 功 能:发指令instruction到主窗口 */
/* 作 者:spot */
/* 输 入:instruction */
/* 输 出:无 */
/* */
/* 历史记录: */
/* spot 2005-06-28 Creat Inital version. (Version 1.0) */
/****************************************************************************/
void send_mi(u_char instruction)
{
E2 = 1;
E1 = 1;
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 = 1;
E1 = 1; /* 开M */
_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)
{
E2 = 1; /* 开S */
_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)
{
E2 = 1;
_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_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();
}
/****************************************************************************/
/* 函数名: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);
}
}
}
/****************************************************************************/
/* 函数名: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_page */
/* 功 能:同时设置主从列地址为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);
}
/****************************************************************************/
/* 函数名:draw_bmp */
/* 功 能:画一个图,横坐标是col,layer表示上下层,width是图形的宽,高固定16 */
/* 作 者:spot */
/* 输 入: */
/* col 图型的起始位置0~121 */
/* layer 图形的位置(Y坐标)0-下半部分 非0-上半部分 */
/* width 图形宽度8,16可选 */
/* bmp 图形数据指针 */
/* */
/* 输 出:无 */
/* */
/* 历史记录: */
/* spot 2005-06-28 Creat Inital version. (Version 1.0) */
/****************************************************************************/
void draw_bmp(u_char col,u_char layer,u_char width,u_char *bmp)
{
u_char x;
u_char address; /* address表示显存的物理地址 */
u_char p=0;
u_char page=0; /* page表示上下两页,window表示左右窗口(0左,1右) */
u_char window=0;
if (layer)
{
page=2; /* 左-主窗口,右-从窗口 */
}
for (x=col; x<col+width; x++)
{
if (x>121)
return; /* 防止显示乱码 */
if (x>60) /* 左右窗口定位 */
{
window=1; /* 右-从窗口 */
address=x%61;
}
else
{
address=x; /* 主窗口输出 */
}
set_page(page); /* 上层数据输出 */
set_address(address);
if (window)
putchar_r(bmp[p]);
else
putchar_l(bmp[p]);
set_page(page+1); /* 下层数据输出 */
set_address(address); /* 列保持不变 */
if (window)
putchar_r(bmp[p+width]);
else
putchar_l(bmp[p+width]);
p++;
}
}
/****************************************************************************/
/* 函数名:disp_one_ascii */
/* 功 能:显示单个ASCII码 */
/* 作 者:spot */
/* 输 入: */
/* col 图型的起始位置0~121 */
/* layer 图形的位置(Y坐标)0-下半部分 非0-上半部分 */
/* ascii_code 所要显示德ASCCII码 */
/* mode 显示模式,0正显,1反显 */
/* */
/* 输 出:无 */
/* */
/* 历史记录: */
/* spot 2005-06-28 Creat Inital version. (Version 1.0) */
/****************************************************************************/
void disp_one_ascii(u_char col,u_char layer,u_char ascii_code,u_char mode)
{
u_char i,temp;
temp = ascii_code;
for (i=0; i<16; i++) /*ASCII码显示占用16个字节*/
{
if (mode)
dot_buffer[i]=~ascii_tab[(ascii_code-0x20)*16 + i];
else
dot_buffer[i]= ascii_tab[(ascii_code-0x20)*16 + i];
}
draw_bmp(col,layer,8,dot_buffer);
}
/****************************************************************************/
/* 函数名:disp_ram_data */
/* 功 能:显示小于14位的十进制数字 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -