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

📄 jbdisp.c

📁 电话PSTN线路上FSK处理软件。。。。。。。。。
💻 C
字号:

#include <jbDisp.h>


void ConvertCode(void)
{
	byte i;
	byte bTemp;
	byte code *pDispCode;
    for(i=0;i<20;i++){
		pDispCode=DISP_CODE_ADDR;
		bTemp=0;
		while(1){  
			if(pDispCode>DISP_CODE_END)
				break;
			if(aLargeBuf[i]==*pDispCode){		//查字符表
				aLargeBuf[i]=*(++pDispCode);
				break;
			}
			else
				pDispCode+=2;
		}
    }
}

void DispOut(void)
{   
	byte i;
    SDA=SPACE;
    SDelay();
    SCL=SPACE;
    SDelay();      
    I2CWrite(0x70);
    I2CWrite(0xe0);                       
    I2CWrite(0x00);     
    for(i=0;i<20;i++)
        I2CWrite(aLargeBuf[i]);                 // Display Large Lcd
    SCL=MARK;
    SDelay();
    SDA=MARK;
    SDelay();
    
    SDA=SPACE;
    SDelay();
    SCL=SPACE;
    SDelay();      
    I2CWrite(0x72);
    I2CWrite(0xe0);                       
    I2CWrite(0x00);     
    for(i=0;i<5;i++)
        I2CWrite(aSmallBuf[i]);                 // Display Small Lcd
    SCL=MARK;
    SDelay();
    SDA=MARK;
    SDelay();
}


void I2CWrite(byte todisp)
{     
    bDispBuf=todisp;
    EA=0;      
    SDA=bDispBuf7;
    SCL=MARK;
    SDelay();
    SCL=SPACE;
    SDelay();
    SDA=bDispBuf6;
    SCL=MARK;
    SDelay();
    SCL=SPACE;
    SDelay();
    SDA=bDispBuf5;
    SCL=MARK;
    SDelay();
    SCL=SPACE;
    SDelay();
    SDA=bDispBuf4;
    SCL=MARK;
    SDelay();
    SCL=SPACE;
    SDelay();
    SDA=bDispBuf3;
    SCL=MARK;
    SDelay();
    SCL=SPACE;
    SDelay();
    SDA=bDispBuf2;
    SCL=MARK;
    SDelay();
    SCL=SPACE;
    SDelay();
    SDA=bDispBuf1;
    SCL=MARK;
    SDelay();
    SCL=SPACE;
    SDelay();
    SDA=bDispBuf0;
    SDelay();
    SCL=MARK;
    SDelay();
    SCL=SPACE;
    SDA=MARK;
    SDelay(); 
    SCL=MARK;
    SDelay();
    SDelay();
    SCL=SPACE;
    SDA=SPACE;
    SDelay();
    EA=1;
}
      
void SDelay(void)         /* short delay,time about 6us */
{   
	_nop_();  
    _nop_();
    _nop_();
    _nop_();
}            

void DispInit(void)
{
    SCL=MARK;          /* stop condition */
    SDelay();
    SDA=MARK;
    SDelay();
    SDA=SPACE;         /* start condition */
    SDelay();
    SCL=SPACE;
    SDelay();
    I2CWrite(0x70);        /* slave address set */
    I2CWrite(0xc8);        /* set Large Lcd drive mode:mux(32 rows) M1M0=00
                       Display status: Normal E1E0=00;
                       System type: PCF8578 mixed mode T=1 */
    I2CWrite(0x70);        /* set display start bank is bank0 */
    SCL=MARK;          /* stop condition */
    SDelay();
    SDA=MARK;
    SDelay();

    SDA=SPACE;         /* start condition */
    SDelay();
    SCL=SPACE;
    SDelay();
    I2CWrite(0x72);        /* slave address set */
    I2CWrite(0xc9);        /* set Small Lcd drive mode:mux(32 rows) M1M0=00
                       Display status: Normal E1E0=00;
                       System type: PCF8578 mixed mode T=1 */
    I2CWrite(0xf8);
    I2CWrite(0x70);        /* set display start bank is bank0 */
    SCL=MARK;          /* stop condition */
    SDelay();
    SDA=MARK;
    SDelay();
    
} /* End function: DispInit() */     

/********************************************************
*
*     Function Name:  DispClr()
*     Function:   Clear display
*
********************************************************/

void DispClr(void)
{   
    memset(aLargeBuf,'\0',20);
    memset(aSmallBuf,'\0',5);
    DispOut();
} /* End DispClr() */

/*********************************************************
*
*     函  数:  DispNumber()
*     功  能:  在大、小显示器上显示电话号码及数据
*               bType=1 点亮大显示器
*               bType=0 点亮小显示器
*
*********************************************************/

void DispNum(bool fType)
{   
    byte i;
    byte xdata aTemp[8];
    byte xdata aTempSmall[5];
    Page(5);
    if(fType){
	    for(i=0;i<8;i++)
    	    aTemp[i]=aLargeBuf[i]&0x08;           	// 记录大显示器上各标志位
        memset(aLargeBuf,0,11);
        if(pReadNumber>=10){
            for(i=0;i<11;i++){
                if((aNumBuf[pReadNumber-10+i]&0x0f)==0x0c)
                    break;
                aLargeBuf[i]=aLCDSegment[(aNumBuf[pReadNumber-10+i]&0x0f)];
            }    
        }   
        else{
            for(i=0;i<=pReadNumber;i++){
                if((aNumBuf[i]&0x0f)==0x0c)
                    break;
                aLargeBuf[i]=aLCDSegment[aNumBuf[i]&0x0f]; 
            }    
        }        
        for(i=0;i<8;i++)
            aLargeBuf[i]|=aTemp[i];           		// 恢复各标志位
    }
    else{
	    for(i=0;i<5;i++)
    	    aTempSmall[i]=aSmallBuf[i]&0x08;      	// 记录小显示器上各标志位
        memset(aSmallBuf,'\0',5);
        if(pReadNumber>=4){                         // Small Lcd
            for(i=0;i<5;i++){
            	if((aNumBuf[pReadNumber-4+i]&0x0f)==0x0c)
            		break;
                aSmallBuf[i]=aLCDSegment[(aNumBuf[pReadNumber-4+i]&0x0f)];
            }    
        }   
        else{
            for(i=0;i<=pReadNumber;i++)
                aSmallBuf[i]=aLCDSegment[aNumBuf[i]&0x0f]; 
        }        
	    for(i=0;i<5;i++)
    	    aSmallBuf[i]|=aTempSmall[i];      //记录大显示器上各标志位
    }            
    DispOut();
}      
 
/***********************************************************
*
*     Function Name: DispTime()
*     Function:   显示通话时间
*     Input:  
*
***********************************************************/ 
void DispTime(uint Time)
{   
    uint Hour;
    byte aTemp[4],i;
    for(i=0;i<4;i++)
        aTemp[i]=aLargeBuf[i+11]&0x08;
    Hour=Time/3600;
    switch(Hour){
        case 0: 
            aLargeBuf[6]&=0xf7;
            aLargeBuf[7]&=0xf7;
            aLargeBuf[5]&=0xf7;
            aLargeBuf[4]&=0xf7;
            break;
            
        case 1:
            aLargeBuf[6]|=0x08;
            aLargeBuf[7]|=0x08;
            aLargeBuf[5]&=0xf7;
            aLargeBuf[4]&=0xf7;
            break;
            
        case 2:
            aLargeBuf[6]|=0x08;
            aLargeBuf[5]|=0x08;
            aLargeBuf[4]|=0x08;
            aLargeBuf[7]&=0xf7;
            break;
            
        case 3:
            aLargeBuf[6]|=0x08;
            aLargeBuf[5]|=0x08;
            aLargeBuf[7]|=0x08;
            aLargeBuf[4]&=0xf7;
            break;
            
        default:
            break;
    }
    if(Hour!=0)     
        Hour=Time%3600;
    else
        Hour=Time;    
    aLargeBuf[14]=aLCDSegment[(Hour/60)/10];    
    aLargeBuf[13]=aLCDSegment[(Hour/60)%10];    
    aLargeBuf[12]=aLCDSegment[(Hour%60)/10];    
    aLargeBuf[11]=aLCDSegment[(Hour%60)%10];    
    for(i=0;i<4;i++)
        aLargeBuf[i+11]|=aTemp[i];
    DispOut();
}    

/*****************************************************************
*
*     Function Name:  DispCharge()
*     Function:     在大、小显示器上显示话费,
*     Input:        话费及显示缓冲区地址
*                   Line=0 大显示器最顶上一行
*                   Line=1 大显示器最底下一行

*                   Line=2 小显示器
*                   Line=3 大显示器最顶上一行前头,用来显示通话次数
*                   //Line=4 大显示器最顶上一行后头,用来显示通讯命令
*
*
******************************************************************/
byte code DispAddrCode[10]={6,7,8,9,10,19,18,17,16,15};

void DispCharge(ulint bValue,byte bLine)
{   
    byte i,k=1,aTemp[5];
    byte xdata aTerm[2];
    aTerm[0]=aSmallBuf[0]&0x08;
    aTerm[1]=aSmallBuf[1]&0x08;
    memset(aTemp,'\0',5);
    if(bValue>=10000){
        k++;
        aTemp[0]=aLCDSegment[(bValue/10000)%10];
    }    
    if(bValue>=1000){
        k++;
        aTemp[1]=aLCDSegment[(bValue/1000)%10];
    }    
    if(bValue>=100){
        k++;
        aTemp[2]=aLCDSegment[(bValue/100)%10];
    }    
    if(bValue>=10){
        k++;
        aTemp[3]=aLCDSegment[(bValue/10)%10];
    }    
    aTemp[4]=aLCDSegment[bValue%10];
    if(bLine==3){
        for(i=0;i<k;i++)
            aLargeBuf[i]=aTemp[5-k+i];
        return;    
    }        
    else{    
    	if(k==1){									//小数点前加0
    		aTemp[3]=aTemp[2]=aLCDSegment[0];
    	}
    	if(k==2)
    		aTemp[2]=aLCDSegment[0];				
        for(i=0;i<5;i++){
            if(bLine==2)
                aSmallBuf[i]=aTemp[i];              //点亮小显示器
            else
                aLargeBuf[DispAddrCode[5*bLine+i]]=aTemp[i];    //点亮大显示器
                
        }
    }        
    if(bLine==0)
	    aLargeBuf[8]|=0x08;
    if(bLine==1){
		aLargeBuf[17]|=0x08;						//显示小数点
        aLargeBuf[0]|=0x08;							//显示人民币符号
    }    
    if(bLine==2){
        aSmallBuf[0]|=aTerm[0];
        aSmallBuf[1]|=aTerm[1];
        aSmallBuf[2]|=0x08;
    }    
    if(bValue>=100000){                             //显示话费最高位
        switch(bLine){
            case 0:
                aLargeBuf[5]=aLCDSegment[(bValue/100000)%10];        
                break;
                
            case 1:
                aLargeBuf[19]|=0x08;
                break;
                
            case 2:
                aSmallBuf[3]|=0x08;    
               break;
               
            case 3:
                break;    
        }
    }    
    DispOut();         
}    

/******************************************************
*
*     Function Name:  DispSymbol()
*     Function:       显示各种符号。如:挂机、摘机、闪烁及锁机标志  
*     Input:          显示符号代码值
*
*
*******************************************************/

void DispSymbol(byte SymbolCode)
{   
    switch(SymbolCode){
        case LARGE_PHONE: 
            aLargeBuf[1]|=0x08;    
            aLargeBuf[2]&=0xf7;    
            break;
        case LARGE_UNPHONE:
            aLargeBuf[1]&=0xf7;    
            break;    
        case LARGE_HOOK: 
            aLargeBuf[1]&=0xf7;    
            aLargeBuf[2]|=0x08;    
            break;
        case LARGE_UNHOOK:
            aLargeBuf[2]&=0xf7;    
            break;    
        case LARGE_FLASH: 
            aLargeBuf[3]|=0x08;    
            break;
        case LARGE_UNFLASH:
            aLargeBuf[3]&=0xf7;    
            break;    
        case LARGE_LOCK: 
            aLargeBuf[12]|=0x08;    
            break;
        case LARGE_UNLOCK:
            aLargeBuf[12]&=0xf7;    
            break; 
	    case LARGE_HALFPRICE:
	        aSmallBuf[0]|=0x08;
	        aSmallBuf[1]&=0xf7;
	        aLargeBuf[13]|=0x08;
	        aLargeBuf[14]&=0xf7;
            break;           

		case LARGE_ALLPRICE:
	        aSmallBuf[1]|=0x08;
	        aSmallBuf[0]&=0xf7;
	        aLargeBuf[14]|=0x08;
	        aLargeBuf[13]&=0xf7;
            break;
	    case LARGE_COMM:
	        aLargeBuf[18]|=0x08;
	        break;

	    case LARGE_UNCOMM:
	        aLargeBuf[18]&=0xf7;
	        break;
		 
	    case SMALL_COMM:
	        aSmallBuf[3]|=0x08;
	        break;

	    case SMALL_UNCOMM:
	        aSmallBuf[3]&=0xf7;
	        break;

	    case SMALL_HALFPRICE:
	        aSmallBuf[1]|=0x08;
	        aSmallBuf[0]&=0xf7;
            break;           

		case SMALL_ALLPRICE:
	        aSmallBuf[0]|=0x08;
	        aSmallBuf[1]&=0xf7;
            break;

        default:
            break;
    }
    DispOut();
}

void DispErrorCode(void)
{   
    byte i;
    memset(aLargeBuf,0,20);
    memset(aSmallBuf,0,5);
   	aLargeBuf[0]=0xf1;//E r r o r
    aLargeBuf[1]=0x60;
   	aLargeBuf[2]=0x60;
   	aLargeBuf[3]=0xe4;
   	aLargeBuf[4]=0x60;
   	aLargeBuf[5]=0x20;
    aLargeBuf[6]=aLCDSegment[bErrorCode>>4];
    aLargeBuf[7]=aLCDSegment[bErrorCode&0x0f];
    if(!fWorkMode){
    	for(i=3;i<6;i++)
    		aLargeBuf[i]=aLargeBuf[i+2];
    	aLargeBuf[6]=aLargeBuf[7]=0;
   	} 	
    DispOut();
    DelaySecond(3);
}    

void DispCmd(byte bCode)
{
    
    if(bStatusWord==S_SERVICE){
    	if((bCode&0xf0)!=0)
    		aLargeBuf[9]=aLCDSegment[bCode>>4];
    	else
    		aLargeBuf[9]=0;	
    	aLargeBuf[10]=aLCDSegment[bCode&0x0f];
    }
    else{
    	if((bCode&0xf0)!=0)
    		aLargeBuf[12]=aLCDSegment[bCode>>4];
    	else
    		aLargeBuf[12]=0;
    	aLargeBuf[11]=aLCDSegment[bCode&0x0f];
    }	
    DispOut();
}    

void DispOK(byte bSpeakTime)
{
	byte i;
	aLargeBuf[0]='o';
	aLargeBuf[1]='K';
	memset(&aLargeBuf[2],0,18);
	memset(aSmallBuf,0,5);
	ConvertCode();
    DispOut();
    for(i=0;i<bSpeakTime;i++){
    	cbDelay5MS=8;
    	fDelay5MS=0;
    	Speaker(20);
    	while(!fDelay5MS)PCON=0x81;
    	cbDelay5MS=160;
    	fDelay5MS=0;
    	while(!fDelay5MS)PCON=0x81;
    }
}

	

⌨️ 快捷键说明

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