📄 test1.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 + -