?? eeprom.lst
字號:
__text_start:
__start:
0033 E5CF LDI R28,0x5F
0034 E0D4 LDI R29,4
0035 BFCD OUT 0x3D,R28
0036 BFDE OUT 0x3E,R29
0037 51C0 SUBI R28,0x10
0038 40D0 SBCI R29,0
0039 EA0A LDI R16,0xAA
003A 8308 STD Y+0,R16
003B 2400 CLR R0
003C E6E8 LDI R30,0x68
003D E0F0 LDI R31,0
003E E010 LDI R17,0
003F 36E8 CPI R30,0x68
0040 07F1 CPC R31,R17
0041 F011 BEQ 0x0044
0042 9201 ST R0,Z+
0043 CFFB RJMP 0x003F
0044 8300 STD Z+0,R16
0045 E5EE LDI R30,0x5E
0046 E0F0 LDI R31,0
0047 E6A0 LDI R26,0x60
0048 E0B0 LDI R27,0
0049 E010 LDI R17,0
004A 36E6 CPI R30,0x66
004B 07F1 CPC R31,R17
004C F021 BEQ 0x0051
004D 95C8 LPM
004E 9631 ADIW R30,1
004F 920D ST R0,X+
0050 CFF9 RJMP 0x004A
0051 940E00C5 CALL _main
_exit:
0053 CFFF RJMP _exit
FILE: D:\YM200\內部EEPROM\main.c
(0001) /*內部EEPROM讀寫實驗,本實驗涉及數碼管串行顯示,建議在掌握數碼管串行顯示的
(0002) 基礎上,來學習本例程。本實驗可記錄系統啟動次數,每啟動一次,數碼管顯示數據
(0003) 加一,此數據保存于ATmega16內部EEPROM中。*/
(0004) #include <iom16v.h>
(0005) #include <macros.h>
(0006) #include <led.h>
(0007)
(0008) #define uchar unsigned char
(0009) #define uint unsigned int
(0010)
(0011) const uchar tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數碼管段碼
(0012) uchar buff[8]={0,0,0,0,0,0,0,0}; //8位顯示緩沖區
(0013)
(0014)
(0015) extern void EEPROM_write(unsigned int addr, unsigned char dd);
(0016) extern void EEPROM_read(unsigned int addr,unsigned char *dd);
(0017)
(0018) /*-------------------------------------------------------------------
(0019) delay :短延時函數
(0020) 輸入參數 x :粗略延時,x越大,延時越長
(0021) 輸出參數 :無
(0022) --------------------------------------------------------------------*/
(0023) void delay(unsigned int x)
(0024) {
(0025) while(x--);
_delay:
x --> R16
0054 0118 MOVW R2,R16
0055 5001 SUBI R16,1
0056 4010 SBCI R17,0
0057 2022 TST R2
0058 F7D9 BNE 0x0054
0059 2033 TST R3
005A F7C9 BNE 0x0054
005B 9508 RET
_L_delay:
y --> R20
005C 940E0125 CALL push_gset1
005E 01A8 MOVW R20,R16
(0026) }
(0027) /*------------------------------------------------------------------
(0028) L_delay :長延時函數
(0029) 輸入參數 y :粗略延時,y越大,延時越長
(0030) 輸出參數 :無
(0031) --------------------------------------------------------------------*/
(0032) void L_delay(unsigned int y)
(0033) {
005F C003 RJMP 0x0063
(0034) while(y--) delay(65000);
0060 EE08 LDI R16,0xE8
0061 EF1D LDI R17,0xFD
0062 DFF1 RCALL _delay
0063 011A MOVW R2,R20
0064 5041 SUBI R20,1
0065 4050 SBCI R21,0
0066 2022 TST R2
0067 F7C1 BNE 0x0060
0068 2033 TST R3
0069 F7B1 BNE 0x0060
006A 940E0128 CALL pop_gset1
006C 9508 RET
(0035) }
(0036) /*-----------------------------------------------------------
(0037) PORT_init :端口初始化函數
(0038) 輸入參數 :無
(0039) 輸出參數 :無
(0040) ------------------------------------------------------------*/
(0041) void PORT_init(void)
(0042) {
(0043) LED_DATA_DDR|=LED_NCS|LED_SCK|LED_MOSI; //設置為輸出
_PORT_init:
006D B38A IN R24,0x1A
006E 618C ORI R24,0x1C
006F BB8A OUT 0x1A,R24
(0044) LED_SEL_DDR |=LED_SELA|LED_SELB|LED_SELC; //設置為輸出
0070 B38A IN R24,0x1A
0071 6E80 ORI R24,0xE0
0072 BB8A OUT 0x1A,R24
(0045)
(0046) LED_DATA_PORT&=~(LED_NCS|LED_SCK|LED_MOSI); //輸出0
0073 B38B IN R24,0x1B
0074 7E83 ANDI R24,0xE3
0075 BB8B OUT 0x1B,R24
(0047) LED_SEL_PORT &=~(LED_SELA|LED_SELB|LED_SELC); //輸出0
0076 B38B IN R24,0x1B
0077 718F ANDI R24,0x1F
0078 BB8B OUT 0x1B,R24
(0048)
(0049) PORTC=0xff;
0079 EF8F LDI R24,0xFF
007A BB85 OUT 0x15,R24
(0050) DDRC=0x00;
007B 2422 CLR R2
007C BA24 OUT 0x14,R2
007D 9508 RET
_disp:
i --> R20
aa --> R22
j --> R10
007E 940E0121 CALL push_gset3
(0051) }
(0052) /*-----------------------------------------------------------
(0053) disp :數碼管顯示函數
(0054) 輸入參數 :無
(0055) 輸出參數 :無
(0056) ------------------------------------------------------------*/
(0057) void disp(void)
(0058) {
(0059) uchar aa,i,j;
(0060)
(0061) for(i=0;i<8;i++)
0080 2744 CLR R20
0081 C03D RJMP 0x00BF
(0062) {
(0063) aa=~tab[buff[7-i]];
0082 2E24 MOV R2,R20
0083 2433 CLR R3
0084 E0E7 LDI R30,7
0085 E0F0 LDI R31,0
0086 19E2 SUB R30,R2
0087 09F3 SBC R31,R3
0088 E680 LDI R24,0x60
0089 E090 LDI R25,0
008A 0FE8 ADD R30,R24
008B 1FF9 ADC R31,R25
008C 81E0 LDD R30,Z+0
008D 27FF CLR R31
008E E584 LDI R24,0x54
008F E090 LDI R25,0
0090 0FE8 ADD R30,R24
0091 1FF9 ADC R31,R25
0092 9164 LPM R22,0(Z)
0093 9560 COM R22
(0064) for(j=0;j<8;j++)
0094 24AA CLR R10
0095 C009 RJMP 0x009F
(0065) {
(0066) if((aa&0x80)!=0) LED_DATA_PORT|=LED_MOSI;
0096 FF67 SBRS R22,7
0097 C002 RJMP 0x009A
0098 9ADC SBI 0x1B,4
0099 C001 RJMP 0x009B
(0067) else LED_DATA_PORT&=~LED_MOSI;
009A 98DC CBI 0x1B,4
(0068) LED_DATA_PORT|=LED_SCK;
009B 9ADB SBI 0x1B,3
(0069) LED_DATA_PORT&=~LED_SCK; //產生移位信號
009C 98DB CBI 0x1B,3
(0070) aa=(aa<<1);
009D 0F66 LSL R22
009E 94A3 INC R10
009F 2D8A MOV R24,R10
00A0 3088 CPI R24,0x8
00A1 F3A0 BCS 0x0096
(0071) }
(0072) LED_SEL_PORT&=0x1f;
00A2 B38B IN R24,0x1B
00A3 718F ANDI R24,0x1F
00A4 BB8B OUT 0x1B,R24
(0073) LED_SEL_PORT+=(i<<5); //74HC138譯碼
00A5 2E24 MOV R2,R20
00A6 0C22 LSL R2
00A7 0C22 LSL R2
00A8 0C22 LSL R2
00A9 0C22 LSL R2
00AA 0C22 LSL R2
00AB B23B IN R3,0x1B
00AC 0C32 ADD R3,R2
00AD BA3B OUT 0x1B,R3
(0074)
(0075) LED_DATA_PORT|= LED_NCS;
00AE 9ADA SBI 0x1B,2
(0076) LED_DATA_PORT&=~LED_NCS; //數據輸出到并行口上
00AF 98DA CBI 0x1B,2
(0077)
(0078) delay(2000);
00B0 ED00 LDI R16,0xD0
00B1 E017 LDI R17,7
00B2 DFA1 RCALL _delay
(0079) for(j=0;j<8;j++) //使輸出置1
00B3 24AA CLR R10
00B4 C004 RJMP 0x00B9
(0080) {
(0081) LED_DATA_PORT|=LED_MOSI;
00B5 9ADC SBI 0x1B,4
(0082) LED_DATA_PORT|=LED_SCK;
00B6 9ADB SBI 0x1B,3
(0083) LED_DATA_PORT&=~LED_SCK;
00B7 98DB CBI 0x1B,3
00B8 94A3 INC R10
00B9 2D8A MOV R24,R10
00BA 3088 CPI R24,0x8
00BB F3C8 BCS 0x00B5
(0084) }
(0085) LED_DATA_PORT|= LED_NCS;
00BC 9ADA SBI 0x1B,2
(0086) LED_DATA_PORT&=~LED_NCS;
00BD 98DA CBI 0x1B,2
00BE 9543 INC R20
00BF 3048 CPI R20,0x8
00C0 F408 BCC 0x00C2
00C1 CFC0 RJMP 0x0082
00C2 940E011A CALL pop_gset3
00C4 9508 RET
_main:
aa --> Y+0
00C5 9721 SBIW R28,1
(0087) }
(0088) }
(0089) /*-----------------------------------------------------------
(0090) main :主函數
(0091) 輸入參數 :無
(0092) 輸出參數 :無
(0093) ------------------------------------------------------------*/
(0094) void main(void)
(0095) {
(0096) uchar aa;
(0097) PORT_init();
00C6 DFA6 RCALL _PORT_init
(0098) EEPROM_read(0x08, &aa);
00C7 019E MOVW R18,R28
00C8 E008 LDI R16,0x8
00C9 E010 LDI R17,0
00CA 940E00F9 CALL _EEPROM_read
(0099) PORTB=~aa;
00CC 8028 LDD R2,Y+0
00CD 9420 COM R2
00CE BA28 OUT 0x18,R2
(0100) aa++;
00CF 8188 LDD R24,Y+0
00D0 5F8F SUBI R24,0xFF
00D1 8388 STD Y+0,R24
(0101) EEPROM_write(0x08, aa);
00D2 2F28 MOV R18,R24
00D3 E008 LDI R16,0x8
00D4 E010 LDI R17,0
00D5 940E00F1 CALL _EEPROM_write
(0102)
(0103) buff[7]=aa%10;
00D7 E01A LDI R17,0xA
00D8 8108 LDD R16,Y+0
00D9 940E0102 CALL mod8u
00DB 93000067 STS 0x67,R16
(0104) buff[6]=(aa/10)%10;
00DD E01A LDI R17,0xA
00DE 8108 LDD R16,Y+0
00DF 940E0104 CALL div8u
00E1 E01A LDI R17,0xA
00E2 940E0102 CALL mod8u
00E4 93000066 STS 0x66,R16
(0105) buff[5]=aa/100;
00E6 E614 LDI R17,0x64
00E7 8108 LDD R16,Y+0
00E8 940E0104 CALL div8u
00EA 93000065 STS 0x65,R16
00EC C001 RJMP 0x00EE
(0106)
(0107) while(1)
(0108) {
(0109) disp();
00ED DF90 RCALL _disp
00EE CFFE RJMP 0x00ED
00EF 9621 ADIW R28,1
00F0 9508 RET
FILE: D:\YM200\內部EEPROM\EEPROM.c
(0001) #include <iom16v.h>
(0002) /*-----------------------------------------------------------
(0003) EEPROM_write :EEPROM單字節寫入
(0004) 輸入參數 addr :地址
(0005) dd :數據
(0006) 輸出參數 :無
(0007) ------------------------------------------------------------*/
(0008) void EEPROM_write(unsigned int addr, unsigned char dd)
(0009) {
(0010) while(EECR & (1<<EEWE)); //等待上一次寫操作結束
_EEPROM_write:
dd --> R18
addr --> R16
00F1 99E1 SBIC 0x1C,1
00F2 CFFE RJMP _EEPROM_write
(0011) EEAR = addr; //設置地址和數據寄存器
00F3 BB1F OUT 0x1F,R17
00F4 BB0E OUT 0x1E,R16
(0012) EEDR = dd;
00F5 BB2D OUT 0x1D,R18
(0013) EECR |= (1<<EEMWE); //置位EEMWE
00F6 9AE2 SBI 0x1C,2
(0014) EECR |= (1<<EEWE); //置位EEWE 以啟動寫操作
00F7 9AE1 SBI 0x1C,1
00F8 9508 RET
(0015) }
(0016) /*-----------------------------------------------------------
(0017) EEPROM_read :EEPROM單字節讀取
(0018) 輸入參數 addr :地址
(0019) dd :數據保存指針
(0020) 輸出參數 :無
(0021) ------------------------------------------------------------*/
(0022) void EEPROM_read(unsigned int uiAddress,unsigned char *ucData)
(0023) {
(0024) while(EECR & (1<<EEWE)); //等待上一次寫操作結束
_EEPROM_read:
ucData --> R18
uiAddress --> R16
00F9 99E1 SBIC 0x1C,1
00FA CFFE RJMP _EEPROM_read
(0025) EEAR = uiAddress; //設置地址寄存器
00FB BB1F OUT 0x1F,R17
00FC BB0E OUT 0x1E,R16
(0026) EECR |= (1<<EERE); //設置EERE 以啟動讀操作
00FD 9AE0 SBI 0x1C,0
(0027) *ucData=EEDR; //自數據寄存器返回數據
FILE: <library>
00FE B22D IN R2,0x1D
00FF 01F9 MOVW R30,R18
0100 8220 STD Z+0,R2
0101 9508 RET
mod8u:
0102 9468 BSET 6
0103 C001 RJMP xdiv8u
div8u:
0104 94E8 BCLR 6
xdiv8u:
0105 932A ST R18,-Y
0106 92FA ST R15,-Y
0107 92EA ST R14,-Y
0108 24FF CLR R15
0109 24EE CLR R14
010A E120 LDI R18,0x10
010B 0F00 LSL R16
010C 1CFF ROL R15
010D 1CEE ROL R14
010E 16E1 CP R14,R17
010F F010 BCS 0x0112
0110 1AE1 SUB R14,R17
0111 9503 INC R16
0112 952A DEC R18
0113 F7B9 BNE 0x010B
0114 F40E BRTC 0x0116
0115 2D0E MOV R16,R14
0116 90E9 LD R14,Y+
0117 90F9 LD R15,Y+
0118 9129 LD R18,Y+
0119 9508 RET
pop_gset3:
011A E0E4 LDI R30,4
011B 940C0129 JMP pop
push_gset5:
011D 92FA ST R15,-Y
011E 92EA ST R14,-Y
push_gset4:
011F 92DA ST R13,-Y
0120 92CA ST R12,-Y
push_gset3:
0121 92BA ST R11,-Y
0122 92AA ST R10,-Y
push_gset2:
0123 937A ST R23,-Y
0124 936A ST R22,-Y
push_gset1:
0125 935A ST R21,-Y
0126 934A ST R20,-Y
0127 9508 RET
pop_gset1:
0128 E0E1 LDI R30,1
pop:
0129 9149 LD R20,Y+
012A 9159 LD R21,Y+
012B FDE0 SBRC R30,0
012C 9508 RET
012D 9169 LD R22,Y+
012E 9179 LD R23,Y+
012F FDE1 SBRC R30,1
0130 9508 RET
0131 90A9 LD R10,Y+
0132 90B9 LD R11,Y+
0133 FDE2 SBRC R30,2
0134 9508 RET
0135 90C9 LD R12,Y+
0136 90D9 LD R13,Y+
0137 FDE3 SBRC R30,3
0138 9508 RET
0139 90E9 LD R14,Y+
013A 90F9 LD R15,Y+
013B 9508 RET
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -