📄 lcd12864.c
字号:
//lcd12864.c
#include"general.h"
#include"lcd12864.h"
#include"lcd_code.h"
#include"sys12M.h"
#include"cm27c04.h"
#include<math.h>
sbit EN = P1^0;
//********************************
extern BYTE code char_code[95][16];
extern BYTE code motor_icon[6][32];
extern BYTE bdata tempchar[8];
//********************************
void lcd_init(void)
{
lcd_cmd1_send(0x3F);
lcd_cmd1_send(0xC0);
lcd_cmd2_send(0x3F);
lcd_cmd2_send(0xC0);
}
//********************************
void start_row(BYTE nrow)
{
lcd_cmd1_send(nrow|0xC0);
lcd_cmd2_send(nrow|0xC0);
}
//********************************
void lcd_cmd1_send(BYTE cmd)
{
BYTE state;
do
{
ADDR_LCD = E1_state_r;
EN = 1;
state = DATA_LCD;
EN = 0;
state = state & 0x80;
}while(state);
ADDR_LCD = E1_cmd_w;
EN = 1;
DATA_LCD = cmd;
_nop_();
EN = 0;
}
//***********************************
void lcd_cmd2_send(BYTE cmd)
{
BYTE state;
do
{
ADDR_LCD = E2_state_r;
EN = 1;
state = DATA_LCD;
EN = 0;
state = state & 0x80;
}while(state);
ADDR_LCD = E2_cmd_w;
EN = 1;
DATA_LCD = cmd;
_nop_();
EN = 0;
}
//*************************************
void lcd_data1_send(BYTE dat)
{
BYTE state;
do
{
ADDR_LCD = E1_state_r;
EN = 1;
state = DATA_LCD;
EN = 0;
state = state & 0x80;
}while(state);
ADDR_LCD = E1_data_w;
EN = 1;
DATA_LCD = dat;
_nop_();
EN = 0;
}
//***********************************
void lcd_data2_send(BYTE dat)
{
BYTE state;
do
{
ADDR_LCD = E2_state_r;
EN = 1;
state = DATA_LCD;
EN = 0;
state = state & 0x80;
}while(state);
ADDR_LCD = E2_data_w;
EN = 1;
DATA_LCD = dat;
_nop_();
EN = 0;
}
//************************************
//*************************LCD清屏
void lcd_clear()
{
BYTE page;
BYTE i,j;
for(i=0;i<8;i++)
{
page = i | 0xB8;
lcd_cmd1_send(page);
lcd_cmd1_send(0x40);
lcd_cmd2_send(page);
lcd_cmd2_send(0x40);
for(j=0;j<64;j++)
{
lcd_data1_send(0x00);
lcd_data2_send(0x00);
}
}
}
//***********************LCD写字符子程序
BYTE lcd_char_send(BYTE *dat,BYTE page/*0,2,4or8*/,BYTE line_num,bit bclr)
{
BYTE temp,cur_line;
BYTE i;
temp = page | 0xB8;
for(i=0,cur_line=line_num;i<8;i++,cur_line++)
{
if(cur_line<64)
{
lcd_cmd1_send(temp);
lcd_cmd1_send(cur_line|0x40);
if(bclr) lcd_data1_send(dat[i]);
else lcd_data1_send(~dat[i]);
}
else
{
lcd_cmd2_send(temp);
lcd_cmd2_send((cur_line-64)|0x40);
if(bclr) lcd_data2_send(dat[i]);
else lcd_data2_send(~dat[i]);
}
}
temp = (page+1) | 0xB8;
for(i=8,cur_line=line_num;i<16;i++,cur_line++)
{
if(cur_line<64)
{
lcd_cmd1_send(temp);
lcd_cmd1_send(cur_line|0x40);
if(bclr) lcd_data1_send(dat[i]);
else lcd_data1_send(~dat[i]);
}
else
{
lcd_cmd2_send(temp);
lcd_cmd2_send((cur_line-64)|0x40);
if(bclr) lcd_data2_send(dat[i]);
else lcd_data2_send(~dat[i]);
}
}
line_num += 8;
return line_num;
}
//*************************打印字符
BYTE print_char(BYTE the_char,BYTE page,BYTE line_num,bit bclr)
{
line_num = lcd_char_send(char_code[the_char-32],page,line_num,bclr);
return line_num;
}
//*************************打印字符串
BYTE print_string(BYTE *string,BYTE page,BYTE line_num,bit bclr)
{
BYTE i;
BYTE char_test;
i = 0;
while(1)
{
char_test = string[i];
if(char_test == '$') break;
if(char_test >0xA0)
{
line_num = print_chs(string+i,page,line_num,bclr);
i++;
i++;
}
else
{
line_num = print_char(char_test,page,line_num,bclr);
i++;
}
}
return line_num;
}
//*************************打印图标或汉字
BYTE print_icon(BYTE *icon,BYTE page,BYTE line_num,BYTE iheight,BYTE iwidth,bit bclr)
{
BYTE temp,cur_line;
BYTE i,j;
for(j=0;j<iheight;j++)
{
temp = (page+j) | 0xB8;
for(i=0,cur_line=line_num;i<iwidth;i++,cur_line++)
{
if(cur_line<64)
{
lcd_cmd1_send(temp);
lcd_cmd1_send(cur_line|0x40);
if(bclr) lcd_data1_send(icon[i+j*iwidth]);
else lcd_data1_send(~icon[i+j*iwidth]);
}
else
{
lcd_cmd2_send(temp);
lcd_cmd2_send((cur_line-64)|0x40);
if(bclr) lcd_data2_send(icon[i+j*iwidth]);
else lcd_data2_send(~icon[i+j*iwidth]);
}
}
}
line_num += iwidth;
return line_num;
}
//******************************打印整型数字
BYTE print_num(WORD srcnum,BYTE page,BYTE line_num,bit bclr)
{
BYTE i;
WORD j,digit;
if(srcnum==0) print_string(" $",page,line_num,bclr);
else if(srcnum<10)
{
digit = srcnum;
line_num = lcd_char_send(char_code[digit+16],page,line_num,bclr);
}
else if(srcnum<100)
for(i=0,j=10,digit=0;i<2;i++)
{
digit = srcnum / j;
srcnum -= digit * j;
j /= 10;
line_num = lcd_char_send(char_code[digit+16],page,line_num,bclr);
}
else if(srcnum<1000)
for(i=0,j=100,digit=0;i<3;i++)
{
digit = srcnum / j;
srcnum -= digit * j;
j /= 10;
line_num = lcd_char_send(char_code[digit+16],page,line_num,bclr);
}
else if(srcnum<10000)
for(i=0,j=1000,digit=0;i<4;i++)
{
digit = srcnum / j;
srcnum -= digit * j;
j /= 10;
line_num = lcd_char_send(char_code[digit+16],page,line_num,bclr);
}
else
for(i=0,j=10000,digit=0;i<5;i++)
{
digit = srcnum / j;
srcnum -= digit * j;
j/=10;
line_num = lcd_char_send(char_code[digit+16],page,line_num,bclr);
}
return line_num;
}
//************************************
void screen_up(BYTE ustep,WORD ctime)
{
BYTE i;
for(i=0;i<LCD_NROW;)
{
lcd_cmd1_send(i|0xC0);
lcd_cmd2_send(i|0xC0);
i += ustep;
delay(ctime);
}
lcd_cmd1_send(0xC0);
lcd_cmd2_send(0xC0);
}
//*******************************************
void screen_down(BYTE dstep,WORD ctime)
{
BYTE i;
for(i=LCD_NROW-1;i<LCD_NROW;)
{
lcd_cmd1_send(i|0xC0);
lcd_cmd2_send(i|0xC0);
i -= dstep;
delay(ctime);
}
lcd_cmd1_send(0xC0);
lcd_cmd2_send(0xC0);
}
//**********************************************
void setpos(BYTE px,BYTE py,bit bclr)
{
BYTE page;
BYTE posdata;
page = py % 8;
posdata = 0x01;
if(page) posdata = _crol_(posdata,page);
page = py / 8;
page = page|0xB8;
if(px<64)
{
lcd_cmd1_send(page);
lcd_cmd1_send(px|0x40);
if(bclr) lcd_data1_send(posdata);
else lcd_data1_send(~posdata);
}
else
{
lcd_cmd2_send(page);
lcd_cmd2_send((px-64)|0x40);
if(bclr) lcd_data2_send(posdata);
else lcd_data2_send(~posdata);
}
}
//***********************************************
void drawline(BYTE xb,BYTE yb,BYTE xe,BYTE ye,bit bclr)
{
char fm;
char xstep,ystep;
BYTE estep;
BYTE ncase;
if ( (xe>=xb) && (ye>=yb) ) ncase = 1;
else if ( (xe<xb) && (ye>=yb) ) ncase = 2;
else if ( (xe<xb) && (ye<yb) ) ncase = 3;
else ncase = 4;
fm = xstep = ystep = 0;
estep = abs(xe-xb) + 1;
do
{
setpos(xb+xstep,yb+ystep,bclr);
if(fm>=0)
{
switch(ncase)
{
case 1: xstep++;
break;
case 2: xstep--;
break;
case 3: xstep--;
break;
case 4: xstep++;
break;
default:break;
}
fm -= abs(ye-yb);
estep--;
}
else
{
switch(ncase)
{
case 1: ystep++;
break;
case 2: ystep++;
break;
case 3: ystep--;
break;
case 4: ystep--;
break;
default:break;
}
fm += abs(xe-xb);
}
}while(estep);
}
//************************************************************************
void drawrect(BYTE xb,BYTE yb,BYTE rwidth,BYTE rheight,bit bclr)
{
BYTE i;
for(i=xb;i<xb+rwidth;i++)
{
setpos(i,yb,bclr);
setpos(i,yb+rheight,bclr);
}
for(i=yb;i<yb+rheight;i++)
{
setpos(xb,i,bclr);
setpos(xb+rwidth,i,bclr);
}
}
//*************************************************************************
void drawcircle(BYTE xb,BYTE yb,BYTE cr,bit bclr)
{
int fm;
char xstep,ystep;
BYTE estep;
fm = 0;
xstep = xb;
ystep = yb+cr-1;
estep = 4*cr-3;
do
{
setpos(xstep,ystep,bclr);
if(fm>=0)
{
if ( (xstep>=xb) && (ystep>=yb) )
{
xstep--;estep--;
fm -= (2*xstep-1);
}
else if ( (xstep<xb) && (ystep>=yb) )
{
ystep--;
fm -= (2*ystep-1);
}
else if ( (xstep<xb) && (ystep<yb) )
{
xstep++;estep--;
fm -= (2*xstep-1);
}
else
{
ystep++;
fm -= (2*ystep-1);
}
}
else
{
if ( (xstep>=xb) && (ystep>=yb) )
{
ystep++;
fm += (2*ystep+1);
}
else if ( (xstep<xb) && (ystep>=yb) )
{
xstep--;estep--;
fm += (2*xstep+1);
}
else if ( (xstep<xb) && (ystep<yb) )
{
ystep--;
fm += (2*ystep+1);
}
else
{
xstep++;estep--;
fm += (2*xstep+1);
}
}
}while(estep);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -