📄 f_calluate.c
字号:
#include <pic18fxx8.h>
#include <stdio.h>
const char table[240]={
0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,
0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,
0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,
0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
0x00,0x70,0x88,0x08,0x00,0x1C,0x22,0x21,
0x08,0x88,0x70,0x00,0x21,0x22,0x1C,0x00,
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,
0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,
0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
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,
0x02,0xFA,0x82,0x82,0xFE,0x80,0x40,0x60,
0x08,0x04,0x24,0x40,0x3F,0x22,0x2C,0x21,
0x58,0x46,0x48,0x50,0x20,0x20,0x20,0x00,
0x21,0x2E,0x20,0x30,0x2C,0x23,0x20,0x00,
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};
void initial()
{
INTCON=0X00;
WDTCON=0;
ADCON1=0X87; //设置所有与模拟输入共用的引脚为I/O方式
TRISE=TRISE&0XF8; //设置RE0,RE1,RE2为输出
TRISB=TRISB&0XFE; //设置RB0为输出
TRISA=TRISA&0XF7; //设置RA3为输出
}
//读液晶显示器状态子程序,行参E代表液晶的边
void LCDSTA1(int E)
//int E;
{
int E1FLAG;
TRISD=0XFF; //设置D口为输入
while(1)
{
if(E==1)
{PORTA=PORTA|0X08; //设置RE2/CSA=0,RA3/CSB=1,RE0/RW=1,RE1/DI=0
PORTE=(PORTE|0X01)&0XF9;}
else
{PORTA=PORTA&0XF7; //设置RE2/CSA=1,RA3/CSB=0,RE0/RW=1,RE1/DI=0
PORTE=(PORTE|0X05)&0XFD;}
PORTB=PORTB|0X01; //RB0/E=1
E1FLAG=PORTD&0X80;
PORTB=PORTB&0XFE; //RB0/E=0
if(E1FLAG==0X0000)break;
}
}
//对液晶显示器发指令子程序,行参E代表处理的液晶的边
void TRANS1(int TRANS ,int E)
//int TRANS,E;
{
LCDSTA1(E);
TRISD=0X00; //RD为输出
if(E==1) //设置RE2/CSA=0,RA3/CSB=1,RE0/RW=0,RE1/DI=0
{PORTA=PORTA|0X08;
PORTE=PORTE&0XF8;}
else //设置RE2/CSA=1,RA3/CSB=0,RE0/RW=0,RE1/DI=0
{PORTA=PORTA&0xF7;
PORTE=(PORTE|0X04)&0XFC;}
PORTD=TRANS;
PORTB=PORTB|0X01; //RB0/E=1
PORTB=PORTB&0XFE; //RB0/E=0
}
//对液晶显示器写数据子程序
void WRITE1(char WRITE,int CLMADD,int E)
//int WRITE,CLMADD,E;
{
TRANS1(CLMADD,E); //设置列地址
LCDSTA1(E); //查询液晶是否为空闲
TRISD=0X00; //RD为输出
if(E==1) //设置RE2/CSA=0,RA3/CSB=1,RE0/RW=0,RE1/DI=1
{PORTA=PORTA|0X08;
PORTE=(PORTE|0X02)&0xFA;}
else //设置RE2/CSA=1,RA3/CSB=0,RE0/RW=0,RE1/DI=1
{PORTA=PORTA&0xF7;
PORTE=(PORTE|0X06)&0xFE;}
PORTD=WRITE;
PORTB=PORTB|0X01; //RB0/E=1
PORTB=PORTB&0XFE; //RB0/E=0
}
//开E边显示子程序
void DISP1(int E)
//int E;
{
int E1FLAG;
while(1)
{
TRANS1(0X03F,E); //送出控制命令
LCDSTA1(E); //判断液晶是否为空闲状态
TRISD=0XFF; //设置ED为输入
if(E==1) //设置RE2/CSA=0,RA3/CSB=1,RE0/RW=1,RE1/DI=0
{PORTA=PORTA|0X08;
PORTE=(PORTE|0X01)&0xF9;}
else //设置RE2/CSA=1,RA3/CSB=0,RE0/RW=1,RE1/DI=0
{PORTA=PORTA&0xF7;
PORTE=(PORTE|0X05)&0xFD;}
PORTB=PORTB|0X01; //RB0/E=1
E1FLAG=PORTD&0X20;
PORTB=PORTB&0XFE; //RB0/E=0
if(E1FLAG==0X00)break; //如果液晶被打开,则退出循环,否则继续打开
}
}
//E边清屏子程序
void CLEAR1(int E)
//int E;
{
int PAGEADD,PAGENUM,CLMADD,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); //判断液晶是否为空闲状态
TRISD=0XFF; //设置RD为输入
if(E==1) //设置RE2/CSA=0,RA3/CSB=1,RE0/RW=1,RE1/DI=0
{PORTA=PORTA|0X08;
PORTE=(PORTE|0X01)&0xF9;}
else //设置RE2/CSA=1,RA3/CSB=0,RE0/RW=1,RE1/DI=0
{PORTA=PORTA&0xF7;
PORTE=(PORTE|0X05)&0xFD;}
PORTB=PORTB|0X01; //RB0/E=1
E1FLAG=PORTD&0X20;
PORTB=PORTB&0XFE; //RB0/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);
}
}
void init(void);
void main()
{
//init();
//GIE=0;
//GIE=1;
int i;
int j;
for(j=0;j<5;j++)
{
initial();
// LCD1INIT(1);
//LCD1INIT(2);
DISPLAY1(1,0x0BC-j,0x5C);
DISPLAY2(2,0x0BC-j,0x40);
DISPLAY3(1,0x0BE-j,0x68);
DISPLAY4(2,0x0BE-j,0x40);
for(i=0;i<=30000;i++);
for(i=0;i<=30000;i++);
// Delay10KTCYx (255); /*暂停 (255 * 10,000 cycles) */
}
}
/*void init()
{
TRISB=0x00; //PORTB端口设置为输出
TRISC=0x01;
TRISD=0x00; //PORTD端口设置为输出
T0CON=0x8F; //设定TMR0L工作于16位定时器方式,内部时钟,TMR0不用分频
INTCON=0X20; //总中断禁止,TMR0中断允许,清除TMR0的中断标志
TMR0IP=1; //TMR0为中断高优先级
IPEN=1; //使能中断优先级
T1CON=0x03; //设定TMR1工作于计数器方式,外部时钟,不使用分频器
TMR0=0x0D8EF; //100ms定时初值
TMR1=0x00; //TMR1计数器置0
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -