📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~2\icc\019-TEST\main.c
0000 .dbfunc e main _main fV
0000 ; temp -> y+0
.even
0000 _main::
0000 2197 sbiw R28,1
0002 .dbline -1
0002 .dbline 23
0002 ; /*
0002 ; 实验十三:
0002 ;
0002 ; AVR单片机I2C总线实验。
0002 ; 1、用24C02记录CPU启动次数,并在PB口上显示出来。
0002 ; 2、内部1 M晶振,程序采用单任务方式,软件延时。
0002 ; 3、进行此实验请插上JP1的所有8个短路块,JP7(LED_EN)/PC0/PC1短路块。
0002 ; 4、通过此实验,可以I2C总线操作有个初步认识。
0002 ;
0002 ; AVR mega16学习板
0002 ; www.iccavr.com
0002 ; 14:42 2007-4-9
0002 ; */
0002 ;
0002 ; #include "iom16v.h"
0002 ; #include "beep.h"
0002 ; #include "delay.h"
0002 ; #include "ds1302.h"
0002 ; #include "spi.h"
0002 ; #include "twi.h"
0002 ; #include "uart.h"
0002 ;
0002 ; void main(void) {
0002 .dbline 27
0002 ;
0002 ; unsigned char temp;
0002 ;
0002 ; PORTA = 0xFF; /*打开上拉*/
0002 8FEF ldi R24,255
0004 8BBB out 0x1b,R24
0006 .dbline 28
0006 ; DDRA = 0x00; /*方向输入*/
0006 2224 clr R2
0008 2ABA out 0x1a,R2
000A .dbline 29
000A ; PORTB = 0xFF; /*电平设置*/
000A 88BB out 0x18,R24
000C .dbline 30
000C ; DDRB = 0xFF; /*方向输出*/
000C 87BB out 0x17,R24
000E .dbline 31
000E ; PORTC = 0xFF;
000E 85BB out 0x15,R24
0010 .dbline 32
0010 ; DDRC = 0x00;
0010 24BA out 0x14,R2
0012 .dbline 33
0012 ; PORTD = 0xFF;
0012 82BB out 0x12,R24
0014 .dbline 34
0014 ; DDRD = 0x20;
0014 80E2 ldi R24,32
0016 81BB out 0x11,R24
0018 .dbline 37
0018 ;
0018 ; /*蜂鸣器测验试*/
0018 ; delay_ms(100);
0018 04E6 ldi R16,100
001A 10E0 ldi R17,0
001C 0E940000 xcall _delay_ms
0020 .dbline 38
0020 ; beep(300);
0020 0CE2 ldi R16,300
0022 11E0 ldi R17,1
0024 0E940000 xcall _beep
0028 .dbline 41
0028 ;
0028 ; /*按键及指示灯测试*/
0028 ; delay_ms(1000);
0028 08EE ldi R16,1000
002A 13E0 ldi R17,3
002C 0E940000 xcall _delay_ms
0030 10C0 xjmp L3
0032 L2:
0032 .dbline 42
0032 ; while (1) {
0032 .dbline 43
0032 ; temp = PINA; /*提取按键*/
0032 29B2 in R2,0x19
0034 2882 std y+0,R2
0036 .dbline 44
0036 ; if (temp != 0xFF) {
0036 822D mov R24,R2
0038 8F3F cpi R24,255
003A 41F0 breq L5
003C .dbline 44
003C .dbline 45
003C ; PORTB = temp; /*显示按键值*/
003C 88BB out 0x18,R24
003E .dbline 46
003E ; beep(200);
003E 08EC ldi R16,200
0040 10E0 ldi R17,0
0042 0E940000 xcall _beep
0046 L7:
0046 .dbline 47
0046 L8:
0046 .dbline 47
0046 ; while (PINA != 0xFF); /*等待按键松开*/
0046 89B3 in R24,0x19
0048 8F3F cpi R24,255
004A E9F7 brne L7
004C .dbline 48
004C ; }
004C L5:
004C .dbline 49
004C ; if ((PIND & 0x04) == 0x00) { /*INT键退出*/
004C 8299 sbic 0x10,2
004E 01C0 rjmp L10
0050 .dbline 49
0050 .dbline 50
0050 ; break;
0050 01C0 xjmp L4
0052 L10:
0052 .dbline 52
0052 L3:
0052 .dbline 42
0052 EFCF xjmp L2
0054 L4:
0054 .dbline 55
0054 ; }
0054 ; }
0054 ;
0054 ; /*SPI总线HC595芯片测试*/
0054 ; PORTB = 0xEF;
0054 8FEE ldi R24,239
0056 88BB out 0x18,R24
0058 .dbline 56
0058 ; delay_ms(3000);
0058 08EB ldi R16,3000
005A 1BE0 ldi R17,11
005C 0E940000 xcall _delay_ms
0060 .dbline 57
0060 ; SPI_MasterInit(); /*初始SPI接口*/
0060 0E940000 xcall _SPI_MasterInit
0064 .dbline 58
0064 ; PORTB = 0xF0; /*打开4位数码管*/
0064 80EF ldi R24,240
0066 88BB out 0x18,R24
0068 .dbline 59
0068 2224 clr R2
006A 2882 std y+0,R2
006C 10C0 xjmp L15
006E L12:
006E .dbline 59
006E .dbline 60
006E 80E0 ldi R24,<_disp
0070 90E0 ldi R25,>_disp
0072 E881 ldd R30,y+0
0074 FF27 clr R31
0076 E80F add R30,R24
0078 F91F adc R31,R25
007A 0081 ldd R16,z+0
007C 0E940000 xcall _SPI_595_Out
0080 .dbline 61
0080 04EF ldi R16,500
0082 11E0 ldi R17,1
0084 0E940000 xcall _delay_ms
0088 .dbline 62
0088 L13:
0088 .dbline 59
0088 8881 ldd R24,y+0
008A 8F5F subi R24,255 ; addi 1
008C 8883 std y+0,R24
008E L15:
008E .dbline 59
008E ; for (temp = 0; temp < 10; temp ++) {
008E 8881 ldd R24,y+0
0090 8A30 cpi R24,10
0092 68F3 brlo L12
0094 .dbline 63
0094 ; SPI_595_Out(disp[temp]); /*显示数据输出*/
0094 ; delay_ms(500);
0094 ; }
0094 ; SPCR = 0x00; /*关闭SPI接口*/
0094 2224 clr R2
0096 2DB8 out 0xd,R2
0098 .dbline 66
0098 ;
0098 ; /*IIC总线24C02芯片测试*/
0098 ; PORTB = 0xDF;
0098 8FED ldi R24,223
009A 88BB out 0x18,R24
009C .dbline 67
009C ; delay_ms(3000);
009C 08EB ldi R16,3000
009E 1BE0 ldi R17,11
00A0 0E940000 xcall _delay_ms
00A4 .dbline 68
00A4 ; twi_write(0x08, 0x55); /*写入标志*/
00A4 25E5 ldi R18,85
00A6 08E0 ldi R16,8
00A8 0E940000 xcall _twi_write
00AC .dbline 69
00AC ; delay_ms(10);
00AC 0AE0 ldi R16,10
00AE 10E0 ldi R17,0
00B0 0E940000 xcall _delay_ms
00B4 .dbline 70
00B4 ; twi_read(0x08, &temp); /*读出标志*/
00B4 9E01 movw R18,R28
00B6 08E0 ldi R16,8
00B8 0E940000 xcall _twi_read
00BC .dbline 71
00BC ; delay_ms(500);
00BC 04EF ldi R16,500
00BE 11E0 ldi R17,1
00C0 0E940000 xcall _delay_ms
00C4 .dbline 72
00C4 ; if (temp == 0x55) { /*校验标志*/
00C4 8881 ldd R24,y+0
00C6 8535 cpi R24,85
00C8 29F4 brne L16
00CA .dbline 72
00CA .dbline 73
00CA ; beep(300);
00CA 0CE2 ldi R16,300
00CC 11E0 ldi R17,1
00CE 0E940000 xcall _beep
00D2 .dbline 74
00D2 ; }
00D2 04C0 xjmp L17
00D4 L16:
00D4 .dbline 75
00D4 ; else {
00D4 .dbline 76
00D4 ; beep(1500);
00D4 0CED ldi R16,1500
00D6 15E0 ldi R17,5
00D8 0E940000 xcall _beep
00DC .dbline 77
00DC ; }
00DC L17:
00DC .dbline 80
00DC ;
00DC ; /*DS302芯片测试*/
00DC ; PORTB = 0xBF;
00DC 8FEB ldi R24,191
00DE 88BB out 0x18,R24
00E0 .dbline 81
00E0 ; delay_ms(1000);
00E0 08EE ldi R16,1000
00E2 13E0 ldi R17,3
00E4 0E940000 xcall _delay_ms
00E8 .dbline 82
00E8 ; ds1302_init(); /*初始化DS302*/
00E8 0E940000 xcall _ds1302_init
00EC .dbline 83
00EC ; time_buf[5] = 0x55;
00EC 85E5 ldi R24,85
00EE 80930500 sts _time_buf+5,R24
00F2 .dbline 84
00F2 ; time_buf[6] = 0x00;
00F2 2224 clr R2
00F4 20920600 sts _time_buf+6,R2
00F8 .dbline 85
00F8 ; ds1302_write_time(); /*写入标志*/
00F8 0E940000 xcall _ds1302_write_time
00FC .dbline 86
00FC ; delay_ms(2000);
00FC 00ED ldi R16,2000
00FE 17E0 ldi R17,7
0100 0E940000 xcall _delay_ms
0104 .dbline 87
0104 ; ds1302_read_time(); /*读出标志*/
0104 0E940000 xcall _ds1302_read_time
0108 .dbline 88
0108 ; if ((time_buf[5] == 0x55) && (time_buf[6] != 0x00)) {/*校验标志*/
0108 80910500 lds R24,_time_buf+5
010C 8535 cpi R24,85
010E 49F4 brne L20
0110 20900600 lds R2,_time_buf+6
0114 2220 tst R2
0116 29F0 breq L20
0118 .dbline 88
0118 .dbline 89
0118 ; beep(300);
0118 0CE2 ldi R16,300
011A 11E0 ldi R17,1
011C 0E940000 xcall _beep
0120 .dbline 90
0120 ; }
0120 04C0 xjmp L21
0122 L20:
0122 .dbline 91
0122 ; else {
0122 .dbline 92
0122 ; beep(1500);
0122 0CED ldi R16,1500
0124 15E0 ldi R17,5
0126 0E940000 xcall _beep
012A .dbline 93
012A ; }
012A L21:
012A .dbline 96
012A ;
012A ; /*串口测试*/
012A ; PORTB = 0xF7;
012A 87EF ldi R24,247
012C 88BB out 0x18,R24
012E .dbline 97
012E ; delay_ms(3000);
012E 08EB ldi R16,3000
0130 1BE0 ldi R17,11
0132 0E940000 xcall _delay_ms
0136 .dbline 98
0136 ; Uart_Init();
0136 0E940000 xcall _Uart_Init
013A 08C0 xjmp L25
013C L24:
013C .dbline 99
013C .dbline 100
013C 0E940000 xcall _Uart_Receive
0140 0883 std y+0,R16
0142 .dbline 101
0142 202E mov R2,R16
0144 2094 com R2
0146 28BA out 0x18,R2
0148 .dbline 102
0148 0E940000 xcall _Uart_Transmit
014C .dbline 103
014C L25:
014C .dbline 99
014C F7CF xjmp L24
014E X0:
014E .dbline -2
014E L1:
014E 2196 adiw R28,1
0150 .dbline 0 ; func end
0150 0895 ret
0152 .dbsym l temp 0 c
0152 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -