亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? function.c

?? 51單片機C語言常用模塊與綜合系統設計實例精講
?? C
字號:
#include <./Atmel/at89x52.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
#include <string.h>
#include "source.h"
#define FSUCCESS 0
#define FERROR   1  
#define FDOVER   2
bit TDBdata_over;
unsigned char dst_buf[DST_LEN];/*為數據傳輸口的發送緩沖區.*/
unsigned char dst_head;        /*為目前要發送數據存儲的位置*/
unsigned char dst_tail;        /*為真正發送數據存儲的位置,當head和tail相等時表明發送數據緩沖區無數據*/
unsigned char dsr_buf[DSR_LEN];/*接收數據緩沖區*/
unsigned char dsr_head;        /*從串口接收到的數據存儲的位置*/
unsigned char dsr_tail;        /*從串口接收緩沖區讀取數據的位置,當tail和head相等時間標兵接收緩沖區無數據*/
void delay_macnine_ncircle(unsigned char cnt){//11+6*cnt machin circle.
	while(cnt--);
}
void delay_10us(unsigned char tus){/*在C51時鐘的頻率為18.432MHZ時,延時10微秒*/
	tus--;
	while(tus--){
		_nop_();_nop_();_nop_();
		_nop_();_nop_();_nop_();
		_nop_();_nop_();_nop_();
	}
}
void print_sbuf(unsigned char c){/*向串口發送緩沖區中寫數據*/
	dst_buf[dst_head]=c; 
	dst_head ++;
	dst_head %=DST_LEN; 
}
#define REPLAY_LEN 9
void reply_dwn(unsigned char flag,unsigned char *rbuf){/*rbuf 是下載的數據的指針,此函數是對下載的數據進行應答*/
	unsigned char reply[REPLAY_LEN];
	struct  yushi rply_crc;
	unsigned char i;
	reply[0]=FDWN_FHD;
	reply[1]=flag;
	reply[2]=rbuf[2];
	reply[3]=rbuf[3];
	reply[4]=rbuf[4];
	reply[5]=0x00;
	reply[6]=0x00;
	init_crccheck(&rply_crc);
	for(i=0;i<7;i++){
		crccheck(reply[i],&rply_crc);
	}
	reply[7]=rply_crc.h;
	reply[8]=rply_crc.l;
	for(i=0;i<REPLAY_LEN;i++){	
		print_sbuf(*(reply+i));
	}
	TI=1;
}
#define ERASE_SECTOR 
void flash_download(void){/*數據下載,等在數據下載完畢后此函數才退出*/
	union SFADD   dwn_adres;
	unsigned char fdata[FDWN_LEN];
	unsigned char fsm_fdl;
	unsigned char cnt;
	unsigned char erase_sec=0;
	unsigned int  sector_section=0;
	unsigned char temp;
	struct yushi fcrc;
	fsm_fdl=0;
	while(1){/*進入死循環,只有計算機把所有的數據下載完畢才推出*/
		if(dsr_tail!=dsr_head){/*串口接收緩沖區中有數據*/	
			if(fsm_fdl==0){/*串口接收在尋找幀頭(0X7E)的狀態*/
				if(dsr_buf[dsr_tail]==FDWN_FHD){/*串口接收的數據是幀頭*/
					fsm_fdl=1;/*把串口接收的狀態設置為接收數據*/
					fdata[0]=FDWN_FHD;/*把接收到的字節存儲在接收的數據中*/
					cnt=1;
				}
			}
			else if(fsm_fdl==1){/*串口的狀態在接受數據狀態*/
				if(cnt<FDWN_LEN-1){/*135個字節的幀還沒有接收完畢*/
						fdata[cnt]=dsr_buf[dsr_tail];
						cnt++;
				}
				else{/*一幀數據接收完畢*/
					fdata[cnt]=dsr_buf[dsr_tail];
					if(1){//mult_crccheck(fdata,FDWN_LEN,struct &fcrc)==0){/*由于串口出錯的概率比較小,沒有進行CRC效驗*/
						dwn_adres.c[1]=fdata[2];/*提取出要寫到flash的地址字節*/
						dwn_adres.c[2]=fdata[3];
						dwn_adres.c[3]=fdata[4];
#ifdef ERASE_SECTOR
						sector_section=dwn_adres.c[1];/*把地址字節轉化為扇區地址*/
						sector_section <<=8;
						sector_section &=0xff00;
						sector_section |=dwn_adres.c[2];
						sector_section >>=5;
						if(((dwn_adres.c[2]&0x1f)==0x00)&&(dwn_adres.c[3]==0x00)){/*如果A0~A11為0,那么就表明要寫的數據跨越扇區了,需要對扇區進行擦除*/
 					    if(sector_section<8){/*是扇區0~7(SA0~SA7)*/
								erase_sec=(unsigned char)sector_section;/*設置要擦除的扇區*/
								delay_10us(15);
								if(erase_sector(erase_sec)){/*返回1表明擦除成功*/
								}
								else{
									reply_dwn(erase_sec,fdata);
								}
							}
							else if((sector_section&0x7)==0){/*表明要跨越64K字節大小的扇區,扇區是SA8-SA70*/
								sector_section >>=3;
								erase_sec=(unsigned char)(sector_section&0xff);
								erase_sec +=7;/*計算出要擦除的扇區*/
								delay_10us(15);
								if(erase_sector(erase_sec)){/*返回1表明擦除成功*/
								}
								else{
									reply_dwn(erase_sec,fdata);
								}
							}
						}
#endif
						for(cnt=0;cnt<128;cnt++){/*把128字節的數據寫到Flash中*/
							write_flash(&dwn_adres,fdata[5+cnt]);
							dwn_adres.l ++;/*沒寫一個字節,寫falsh的地址增加1*/
						}
						if(fdata[1]==0x00){/*收到計算機的是數據下載類型,返回接收數據成功*/
							reply_dwn(FSUCCESS,fdata);
						}
						else if(fdata[1]==0x01){/*計算機通知所有數據下載完畢*/
							reply_dwn(FDOVER,fdata);/*對幀進行應答*/
							return;/*函數返回*/
						}
					}
					else{//CRC error
						reply_dwn(FERROR,fdata);
					}
					fsm_fdl=0;/*繼續搜索下一幀的幀頭*/					
				}
			}	
			dsr_tail++;
			dsr_tail %=DSR_LEN;
		}
		else{/*等待串口中斷接收新的數據到數據接收緩沖區中*/
		}
	}
}

void init_serial(void)/*串行異步口初始化*/
{ 
    unsigned char ch;
   	SCON = 0x50;    // SCON /    MODE 1              /* setup serial port control /
    ch=TMOD;
	ch=ch&0x0f;
	TMOD=ch|0x20;       
	PCON=0XF0; // DIV 16
#ifdef FOSC18432
  	TH1=251;
  	TH0=TH1; /**hardware (19.2k baud @18.432)***/
	TR1=1; // let timer 1 run      // TCON /
#else
#ifdef FOSC24M
  	TH1=243;
  	TH0=TH1; /**hardware (9.6k baud @24M) infect is 9.61k*/
	TR1=1; // let timer 1 run      // TCON /
#else 
    //nothing 
#endif
#endif
	ES=1;//serial interrupt
}
#define ULWRCYCLE   FLASHADD=0X00;XBYTE[0X4AAA]=0XAA;XBYTE[0X4555]=0X55    /*Flash的非鎖定寫周期*/
#define WRITE_CMD 	ULWRCYCLE;FLASHADD=0X00;XBYTE[0X4AAA]=0XA0            /*Flash的寫命令*/
#define ERASE_CMD   ULWRCYCLE;FLASHADD=0X00;XBYTE[0X4AAA]=0X80;ULWRCYCLE  /*Flash的擦除扇區命令*/
#define ERASE_CHIP  ERASE_CMD;FLASHADD=0X00;XBYTE[0X4AAA]=0X10            /*Flash的擦除整個芯片命令*/
bit erase_sector(unsigned char sa){/*扇區擦除命令,參數sa為要擦除的扇區為0~70*/
	unsigned int n;
	unsigned char cnt;
	unsigned char temp;
	unsigned char rybystat;
	ERASE_CMD;
	temp=sa;
	if(sa<8){/*是flash中的boot扇區,每個扇區的大小為8K字節*/
		cnt=temp;
		temp >>=1;
		FLASHADD=temp;
		if(cnt%2){/*扇區不同扇區的扇區地址是不同的*/
			XBYTE[0X2000+FLASH_MEM_SPACE_START]=0X30;/*擦除扇區命令*/
		}
		else{
			XBYTE[FLASH_MEM_SPACE_START]=0X30;/*擦除扇區命令*/
		}
	}
	else{/*是每個扇區為64K字節的扇區*/
		cnt=temp-7;
		temp=cnt <<2;
		FLASHADD=temp;
		XBYTE[FLASH_MEM_SPACE_START]=0X30;/*擦除扇區命令*/
	}	
	rybystat=FLASHRYNBY;
	for(n=0;n<2000;n++){/*如果RY/BY#管腳變低,表明擦除命令真正開始*/
		if(rybystat&0x01==0x00){//start erase.				
			goto my_exit;//break;
		}
		rybystat=FLASHRYNBY;
	}
my_exit:
	while(1){
		rybystat=FLASHRYNBY;
		if(rybystat&0x01==0x01){/*如果RY/BY#變低表明擦除完畢*/	
			break;
		}
	}
	if(n>=2000){/*擦除命令由于某種原因不能開始,退出程序*/
		return 0;
	}
	return 1;
}
void erase_flash(unsigned char flag,unsigned char sa){/*flag為0,擦除整個芯片,flag為1,擦除sa指定的扇區,可以由外部命令調用*/
	unsigned char cnt;
	unsigned char temp;
	unsigned char rybystat;
	if(flag==0){
		ERASE_CHIP;/*擦除整個芯片*/
	}
	else{
		ERASE_CMD;
		temp=sa;
		if(sa<8){//this is boot sector and is 8k pre sector.
			cnt=temp;
			temp >>=1;
			FLASHADD=temp;
			if(cnt%2){
				XBYTE[0X2000+FLASH_MEM_SPACE_START]=0X30;//erase sector of flash cmd.
			}
			else{
				XBYTE[FLASH_MEM_SPACE_START]=0X30;//erase sector of flash cmd.
			}
		}
		else{//it is 64k pre sector.
			cnt=temp-7;
			temp=cnt <<2;
			FLASHADD=temp;
			XBYTE[FLASH_MEM_SPACE_START]=0X30;//erase sector of flash cmd.
		}	
	}
	for(cnt=0;cnt<250;cnt++){
			rybystat=FLASHRYNBY;
			if((rybystat&0x01)==0x00){/*擦除開始*/
				goto exit_for;
			}
	}
exit_for:
	if(cnt>=250){/*擦除出錯*/
	}
	else{
		while(1){
			rybystat=FLASHRYNBY;
			if((rybystat&0x01)==0x01){/*擦除完成*/	
				break;
			}
			else{
				cnt++;/*正在擦除中*/
			}
		}
	}
}
void write_flash(union SFADD  *p_add,unsigned char dat){/*向p_add指向的地址中寫數據dat*/
    unsigned int flashspace;
	union SFADD   dwn_adres;
	dwn_adres.l=p_add->l;
	flashspace=dwn_adres.i[1];
	flashspace &=0x3fff;
	flashspace +=FLASH_MEM_SPACE_START;
	dwn_adres.l <<=2;	
    WRITE_CMD;
    FLASHADD=dwn_adres.c[1];
    XBYTE[flashspace]=dat;
}
void read_flash(unsigned char hadd,unsigned int ladd,unsigned char len,unsigned char *buf){/*從flash的hadd和ladd組成地址中讀取len個數據到buf中*/
    unsigned char cnt;	
    unsigned int flashspace;
    flashspace=0x4000;
    flashspace +=ladd&0x3fff;
    FLASHADD=hadd;
    for(cnt=0;cnt<len;cnt++){
        buf[cnt]=XBYTE[flashspace+cnt];
    }
}
void draw_picture(unsigned char orgx,unsigned int orgy){/*把存儲在flash中的圖片使用顯示出來*/
	unsigned char row;
	unsigned int basex;
	unsigned int ladd;
	union SFADD offset;
	basex=0x8000+SCREEN_WIDTH*orgy+orgx;/*在顯存儲中的位置*/
	offset.l=FLASH_ADD_PICTURE_START;   /*圖片在flash中的位置*/
	ladd=offset.i[1];
	ladd &=0x3fff;
	ladd |=FLASH_MEM_SPACE_START;      /*把圖片在flash中的位置轉換為單片機能表示的尋址的地址*/
	offset.l <<=2;                     /*flash地址的A0~A13*/
	FLASHADD=offset.c[1];             /*flash地址的A14~A21地址*/
	for(row=0;row<PICTURE_HEIGHT;row++){/*約定存儲的圖片寬度為PICTURE_WIDTH*8 高度為PICTURE_HEIGHT*/
		memcpy((unsigned char *)basex,(unsigned char *)ladd,PICTURE_WIDTH);/*顯示圖片中的一行,相當于寫1行圖片數據到顯存中*/
		ladd +=PICTURE_WIDTH;/*圖片數據指向下一行*/
		basex +=SCREEN_WIDTH;/*顯存指向下一行*/
	}
	
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
夜夜亚洲天天久久| 日本欧美一区二区| 亚洲h动漫在线| 国产很黄免费观看久久| 在线不卡免费av| 亚洲色图色小说| 国内精品伊人久久久久影院对白| 欧美性一区二区| 中文一区二区完整视频在线观看| 日本不卡一二三| 欧美日韩免费一区二区三区视频| 欧美国产日本韩| 国产一区二区三区电影在线观看| 欧美日韩国产系列| 亚洲人成网站影音先锋播放| 国内偷窥港台综合视频在线播放| 欧美一区二区福利在线| 午夜a成v人精品| 在线精品视频小说1| 综合分类小说区另类春色亚洲小说欧美 | 欧美美女网站色| 有坂深雪av一区二区精品| 国产电影精品久久禁18| 日韩欧美卡一卡二| 麻豆国产91在线播放| 日韩限制级电影在线观看| 亚洲大片在线观看| 欧美日韩国产美| 五月综合激情网| 欧美精品视频www在线观看| 天堂影院一区二区| 911国产精品| 蜜桃传媒麻豆第一区在线观看| 欧美性色黄大片| 亚洲一区二区高清| 在线看国产日韩| 亚洲va中文字幕| 91精品国产欧美一区二区成人| 日韩国产在线观看一区| 91精品国产高清一区二区三区蜜臀| 婷婷夜色潮精品综合在线| 欧美高清性hdvideosex| 奇米影视一区二区三区小说| 久久夜色精品国产噜噜av| 国产精品系列在线观看| 国产日产欧美一区二区三区| 福利一区二区在线| 亚洲欧美在线另类| 欧美猛男gaygay网站| 蜜桃av噜噜一区二区三区小说| 久久综合九色综合欧美就去吻| 久草精品在线观看| 国产精品黄色在线观看| 精品婷婷伊人一区三区三| 日本aⅴ免费视频一区二区三区| 欧美成人一区二区| 成人永久aaa| 亚洲成人一区二区在线观看| 日韩欧美一区在线| 成人高清视频在线| 亚洲一区二区三区四区中文字幕| 日韩欧美www| 99久久夜色精品国产网站| 性欧美大战久久久久久久久| 精品国产髙清在线看国产毛片| 白白色亚洲国产精品| 一区二区三区欧美久久| 欧美成人欧美edvon| 波多野结衣的一区二区三区| 日韩一区精品视频| 中文字幕欧美激情| 日韩一区二区精品在线观看| 成人av手机在线观看| 另类小说综合欧美亚洲| 中文字幕一区二区三| 日韩女优av电影在线观看| www.日韩av| 国产精品资源在线看| 亚洲综合一区二区| 亚洲国产经典视频| 欧美一区二区三区在线观看| 色婷婷激情久久| 国产黄人亚洲片| 麻豆国产精品视频| 亚洲18色成人| 一个色综合av| 中文字幕在线不卡| 26uuu久久天堂性欧美| 在线不卡中文字幕| 欧美性受xxxx黑人xyx性爽| 波多野结衣在线aⅴ中文字幕不卡| 日本中文在线一区| 亚洲电影激情视频网站| 一区二区中文视频| 国产精品家庭影院| 国产日本欧洲亚洲| 精品第一国产综合精品aⅴ| 欧美喷潮久久久xxxxx| 91老师片黄在线观看| 成人妖精视频yjsp地址| 国产自产2019最新不卡| 捆绑调教美女网站视频一区| 午夜久久电影网| 亚洲国产欧美在线| 亚洲另类在线制服丝袜| 中文字幕制服丝袜成人av| 久久久精品影视| 国产香蕉久久精品综合网| 精品av久久707| 精品国产sm最大网站| 91精品国产综合久久婷婷香蕉| 欧美午夜精品电影| 欧美在线影院一区二区| 在线视频你懂得一区| 在线视频亚洲一区| 欧美日韩国产中文| 欧美日韩美少妇| 91精品国产综合久久久蜜臀图片| 69堂亚洲精品首页| 欧美成人一区二区三区片免费| 亚洲精品在线网站| 国产日韩欧美麻豆| 亚洲国产成人自拍| 亚洲美女电影在线| 午夜精品久久一牛影视| 亚瑟在线精品视频| 韩国精品在线观看| 国产xxx精品视频大全| 黄页视频在线91| 精品国产欧美一区二区| 精品精品欲导航| 国产三级精品在线| 亚洲欧美自拍偷拍| 亚洲一二三四区| 麻豆freexxxx性91精品| 国产精品亚洲а∨天堂免在线| 国产精品亚洲综合一区在线观看| 国产91在线观看丝袜| 91免费观看在线| 91精品国产综合久久婷婷香蕉| 精品国产一区二区三区四区四| 欧美韩国一区二区| 一区二区欧美视频| 久久成人免费电影| 97久久精品人人做人人爽 | 欧美日韩黄视频| 久久久噜噜噜久噜久久综合| 亚洲欧美激情插| 久久99久久99小草精品免视看| 成人免费视频国产在线观看| 欧美午夜在线观看| 中文字幕不卡三区| 久久99精品久久久| 男女性色大片免费观看一区二区| 狠狠色综合日日| 色婷婷综合久久久久中文 | 91美女片黄在线观看| 91精品欧美久久久久久动漫| 国产精品毛片a∨一区二区三区| 亚洲在线免费播放| 国产九色精品成人porny| 在线观看视频欧美| 国产午夜精品一区二区三区嫩草 | 欧美图区在线视频| 国产午夜精品一区二区| 亚洲成年人影院| 高清不卡一二三区| 日韩精品一区二区三区中文不卡 | 国产亚洲成年网址在线观看| 欧美日精品一区视频| 欧美一区二区精品| 亚洲精品日日夜夜| 精品一区二区国语对白| 91福利在线看| 国产精品精品国产色婷婷| 九一久久久久久| 欧美酷刑日本凌虐凌虐| 亚洲视频一区在线| 东方aⅴ免费观看久久av| 日韩免费高清av| 日韩电影在线观看一区| 在线精品视频一区二区三四| 国产精品剧情在线亚洲| 国产一区二区三区黄视频 | 成人看片黄a免费看在线| 欧美变态tickle挠乳网站| 精品免费视频一区二区| 亚洲gay无套男同| 欧美中文字幕一区二区三区亚洲| 中文字幕精品综合| 盗摄精品av一区二区三区| 久久老女人爱爱| 激情丁香综合五月| 欧美第一区第二区| 久久精品国产亚洲5555| 欧美一区二区三区视频免费| 日本欧美肥老太交大片| 日韩你懂的在线观看| 激情六月婷婷综合| 国产日韩欧美不卡在线|