⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f_calluate.c

📁 pic18F458单片机频率测量c程序
💻 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 + -