源程序
#include "pic1687x.h"
#include "delays.h"
#pragma romdata table=0x1000
const char table[240]={0x08,0xf8,0x08,0x08,0x08,0x08,0xf0,0x00,
0x20,0x3f,0x21,0x01,0x01,0x01,0x00,0x00,//"p",0~15
0x00,0x08,0x08,0xf8,0x08,0x08,0x00,0x00,
0x00,0x20,0x20,0x3f,0x20,0x20,0x00,0x00,//"i",16~31
0xc0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,
0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//"c",32~47
0x00,0x10,0x10,0xf8,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3f,0x20,0x20,0x00,0x00,//"1",48~63
0x00,0x70,0x88,0x08,0x00,0x1c,0x22,0x21,//"8"左,64~71
0x08,0x88,0x70,0x00,0x21,0x22,0x1c,0x00,//"8"右,72~79
0x08,0xf8,0x88,0x88,0xe8,0x08,0x10,0x00,
0x20,0x3f,0x20,0x00,0x03,0x00,0x00,0x00,//"f",80~95
0x00,0x00,0xc0,0x20,0x10,0xf8,0x00,0x00,
0x00,0x07,0x04,0x24,0x24,0x3f,0x24,0x00,//"4",96~111
0x00,0xf8,0x08,0x88,0x88,0x08,0x08,0x00,
0x00,0x19,0x21,0x20,0x20,0x11,0x0e,0x00,//"5",112~127
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
0x00,0x1c,0x22,0x21,0x21,0x22,0x1c,0x00,//"8",128~143
0x00,0x10,0x0c,0x04,0x4c,0xb4,0x94,0x05,
0xf6,0x04,0x04,0x04,0x14,0x0c,0x04,0x00,
0x00,0x82,0x82,0x42,0x42,0x23,0x12,0x0a,
0x07,0x0a,0x12,0xe2,0x42,0x02,0x02,0x00,//"实",144~175
0x02,0xfa,0x82,0x82,0xfe,0x80,0x40,0x60,
0x08,0x04,0x24,0x40,0x3f,0x22,0x2c,0x21,//"验"左,176~191
0x58,0x46,0x48,0x50,0x20,0x20,0x20,0x00,
0x21,0x2e,0x20,0x30,0x2c,0x23,0x20,0x00,//"验"右,192~207
0x10,0x10,0xd0,0xff,0x50,0x90,0x00,0xfe,
0x62,0xa2,0x22,0x21,0xa1,0x61,0x00,0x00,
0x04,0x03,0x00,0x7f,0x00,0x11,0x0e,0x41,
0x20,0x11,0x0a,0x0e,0x31,0x60,0x20,0x00};//"板",208~239
void initial()
{
intcon=0x00;
wdtdis;
adcon1=0x87; //设置所有与模拟输入共用的引脚为i/o方式
trise=trisc&0xf0; //设置rd0,rd1,rd2,rd3为输出
trisa=trisa&0xfd; //设置ra1为输出
}
//读液晶显示器状态子程序,行参e代表液晶的边
void lcdsta1(int e)
//int e;
{
int e1flag;
trisc=0xff; //设置c口为输入
while(1)
{
if(e==1)
{portd=portd|0xf9; //设置rd2/csa=0,rd3/csb=1,rd0/rw=1,rd1/di=0
}
else
{portd=portd&0xfd; //设置rd2/csa=1,rd3/csb=0,rd0/rw=1,rd1/di=0
}
porta=porta|0x02; //ra1/e=1
e1flag=portc&0x80;
porta=porta&0xfd; //ra1/e=0
if(e1flag==0x0000)break;
}
}
//对液晶显示器发指令子程序,行参e代表处理的液晶的边
void trans1(int trans,int e) //int trans,e;
{
lcdsta1(e);
trisc=0x00; //rc为输出
if(e==1) //设置rd2/csa=0,rd3/csb=1,rd0/rw=0,rd1/di=0
{portd=portd|0xf8;
}
else //设置rd2/csa=1,rd3/csb=0,rd0/rw=0,rd1/di=0
{portd=portd&0xfc;
}
portc=trans;
porta=porta|0x02; //ra1/e=1
porta=porta&0xfd; //ra1/e=0
}
//对液晶显示器写数据子程序
void write1(char write,int clmadd,int e)
//int write,clmadd,e;
{
trans1(clmadd,e); //设置列地址
lcdsta1(e); //查询液晶是否为空闲
trisc=0x00; //rc为输出
if(e==1) //设置rd2/csa=0,rd3/csb=1,rd0/rw=0,rd1/di=1
{portd=portd|0xfa;
}
else //设置rd2/csa=1,rd3/csb=0,rd0/rw=0,rd1/di=1
{portd=portd&0xfe;
}
portc=write;
porta=porta|0x02; //ra1/e=1
porta=porta&0xfd; //ra1/e=0
}
//开e边显示子程序
void disp1(int e)
//int e;
{
int e1flag;
while(1)
{
trans1(0x03f,e); //送出控制命令
lcdsta1(e); //判断液晶是否为空闲状态
trisc=0xff; //设置rc为输入
if(e==1) //设置re2/csa=0,ra3/csb=1,re0/rw=1,re1/di=0
{portd=portd|0xf9;
}
else //设置re2/csa=1,ra3/csb=0,re0/rw=1,re1/di=0
{portd=portd&0xfd;
}
porta=porta|0x02; //ra1/e=1
e1flag=portc&0x20;
porta=porta&0xfd; //ra1/e=0
if(e1flag==0x00)break; //如果液晶被打开,则退出循环,否则继续打开
}
}
//e边清屏子程序
void clear1(int e)
//int e;
{
int pageadd,pagenum,clmsum;
for(pagenum=0x08,pageadd=0x0b8;pagenum>0;pagenum--,pageadd++)
{
trans1(pageadd,e); //设置相应的页地址
for(clmsum=0x40;clmsum<=0x7f;clmsum++)
{
lcdsta1(e); //判断液晶空闲状态
write1(0x00,clmsum,e); //送0清屏
}
}
}
//关e边显示子程序
void disoff1(int e)
//int e;
{
int e1flag;
while(1)
{
trans1(0x3e,e); //发送控制命令
lcdsta1(e); //判断液晶是否为空闲状态
trisc=0xff; //设置rd为输入
if(e==1) //设置re2/csa=0,ra3/csb=1,re0/rw=1,re1/di=0
{portd=portd|0xf9;
}
else //设置re2/csa=1,ra3/csb=0,re0/rw=1,re1/di=0
{portd=portd&0xfd;
}
porta=porta|0x02; //ra1/e=1
e1flag=portd&0x20;
porta=porta&0xfd; //ra1/e=0
if(e1flag==0x20)break; //如液晶关闭,则推出循环,否则继续关闭
}
}
//lcd的e边初始化子程序
void lcd1init(int e)
{
disoff1(e); //关e区显示
/*trans1(0x0a4,e);
trans1(0x0a9,e);
trans1(0x0e2,e);
trans1(0x0a0,e);*/
clear1(e); //清屏
lcdsta1(e); //判断液晶空闲状态
disp1(e); //开显示
}
//显示"pic18"
display1(int e,int pagadd,int clmadd)
{
int k,m,n=0;
char temp;
trans1(0x0c0,e);
trans1(pagadd,e);
for(m=0;m<4;m++)
{
for(k=0;k<8;k++,clmadd++)
{
temp=table[k+n];
write1(temp,clmadd,e);
}
clmadd=clmadd-8;
pagadd=pagadd+1;
trans1(pagadd,e);
for(;k<16;k++,clmadd++)
{
temp=table[k+n];
write1(temp,clmadd,e);
}
trans1(0x0c0,e);
pagadd=pagadd-1;
trans1(pagadd,e);
n=n+16;
}
for(k=0;k<4;k++,clmadd++)
{
temp=table[k+64];
write1(temp,clmadd,e);
}
clmadd=clmadd-4;
pagadd=pagadd+1;
trans1(pagadd,e);
for(;k<8;k++,clmadd++)
{
temp=table[k+64];
write1(temp,clmadd,e);
}
}
//显示"8f458"
display2(int e,int pagadd,int clmadd)
{
int k,m,n=80;
char temp;
trans1(0x0c0,e);
trans1(pagadd,e);
for(k=0;k<4;k++,clmadd++)
{
temp=table[k+72];
write1(temp,clmadd,e);
}
clmadd=clmadd-4;
pagadd=pagadd+1;
trans1(pagadd,e);
for(;k<8;k++,clmadd++)
{
temp=table[k+72];
write1(temp,clmadd,e);
}
for(m=0;m<4;m++)
{
trans1(0x0c0,e);
pagadd=pagadd-1;
trans1(pagadd,e);
for(k=0;k<8;k++,clmadd++)
{
temp=table[k+n];
write1(temp,clmadd,e);
}
clmadd=clmadd-8;
pagadd=pagadd+1;
trans1(pagadd,e);
for(;k<16;k++,clmadd++)
{
temp=table[k+n];
write1(temp,clmadd,e);
}
n=n+16;
}
}
//显示"实验"
display3(int e,int pagadd,int clmadd)
{
int k;
char temp;
trans1(0x0c0,e); //从0行开始显示
trans1(pagadd,e);
for(k=0;k<16;k++,clmadd++)
{
temp=table[k+144];
write1(temp,clmadd,e);
}
clmadd=clmadd-16;
pagadd=pagadd+1;
trans1(pagadd,e);
for(;k<32;k++,clmadd++)
{
temp=table[k+144];
write1(temp,clmadd,e);
}
trans1(0x0c0,e);
pagadd=pagadd-1;
trans1(pagadd,e);
for(k=0;k<8;k++,clmadd++)
{
temp=table[k+176];
write1(temp,clmadd,e);
}
clmadd=clmadd-8;
pagadd=pagadd+1;
trans1(pagadd,e);
for(;k<16;k++,clmadd++)
{
temp=table[k+176];
write1(temp,clmadd,e);
}
}
//显示"验板"
display4(int e,int pagadd,int clmadd)
{
int k;
char temp;
trans1(0x0c0,e); //从0行开始显示
trans1(pagadd,e);
for(k=0;k<8;k++,clmadd++)
{
temp=table[k+192];
write1(temp,clmadd,e);
}
clmadd=clmadd-8;
pagadd=pagadd+1;
trans1(pagadd,e);
for(;k<16;k++,clmadd++)
{
temp=table[k+192];
write1(temp,clmadd,e);
}
trans1(0x0c0,e);
pagadd=pagadd-1;
trans1(pagadd,e);
for(k=0;k<16;k++,clmadd++)
{
temp=table[k+208];
write1(temp,clmadd,e);
}
clmadd=clmadd-16;
pagadd=pagadd+1;
trans1(pagadd,e);
for(;k<32;k++,clmadd++)
{
temp=table[k+208];
write1(temp,clmadd,e);
}
}
//主函数
main()
{
int j;
for(j=0;j<5;j++)
{
initial();
lcd1init(1);
lcd1init(2);
display1(1,0xbc-j,0x5c);
display2(2,0xbc-j,0x40);
display3(1,0xbe-j,0x68);
display4(2,0xbe-j,0x40);
delayms(255); /*暂停 (255 * 10,000 cycles) */
}
}