📄 main.s
字号:
.module main.c
.area text(rom, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~2\icc\019-TEST\main.c
.dbfunc e main _main fV
; temp -> y+0
.even
_main::
sbiw R28,1
.dbline -1
.dbline 23
; /*
; 实验十三:
;
; AVR单片机I2C总线实验。
; 1、用24C02记录CPU启动次数,并在PB口上显示出来。
; 2、内部1 M晶振,程序采用单任务方式,软件延时。
; 3、进行此实验请插上JP1的所有8个短路块,JP7(LED_EN)/PC0/PC1短路块。
; 4、通过此实验,可以I2C总线操作有个初步认识。
;
; AVR mega16学习板
; www.iccavr.com
; 14:42 2007-4-9
; */
;
; #include "iom16v.h"
; #include "beep.h"
; #include "delay.h"
; #include "ds1302.h"
; #include "spi.h"
; #include "twi.h"
; #include "uart.h"
;
; void main(void) {
.dbline 27
;
; unsigned char temp;
;
; PORTA = 0xFF; /*打开上拉*/
ldi R24,255
out 0x1b,R24
.dbline 28
; DDRA = 0x00; /*方向输入*/
clr R2
out 0x1a,R2
.dbline 29
; PORTB = 0xFF; /*电平设置*/
out 0x18,R24
.dbline 30
; DDRB = 0xFF; /*方向输出*/
out 0x17,R24
.dbline 31
; PORTC = 0xFF;
out 0x15,R24
.dbline 32
; DDRC = 0x00;
out 0x14,R2
.dbline 33
; PORTD = 0xFF;
out 0x12,R24
.dbline 34
; DDRD = 0x20;
ldi R24,32
out 0x11,R24
.dbline 37
;
; /*蜂鸣器测验试*/
; delay_ms(100);
ldi R16,100
ldi R17,0
xcall _delay_ms
.dbline 38
; beep(300);
ldi R16,300
ldi R17,1
xcall _beep
.dbline 41
;
; /*按键及指示灯测试*/
; delay_ms(1000);
ldi R16,1000
ldi R17,3
xcall _delay_ms
xjmp L3
L2:
.dbline 42
; while (1) {
.dbline 43
; temp = PINA; /*提取按键*/
in R2,0x19
std y+0,R2
.dbline 44
; if (temp != 0xFF) {
mov R24,R2
cpi R24,255
breq L5
.dbline 44
.dbline 45
; PORTB = temp; /*显示按键值*/
out 0x18,R24
.dbline 46
; beep(200);
ldi R16,200
ldi R17,0
xcall _beep
L7:
.dbline 47
L8:
.dbline 47
; while (PINA != 0xFF); /*等待按键松开*/
in R24,0x19
cpi R24,255
brne L7
.dbline 48
; }
L5:
.dbline 49
; if ((PIND & 0x04) == 0x00) { /*INT键退出*/
sbic 0x10,2
rjmp L10
.dbline 49
.dbline 50
; break;
xjmp L4
L10:
.dbline 52
L3:
.dbline 42
xjmp L2
L4:
.dbline 55
; }
; }
;
; /*SPI总线HC595芯片测试*/
; PORTB = 0xEF;
ldi R24,239
out 0x18,R24
.dbline 56
; delay_ms(3000);
ldi R16,3000
ldi R17,11
xcall _delay_ms
.dbline 57
; SPI_MasterInit(); /*初始SPI接口*/
xcall _SPI_MasterInit
.dbline 58
; PORTB = 0xF0; /*打开4位数码管*/
ldi R24,240
out 0x18,R24
.dbline 59
clr R2
std y+0,R2
xjmp L15
L12:
.dbline 59
.dbline 60
ldi R24,<_disp
ldi R25,>_disp
ldd R30,y+0
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _SPI_595_Out
.dbline 61
ldi R16,500
ldi R17,1
xcall _delay_ms
.dbline 62
L13:
.dbline 59
ldd R24,y+0
subi R24,255 ; addi 1
std y+0,R24
L15:
.dbline 59
; for (temp = 0; temp < 10; temp ++) {
ldd R24,y+0
cpi R24,10
brlo L12
.dbline 63
; SPI_595_Out(disp[temp]); /*显示数据输出*/
; delay_ms(500);
; }
; SPCR = 0x00; /*关闭SPI接口*/
clr R2
out 0xd,R2
.dbline 66
;
; /*IIC总线24C02芯片测试*/
; PORTB = 0xDF;
ldi R24,223
out 0x18,R24
.dbline 67
; delay_ms(3000);
ldi R16,3000
ldi R17,11
xcall _delay_ms
.dbline 68
; twi_write(0x08, 0x55); /*写入标志*/
ldi R18,85
ldi R16,8
xcall _twi_write
.dbline 69
; delay_ms(10);
ldi R16,10
ldi R17,0
xcall _delay_ms
.dbline 70
; twi_read(0x08, &temp); /*读出标志*/
movw R18,R28
ldi R16,8
xcall _twi_read
.dbline 71
; delay_ms(500);
ldi R16,500
ldi R17,1
xcall _delay_ms
.dbline 72
; if (temp == 0x55) { /*校验标志*/
ldd R24,y+0
cpi R24,85
brne L16
.dbline 72
.dbline 73
; beep(300);
ldi R16,300
ldi R17,1
xcall _beep
.dbline 74
; }
xjmp L17
L16:
.dbline 75
; else {
.dbline 76
; beep(1500);
ldi R16,1500
ldi R17,5
xcall _beep
.dbline 77
; }
L17:
.dbline 80
;
; /*DS302芯片测试*/
; PORTB = 0xBF;
ldi R24,191
out 0x18,R24
.dbline 81
; delay_ms(1000);
ldi R16,1000
ldi R17,3
xcall _delay_ms
.dbline 82
; ds1302_init(); /*初始化DS302*/
xcall _ds1302_init
.dbline 83
; time_buf[5] = 0x55;
ldi R24,85
sts _time_buf+5,R24
.dbline 84
; time_buf[6] = 0x00;
clr R2
sts _time_buf+6,R2
.dbline 85
; ds1302_write_time(); /*写入标志*/
xcall _ds1302_write_time
.dbline 86
; delay_ms(2000);
ldi R16,2000
ldi R17,7
xcall _delay_ms
.dbline 87
; ds1302_read_time(); /*读出标志*/
xcall _ds1302_read_time
.dbline 88
; if ((time_buf[5] == 0x55) && (time_buf[6] != 0x00)) {/*校验标志*/
lds R24,_time_buf+5
cpi R24,85
brne L20
lds R2,_time_buf+6
tst R2
breq L20
.dbline 88
.dbline 89
; beep(300);
ldi R16,300
ldi R17,1
xcall _beep
.dbline 90
; }
xjmp L21
L20:
.dbline 91
; else {
.dbline 92
; beep(1500);
ldi R16,1500
ldi R17,5
xcall _beep
.dbline 93
; }
L21:
.dbline 96
;
; /*串口测试*/
; PORTB = 0xF7;
ldi R24,247
out 0x18,R24
.dbline 97
; delay_ms(3000);
ldi R16,3000
ldi R17,11
xcall _delay_ms
.dbline 98
; Uart_Init();
xcall _Uart_Init
xjmp L25
L24:
.dbline 99
.dbline 100
xcall _Uart_Receive
std y+0,R16
.dbline 101
mov R2,R16
com R2
out 0x18,R2
.dbline 102
xcall _Uart_Transmit
.dbline 103
L25:
.dbline 99
xjmp L24
X0:
.dbline -2
L1:
adiw R28,1
.dbline 0 ; func end
ret
.dbsym l temp 0 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -