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

📄 iisc_step4.c

📁 it is used to interface cs5463 using serial port and display
💻 C
字号:
#include <stdio.h>
#include <string.h>
#include <reg8253.h>
 sfr ldata=0x80;				   /* port0 for lcd data*/ 
 sbit busy=P0^7;				   /*busy flag for lcd p0.7 */
 sbit rs=P2^0;					   /*register select of lcd p2.0 */
 sbit rw=P2^1;					   /*read or write select for lcd*/
 sbit en=P2^2;						 /* enable lcd */ 
 sbit led1=P2^3;				   /* indication start of programme execution*/
 void serialsend(unsigned long);
 unsigned char value1,buffer[10],index,value4,state,SEND1[4],BUFFER1[4],ascii[12];
 unsigned long value2,value3,temp8;	
// unsigned char second_line=0xc0 ;

 void lcddisplay()
  {	
		 // unsigned char i; 
		  unsigned char stringcmd[6]={0x38,0x0E,0x01,0x06,0x0C,0x80}; 
 		  unsigned char string[]="B.M.S.C.E ELECTRICAL DEP. ";
		 unsigned char second_line=0xc0 ;    
	      int len1 = strlen(stringcmd),countcmd,count;      
	      unsigned int len=strlen(string);
	      unsigned char lccmd;
	               
	      void lcddata(unsigned char);
	      void lcdcmd(unsigned char);
	      void delay(void);
	      void lcdready(void);
	      void msdelay(unsigned char);

        for (countcmd = 0; countcmd < len1; countcmd++)
        {	  
         lccmd=stringcmd[countcmd];
         lcdcmd(lccmd);
        } 	 		  
 	        		                     
        for (count =0;count<len;count++)  
        {        
         lcddata(string[count]);
       }        
         lcdcmd(second_line); 
		   
  }
/*---------------------------------------------*/	
 void lcdcmd(unsigned char value)
 {
 	lcdready();		 							 /*is LCD ready?*/	
    ldata=value;	  								 /*issue command code*/
 	rs=0;										 /*RS=0 for command*/
 	rw=0;										/*R/W=0 to write to LCD*/
 	en=1;										/*E=1 for H-to-L pulse*/
 	msdelay(1);
 	en=0;  	
 }	
/*---------------------------------------------*/
    
 void lcddata(unsigned char value)
 {
 	lcdready();	   								/*is LCD ready?*/
 	ldata=value;  									 /*issue data */
 	rs=1;										 /*RS=1 for data*/
 	rw=0;			 							/*R/W=0 to write to LCD*/
 	en=1;										  /*E=1 for H-to-L pulse*/
 	msdelay(1);
 	en=0;	 
 }

/*---------------------------------------------*/
 void lcdready()
 {
 	busy=1;									/*make P0.7 input port*/
 	rs=0;	  								 /*RS=0 access command reg*/
 	rw=1;	   								/*R/W=1 read command reg*/
    while(busy==1)								  /*stay until busy flag=0*/
 	{
 	en=0;									 /*E=1 for H-to-L pulse*/
 	msdelay(1);
 	en=1;			  						/*E=0 H-to-L pulse*/
  //busy=0;								  //forcing to zero for testing
 	}  
 } 

/*-----------------------------------------------*/
 void msdelay(unsigned char itime)
 {
 	unsigned int i,j;	                                                                                                                               
 	for(i=0;i<itime;i++)
 	for(j=0;j<1275;j++);
 }
 masterio(unsigned char SENDDATA)
{	  	unsigned char RECEDATA;	
 		SPDR = SENDDATA;
	   	while ((SPSR & 0x80) == 0);
		RECEDATA=SPDR;
		return(RECEDATA);
}

void send_l(unsigned long dd)
{
unsigned long temp;
unsigned char I;
	temp=dd&0xff000000;
	temp=temp>>24;
	SEND1[0]=temp;
	temp=dd&0x00ff0000;
	temp=temp>>16;
	SEND1[1]=temp;
	temp=dd&0x0000ff00;
	temp=temp>>8;
	SEND1[2]=temp;
	temp=dd&0x000000ff;
	SEND1[3]=temp;
for(I=0;I<4;I++)	 
masterio(SEND1[I]);	/* reads the data from cs5463 to buffer*/
}

unsigned long read_l(unsigned char value4)
 { unsigned long int temp;
   unsigned char I,STATUS;  						    
unsigned char value5;
	 while(1){
			masterio(0x1E);
			STATUS=masterio(0xFF);/* STATUS READ OF CS 5463 */
			masterio(0xFF);
			masterio(0XFF);
			if((STATUS&0X80)==1)
			{masterio(0x5E);
			masterio(0x80);/* STATUS write OF CS 5463 */
			masterio(0x00);
			masterio(0X00);
			break;
			}
		  }
	temp=0x00000000;
	value5=0x00;
	value5=value4<<1;
	value5=value5&0x3e;  
	SEND1[0]=value5;
	SEND1[1]=0xff;
	SEND1[2]=0xff;
	SEND1[3]=0xff;
	for(I=0;I<4;I++)	 
BUFFER1[I]=masterio(SEND1[I]);	/* reads the data from cs5463 to buffer*/
temp=BUFFER1[1];
//temp=(BUFFER1[0]*16777216)+ (BUFFER1[1]*65536)+ (BUFFER1[2]*256)+BUFFER1[3];
	return(temp);
   }
    asciiconv(unsigned int bin)
{
unsigned char j,a[11],jj,mask=0x80,i;
long int val1=0,v1=50000000;			   
		ascii[1]='0';
		ascii[2]='.';		               	   
		 for(i=0;i<8;i++)				   /* converting  fractional binary number to decimal*/ 
          { if(bin&mask)
			 val1=val1+v1;			  
			 v1=v1/2;
			 mask=mask>>1;
			  }
		  for(j=0;j<8;j++)
		  {  a[j]=(val1%0x0a)+48;
			 val1=val1/0x0a;
			   }
			j=7;
			for(jj=3;jj<10;jj++) 
			{
			 ascii[jj]=a[j];
			 j--;
	           }
			 ascii[10]='\n';	
}
 
 /*------------2's compliment---------------------*/
compliment(unsigned char HH)
{
int mask1=0x80;
unsigned char comp,num;
	if(HH&mask1)  /* if MSB is set */
	{
	num=(HH&0x7F);	/* set MSB bit to zero*/
	ascii[0]='-';
	comp=(~num)+0x01;  /* 2's compliment*/
	asciiconv(comp);	
	}
	else
	{
	ascii[0]='+';
	asciiconv(HH);                               
	}
}
 serialport(unsigned char RS232)
{	 ES=0;TI=0;					/*ready to transmit  */
	 SBUF=RS232;	 	
	 while(TI==0);
	 TI=0; ES=1;	   /*poll TI until all the bits are transmitted */
	 //TR1=0;
}
 void serialsend(unsigned long value6)
{unsigned char i,HH;
	//value6=value6&0x000000ff;
	HH=value6;//>>16;
    compliment(HH);
for (i=0;i<11;i++)
	serialport(ascii[i]);
	lcddisplay();
 for (i=0;i<11;i++)
		lcddata(ascii[i]);   
	}

/*---------------- main-------------------*/   
void main()
{
char m;
	SPCR = 0x53;
	SCON=0x50;EA=1;ES=1;
	TMOD=0x25;
	TL0=0x00;
	TH0=0x00;
	TH1=0xFD;
	TR1=1;TR0=1;
	index=0;state=0;
 //	lcddisplay();	
		masterio(0xFF);
		masterio(0xFF);
		masterio(0xFF);
		masterio(0XFE);
		for(m=0;m<100;m++);
		send_l(0x40000001);
		send_l(0x64000060);
		send_l(0x74000004);		
		masterio(0xE8);
	state=0;  
while(1)
{
switch (state)

{ case 0 :  
            //lcddisplay();
		//	lcdcmd(second_line);
		// serialsend(value3);
			led1=0;
			msdelay(2);
			led1=1;
		 	break;								 
 	case 1: masterio( value1);
	        state=0;
			break;
	case 2: send_l (temp8);
	        state = 0;
			break;
	case 3: value3=read_l(value4);
	        state=0;
			serialsend(value3);
			break;
	case 4: masterio(0x80);
			msdelay(3);
			masterio(0xFF);
			masterio(0xFF);
			masterio(0xFF);
			masterio(0XFE);
			send_l(0x40000001);
			send_l(0x64000060);
			send_l(0x74000004);	
			masterio(0xE8);
		  	state=0;break;
	default: break;
	}
	}
}

void serial (void) interrupt 4
 { 
 unsigned char temp7,i;
 if (TI)
  TI=0;
  if (RI)
  		{  RI=0;
		temp7=SBUF;
		SBUF=temp7;
      	buffer[index]=temp7;
	  		if (temp7=='z')
	   			{ switch ( buffer[0])
	    	 { case 'a' :
					      if  (buffer[1]>0x41)
						   buffer[1]=buffer[1]-0x57;
						  else buffer[1]=buffer[1]-0x30; 
						    		  
						  if  (buffer[2]>0x41)
						   buffer[2]=buffer[2]-0x57;
						  else  buffer[2]=buffer[2]-0x30;
						  buffer[1]=buffer[1]<<4;
						  value1=buffer[1]+buffer[2];
						  index=0; state=1;
						  break;
		  		case 'b':
				          for(i=1;i<9;i++)
						  {if (buffer[i]>0x41)
						   buffer[i]=buffer[i]-0x57;
						   else
							  buffer[i]=buffer[i]-0x30;
							  buffer[i]=buffer[i]&0x0f;
		                   }
						  temp8=0x00000000;
						   for(i=1;i<8;i++)		
		                   { temp8=temp8 | buffer[i];
							   temp8=temp8<<4;
							   }
						   temp8=temp8|buffer[8];
						   value2=temp8;
						   state=2;	index=0;
						   break;
				 	case  'c':  buffer[1]=buffer[1]&0x0f;
					            buffer[2]=buffer[2]&0x0f;
							 value4= buffer[1]*10+buffer[2];
							 state=3
							;index=0;
							 break;
			 	case 'r':  state=4;
							index=0;
							break;
			 }	
		}
		else index++;
		}
}

 					 

					 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -