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

📄 test1.c

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 C
字号:
#include <p18cxxx.h>

#include <timers.h>
#include <usart.h>
#include <i2c.h>


#define ENDOFTREE 0xff

#define INT24U	unsigned short long
#define INT8U unsigned char
#define INT16U unsigned int
#define MEM_ROM rom

#define RESET_LCD	LATCbits.LATC0

#define RX_THREHOLD 64

#define RCTIMEOUTH 0xf8
#define RCTIMEOUTL 0x2f

void HighInterrupt(void);
void LowInterrupt(void);

unsigned char ticks;
unsigned char rom * ptrTemp;

unsigned char SAV_TBLPTRL;
unsigned char SAV_TBLPTRH;
unsigned char SAV_TBLPTRU;
unsigned char SAV_TABLAT;
unsigned char * pCurRxTail;
unsigned char chrRxCtr;

unsigned char chrRxBuf[128];

#pragma code VectorH=0x08
void atHighVector(void){
	_asm
	goto HighInterrupt
	_endasm
}

#pragma code VectorL=0x18
void atLowVector(void){
	_asm
	goto LowInterrupt
	_endasm
}


#pragma romdata IOPT=0x130000
unsigned char rom IOP;

//#pragma romdata IOPT1=0x131000
extern volatile unsigned char rom LCD1_CW;
extern volatile unsigned char rom LCD1_CR;
extern volatile unsigned char rom LCD1_DW;
extern volatile unsigned char rom LCD1_DR;

//#pragma romdata IOPT2=0x131200
extern volatile unsigned char rom LCD2_CW;
extern volatile unsigned char rom LCD2_CR;
extern volatile unsigned char rom LCD2_DW;
extern volatile unsigned char rom LCD2_DR;

#pragma romdata EXTRAM
unsigned char rom chrTest;
unsigned char chrCurHandle;
unsigned char rom * ptrTemp;

extern void Do_LCD_Init(void);
extern unsigned char rom * Disp_GetBitMap(unsigned int unicode);
extern unsigned char Disp_Word(unsigned char PosX, 
						unsigned char PosY, 
						unsigned int unicode,
						unsigned char Type);

extern void Do_Clear_Screen(unsigned char startX,
					unsigned char startY,
					unsigned char endX,
					unsigned char endY);


extern unsigned char Key_Scan(void);
extern void HW_Bd_Test(void);

extern unsigned char EESequentialReadA(INT8U control,INT16U address,INT8U MEM_ROM * rdptr,INT8U length );
extern INT8U EEPageWriteA(INT8U control, INT16U address, INT8U MEM_ROM *wrptr, INT16U length );

extern void Func_Brd_Init(void);
extern void Do_Key_Init(void);
extern void Func_Start_TMR1(void);
extern void Func_Start_UART(void);


extern unsigned char Func_ChangeCOMMode(unsigned char mode);
extern unsigned char Func_ReadSTT(void);
extern void Func_ResetWM(void);

extern void Display_Start_Picture(void);
extern void Display_Signal_Qual(unsigned char S_Q);
extern void Display_Bat_Lvl(unsigned char B_L);
extern void Display_SM(unsigned char Y_N);
extern void Display_Ser(unsigned char Ser);
extern void Display_Date(unsigned char YearH,
				  unsigned char YearL,
				  unsigned char MonthH,
				  unsigned char MonthL,
				  unsigned char DateH,
				  unsigned char DateL);
extern void Display_Time(unsigned char HourH,
				  unsigned char HourL,
				  unsigned char MinuteH,
				  unsigned char MinuteL,
				  unsigned char CTL);
extern void Display_Local_Num(unsigned char rom * ptrNum);

extern void Display_Lock(unsigned char Lock_State);

void Make_Index_Table(void);
unsigned int Search_ch(void);

#pragma romdata TBLSEC = 0x100
rom unsigned char tbl[]={0,1,2,3,4,5,6,7,8,9,10};

#pragma romdata EXTRAM
unsigned char rom chrT[12];

#pragma code MYCODE
void main(void){
	unsigned char x;
	unsigned int i,j,k;
	unsigned char rom * ptrTemp;
	//unsigned char font[32];
	unsigned int code;
	unsigned char rom * ptrNum;
	
	
	ticks = 0;
	
	//Func_Brd_Init();

	//Func_ResetWM();

	Make_Index_Table();
	i= Search_ch();	
	Func_Start_TMR1();	

	HW_Bd_Test();
	//Test to initialize LCD
	Do_LCD_Init();
	//Test to display a certain byte
	Do_Clear_Screen(0,0,7,127);

	Disp_Word(0,0,0x4f09,0x02);
	Disp_Word(2,60,0x4f09,0x02);
	Disp_Word(4,67,0x4f09,0x02);
	//init USART
	
	Func_Start_UART();
	
	//test i2c
	SSPSTATbits.SMP = 0;
	SSPCON1 = 0x08;			//select I2C master mode
	SSPCON1bits.SSPEN = 1;	//enable I2C 
	PIR2bits.BCLIF = 0;
	
	SSPADD = 10;		// 

	ptrTemp = &chrTest;
	for(i=0;i<5;i++){
		*ptrTemp ++ = i;
	}
	ptrTemp = &chrTest;
	TRISCbits.TRISC5 = 0;
	LATCbits.LATC5 = 0;
	//EEPageWriteA(0b1010000, 0x0000, ptrTemp, 5 );	
	
	k=0;
	code = 0x0000;
	
	Do_Key_Init();

	//test
	INTCON3bits.INT2P = 0;
	INTCON3bits.INT2E = 1;
	x = Func_ChangeCOMMode(3);
	pCurRxTail = chrRxBuf;
	chrRxCtr = 0;
	PIE1bits.TXIE = 0;
	
	INTCONbits.GIEL = 1;	//Enable interrupts
	INTCONbits.GIEH = 1;
	
	Display_Start_Picture();
	Display_Signal_Qual(3);
	Display_Bat_Lvl(2);
	Display_SM(1);
	Display_Ser(0xff);
	Display_Ser(0);
	Display_Ser(1);
	Display_Date('0','2','0','2','1','1');
	Display_Time('1','6','1','8',0x01);
	for(i=0;i<12;i++){
		chrT[i] = i+0x30;
	}
	ptrNum = chrT;
	Display_Local_Num(ptrNum);
	Display_Lock(0);
	
	for(;;){
		//EESequentialReadA(0b10100010,0x0000,ptrTemp,5 );
		if(ticks == 1){
			ticks = 0;	
			LATBbits.LATB3 = 1;
			ptrTemp = &chrTest;
			//EEPageWriteA(0b10100010, 0x0000, ptrTemp, 5 );	
			EESequentialReadA(0b10100010,0x0000,ptrTemp,5 );
			
			//if(x==3) x = 0;
			//else x++;
			//Func_ChangeCOMMode(x);
			
			LATBbits.LATB3 = 0;
			k++;
			/*if(k == 100){
				k = 0;
				Do_Clear_Screen(0,0,7,127);
				for(i=0 ;i <= 7 ;i = i+2){
					for(j = 0; j <= 7; j++){
						while(Disp_Word(i,j*16 ,code,0x00) != 0){
							code++;
							if(code == 0x005f) code = 0x0000;
						}
						code++;
						if(code == 0x005f) code = 0x0000;
					}
				}
			}*/
		}
		//INTCONbits.GIEL = 0;	//Enable interrupts
		/*LATBbits.LATB3 = ~LATBbits.LATB3;
		for(j=0;j<60;j++){
			x=chrTest;
			x=IOP;
		}
		//INTCONbits.GIEL = 1;	//Enable interrupts
		for(j=0;j<50;j++){
			x=chrTest;
			x=IOP;
		}*/
	}
}


#pragma interrupt HighInterrupt
void HighInterrupt(void){
	_asm
	movff	TBLPTRL,SAV_TBLPTRL
	movff	TBLPTRH,SAV_TBLPTRH
	movff	TBLPTRU,SAV_TBLPTRU
	movff	TABLAT,SAV_TABLAT
	_endasm
	//UART receiving ISR
	if(PIR1bits.RCIF){
		PIR1bits.RCIF = 0;
		*pCurRxTail++ = RCREG;
		chrRxCtr++;
		TMR0H = RCTIMEOUTH;
		TMR0L = RCTIMEOUTL;
		T0CONbits.TMR0ON = 1;
		INTCONbits.TMR0IE = 1;
		if(chrRxCtr >= RX_THREHOLD) INTCON3bits.INT2F = 1;	//Trigger the INT2
	}
	//Timer0 ISR
	if(INTCONbits.TMR0IF){
		INTCONbits.TMR0IE = 0;	//disable timer0 interrupt
		T0CONbits.TMR0ON = 0;
		if(chrRxCtr != 0) INTCON3bits.INT2F = 1;	//Trigger the INT2
	}
	_asm
	movff	SAV_TBLPTRL,TBLPTRL
	movff	SAV_TBLPTRH,TBLPTRH
	movff	SAV_TBLPTRU,TBLPTRU
	movff	SAV_TABLAT,TABLAT
	_endasm
}

#pragma interruptlow LowInterrupt
//Low priority interrupt deal with all other interrupt
void LowInterrupt(void){
	//LATBbits.LATB3 = ~LATBbits.LATB3;
	unsigned char chrTemp;
	_asm
	movff	STATUS,POSTINC1
	movff	BSR,POSTINC1
	movwf	POSTINC1,0
	movff	PRODH,POSTINC1
	movff	PRODL,POSTINC1
	movff	TABLAT,POSTINC1
	movff	TBLPTRU,POSTINC1
	movff	TBLPTRH,POSTINC1
	movff	TBLPTRL,POSTINC1
	movff	FSR2H,POSTINC1
	movff	FSR2L,POSTINC1
	movff	FSR0H,POSTINC1
	movff	FSR0L,POSTINC1
	//
	movff	AARGB7,POSTINC1
	movff	AARGB6,POSTINC1
	movff	AARGB5,POSTINC1
	movff	AARGB4,POSTINC1
	movff	AARGB3,POSTINC1
	movff	AARGB2,POSTINC1
	movff	AARGB1,POSTINC1
	movff	AARGB0,POSTINC1
	_endasm 
	//The TX service of USART
	if(PIR1bits.TXIF){
		PIR1bits.TXIF = 0;
		TXREG = 0x5f;
	//	if(intCurRxNum != 0){
	//		TXREG = *pCurTxHead ++;
	//		intCurTxNum--;
	//	}
	//	else chrCOMBusy = FALSE;
	}
	//The TIMER1 service of USART
	if(PIR1bits.TMR1IF){
		PIR1bits.TMR1IF = 0;
		//WriteTimer1(0xffff-1000);
		TMR1H = 0xfb;
		TMR1L = 0xa0;
		ticks = 1;	
		//LATAbits.LATA5 = ~LATAbits.LATA5;
		INTCON3bits.INT2F = 1;
		//OS_ENTER_CRITICAL();
		//OSIntNesting++;
		//OS_EXIT_CRITICAL();
		//OSTimeTick();
		//OSIntExit();
	}
	//if(INTCONbits.RBIF == 1){
	while(INTCONbits.RBIF == 1){
		INTCONbits.RBIF = 0;
		if(PORTBbits.RB4 == 0){
			chrTemp = Key_Scan();
			Do_Key_Init();
			if((chrTemp >= 0x30) && (chrTemp <= 0x39)){
				Disp_Word(0,0 ,chrTemp,0x00);
			}
		}
		else{
			Do_Clear_Screen(0,0,1,7);
		}
		if(PORTBbits.RB5 != chrCurHandle){
			chrCurHandle = PORTBbits.RB5;
			if(chrCurHandle ==1) LATCbits.LATC1 = 0;
			else  LATCbits.LATC1 = 1;
		}
	}
	if(	INTCON3bits.INT2F ==1){
		INTCON3bits.INT2F = 0;
	}

	//INTCONbits.GIEL = 1;
	_asm
	movff	POSTDEC1,AARGB0	//adjust the soft stack pointer
	//
	movff	POSTDEC1,AARGB0
	movff	POSTDEC1,AARGB1
	movff	POSTDEC1,AARGB2
	movff	POSTDEC1,AARGB3
	movff	POSTDEC1,AARGB4
	movff	POSTDEC1,AARGB5
	movff	POSTDEC1,AARGB6
	movff	POSTDEC1,AARGB7
	//
	movff	POSTDEC1,FSR0L
	movff	POSTDEC1,FSR0H
	movff	POSTDEC1,FSR2L
	movff	POSTDEC1,FSR2H
	movff	POSTDEC1,TBLPTRL
	movff	POSTDEC1,TBLPTRH
	movff	POSTDEC1,TBLPTRU
	movff	POSTDEC1,TABLAT
	movff	POSTDEC1,PRODL
	movff	POSTDEC1,PRODH
	movf	POSTDEC1,0,0
	movff	POSTDEC1,BSR
	movff	INDF1,STATUS
	_endasm	
}



#define NUM_OF_RESP 25
#pragma code MYCODE
unsigned char rom chrResp[][20]={
	"OK",			//0
	"ERROR",		//1
	"BUSY",			//2
	"NO CARRIER",	//3
	"RING",			//4
	"+CLIP",		//5
	"+CLCK",		//6
	"+COPS",		//7
	"+CGSN",		//8
	"+CCLK",		//9
	"+CIMI",		//10
	"+CNUM",		//11
	"+CSQ",			//12
	"+CSCS",		//13
	"+CREG",		//14
	"+CRING",		//15
	"+CPIN",		//16
	"+CPWD",		//17
	"+CAD",			//18
	"+CBC",			//19
	"+CMT",			//20
	"+WIND",		//21
	"+WCNT",		//22
	"+WEND",		//23
	">"				//24
};
unsigned char rom asciimap[0x80];
void rom * rom RespFuncPtrTbl[NUM_OF_RESP];

#define NUM_OF_NOD 100
struct TblItem{
	unsigned char ID;
	unsigned char Lvl;
	unsigned char ptr[30];
};

struct TblItem rom Nod[NUM_OF_NOD];
unsigned char nodmap[NUM_OF_NOD];
void Func_Null(void);

void Make_Index_Table(void){
	unsigned char curNod,curResp,curChar,t1,t2;

	unsigned int i,j;
	unsigned char NumOfNod;
	NumOfNod = 1;
	//clear the Nod's data
	for(i=0;i<NUM_OF_NOD;i++){
		Nod[i].ID = 0x00;
		Nod[i].Lvl = 0;
		for(j=0;j<30;j++){
			Nod[i].ptr[j] = 0x0;
		}
	}
	//make the ascii code map table
	for(i=0;i<0x80;i++){
		if(i>='A' && i <='Z') asciimap[i] = i-'A'+3;	//ASCII code map to X - A +3
		else if(i=='>') asciimap[i] = 2;
		else if(i=='+') asciimap[i] = 1;
		else asciimap[i]=0;
	}
	//make the nods
	curResp = 0;
	for(;;){	
		curNod = 0;
		curChar = 0;
		for(;;){	
			t1 = chrResp[curResp][curChar];
			t1 = asciimap[t1];		
			if(Nod[curNod].ptr[t1] == 0){
				if(chrResp[curResp][curChar+1] == '\0'){
					Nod[curNod].ptr[t1] = ENDOFTREE;
					nodmap[curNod] = curResp;
					break;
				}
				Nod[curNod].ptr[t1] = NumOfNod;
				Nod[NumOfNod].ID = chrResp[curResp][curChar];
				NumOfNod++;
				curNod = Nod[curNod].ptr[t1];
			}
			else{
				curNod = Nod[curNod].ptr[t1];
			}
			curChar++;
		}
		curResp++;
		if(curResp == sizeof(chrResp)/20) break;
	}
	//make the process function table
	for(i=0;i<NUM_OF_NOD;i++) 
		RespFuncPtrTbl[0] = &Func_Null;
}

unsigned char rom chrT[100]="AB*D#+WINDCBAX";
unsigned int Search_ch(void){
	unsigned char i,j,x,t1;
	j=0;
	for(i=0;i<20;i++){
		t1 = chrT[i];
		t1 = asciimap[t1];		
		if(Nod[j].ptr[t1] != ENDOFTREE){
			j = Nod[j].ptr[t1];
			if(j==0) j= Nod[j].ptr[t1];
		}
		else {
			
			RespFuncPtrTbl[j]();
			return (j);
		}
	}
	return (0xff);
}

//process functions. these functions must be "void" input and return nothing
void Func_Null(void){
	Nop();
	Nop();
}

⌨️ 快捷键说明

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