?? eeprom.s
字號:
.module eeprom.c
.area text(rom, con, rel)
.dbfile E:\iccavr代碼\實驗16_片內EEPROM的使用\eeprom.c
.dbfunc e DelaymS _DelaymS fV
; j -> R20,R21
; k -> R22,R23
; i -> R16,R17
.even
_DelaymS::
rcall push_gset2
.dbline -1
.dbline 36
; //******************************************************************************
; // *
; // FileName : 實驗板eeprom片內.c ICCAVR V6.31A編譯 *
; // Function : 片內eeprom操作練習 *
; // Date : 2006-11-14 *
; // Version : 1.0 *
; // *
; // Author : 開關電源 hongtusy@163.com *
; // Company : 電子信息技術咨詢網 http://www.itsn.cn *
; // *
; //***************************描述與記事*****************************************
; //實驗板的AVR程序,片內eeprom操作練習,和計算機通訊,上電后首先發送保存在片內的數據
; //然后接收PC發送的數據并保存起來,然后讀取數據返回給pc,斷電后數據不丟失。
; //接線定義:將串口經rs232連接pc機 即PW6-7/8.
; //記事:本程序旨在對片內eeprom使用的理解與演示,程序適合初學者使用.
; //使用8MHz晶體。
; //******************************************************************************
;
; #include <iom8535v.h> //頭文件,ATmega8535單片機的寄存器定義
; #include <macros.h> //
;
; typedef unsigned char uchar;
; typedef unsigned int uint;
;
; #define BAUDRATE 9600 //波特率
; #define F_CPU 8000000 //系統晶體頻率
;
; /************************************************
; 函 數 名: DelaymS()
; 功 能: 毫秒級延時函數
; 輸入參數: 延遲時間/系統晶體
; 輸出參數: 做相應的延遲處理
; 描 述: /
; ***********************************************/
; void DelaymS (uint i) //延時函數,參數i為延時時間
; {
.dbline 38
; uint j,k; //雙重延時
; for (j=0;j<i;j++)
clr R20
clr R21
rjmp L5
L2:
.dbline 39
; {
.dbline 40
clr R22
clr R23
rjmp L9
L6:
.dbline 40
L7:
.dbline 40
subi R22,255 ; offset = 1
sbci R23,255
L9:
.dbline 40
ldi R24,500
ldi R25,1
cp R24,R22
cpc R25,R23
brsh L6
.dbline 41
L3:
.dbline 38
subi R20,255 ; offset = 1
sbci R21,255
L5:
.dbline 38
cp R20,R16
cpc R21,R17
brlo L2
.dbline -2
L1:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r j 20 i
.dbsym r k 22 i
.dbsym r i 16 i
.dbend
.dbfunc e Send_word _Send_word fV
; h -> R16
.even
_Send_word::
.dbline -1
.dbline 51
; for (k=0;k<=500;k++);
; }
; }
; /********************************************************
; 子程序名: Send_word()
; 功 能: 串口發送一個字節
; 輸入參數: /
; 輸出參數: /
; 描 述: 把數據發送出去先發送再檢測,發完后,才離開
; ********************************************************/
; void Send_word(uchar h)
; {
.dbline 52
; UDR = h; //發送一個字符數據
out 0xc,R16
L11:
.dbline 54
L12:
.dbline 53
; while(!(UCSRA&(1<<UDRE))) //1字節發送完畢?
sbis 0xb,5
rjmp L11
.dbline -2
L10:
.dbline 0 ; func end
ret
.dbsym r h 16 c
.dbend
.dbfunc e receive_word _receive_word fc
.even
_receive_word::
.dbline -1
.dbline 64
; ;
; }
; /********************************************************
; 子程序名: receive_word()
; 功 能: 串口接收一個字節數據
; 輸入參數: /
; 輸出參數: /
; 描 述: /
; ********************************************************/
; uchar receive_word (void)
; {
L15:
.dbline 66
L16:
.dbline 65
; while(!(UCSRA&(1<<RXC))) //1字節接收完成?
sbis 0xb,7
rjmp L15
.dbline 67
; ;
; return UDR; //輸出接收到的數據
in R16,0xc
.dbline -2
L14:
.dbline 0 ; func end
ret
.dbend
.dbfunc e mcu_Init _mcu_Init fV
.even
_mcu_Init::
.dbline -1
.dbline 77
; }
; /************************************************
; 函 數 名: Init_port()
; 功 能: 單片機初始化函數
; 輸入參數: /
; 輸出參數: /
; 描 述: 相關口方向的設置等
; ***********************************************/
; void mcu_Init(void)
; {
.dbline 78
; DDRD = 0xff;//PD口為推挽1輸出,位碼,PD7為485DE腳。口方向不影響串口。
ldi R24,255
out 0x11,R24
.dbline -2
L18:
.dbline 0 ; func end
ret
.dbend
.dbfunc e usart_Init _usart_Init fV
.even
_usart_Init::
.dbline -1
.dbline 88
; }
; /********************************************************
; 子程序名: usart_Init()
; 功 能: 串口初始化
; 輸入參數: /
; 輸出參數: /
; 描 述: /
; ********************************************************/
; void usart_Init (void)
; {
.dbline 89
; CLI(); //關閉中斷
cli
.dbline 90
; UBRRL= (F_CPU/BAUDRATE/16-1)%256;
ldi R24,51
out 0x9,R24
.dbline 91
; UBRRH= (F_CPU/BAUDRATE/16-1)/256;
clr R2
out 0x20,R2
.dbline 93
; //UBRRL=51; //波特率寄存器,UART:9600bps,8.000MHz
; UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE); //接收結束中斷使能,RXD&TXD使能
ldi R24,152
out 0xa,R24
.dbline 94
; UCSRC = (1<<URSEL)|(1<<UPM1)|(1<<UCSZ0)|(1<<UCSZ1);
ldi R24,166
out 0x20,R24
.dbline -2
L19:
.dbline 0 ; func end
ret
.dbend
.dbfunc e EEPROM_write _EEPROM_write fV
; uData -> R18
; uAddr -> R16,R17
.even
_EEPROM_write::
.dbline -1
.dbline 106
; //訪問UCSRC寄存器,偶校驗,8個數據位,默認一個停止位,
; //SEI(); //開全局中斷使能
; }
; /********************************************************
; 子程序名: EEPROM_write
; 功 能: 寫一字節數據到片內指定地址單元
; 輸入參數: /
; 輸出參數: /
; 描 述: /
; ********************************************************/
; void EEPROM_write(uint uAddr,uchar uData)
; {
.dbline 107
; EEAR = uAddr; //寫操作的16位地址寄存器
out 0x1f,R17
out 0x1e,R16
.dbline 108
; EEDR = uData; //寫數據到數據寄存器
out 0x1d,R18
.dbline 109
; EECR |= (1<<EEMWE); //允許EEPROM操作
sbi 0x1c,2
.dbline 110
; EECR |= (1<<EEWE); //開始寫操作
sbi 0x1c,1
L21:
.dbline 112
L22:
.dbline 111
; while (EECR & (1<<EEWE)) //等待寫操作完成
sbic 0x1c,1
rjmp L21
.dbline -2
L20:
.dbline 0 ; func end
ret
.dbsym r uData 18 c
.dbsym r uAddr 16 i
.dbend
.dbfunc e EEPROM_read _EEPROM_read fc
; uAddr -> R16,R17
.even
_EEPROM_read::
.dbline -1
.dbline 122
; ;
; }
; /********************************************************
; 子程序名: EEPROM_read
; 功 能: 從片內指定地址單元讀一字節數據
; 輸入參數: /
; 輸出參數: /
; 描 述: /
; ********************************************************/
; uchar EEPROM_read(uint uAddr)
; {
L25:
.dbline 124
L26:
.dbline 123
; while (EECR & (1<<EEWE)) //等待前一次寫操作完成
sbic 0x1c,1
rjmp L25
.dbline 125
; ;
; EEAR = uAddr; //寫操作的16位地址寄存器
out 0x1f,R17
out 0x1e,R16
.dbline 126
; EECR |= (1<<EERE); //開始讀操作
sbi 0x1c,0
.dbline 127
; return EEDR; //輸出讀出的數據
in R16,0x1d
.dbline -2
L24:
.dbline 0 ; func end
ret
.dbsym r uAddr 16 i
.dbend
.dbfunc e main _main fV
; temp -> <dead>
; i -> R20
; k -> R22
; j -> R20
.even
_main::
.dbline -1
.dbline 131
; }
; //*****************主程序**********************************
; void main (void)
; {
.dbline 133
; uchar temp,i,j,k;
; mcu_Init(); //單片機初始化
rcall _mcu_Init
.dbline 134
; usart_Init(); //串口初始化
rcall _usart_Init
.dbline 135
; i=EEPROM_read(0x10); //讀片內EEPROM地址為0x10的數據,
ldi R16,16
ldi R17,0
rcall _EEPROM_read
mov R20,R16
.dbline 136
; Send_word(i); //發送數據到PC,這個數是掉電前保存的。
rcall _Send_word
rjmp L30
L29:
.dbline 138
.dbline 139
rcall _receive_word
mov R20,R16
.dbline 140
mov R18,R20
ldi R16,16
ldi R17,0
rcall _EEPROM_write
.dbline 142
ldi R16,16
ldi R17,0
rcall _EEPROM_read
mov R22,R16
.dbline 143
rcall _Send_word
.dbline 144
L30:
.dbline 137
rjmp L29
X0:
.dbline -2
L28:
.dbline 0 ; func end
ret
.dbsym l temp 1 c
.dbsym r i 20 c
.dbsym r k 22 c
.dbsym r j 20 c
.dbend
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -