📄 lcd_1621.c
字号:
#include<head.h>
#include "LCD_1621.h"
#define lcd_writerising() LWR=LOW; LWR=HIGH;
void lcd_command(bit temp);
void lcd_writecommand(unsigned char commandcode);
void lcd_writedata(Uchar seg,Uchar form,bit mode);
/**************************************************************************
* 字模表格定义
* code Uchar form_buf_tab:LCDBUF0-LCDBUF5
* code Uchar form_lcd_tab:LCDF0-LCDF2
**************************************************************************/
Uchar lcd_buf[3]={0,0,0};
Uchar lcd_nbuf[6]={0,0,0,0,0,0};
code uchar lcd_j[11]={0x00,0x08,0x0c,0x0e,0x0f,0x8f,0xcf,0xef,0xff,0xff,0xff};
code uchar lcd_num[]={CH0,CH1,CH2,CH3,CH4, //0.1.2.3.4 4
CH5,CH6,CH7,CH8,CH9, //5.6.7.8.9 9
CHA,CHB,CHC, // A.B.C C
CHD,CHE,CHF,CHG,CHH, //D,E,F,G,H 11
CHI,CHJ,CHK,CHL,CHM, //I,J,K,L,M 16
CHN,CHO,CHP,CHQ,CHR, //N,O,P,Q,R 1b
CHS,CHT,CHU,CHV,CHW, //S,T,U,V,W 0x20
CHX,CHY,CHZ,CHPLUS,CHBLANK, //X,Y,Z,-,0x26
};
code uchar lcd_char[][2]={
{0x85,0x61},{0x00,0x60},{0xa4,0x25},{0xa0,0x65},//0.1.2.3
{0x21,0x64},{0xa1,0x45},{0xa5,0x45},{0x00,0x61},//4.5.6.7
{0xa5,0x65},{0xa1,0x65},//8.9.
{0x08,0x66},{0xa5,0x47},{0x85,0x01},{0xa4,0x64},//A.B.C.D
{0xa5,0x05},{0x25,0x05},{0x85,0x45},{0x25,0x64},//E.F.G.H
{0x50,0x00},{0x80,0x60},{0x25,0x0a},{0x85,0x00},//I.J.K.L //{0x50,0x0a}
{0x07,0x62},{0x07,0x68},{0x85,0x61},{0x25,0x25},//M.N.O.P
{0x87,0x69},{0x25,0x0b},{0xa1,0x45},{0x50,0x01},//Q.R.S.T
{0x85,0x60},{0x0d,0x02},{0x0d,0x68},{0x05,0x0a},//U.V.W.X
{0x42,0x02},{0x88,0x03}, //Y.Z. . 26个
{0x00,0x00},{0xa5,0x44},{0xa4,0x04},{0xa4,0x64},//a,b,c,d
{0x00,0x00},{0x00,0x00},{0xa1,0x65},{0x00,0x00},//e,f,g,h
{0x00,0x00},{0x00,0x00},{0x00,0x00},{0x85,0x00},//i,j,k,l
{0x00,0x00},{0x00,0x00},{0xa4,0x44},{0x00,0x00},//m,n,o,p
{0x00,0x00},{0x24,0x04},{0x00,0x00},{0xa5,0x04},//q,r,s,t
{0x00,0x00},{0x00,0x00},{0x0c,0x48},{0x00,0x00},//u,v,w,x
{0x00,0x00},{0xa8,0x07},{0x08,0x02},{0x00,0x00}//y,z
};
code unsigned char voltt[]={0x20,0x21,0x23,0x27,0x2f,0x3f};
/**************************************************************************
* 函数原型: void lcd_setback(BOOL back)
* 功 能: 打开或关闭背光灯
**************************************************************************/
void lcd_setback(BOOL back)
{
LBL=back;
}
#if 0
void lcd_set(bit onoff)
{
lcd_writecommand(onoff?0x03:0x2);
}
#endif
/**************************************************************************
* 函数原型: void beep_set(BOOL beep)
* 功 能: 打开或关闭蜂鸣器
**************************************************************************/
void beep_set(BOOL beep)
{
lcd_writecommand(beep?0x9:0x8);
}
#if 0
/**************************************************************************
* 函数原型: BOOL lcd_writevolt(char volt)
* 功 能: 写入电压显示
* 入口:需写入的数字大小
* 出口:返回是否写入成功
**************************************************************************/
BOOL lcd_writevolt(char volt)
{
if(volt<0)
{
lcd_writedata(30,0,1);
}
else
{
volt%=6;
lcd_writedata(30,voltt[volt],1);
}
return 1;
}
#endif
/**************************************************************************
* 函数原型: void lcd_flagset(Uchar flagbit,BOOL flag)
* 功 能: 设置符号位
**************************************************************************/
void Dis_SetFlag(Uchar flagbit,BOOL flag)
{
switch(flagbit)
{
case DIS_MINUS:
if(flag)lcd_buf[2]|=0x20;
else lcd_buf[2]&=0xdf;
break;
case DIS_ZERO:
if(flag)lcd_buf[2]|=0x10;
else lcd_buf[2]&=0xef;
break;
case DIS_STA:
if(flag)lcd_buf[2]|=0x40;
else lcd_buf[2]&=0xbf;
break;
case DIS_TARE:
if(flag)lcd_buf[1]|=0x40;
else lcd_buf[1]&=0xbf;
break;
case DIS_COLON1:
if(flag)lcd_buf[1]|=0x02;
else lcd_buf[1]&=0xfd;
break;
case DIS_COLON2:
if(flag)lcd_buf[1]|=0x04;
else lcd_buf[1]&=0xfb;
break;
case DIS_HOLD:
if(flag)lcd_buf[1]|=0x20;
else lcd_buf[1]&=0xdf;
break;
}
lcd_writedata(18,lcd_buf[1],0);
lcd_writedata(16,lcd_buf[1]>>4,0);
lcd_writedata(17,lcd_buf[2]>>4,0);
lcd_writedata(29,lcd_buf[2],0);
}
/**************************************************************************
* 函数原型: BOOL lcd_all()
* 功 能:
* 入口:
* 出口:返回是否写入成功
**************************************************************************/
BOOL lcd_all()
{
char i=0;
for(i=0;i<32;i++)
{
lcd_writedata(i,0xff,0);
}
return 1;
}
/**************************************************************************
* 函数原型: BOOL lcd_clr()
* 功 能:
* 入口:
* 出口:返回是否写入成功
**************************************************************************/
BOOL lcd_clr()
{
char i=0;
for(i=0;i<32;i++)
{
lcd_writedata(i,0x0,0);
}
lcd_buf[0]=0;
lcd_buf[1]=0;
lcd_buf[2]=0;
return 1;
}
/**************************************************************************
* 函数原型: BOOL lcd_writej(char j)
* 功 能: 写入比例尺
* 入口:需写入的数字大小
* 出口:返回是否写入成功
**************************************************************************/
BOOL lcd_writej(char j)
{
lcd_buf[0]=lcd_j[j];
lcd_buf[1]|=0x08;
if(j>8)lcd_buf[1]|=0x01;
else lcd_buf[1]&=0xfe;
if(j>9)lcd_buf[1]|=0x10;
else lcd_buf[1]&=0xef;
lcd_writedata(19,lcd_buf[0],1);
lcd_writedata(18,lcd_buf[1],0);
lcd_writedata(16,lcd_buf[1]>>4,0);
return 1;
}
/**************************************************************************
* 函数原型: BOOL lcd_writenum(char num[7])
* 功 能: 在数字区写入数据
* 入口:需写入的数字或字母的数组
* 出口:返回是否写入成功
**************************************************************************/
unsigned char lcd_writenum(unsigned char *num)
{
uchar i=0,j=0;
Uchar show_temp=0;
for(i=0;i<6;i++)
{
show_temp=num[j];
if(show_temp>='a') show_temp-=('a'-10);
else if(show_temp>='A') show_temp-=('A'-10);
else if(show_temp>='0') show_temp-='0';
else if(show_temp=='-') show_temp=36;//'-'
else if(show_temp>9)show_temp=0x25;//blank
if(num[++j]=='.')
{
j++;
show_temp|=0x80;
}
lcd_nbuf[i]=show_temp;
}
lcd_outnum(0);
return j;
}
void lcd_outnum(unsigned char flashbit)
{
uchar i=0;
Uchar show_temp=0;
for(i=0;i<6;i++)
{
show_temp=lcd_num[0x7f&lcd_nbuf[i]];
if(0x80&lcd_nbuf[i])show_temp|=0x80;
// if(((6-i)==flashbit)||flashbit>6)show_temp&=0x80;
lcd_writedata(i*2,show_temp,1);
}
}
/**************************************************************************
* 函数原型: BOOL lcd_writechar(char wchar[3])
* 功 能: 在字符写入数据
* 入口:需写入的数字或字母的数组
* 出口:返回是否写入成功
**************************************************************************/
BOOL lcd_writechar(char *wchar)
{
uchar i,j=0,k=0;
Uchar show_temp=0;
for(i=0;i<3;i++)
{
show_temp=wchar[j];
if(show_temp>='a')
show_temp-='a'-36;
else if(show_temp>='A')
show_temp-='A'-10;
else if(show_temp>='0') show_temp-='0';
else show_temp=63;
k=i*4+12+(i>0?5:0);
lcd_writedata(k,lcd_char[show_temp][0],1);
show_temp=lcd_char[show_temp][1];
if(wchar[++j]=='.')
{
j++;
show_temp|=0x80;
}
lcd_writedata(k+2,show_temp,1);
}
return 1;
}
/**************************************************************************
* 函数原型: void command(bit temp)
* 功 能: 写命令或写数据
**************************************************************************/
void lcd_command(bit temp)
{
LCS=LOW;
LDATA=HIGH; //端口置高 1
lcd_writerising(); //写入
LDATA=LOW; // 0
lcd_writerising();
LDATA=temp; // 0/1 写命令或数据
lcd_writerising();
}
/**************************************************************************
* 函数原型:void lcd_datadriver(Uchar seg,Uchar form)
* 功 能:写行地址及数据
**************************************************************************/
void lcd_writedata(Uchar seg,Uchar form,bit mode)
{
Uchar j;
EA=0;
lcd_command(HIGH); //101XXXXXXX write
for(j=0;j<6;j++)
{
LDATA=(bit)(seg&0x20); //地址6位
seg<<=1;
lcd_writerising();
}
for(j=0;j<(mode?0x8:0x4);j++)
{
LDATA=(bit)(form&0x01); //数据
form>>=1;
lcd_writerising();
}
LDATA=HIGH;
LCS=HIGH;
EA=1;
}
/**************************************************************************
* 函数原型:void write_lcdcommand(Uchar commandcode);
* 功 能:写一字节命令到LCD。
**************************************************************************/
void lcd_writecommand(Uchar commandcode)
{
Uchar i;
EA=0;
lcd_command(LOW); //100XXXXXXX 送命令
for(i=0;i<8;i++)
{
LDATA=(bit)(commandcode&0x80);
commandcode=commandcode<<1;
lcd_writerising();
}
lcd_writerising(); //送无效数据位
LDATA=HIGH; //第九位数据位
LCS=HIGH; //CS置高
EA=1;
}
/**************************************************************************
* 函数原型: void lcd_writerising(void);
* 功 能:产生写信号上升沿。
**************************************************************************/
/*void lcd_writerising(void)
{
LWR=LOW;
LWR=HIGH;
} */
/**************************************************************************
* 函数原型: void init_lcd(void);
* 功 能:初始化LCD。
**************************************************************************/
void lcd_init(void) //初始化送命令
{
Uint i=0;
LCS=HIGH;
LDATA=HIGH;
LWR=HIGH;
lcd_writecommand(0x01);
lcd_writecommand(0x02);
lcd_writecommand(0x18);
lcd_writecommand(0x29);
lcd_writecommand(0x60);
lcd_writecommand(0xe3);
lcd_writecommand(0x03);
lcd_writecommand(0x08);
lcd_clr();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -