📄 lcd.c
字号:
#include <iom128v.h>
#include <control.h>
#include <lcd.h>
#include <macros.h>
#define chg1(a) (((a&0xf0)>>4)*10+(a&0x0f))
#define chg2(a) (((a/10)<<4)+(a%10))
extern const unsigned char FONT_LOGO[][492];
extern const unsigned char FONT_CHAR[];
extern const unsigned char FONT_HEAD[][246];
extern unsigned char time[7];
extern unsigned char temp_alarm[3],temp_alarm1[3];
extern unsigned char temperature_h[2],temperature_l[2];
//-----------液晶---------------------
//D_I=PF0,LCD_E1=PF1,LCD_E2=PF2,LCD_R/W=PF3
unsigned char LCD_BACK_FLAG; //反白标志=1:反白
unsigned char LCD_ASCII_FLAG; //8*8字符标志
unsigned char LCD_UNDER_LINE_FLAG; //下划线
unsigned char LCD_ROW; //当前光标字符行
unsigned char LCD_COL; //当前光标字符列
unsigned char LCD_X; //当前显示列(点)
unsigned char LCD_WIDTH;
//---------------------------------------------------------
// NAME: LCD_WR_L()
// ENTRY: b
// RETURN: void
// MODIFY: 2004.2.3
//--------------------------------------------------------
void LCD_WR_L(unsigned char b)//液晶数据发送子程序(左)
{
SREG&=~0X80;
PORTF&=~0X01;
PORTF|=0X01;
PORTF&=~0X08;
DDRA=0XFF;
PORTA=b;
PORTF|=(1<<2);
PORTF|=(1<<1);
PORTF&=~(1<<1);
SREG|=0X80;
}
//---------------------------------------------------------
// NAME: LCD_W_CTRL()
// ENTRY: b
// RETURN: void
// MODIFY: 2004.2.3
//--------------------------------------------------------
void LCD_W_CTRL(unsigned char b)//液晶控制码发送子程序
{
SREG&=~0X80;
PORTF&=~(1<<0); //D_I=0;
PORTF&=~(1<<3); //RW=0;
DDRA=0XFF; //P0=b;
NOP();
PORTA=b;
NOP();
PORTF&=~(1<<1); //CS1=0;
PORTF|=(1<<1); //CS1=1;
PORTF&=~(1<<1); //CS1=0;
PORTF&=~(1<<0); //D_I=0;
PORTF&=~(1<<3); //RW=0;
DDRA=0XFF; //P0=b;
NOP();
PORTA=b;
NOP();
PORTF&=~(1<<2); //CS2=0;
PORTF|=(1<<2); //CS2=1;
PORTF&=~(1<<2); //CS2=0;
SREG|=0X80;
}
//---------------------------------------------------------
// NAME: LCD_WR_R()
// ENTRY: b
// RETURN: void
// MODIFY: 2004.2.3
//--------------------------------------------------------
void LCD_WR_R(unsigned char b)//液晶数据发送子程序(左)
{
SREG&=~0X80;
DDRA=0XFF;
PORTF&=~(1<<0); //D_I=0;
PORTF|=(1<<0); //D_I=1;
PORTA=b; //P0=b;
NOP();
NOP();
NOP();
PORTF|=(1<<1); //CS1=1;
PORTF|=(1<<2); //CS2=1;
PORTF&=~(1<<2); //CS2=0;
SREG|=0X80;
}
//---------------------------------------------------------
// NAME: LCD_W_Y()
// ENTRY: Y
// RETURN: void
// MODIFY: 2004.2.3
//--------------------------------------------------------
void LCD_W_Y(unsigned char y) //RAM行设置
{
unsigned char a;
a=0xb8+y;
LCD_W_CTRL(a);
}
//---------------------------------------------------------
// NAME: LCD_W_X()
// ENTRY: X
// RETURN: void
// MODIFY: 2004.2.3
//--------------------------------------------------------
void LCD_W_X(unsigned char x) //RAM列设置
{
LCD_W_CTRL(x);
}
//---------------------------------------------------------
// NAME: LCD_WD16()
// ENTRY: *P,N,u_line
// RETURN: void
// MODIFY: 2004.2.3
//--------------------------------------------------------
void LCD_WD16( unsigned char *p,unsigned char n,unsigned char u_line) //写16点阵字模,
{
unsigned char x; //点
unsigned char d; //点
x=LCD_X;
if(x<LCD_HALF_X) //半屏列数
{
LCD_W_X(x % LCD_HALF_X); //RAM列设置
while((x<LCD_HALF_X)&&(n>0))
{
d=(*p++); //取字模
if(LCD_ASCII_FLAG)
d=(d>>4)|(*(p)<<4); //组合
if(u_line) d=d | 0x80;
if(LCD_BACK_FLAG) d = ~d; //反白标志
LCD_WR_L(d); //液晶数据发送子程序(左)
p++; n--; x++;
}
}
if(x<LCD_MAX_X) //每屏列数(122*32)
{
LCD_W_X(x % LCD_HALF_X); //RAM列设置
while((x<LCD_MAX_X)&&(n>0))
{
d=(*p++); //液晶数据发送子程序(左)
if(LCD_ASCII_FLAG)
d=(d>>4)|(*(p)<<4); //组合
if(u_line) d=d | 0x80;
if(LCD_BACK_FLAG) d = ~d; //反白标志
LCD_WR_R(d); //液晶数据发送子程序(左)
p++; n--; x++;
}
}
}
//---------------------------------------------------------
// NAME: SHOW_LOGO()
// ENTRY: S
// RETURN: void
// FUNCTION:: 显示LOGO画面
// MODIFY: 2004.2.3
//--------------------------------------------------------
void SHOW_LOGO(unsigned char s) //显示LOGO画面
{
unsigned char y,z,a;
unsigned int x;
LCD_W_X(0);
LCD_W_Y(0);
x=0;
for(a=0;a<=122;a++)
{
for(y=4;y>=1;y--)
{
LCD_W_Y(y-1);
if(a<61)
{
LCD_W_X(a);
z=FONT_LOGO[s][x];
LCD_WR_L(z);
}
else
{
LCD_W_X(a%62);
z=FONT_LOGO[s][x];
LCD_WR_R(z);
}
x+=1;
}
}
}
//---------------------------------------------------------
// NAME: SHOW_LOGO()
// ENTRY: void
// RETURN: void
// FUNCTION:LCD清屏子程序
// MODIFY: 2004.2.3
//--------------------------------------------------------
void LCD_CLR(void)
{
unsigned char x,y;
LCD_W_CTRL(0xc0);
for(y=0;y<=8;y++)
{
LCD_W_CTRL(y+0xb8);
#ifdef LCD_4LINE
LCD_W_CTRL(0x40);
#else
LCD_W_CTRL(0);
#endif
// LCD_W_CTRL(0x40);
for(x=0;x<=64;x++)
{
LCD_WR_R(0x00);
LCD_WR_L(0x00);
}
}
}
//---------------------------------------------------------
// NAME: LCD_CURSOR()
// ENTRY: ROW,COL
// RETURN: void
// FUNCTION:LCD定光标
// MODIFY: 2004.2.3
//--------------------------------------------------------
void LCD_CURSOR(unsigned char ROW,unsigned char COL)
{
LCD_ROW=ROW;
LCD_COL=COL;
LCD_X=COL*LCD_WIDTH; //字符宽度(点)
}
//---------------------------------------------------------
// NAME: Disp_char_16_8()
// ENTRY: page,colum
// RETURN: void
// FUNCTION:Display 16*8 char
// MODIFY: 2004.2.3
//--------------------------------------------------------
void Disp_char_16_8(unsigned char page,unsigned char colum,unsigned char k, unsigned char ch) //显示16*8点阵字体
{ //ch=1, 反白
unsigned char i;
if((page > 3)||(colum > 121)) return;
LCD_W_CTRL(0xC0);
if( colum<61 )
{
LCD_W_CTRL(page|0xb8); //Page address
LCD_W_CTRL(colum&0x7f); //colum address
for(i=1;i<=8;i++)
{
if(ch)
LCD_WR_L(~FONT_CHAR[k*16+2*i-1]);
else
LCD_WR_L(FONT_CHAR[k*16+2*i-1]);
}
LCD_W_CTRL((page+1)|0xb8); //Page address
LCD_W_CTRL(colum&0x7f); //colum address
if(ch)
LCD_WR_L(0xff);
else
LCD_WR_L(0);
LCD_W_CTRL((colum+1)&0x7f); //colum address
for(i=1;i<=7;i++)
{
if(ch)
LCD_WR_L(~FONT_CHAR[k*16+2*i]);
else
LCD_WR_L(FONT_CHAR[k*16+2*i]);
}
}
else
{
LCD_W_CTRL(page|0xb8);
LCD_W_CTRL((colum-61)&0x7f);
for(i=1;i<=8;i++)
{
if(ch)
LCD_WR_R(~FONT_CHAR[k*16+2*i-1]);
else
LCD_WR_R(FONT_CHAR[k*16+2*i-1]);
}
LCD_W_CTRL((page+1)|0xb8); //Page address
LCD_W_CTRL((colum-61)&0x7f); //colum address
if(ch)
LCD_WR_R(0xff);
else
LCD_WR_R(0);
for(i=1;i<=7;i++)
{
if(ch)
LCD_WR_R(~FONT_CHAR[k*16+2*i]);
else
LCD_WR_R(FONT_CHAR[k*16+2*i]);
}
}
}
//---------------------------------------------------------
// NAME: SHOW_ALL_HEAD()
// ENTRY: n
// RETURN: void
// FUNCTION:display the head
// MODIFY: 2004.2.3
//---------------------------------------------------------
void SHOW_ALL_HEAD(unsigned char n)
{
unsigned char y,z,a;
unsigned int x=0;
LCD_W_X(0);
LCD_W_Y(0);
for(a=0;a<=121;a++)
{
for(y=2;y>=1;y--)
{
LCD_W_Y(y-1);
if(a<61)
{
LCD_W_X(a);
z=FONT_HEAD[n][x];
LCD_WR_L(z);
}
else
{
LCD_W_X(a%62);
z=FONT_HEAD[n][x];
LCD_WR_R(z);
}
x+=1;
}
}
}
//---------------------------------------------------------
// NAME: LCD_INIT()
// ENTRY: void
// RETURN: void
// FUNCTION:液晶初始化
// MODIFY: 2004.2.3
//---------------------------------------------------------
void LCD_INIT(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -