📄 lcd12864.c
字号:
/***********************************************************************************
无字库LCD12864驱动
CPU:M16
晶振:8M
编译环境:AVRGCC20071221
BY:PENG 2008-1-5
*************************************************************************************/
#include <AVR/io.h>
#include <AVR/delay.h>
#include <avr/pgmspace.h>
#include "MAP.h"
#include "CHINA.h"
#include "LCD12864.h"
#include "ENGLISH.h"
/*---------------------------------------------------
name:delay
task:延时
return:NO
----------------------------------------------------*/
void delay(uint16 t)
{
for(;t>0;t--)
_delay_us(100);
}
/*---------------------------------------------------
name:void busywait(void)
task:busywait
return:
----------------------------------------------------*/
void busywait(void)
{
Bus_in;
Lcd_Bus=0xff;
Di_clr;
RW_set;
//_delay_us(4);
Enable_set;
while(busy) ;
Enable_clr;
Bus_out;
}
/*---------------------------------------------------
name:void write_com(uint8 cmdcode)
task:写命令到LCD
return:NO
----------------------------------------------------*/
void write_com(uint8 cmdcode)
{
busywait( );
Di_clr;
RW_clr;
Lcd_Bus=cmdcode;
Enable_set;
Enable_clr;
}
/*---------------------------------------------------
name:void write_data(uint8 Dispdata)
task:写数据到LCD
return:NO
----------------------------------------------------*/
void write_data(uint8 Dispdata)
{
busywait( );
Di_set;
RW_clr;
Lcd_Bus=Dispdata;
Enable_set;
Enable_clr;
}
/*---------------------------------------------------
name:
task:清除内存
return:
----------------------------------------------------*/
void Clr_Scr(uint8 any)
{
uint8 j,k;
Mcs_set;Scs_set;
write_com(Page_Add+0);
write_com(Col_Add+0);
if(any==1) //all screen
{
for(k=0;k<8;k++)
{
write_com(Page_Add+k);
for(j=0;j<64;j++)write_data(0x00);
}
}
if(any==2) //left
{
for(k=0;k<8;k++)
{
write_com(Page_Add+k);
for(j=0;j<64;j++)write_data(0x00);
}
}
if(any==3) //right
{
for(k=0;k<8;k++)
{
write_com(Page_Add+k);
for(j=0;j<64;j++)write_data(0x00);
}
}
}
/*---------------------------------------------------
name:void Disp_Img(uint8 *img)
task:显示12864图片
return:NO
----------------------------------------------------*/
void Disp_Img(uint8 *img)
{
uint8 j,k;
for(k=0;k<8;k++)
{
Mcs_set;Scs_clr;
write_com(Page_Add+k);
write_com(Col_Add+0);
for(j=0;j<64;j++) write_data(pgm_read_byte(&img[k*128+j]));
Mcs_clr;Scs_set;
write_com(Page_Add+k);
write_com(Col_Add+0);
for(j=64;j<128;j++) write_data(pgm_read_byte(&img[k*128+j]));
}
}
/*---------------------------------------------------
name:ascii_disp8
task:指定位置显示ASCII 8*8
return:NO
----------------------------------------------------*/
void ascii_disp8(uint8 c)
{
uint8 line;
c -= 32;
for (line=0; line<8; line++)
write_data(pgm_read_byte(&font8[c][line]));
}
/*---------------------------------------------------
name:void Disp_char(uint8 Y,uint8 X,uint8 s)
task:指定位置显示 8*8 数字
return:NO
----------------------------------------------------*/
void Disp_char(uint8 Y,uint8 X,uint8 s,uint8 l_r)
{
uint8 line;
if(l_r){Mcs_set;Scs_clr;}
else {Mcs_clr;Scs_set;}
write_com(Page_Add+Y);
write_com(Col_Add+X);
s -= 32;
for (line=0; line<8; line++)
write_data(pgm_read_byte(&font8[s][line]));
}
/*---------------------------------------------------
name:void Disp_english_string(uint8 Y,uint8 X,uint8 *s)
task:指定位置显示ASCII 8*8 字符串
return:NO
----------------------------------------------------*/
void Disp_english_string(uint8 Y,uint8 X,uint8 *s)
{
uint8 num,bit;
num=1;
bit=0;
Mcs_set;Scs_clr;
write_com(Page_Add+Y);
write_com(Col_Add+X);
while (*s&&((num+X/8)<17)) //line full out
{
if(((num*8+X)>64)&&(bit!=2)) bit=1;//less than 64 disp left or disp right
if(bit==1){Mcs_clr;Scs_set;write_com(Col_Add);write_com(Page_Add+Y);bit=2;}
ascii_disp8(*s);
num++;
s++;
}
}
/*---------------------------------------------------
name:void Disp_nascii_string(uint8 Y,uint8 X,uint8 *s,uint8 n)
task:指定位置显示ASCII N 个8*8 字符串
return:NO
----------------------------------------------------*/
void Disp_nascii_string(uint8 Y,uint8 X,uint8 *s,uint8 n)
{
uint8 num,bit;
num=1;
bit=0;
Mcs_set;Scs_clr;
write_com(Page_Add+Y);
write_com(Col_Add+X);
while ((n>0)&&((num+X/8)<17)) //line full out
{
if(((num*8+X)>64)&&(bit!=2)) bit=1;//less than 64 disp left or disp right
if(bit==1){Mcs_clr;Scs_set;write_com(Col_Add);write_com(Page_Add+Y);bit=2;}
ascii_disp8(*s);
num++;
s++;
n--;
}
}
/*---------------------------------------------------
name:void hz_disp16(uint8 pag,uint8 col, uint8 *hzk)
task:指定位置显示汉字16*16
return:NO
----------------------------------------------------*/
void hz_disp16(uint8 pag,uint8 col, uint8 *hzk)
{
uint8 j=0,i=0;
for(j=0;j<2;j++)
{
write_com(Page_Add+pag+j);
write_com(Col_Add+col);
for(i=0;i<16;i++) write_data(pgm_read_byte(&hzk[16*j+i]));
}
}
/*---------------------------------------------------
name:void init_lcd(void)
task:初始化LCD屏
return:NO
----------------------------------------------------*/
void init_lcd(void)
{
Bus_out;
Lcd_Bus=0xff;
DDRC=0Xfc;
Li_on;
_delay_ms(2);
Mcs_set;
Scs_set;
write_com(Disp_Off);
write_com(Page_Add+0);
write_com(Start_Line+0);
write_com(Col_Add+0);
write_com(Disp_On);
}
/*---------------------------------------------------
name:inform_disp
task:information
return:NO
----------------------------------------------------*/
void inform_disp(void)
{
Clr_Scr(all);
Disp_Img(FirstPage);
delay(10000);
Clr_Scr(all);
Disp_english_string(0,8,"VOL");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -