📄 12864.h
字号:
//包含液晶驱动得所有底层函数
//汉字取模时为一页页取得,汉字可以上下列一起送,16次完成.
void lcd_init( void ) //初始化函数
{
write_cmd_L( 0x3e ); //关显示 00111110B
write_cmd_R( 0x3e );
write_cmd_L( 0xc0 ); //设定起始行 11000000B ,设定第0行是显示的顶端
write_cmd_R( 0xc0 );
write_cmd_L( 0x3f ); //开显示
write_cmd_R( 0x3f );
lcd_clr( ); //清屏
}
void lcd_clr( void ) //清屏函数
{
unsigned char i,j,page; //page为页数
for( i = 0; i < 8; i++ )
{
page = i;
page |= 0xb8; // 10111000B 设定页值 ,低三位决定为第几页
write_cmd_L( page ); //设定RAM中的页值
write_cmd_L( 0x40 ); //设定列值,01000000从第0列起
for( j = 0; j < 64; j++ )
write_dat_L( 0 ); //列清零是一列一列完成的 一列清0完成后列值自动加1
write_cmd_R( page ); //右屏与左屏一样设置
write_cmd_R( 0x40 );
for( j = 0; j < 64; j++ )
write_dat_R( 0 );
}
}
void write_cmd_L( unsigned char cmd ) //写左命令
{
CSB = 1;
CSA = 0;
DI = 0; //此时符合状态码的读取条件
RW = 1;
do
{
DataLine = 0xff;
E = 1;
_nop_();
}while( BUSY ); //为忙态则等待,这是一个读单片机端口的过程
E = 0;
RW = 0;
DataLine = cmd;
E = 1;
_nop_();
E = 0;
}
void write_cmd_R( unsigned char cmd ) //写右命令
{
CSB = 0;
CSA = 1;
DI = 0;
RW = 1;
do
{
DataLine = 0xff;
E = 1;
_nop_();
}while( BUSY );
E = 0;
RW = 0;
DataLine = cmd;
E = 1;
_nop_();
E = 0;
}
void write_dat_L( unsigned char dat )//写左数据,按照器件手册,编制函数
{
CSB = 1;
CSA = 0;
DI = 0;
RW = 1;
do
{
DataLine = 0xff;
E = 1;
_nop_();
}while( BUSY );
E = 0;
DI = 1;
RW = 0;
DataLine = dat;
E = 1;
_nop_();
E = 0;
}
void write_dat_R( unsigned char dat )//写右数据
{
CSB = 0;
CSA = 1;
DI = 0;
RW = 1;
do
{
DataLine = 0xff;
E = 1;
_nop_();
}while( BUSY );
E = 0; //E为低电平有效
DI = 1;
RW = 0;
DataLine = dat;
E = 1;
_nop_();
E = 0;
}
void write_data(unsigned char xpos,unsigned char ypos,unsigned char lcddata) //一次写入一个字节
{
if(xpos<128)
{
if( ( xpos & 0x40 )== 0 ) // 左屏
{
write_cmd_L( 0xb8 | ypos ); //ypos 为页值
write_cmd_L( 0x40 | xpos); //xpos 为列值
write_dat_L( lcddata );
}
else // 右屏
{
write_cmd_R( 0xb8 | ypos );
write_cmd_R( 0x40 | xpos );
write_dat_R( lcddata );
}
}
}
void lcd_putchar5x16( unsigned char x,unsigned char y,unsigned char *ch ) //显示5×16字符
{
unsigned char i;
for( i = 0; i < 5; i ++ )
{
write_data( x+i, y, ch[i] ); //xpos 为起始列值,ypos 为页值
write_data( x+i, y+1, ch[5+i] ); //
}
}
void lcd_putchar12x16( unsigned char x, unsigned char y, unsigned char *hz ) //显示汉字,x显示列,y显示页
{
unsigned char i;
for( i = 0; i < 12; i++ )
{
write_data( x + i, y, hz[ i] );
write_data( x + i, y + 1, hz[ 12 + i] ); //两页一起送数据
}
}
void lcd_putchar_shuzu12x16( unsigned char x,unsigned char y,unsigned char ch ) //显示汉字,汉字以数组形势存放 66666666666666666666666666666
{
unsigned char i;
for( i = 0; i <12; i++ )
{
write_data( x+i, y, xindekaishi_hanzi[ch*24 + i] ); //xpos 为起始列值,ypos 为页值
write_data( x+i, y+1, xindekaishi_hanzi[ch*24 +12+ i] ); //
}
}
void lcd_xingqi_dis12x16( unsigned char x, unsigned char y, unsigned char num ) //显示汉字,x显示列,y显示页
{
unsigned char i;
for( i = 0; i < 12; i++ )
{
write_data( x + i, y, xingqi[24*num+ i] );
write_data( x + i, y + 1, xingqi[ 24*num+ 12 + i] ); //两页一起送数据
}
}
void lcd_num5x16( unsigned char x,unsigned char y,unsigned char ch ) //显示数字0-9
{
unsigned char i;
for( i = 0; i < 5; i ++ )
{
write_data( x+i, y, zifu[ch*10 + i] ); //xpos 为起始列值,ypos 为页值
write_data( x+i, y+1, zifu[ch*10 +5+ i] ); //
}
}
void lcd_num_biankuang5x16( unsigned char x,unsigned char y,unsigned char ch ) //显示数字0-9,里面加上了边框的数据
{
unsigned char i;
for( i = 0; i < 5; i ++ )
{
write_data( x+i, y, zifu_biankuang[ch*10 + i] ); //xpos 为起始列值,ypos 为页值
write_data( x+i, y+1,zifu_biankuang[ch*10 +5+ i] ); //
}
}
void hz_disp( unsigned char x, unsigned char y, unsigned char *hz ) //显示汉字,x显示列,y显示页
{
unsigned char i;
for( i = 0; i < 16; i++ )
{
write_data( x + i, y, hz[ i] );
write_data( x + i, y + 1, hz[ 16 + i] ); //两页一起送数据
}
}
void lcd_image12816_dis(unsigned char m,unsigned char code *img)
{
unsigned char j,k;
for( k = 0; k < 2; k++ )
{
m =m+ k;
m |= 0xb8; // 10111000B 设定页值 , i值影响page的低三位
write_cmd_L(m );
write_cmd_L( 0x40 ); //01000000 设定列值
for( j = 0; j < 64; j++ )
write_dat_L(img[k*128+j]); //img为指针
write_cmd_R( m );
write_cmd_R( 0x40 );
for(j=64;j<128;j++)
write_dat_R(img[k*128+j]);
}
}
//显示12864图片
void Disp_Img(unsigned char code *img) //字模生成时为先取第一页数据,再第二页....,且为纵向取模,字节倒序
{
unsigned char j,k,page = 0;
for( k = 0; k < 8; k++ )
{
page = k;
page |= 0xb8; // 10111000B 设定页值 , i值影响page的低三位
write_cmd_L( page );
write_cmd_L( 0x40 ); //01000000 设定列值
for( j = 0; j < 64; j++ )
write_dat_L(img[k*128+j]); //img为指针
write_cmd_R( page );
write_cmd_R( 0x40 );
for(j=64;j<128;j++)
write_dat_R(img[k*128+j]);
}
}
unsigned char Rddata( void ) //读取显示的数据
{
unsigned char dd = 0;
DataLine = 0xff;
DI = 1;
RW = 1;
E = 1;
_nop_();
dd = DataLine;
E = 0;
return(dd);
}
void biankuang_display()
{
unsigned char x01 = 0; //
unsigned char y01 = 0;
for(y01 = 0 ; y01<6 ; y01++) //写左边框
{
write_data( x01,y01,0xff);
write_data( x01+1,y01,0xff);
}
for(y01 = 0 ; y01<6 ; y01++) //写右边框
{
write_data( 126,y01,0xff);
write_data( 127,y01,0xff);
}
write_data( 2,0,0x0f); //边脚雕饰
write_data( 3,0,0x07);
write_data( 124,0,0x07);
write_data( 125,0,0x0f);
for(x01 = 4 ; x01<124 ; x01++) //写上边框
{
write_data( x01,0,0x03);
}
lcd_image12816_dis(6,xindekaishi); // 写显示的下部
lcd_putchar12x16( 12, 4, xing ); //显示星
lcd_putchar12x16( 25, 4, qii); //显示汉字期
lcd_putchar12x16( 70, 2, wenduji ) ; //显示温度计图片
lcd_putchar12x16( 114, 2,sheshidu); //显示摄氏度
write_data( 104, 3,0x08); //显示一点
lcd_putchar12x16( 70, 4, dingshiqi); //显示图片定时器
// lcd_putchar12x16( 70, 0, naolingkai ) ; 显示闹铃开图片
lcd_putchar5x16( 19, 2,maohao ); //显示5×16字符,以下显示不带边框的冒号
lcd_putchar5x16( 37, 2,maohao ); //
//lcd_putchar5x16( 102, 2,maohao ) ;
lcd_putchar5x16( 102, 4,maohao) ; //
lcd_putchar5x16( 102, 0,maohao_biankuang); //显示带边框的冒号
lcd_putchar5x16( 90, 4,hengxian ) ; //显示横线,不带边框
lcd_putchar5x16( 96, 4,hengxian ) ; //显示横线
lcd_putchar5x16( 108, 4,hengxian ); //显示横线
lcd_putchar5x16( 114, 4,hengxian ) ; //显示横线
lcd_putchar5x16( 20, 0,hengxian_biankuang ); //显示横线,带边框
lcd_putchar5x16( 38, 0,hengxian_biankuang ) ; //显示横线
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -