📄 ocm12864.c
字号:
////*****判忙函数****////
////*****************////
void check_busy()
{
uchar read_data=0xff;
clear_rs();
set_rw();
clear_cs();
LCD_DIN_EN ;
do
{
set_en();
_NOP();
_NOP();
read_data=lcddata_in;
clear_en();
}while(read_data&0x80);
set_cs();
LCD_DOUT_EN;
}
////*****************////
////***写数据函数****////
////*****************////
void write_data(uchar dat)
{
check_busy();
set_rs();
clear_rw();
clear_cs();
lcddata_out=dat;
set_en();
_NOP();
_NOP();
clear_en();
set_cs();
}
////*****************////
////****写命令函数***////
////*****************////
void write_command(uchar command)
{
check_busy();
clear_rs();
clear_rw();
clear_cs();
lcddata_out=command;
set_en();
_NOP();
_NOP();
clear_cs();
set_cs();
}
////*****************////
////*****复位函数****////
////*****************////
void reset(void)
{
clear_reset();
LCD_Delay(200);
set_reset();
}
////*****************////
////*****清屏函数****////
////*****************////
void clear_screen(uchar m)
{
uchar i,j;
write_command(0x40); //设置起始行
for(i=0;i<8;i++)
{
write_command(i|0xb0); //设置起始页
write_command(0x10); //设置列的高八位
write_command(0x00); //设置列的低八位
for(j=0;j<128;j++)
{
write_data(m); //设置清屏方式
}
}
}
////*****************////
////***初始化函数****////
////*****************////
void lcd_initial()
{
P2DIR=0XFF;
clear_en();
clear_rw();
clear_cs();
reset();
write_command(0xe2); //复位函数
write_command(0xa2); //液晶背光电压选择
write_command(0xa0); //液晶驱动输出和内部RAM列选择
write_command(0xc0); //控制输出模式选择
write_command(0x24); //液晶背光灯电压设置为总电压的50%
write_command(0x81); //液晶背光灯电压设置控制使能
write_command(0x28); //对比度控制,液晶所有控制电压全关
write_command(0x2f); //对比度控制,液晶所有控制电压全开
write_command(0xa6); //现实模式设置(正常)
write_command(0xaf); //开显示
write_command(0xa5); //液晶上所有显示点开
LCD_Delay(1000);
write_command(0xa4); //液晶正常显示
clear_screen(0); //以清屏
write_command(0x40); //显示起始行设置
write_command(0xb0); //设置起始页
write_command(0x10); //设定列高八位
write_command(0x00); //设定列低八位
}
////*****************////
////**设行起始页位置**////
////*****************////
void set_page_address(uchar page)
{
write_command(0xb0|page);
}
////*****************////
////**设定起始列位置**////
////*****************////
void set_colume_address(uchar colume)
{
uchar temp;
temp=colume>>4;
write_command(temp|0x10); //先送列的高三位
temp=colume&0x0f;
write_command(temp|0x00); //再送列的低四位
}
////*****************////
//在指定位置显示一个字符//
////*****************////
void disp_word(uchar col,uchar pag,uchar ascii) //列col 0~127 小行pag 0~7 字符ascii
{ //4行16列时(8*i,2*j,ascii);
uchar i,tmp;
uint x;
x=(ascii-0x20)*0x10; //字符从0x20开始起,每个16位
write_command((adj_page[pag]&0x07)|0xb0); //设置页地址
tmp=col>>4;
write_command(tmp|0x10); //显示列的高四位
tmp=col&0x0f;
write_command(tmp); //显示列的低四位
for(i=0;i<8;i++)
{
write_data(ASCIIchardot[x]); //通过查找ASCIIchardot表得到相应字符串
x++;
}
pag++;//写下半页
write_command((adj_page[pag]&0x07)|0xb0); //设置页地址
tmp=col>>4;
write_command(tmp|0x10); //显示列的高四位
tmp=col&0x0f;
write_command(tmp); //显示列的低四位
for(i=0;i<8;i++)
{
write_data(ASCIIchardot[x]);
x++;
}
pag--; //写完一个字符页还原
}
////*****************////
//在指定位置显示一个汉字//
////*****************////
void disp_chn(uchar col,uchar pag,uchar cn) //列col 0~127 小行pag 0~7 汉字cn tab表中的序号0~x
{ //4行8列时(16*i,2*j,cn);
uchar i,tmp;
uint x;
x=cn<<5;
write_command((adj_page[pag]&0x07)|0xb0); //设置页地址
tmp=col>>4;
write_command(tmp|0x10); //显示列的高四位
tmp=col&0x0f;
write_command(tmp); //显示列的低四位
for(i=0;i<16;i++)
{
write_data(tab[x]); //通过查找tab表得到相应字符串
x++;
}
pag++; //写下半页
write_command((adj_page[pag]&0x07)|0xb0); //设置页地址
tmp=col>>4;
write_command(tmp|0x10); //显示列的高四位
tmp=col&0x0f;
write_command(tmp); //显示列的低四位
for(i=0;i<16;i++)
{
write_data(tab[x]);
x++;
}
pag--; //写完一个字符页还原
}
////*****************////
//在指定位置显示一个字符串//
////*****************////
void disp_str(uchar col,uchar pag,uchar *cn)
{
while(*cn!=0)
{
if(col==128)
{
pag+=2;
col=0;
}
if(pag==8)
{
pag=0;
}
disp_word(col,pag,*cn++);
col+=8;
}
}
////***************************/////
////**在指定的位置显示一个点***/////
////***************************////
void setpoint(uchar x,uchar y) //x横坐标 0-127 往右 y纵坐标 0-63 往下
{
set_page_address(y/8); //y用以确定某一页,0-7页
set_colume_address(x); //x用于确定某一列,0-127列
write_data(0x01<<(y%8)); //再y确定某一页的具体点
}
////***************************/////
////**在指定行pag低端的位置显示一个点***/////
////***************************////
void point(uchar x,uchar y)
{
set_page_address(x); //x用以确定某一页,0-7页
set_colume_address(y); //Y用于确定某一列,0-127列
write_data(0x80);
}
////***************************/////
////********显示图片***********/////
////***************************////
void disp_bmp( uchar const *puts )
{
uchar i,j;
write_command(0x40);
for(i=8;i>0;i--)
{
write_command((i-1)|0xB0);
write_command(0x10);
write_command(0x00);
for(j=0;j<128;j++)
{
write_data( *puts++ );
}
}
}
////***************************/////
////*********显示竖线*********/////
////***************************////
void shuxian(uchar n,uchar e,uchar f) //列 n 0-127 e,f行 0-7 从e行到f行画竖线
{
uint i;
for(i=e;i<(f+1);i++)
{
set_page_address(i);
set_colume_address(n);
write_data(0xff);
}
}
////***************************/////
////*********显示横线*********/////
////***************************////
void hengxian(uchar k) //行 k 0-7 底端画横线
{
uint i;
for(i=0;i<128;i++)
{
point(k,i);
//write_data(0xff);
}
}
////*****************////
////*****延时函数****////
////*****************////
void LCD_Delay(unsigned long v)
{
while(v--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -