📄 yejing.c
字号:
PORTB=PORTB&0XFE; /* RB0/E=0,数据被锁存(写)入KS0108B及其兼容控制驱动器 */
if(E1FLAG==0X00)break; /* 如果RD5=0,则表示液晶显示被打开,退出循环,否则继续打开 */
}
}
/* ****************************************************************
** 函 数 名: CLEAR1(int E)
** 功能描述: E边清屏子程序,将液晶显示屏清屏
*************************************************************** */
void CLEAR1(int E)
{
int PAGEADD,PAGENUM,CLMSUM;
for(PAGENUM=0X08,PAGEADD=0X0B8;PAGENUM>0;PAGENUM--,PAGEADD++)
{ /* PAGEADD含页设置指令,中bit7:bit3为10111表示页设置指令 */
/* bit2:bit000-111为页号的取值范围 */
TRANS1(PAGEADD,E); /* 设置相应的页地址 */
for(CLMSUM=0x40;CLMSUM<=0X7F;CLMSUM++) /* CLMSUM含列地址设置指令,bit7:bit6为01 */
/* 表示设置列地址,bit5:bit0从0-63为列地址得取值范围 */
{
LCDSTA1(E); /* 判断液晶空闲状态 */
WRITE1(0X00,CLMSUM,E); /* 送0清屏 */
}
}
}
/* ****************************************************************
** 函 数 名: DISOFF1(int E)
** 功能描述: 关E边显示子程序,用于检查液晶显示是否被关闭
**************************************************************** */
void DISOFF1(int E)
{
int E1FLAG;
while(1)
{
TRANS1(0X3E,E); /* 发送控制命令,关闭显示 */
LCDSTA1(E); /* 判断液晶是否为空闲状态 */
TRISD=0XFF; /* 设置RD为输入 */
if(E==1) /* 设置RE2/CSA=0,RA3/CSB=1,即片选1。 */
{
PORTA=PORTA|0X08;
PORTE=(PORTE|0X01)&0xF9;/* RE0/RW=1,RE1/DI=0,用来查询液晶显示模块内部控制器的状态*/
}
else /* 设置RE2/CSA=1,RA3/CSB=0,即片选2。*/
{
PORTA=PORTA&0xF7;
PORTE=(PORTE|0X05)&0xFD;/* RE0/RW=1,RE1/DI=0,用来查询液晶显示模块内部控制器的状态*/
}
PORTB=PORTB|0X01; /* RB0/E=1,让数据被读出 */
E1FLAG=PORTD&0X20; /* 取RD5的值 */
PORTB=PORTB&0XFE; /* RB0/E=0,数据被锁存(写)入KS0108B及其兼容控制驱动器 */
if(E1FLAG==0X20)break; /* 如果RD5=0,则表示液晶显示被关闭,则退出循环,否则继续关闭 */
}
}
/* ****************************************************************
** 函 数 名: LCD1INIT(int E)
** 功能描述: LCD的E边初始化子程序
*************************************************************** */
void LCD1INIT(int E)
{
DISOFF1(E); /* 关E边显示 */
CLEAR1(E); /* 清屏 */
DISP1(E); /* 开E边显示 */
}
/* ****************************************************************
** 函 数 名: DISPLAY1(int E,int PAGADD,int CLMADD)
** 功能描述: 汉字显示子程序,入口为存储汉字库的数组的首地址,页地址和起始列地址和选中的E边数
*************************************************************** */
DISPLAY1(int E,int PAGADD,int CLMADD)
{
int K;
char TEMP;
TRANS1(0X0C0,E); /* 从0行开始显示 */
TRANS1(PAGADD,E); /* 从PAGADD页开始 */
for(K=0;K<16;K++,CLMADD++,ARRAY++) /* 汉字占16列 */
{
TEMP=*ARRAY;
WRITE1(TEMP,CLMADD,E); /* TEMP写入数据线的值,CLMAA设置列地址值,E选择液晶块 */
}
CLMADD=CLMADD-16; /* 从原来的列地址开始 */
PAGADD=PAGADD+1; /* 进入下一页 */
TRANS1(PAGADD,E);
for(;K<32;K++,CLMADD++,ARRAY++)
{
TEMP=*ARRAY;
WRITE1(TEMP,CLMADD,E); /* TEMP写入数据线的值,CLMAA设置列地址abcdefab值,E选择液晶块 */
}
}
/* ****************************************************************
** 函 数 名: DISPLAY2(int E,int PAGADD,int CLMADD)
** 功能描述: 数字和字母显示子程序,入口为存储字母或数字的数组的首地址,页地址,起始列地址选中的E边数
或显示汉字的“左半”或“右半”
*************************************************************** */
DISPLAY2(int E,int PAGADD,int CLMADD)
{
int K;
char TEMP;
TRANS1(0X0C0,E); /* 从0行开始显示 */
TRANS1(PAGADD,E); /* 从PAGADD页开始 */
for(K=0;K<8;K++,CLMADD++,ARRAY++) /* 数字和字母占8列 */
{
TEMP=*ARRAY;
WRITE1(TEMP,CLMADD,E); /* TEMP写入数据线的值,CLMAA设置列地址值,E选择液晶块 */
}
CLMADD=CLMADD-8; /* 从原来的列地址开始 */
PAGADD=PAGADD+1; /* 进入下一页 */
TRANS1(PAGADD,E);
for(;K<16;K++,CLMADD++,ARRAY++)
{
TEMP=*ARRAY;
WRITE1(TEMP,CLMADD,E); /* TEMP写入数据线的值,CLMAA设置列地址值,E选择液晶块 */
}
}
/* ****************************************************************
** 函 数 名: DISPLAY3(int E,int PAGADD,int CLMADD)
** 功能描述: 显示数字和字母的“左半”或“右半”,在这个程序中这一部分并没有
用到但在其他的情况中可能用到
*************************************************************** */
DISPLAY3(int E,int PAGADD,int CLMADD)
{
int K;
char TEMP;
TRANS1(0X0C0,E); /* 从0行开始显示 */
TRANS1(PAGADD,E); /* 从PAGADD页开始 */
for(K=0;K<4;K++,CLMADD++,ARRAY++) /* 半个数字和字母占4列 */
{
TEMP=*ARRAY;
WRITE1(TEMP,CLMADD,E); /* TEMP写入数据线的值,CLMAA设置列地址值,E选择液晶块 */
}
CLMADD=CLMADD-4; /* 从原来的列地址开始 */
PAGADD=PAGADD+1; /* 进入下一页 */
TRANS1(PAGADD,E);
for(;K<8;K++,CLMADD++,ARRAY++)
{
TEMP=*ARRAY;
WRITE1(TEMP,CLMADD,E); /* TEMP写入数据线的值,CLMAA设置列地址值,E选择液晶块 */
}
}
/* ****************************************************************
** 函 数 名: xianshi()
** 功能描述: 液晶显示汉字的程序,电压:
*************************************************************** */
void xianshi()
{
unsigned char data;
int j;
for(i=0;i<32;i++)
ppp[i]=dian[i]; //显示汉字“电”
ARRAY=&ppp[0];
DISPLAY1(1,0x0BC,0x58); //第一块液晶,第四页,第24列
for(i=0;i<32;i++)
ppp[i]=ya[i]; //显示汉字“压”
ARRAY=&ppp[0];
DISPLAY1(1,0x0BC,0x68); //第一块液晶,第四页,第40列
for(i=0;i<16;i++)
ppp[i]=mao[i]; //显示“冒号”
ARRAY=&ppp[0];
DISPLAY2(1,0x0BC,0x78); //第一块液晶,第四页,第56列
/* *********显示AD转换结果****************** */
data=Adresult&0x0f;
data=data*16;
for(j=0,i=data;i<16+data;i++,j++) /* 显示小数位 */
ppp[j]=shu[i];
ARRAY=&ppp[0];
DISPLAY2(2,0X0BC,0x50);
for(i=0;i<16;i++) /* 显示小数点 */
ppp[i]=d[i];
ARRAY=&ppp[0];
DISPLAY2(2,0X0BC,0x48);
data=(Adresult&0xf0)>>4;
data=data*16;
for(j=0,i=data;i<16+data;i++,j++) /* 显示个位数 */
ppp[j]=shu[i];
ARRAY=&ppp[0];
DISPLAY2(2,0X0BC,0x40);
}
/* **************** 主函数 ***************************** */
main()
{
YJ_initial(); /* 液晶显示初始化 */
LCD1INIT(1); /* LCD的1边初始化 */
LCD1INIT(2); /* LCD的2边初始化 */
AD_Initial(); /* A/D转化初始化 */
INTCON=INTCON|0xc0; /* 开总中断、开外围接口中断 */
while(1)
{
xianshi();
if(AD_Flag==1) /* AD采样完成 */
Deal_AD(); /* 处理AD数据 */
DELAY(); /* 间隔一定时间启动AD采样,间隔时间是不使AD采样过于频繁 */
ADCON0=ADCON0|0x04; /* 将ADCON0的bit2,设置为1,即启动A/D转换 */
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -