?? 43.c
字號:
return (c); //取回數據
}
//*****************************************
//接收一行數據,必須定義放數據串的指針位置和大小
del=0x7f,backspace=0x08,cr=0x0d,lf=0x0a
void getline (uchar idata *line, unsigned char n)
{ unsigned char cnt = 0; //定義已接收的長度
char c;
do {
if ((c = getbyte ()) == 0x0d) c = 0x00; //讀一個字節,如果是回車換成結束符
if (c == 0x08 || c == 0x7f) //BACKSPACE 和 DEL 的處理
{ if (cnt != 0) //已經輸入退掉一個字符
{cnt--; //總數目減一
line--; //指針減一
putbyte (0x08); //屏幕回顯的處理
putbyte (' ');
putbyte (0x08);
}
}
else
{
putbyte (*line = c); //其他字符取入,回顯
line++; //指針加一
cnt++; //總數目加一
}
}
while (cnt < n - 1 && c != 0x00 && c!=0x1b); //數目到了,回車或ESC停止
*line = 0; //再加上停止符0
}
//****************************
putinbuf(uchar c)
{ES=0; if(!inbufful)
{*inlast= c; //放入數據
inlast++; //最后放入的位置加一
if (inlast==inbuf+ILEN) inlast=inbuf; //地址到頂部回到底部
if (inlast==getlast) inbufful=1; //接收緩沖區滿置滿標志
inbufsign=1;
}
ES=1;
}
//*****************************************
//串口中斷處理
serial () interrupt 4
{
if (TI )
{ TI = 0;
if (outbufsign)
//if (putlast==outlast) outbufsign=0;
//else
{
SBUF=*outlast; //未發送完繼續發送
outlast++; //最后傳出去的字節位置加一
if (outlast==outbuf+OLEN) outlast=outbuf; //地址到頂部回到底部
if (putlast==outlast) outbufsign=0; //數據發送完置發送緩沖區空標志
}
}
if (RI)
{
RI = 0;
if(!inbufful)
{
*inlast= SBUF; //放入數據
inlast++; //最后放入的位置加一
inbufsign=1;
if (inlast==inbuf+ILEN) inlast=inbuf; //地址到頂部回到底部
if (inlast==getlast) inbufful=1; //接收緩沖區滿置滿標志
}
}
}
//*****************************
//串口初始化
0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200
serial_init ()
{
SCON = 0x50; // mode 1: 8-bit UART, enable receiver
TMOD |= 0x20; //timer 1 mode 2: 8-Bit reload
PCON |= 0x80; TH1 = 0xfd;//fa, //baud*2 reload value 19200 baud
TR1 = 1; //timer 1 run
ES = 1; REN=1; EA=1; SM2=1; //SM2=1時收到的第9位為1才置位RI標志
TMOD |=0x01; //th1 auto load 2X8,th0 1X16
TH0=31; TL0=0; //X 32 =1S
TR0=1; ET0=1;
}
//*****************
//測試用主函數
void main(void)
{
char c;
idata unsigned char free[16];
unsigned char idata *freep=free;
serial_init();
putstring(crlf);
putstring(comready);
putstring("jdioptuejls;j;klja");
delay(10);
while(1)
{
c=getbyte();
putbyte(0x20);
puthex(c);
switch(c)
{case 'r':
putbytes(inbuf,ILEN);
break;
case 'g':
getline(freep,10);
putbyte(0x20);
putstring(freep);
break;
default:
putbyte(c);
}
}
}
W77E58.H代碼
#ifndef true
#define true 1
#define false 0
#endif
#ifndef byte
#define byte unsigned char
#define word unsigned int
#define dword unsigned long
#endif
#define clr_bit(bit_name) bit_name=0
#define set_bit(bit_name) bit_name=1
typedef union
{
word w;
byte bh;
byte bl;
} WordType;
typedef union
{
dword dw;
byte b[4];
word w[2];
} DwordType;
//--BYTE Registers-------------------------------------------------
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
#define p0 P0
#define p1 P1
#define p2 P2
#define p3 P3
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;//PCON.7(SMOD)撥特率加倍,PCON.1(PD)掉電方式,PCON.0(IDL)凍結方式
//PCON.6(SMOD0)幀錯檢測允許,PCON.3(GF1)PCON.2(GF0)
sfr TCON = 0x88;//定時控制寄存器
sfr TMOD = 0x89;//"gate,c/t,m1,m0"x2定時器方式GATE=1時只有intx=1時才可以開放定時器x;
//c/t =1時計書數方式,=0時定時方式。m1m0=00時13位計數,=01時16位=10時自裝入8位,
//11時定時器0分兩個,定時器1停止。
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr IE = 0xA8;
sfr IP = 0xB8; //中斷優先級
sfr SCON = 0x98; //串口控制與狀態
sfr SBUF = 0x99;
//--W77E58 Extensions---------------------------------------------
sfr T2CON = 0xC8;
sfr T2MOD = 0xc9;//HC5,HC4,HC3,HC2,T2CR,-,T2OE,DCEN
//hc5-hc2 =1時外中斷5-2標志硬件自動清除。
//t2cr=1 捕獲完成時自動復位
//t2oe=1 定時器2輸出允許
//dcen=1 減計數允許,結合外部輸入t2ex使用,16位自裝入模式
sfr RCAP2L= 0xCA;//重裝的預置數,捕獲的輸出
sfr RCAP2H= 0xCB;
sfr TL2 = 0xCC;
sfr TH2 = 0xCD;
sfr DPL1 = 0x84;
sfr DPH1 = 0x85;
sfr DPS = 0x86;
sfr CKCON = 0x8e;//wd1,wd0,t2m,t1m,t0m,md2,md1,md0
//wd1wd0:看門狗計數00=2^17,01=2^20,10=2^23,11=2^26
//t2m,t1m,t0m等于1時時鐘4分頻
//md2,md1,md0 MOVX執行機器周期000=2,001=3。。。111=9
sfr EXIF = 0x91;//ie5,ie4,ie3,ie2,XT/RG,RGMD,RGSL,-
//ie5,ie3=1外中斷下跳變中斷標志
//ie4,ie3=2外中斷上跳變中斷標志
sfr P4 = 0xa5;//低四位有效
sfr SADDR = 0xa9;//從機串口0地址
sfr SADDR1= 0xaa;//從機串口1地址
sfr SADEN = 0xb9;//串口0地址屏蔽,等于0時所有地址都會引起中斷
sfr SADEN1= 0xba;//串口0地址屏蔽,等于0時所有地址都會引起中斷
sfr SCON1 = 0xc0;
sfr SBUF1 = 0xc1;
sfr ROMMAP= 0xc2;//ROMMAP.7為等待信號使能,用movx指令時,wait腳為p4.0
sfr PMR = 0xc4;//CD1,CD0,SWB,-,XTOFF,ALE-OFF,-DME0
//cd0cd1=0時鐘不變,=1-1/4,=2-1/64,=3=1/1024
//swb=1強制4分頻,外中斷或串口中斷喚醒
//aleoff =1時ale信號終止,外部內存訪問時自動喚醒
//dme0 =1時內部1kram使能
sfr STATUS= 0xc5;//-,HIP,LIP,XTUP,SPTA1,SPRA1,SPTA0,SPRA0
//hip=1正在處理高優先級中斷
//lip=1正在處理低優先級中斷
//spta1串口0正在發送數據
//spra1串口0正在接收數據
//spta0串口0正在發送數據
//spra0串口0正在接收數據
sfr TA = 0xc7;//保護位
sfr WDCON = 0xd8;//SMOD_1,POR,-,-,WDIF,WTRF,EWT,RWT
//smod1 加倍串口1的撥特率,pro電源復位標志
//por 電源復位標志
//wdif看門狗定時中斷標志,軟清
//wtrf看門狗定時器復位標志,看門狗引起復位后,該位置1
//ewt 允許看門狗定時器自動復位
//rwt復位看門狗定時器,如果看門狗溢出還沒有被復位計數器,將會引
//起中斷,再過512周期將復位
sfr EIE = 0xe8;//-,-,-,EWDI,EX5,EX4,EX3,EX2
//ewdi=1,允許看門狗中斷?
//ex5-ex2;外部中斷允許
sfr EIP = 0xf8;//-,-,-,pwdi,px5,px4,px3,px2
//pwdi=1 看門狗中斷優先
//px5-px2=1 外部中斷優先
//--BIT Registers-------------------------------------------------
//PSW
sbit CY = 0xD7;
sbit AC = 0xD6;
sbit F0 = 0xD5;
sbit RS1 = 0xD4;
sbit RS0 = 0xD3;
sbit OV = 0xD2;
sbit P = 0xD0;
//TCON
sbit TF1 = 0x8F; //定時器1溢出標志,自動清零
sbit TR1 = 0x8E; //timer1運行控制位
sbit TF0 = 0x8D; //定時器0溢出標志,自動清零
sbit TR0 = 0x8C; //timer0運行控制位
sbit IE1 = 0x8B; //外中斷1跳變中斷請求標志,自動清零
sbit IT1 = 0x8A; //中斷1跳變檢測使能
sbit IE0 = 0x89; //外中斷0跳變中斷請求標志,自動清零
sbit IT0 = 0x88; //中斷0跳變檢測使能
//IE
sbit EA = 0xAF;
sbit ES = 0xAC;
sbit ET1 = 0xAB;
sbit EX1 = 0xAA;
sbit ET0 = 0xA9;
sbit EX0 = 0xA8;
//IP
sbit PS = 0xBC; //串口0中斷優先設定
sbit PT1 = 0xBB; //定時器1中斷優先
sbit PX1 = 0xBA; //外中斷1
sbit PT0 = 0xB9; //定時器0中斷優先
sbit PX0 = 0xB8; //外中斷0
//P3
sbit RD = 0xB7;
sbit WR = 0xB6;
sbit T1 = 0xB5;
sbit T0 = 0xB4;
sbit INT1 = 0xB3;
sbit INT0 = 0xB2;
sbit TXD = 0xB1;
sbit RXD = 0xB0;
//SCON
sbit SM0 = 0x9F; //SM0/FE 串口0方式0選擇或幀錯標志,人工清零
sbit SM1 = 0x9E; //串口1工作方式選擇0-4/12tclk同步,1-10位可設bps異步,2-64/32tclk
//異步,3-11位可變bps異步
sbit SM2 = 0x9D; //允許方式2和3的多機通訊控制位。方式2、3中=1時接收到的
//第9位為0時不啟動接收中斷ri標志
//方式1中,=1時只有收到有效停止時才啟動ri,方式0中=1將撥
//特率提高3倍。
sbit REN = 0x9C; //允許接收標志
sbit TB8 = 0x9B; //方式23中要發送的第9位。
sbit RB8 = 0x9A; //方式23中接收到的第9位。
sbit TI = 0x99; //發送中斷標志
sbit RI = 0x98; //接收中斷標志
//--W77E58 Extensions--------------------------------------------
// PSW
sbit F1 = 0xd1;
//IE
sbit ET2 = 0xAD; //定時器2允許
sbit ES1 = 0xae; //串口1優先
//IP
sbit PT2 = 0xBD; //定時器2優先
sbit PS1 = 0xbe; //串口1優先
//P1
sbit T2 = 0x90; //計數器2輸入端口
sbit T2EX = 0x91; //計數器捕獲觸發
sbit RXD1 = 0x92; //串口1入
sbit TXD1 = 0x93; //串口2出
sbit INT2 = 0x94; //外中斷2,上跳變觸發
sbit INT3 = 0x95; //外中斷3,下跳變觸發
sbit INT4 = 0x96; //外中斷4,上跳變觸發
sbit INT5 = 0x97; //外中斷5,下跳變觸發
//T2CON
sbit TF2 = 0xCF; //定時器2溢出標志,軟清除
sbit EXF2 = 0xCE; //定時器2外部標志,當exen2=1且t2ex引腳負跳變引起捕獲或重載
//時置位,軟清。
sbit RCLK = 0xCD; //接收時鐘標志,=1時串口0用定時器2溢出做時鐘。
sbit TCLK = 0xCC; //發送時鐘標志,=1時串口0用定時器2溢出做時鐘。
sbit EXEN2 = 0xCB; //定時器2外部允許標志,=1時若未用作撥特率發生器,t2ex腳的負
跳變引起捕獲
sbit TR2 = 0xCA; //定時器2運行控制位
sbit C_T2 = 0xC9; //計數/定時選擇,=1時計數
sbit CP_RL= 0xC8; //捕獲/重載標志,=1時,外部允許時,vt2ex負跳變發生捕獲
//=0時 溢出或外部允許時,vt2ex負跳變發生重載
//SCON1
//注釋參考SCON
sbit SM0_1 = 0xC7;
sbit SM1_1 = 0xC6;
sbit SM2_1 = 0xC5;
sbit REN_1 = 0xC4;
sbit TB8_1 = 0xC3;
sbit RB8_1 = 0xC2;
sbit TI_1 = 0xC1;
sbit RI_1 = 0xC0;
//WDCON
sbit SMOD_1= 0xDF; //加倍串口1的撥特率,pro電源復位標志
sbit POR = 0xDE; //電源復位標志
sbit WDIF = 0XDB; //看門狗定時中斷標志,軟清
sbit WTRF = 0xDA; //看門狗定時器復位標志,看門狗引起復位后,該位置1
sbit EWT = 0xD9; //允許看門狗定時器自動復位
sbit RWT = 0xD8; //復位看門狗定時器,如果看門狗溢出還沒有被復位計
//數器,將會引起中斷,再過512周期將復位
//EIE
sbit EWDI = 0xec; //允許看門狗中斷
sbit EX5 = 0xeb; //ex5-ex2;外部中斷允許
sbit EX4 = 0xea;
sbit EX3 = 0xe9;
sbit EX2 = 0xe8;
//EIP
sbit PWDI = 0xfc; //pwdi=1 看門狗中斷優先
sbit PX5 = 0xfb; //px5-px2=1 外部中斷優先
sbit PX4 = 0xfa;
sbit PX3 = 0xf9;
sbit PX2 = 0xf8;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -