📄 019.lst
字号:
(0127) ds1302_write_byte(ds1302_control_add,0x80); //打开写保护
00FC E820 LDI R18,0x80
00FD E80E LDI R16,0x8E
00FE DF8E RCALL _ds1302_write_byte
00FF 9508 RET
(0128) }
(0129)
(0130) /*从DS302读出时钟数据*/
(0131) void ds1302_read_time(void) {
(0132)
(0133) time_buf[1]=ds1302_read_byte(ds1302_year_add); //年
_ds1302_read_time:
0100 E80C LDI R16,0x8C
0101 DFAF RCALL _ds1302_read_byte
0102 93000061 STS time_buf+1,R16
(0134) time_buf[2]=ds1302_read_byte(ds1302_month_add); //月
0104 E808 LDI R16,0x88
0105 DFAB RCALL _ds1302_read_byte
0106 93000062 STS time_buf+2,R16
(0135) time_buf[3]=ds1302_read_byte(ds1302_date_add); //日
0108 E806 LDI R16,0x86
0109 DFA7 RCALL _ds1302_read_byte
010A 93000063 STS time_buf+3,R16
(0136) time_buf[4]=ds1302_read_byte(ds1302_hr_add); //时
010C E804 LDI R16,0x84
010D DFA3 RCALL _ds1302_read_byte
010E 93000064 STS 0x64,R16
(0137) time_buf[5]=ds1302_read_byte(ds1302_min_add); //分
0110 E802 LDI R16,0x82
0111 DF9F RCALL _ds1302_read_byte
0112 93000065 STS 0x65,R16
(0138) time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒
0114 E800 LDI R16,0x80
0115 DF9B RCALL _ds1302_read_byte
0116 2F80 MOV R24,R16
0117 778F ANDI R24,0x7F
0118 93800066 STS 0x66,R24
(0139) time_buf[7]=ds1302_read_byte(ds1302_day_add); //周
011A E80A LDI R16,0x8A
011B DF95 RCALL _ds1302_read_byte
011C 93000067 STS 0x67,R16
011E 9508 RET
(0140) }
(0141)
(0142) /*DS302初始化函数*/
(0143) void ds1302_init(void) {
(0144)
(0145) RST_CLR; /*RST脚置低*/
_ds1302_init:
011F 98AC CBI 0x15,4
(0146) SCK_CLR; /*SCK脚置低*/
0120 98AA CBI 0x15,2
(0147) RST_OUT; /*RST脚设置为输出*/
0121 9AA4 SBI 0x14,4
(0148) SCK_OUT; /*SCK脚设置为输出*/
0122 9AA2 SBI 0x14,2
0123 9508 RET
_main:
temp --> Y+0
0124 9721 SBIW R28,1
FILE: E:\ICCAVR\project\AVRMEG~2\icc\019-TEST\main.c
(0001) /*
(0002) 实验十三:
(0003)
(0004) AVR单片机I2C总线实验。
(0005) 1、用24C02记录CPU启动次数,并在PB口上显示出来。
(0006) 2、内部1 M晶振,程序采用单任务方式,软件延时。
(0007) 3、进行此实验请插上JP1的所有8个短路块,JP7(LED_EN)/PC0/PC1短路块。
(0008) 4、通过此实验,可以I2C总线操作有个初步认识。
(0009)
(0010) AVR mega16学习板
(0011) www.iccavr.com
(0012) 14:42 2007-4-9
(0013) */
(0014)
(0015) #include "iom16v.h"
(0016) #include "beep.h"
(0017) #include "delay.h"
(0018) #include "ds1302.h"
(0019) #include "spi.h"
(0020) #include "twi.h"
(0021) #include "uart.h"
(0022)
(0023) void main(void) {
(0024)
(0025) unsigned char temp;
(0026)
(0027) PORTA = 0xFF; /*打开上拉*/
0125 EF8F LDI R24,0xFF
0126 BB8B OUT 0x1B,R24
(0028) DDRA = 0x00; /*方向输入*/
0127 2422 CLR R2
0128 BA2A OUT 0x1A,R2
(0029) PORTB = 0xFF; /*电平设置*/
0129 BB88 OUT 0x18,R24
(0030) DDRB = 0xFF; /*方向输出*/
012A BB87 OUT 0x17,R24
(0031) PORTC = 0xFF;
012B BB85 OUT 0x15,R24
(0032) DDRC = 0x00;
012C BA24 OUT 0x14,R2
(0033) PORTD = 0xFF;
012D BB82 OUT 0x12,R24
(0034) DDRD = 0x20;
012E E280 LDI R24,0x20
012F BB81 OUT 0x11,R24
(0035)
(0036) /*蜂鸣器测验试*/
(0037) delay_ms(100);
0130 E604 LDI R16,0x64
0131 E010 LDI R17,0
0132 940E007B CALL _delay_ms
(0038) beep(300);
0134 E20C LDI R16,0x2C
0135 E011 LDI R17,1
0136 940E0067 CALL _beep
(0039)
(0040) /*按键及指示灯测试*/
(0041) delay_ms(1000);
0138 EE08 LDI R16,0xE8
0139 E013 LDI R17,3
013A 940E007B CALL _delay_ms
013C C010 RJMP 0x014D
(0042) while (1) {
(0043) temp = PINA; /*提取按键*/
013D B229 IN R2,0x19
013E 8228 STD Y+0,R2
(0044) if (temp != 0xFF) {
013F 2D82 MOV R24,R2
0140 3F8F CPI R24,0xFF
0141 F041 BEQ 0x014A
(0045) PORTB = temp; /*显示按键值*/
0142 BB88 OUT 0x18,R24
(0046) beep(200);
0143 EC08 LDI R16,0xC8
0144 E010 LDI R17,0
0145 940E0067 CALL _beep
(0047) while (PINA != 0xFF); /*等待按键松开*/
0147 B389 IN R24,0x19
0148 3F8F CPI R24,0xFF
0149 F7E9 BNE 0x0147
(0048) }
(0049) if ((PIND & 0x04) == 0x00) { /*INT键退出*/
014A 9982 SBIC 0x10,2
014B C001 RJMP 0x014D
(0050) break;
014C C001 RJMP 0x014E
014D CFEF RJMP 0x013D
(0051) }
(0052) }
(0053)
(0054) /*SPI总线HC595芯片测试*/
(0055) PORTB = 0xEF;
014E EE8F LDI R24,0xEF
014F BB88 OUT 0x18,R24
(0056) delay_ms(3000);
0150 EB08 LDI R16,0xB8
0151 E01B LDI R17,0xB
0152 940E007B CALL _delay_ms
(0057) SPI_MasterInit(); /*初始SPI接口*/
0154 940E01CD CALL _SPI_MasterInit
(0058) PORTB = 0xF0; /*打开4位数码管*/
0156 EF80 LDI R24,0xF0
0157 BB88 OUT 0x18,R24
(0059) for (temp = 0; temp < 10; temp ++) {
0158 2422 CLR R2
0159 8228 STD Y+0,R2
015A C010 RJMP 0x016B
(0060) SPI_595_Out(disp[temp]); /*显示数据输出*/
015B E688 LDI R24,0x68
015C E090 LDI R25,0
015D 81E8 LDD R30,Y+0
015E 27FF CLR R31
015F 0FE8 ADD R30,R24
0160 1FF9 ADC R31,R25
0161 8100 LDD R16,Z+0
0162 940E01D7 CALL _SPI_595_Out
(0061) delay_ms(500);
0164 EF04 LDI R16,0xF4
0165 E011 LDI R17,1
0166 940E007B CALL _delay_ms
0168 8188 LDD R24,Y+0
0169 5F8F SUBI R24,0xFF
016A 8388 STD Y+0,R24
016B 8188 LDD R24,Y+0
016C 308A CPI R24,0xA
016D F368 BCS 0x015B
(0062) }
(0063) SPCR = 0x00; /*关闭SPI接口*/
016E 2422 CLR R2
016F B82D OUT 0x0D,R2
(0064)
(0065) /*IIC总线24C02芯片测试*/
(0066) PORTB = 0xDF;
0170 ED8F LDI R24,0xDF
0171 BB88 OUT 0x18,R24
(0067) delay_ms(3000);
0172 EB08 LDI R16,0xB8
0173 E01B LDI R17,0xB
0174 940E007B CALL _delay_ms
(0068) twi_write(0x08, 0x55); /*写入标志*/
0176 E525 LDI R18,0x55
0177 E008 LDI R16,0x8
0178 940E020D CALL _twi_write
(0069) delay_ms(10);
017A E00A LDI R16,0xA
017B E010 LDI R17,0
017C 940E007B CALL _delay_ms
(0070) twi_read(0x08, &temp); /*读出标志*/
017E 019E MOVW R18,R28
017F E008 LDI R16,0x8
0180 940E0251 CALL _twi_read
(0071) delay_ms(500);
0182 EF04 LDI R16,0xF4
0183 E011 LDI R17,1
0184 940E007B CALL _delay_ms
(0072) if (temp == 0x55) { /*校验标志*/
0186 8188 LDD R24,Y+0
0187 3585 CPI R24,0x55
0188 F429 BNE 0x018E
(0073) beep(300);
0189 E20C LDI R16,0x2C
018A E011 LDI R17,1
018B 940E0067 CALL _beep
(0074) }
018D C004 RJMP 0x0192
(0075) else {
(0076) beep(1500);
018E ED0C LDI R16,0xDC
018F E015 LDI R17,5
0190 940E0067 CALL _beep
(0077) }
(0078)
(0079) /*DS302芯片测试*/
(0080) PORTB = 0xBF;
0192 EB8F LDI R24,0xBF
0193 BB88 OUT 0x18,R24
(0081) delay_ms(1000);
0194 EE08 LDI R16,0xE8
0195 E013 LDI R17,3
0196 940E007B CALL _delay_ms
(0082) ds1302_init(); /*初始化DS302*/
0198 940E011F CALL _ds1302_init
(0083) time_buf[5] = 0x55;
019A E585 LDI R24,0x55
019B 93800065 STS 0x65,R24
(0084) time_buf[6] = 0x00;
019D 2422 CLR R2
019E 92200066 STS 0x66,R2
(0085) ds1302_write_time(); /*写入标志*/
01A0 940E00D6 CALL _ds1302_write_time
(0086) delay_ms(2000);
01A2 ED00 LDI R16,0xD0
01A3 E017 LDI R17,7
01A4 940E007B CALL _delay_ms
(0087) ds1302_read_time(); /*读出标志*/
01A6 940E0100 CALL _ds1302_read_time
(0088) if ((time_buf[5] == 0x55) && (time_buf[6] != 0x00)) {/*校验标志*/
01A8 91800065 LDS R24,0x65
01AA 3585 CPI R24,0x55
01AB F449 BNE 0x01B5
01AC 90200066 LDS R2,0x66
01AE 2022 TST R2
01AF F029 BEQ 0x01B5
(0089) beep(300);
01B0 E20C LDI R16,0x2C
01B1 E011 LDI R17,1
01B2 940E0067 CALL _beep
(0090) }
01B4 C004 RJMP 0x01B9
(0091) else {
(0092) beep(1500);
01B5 ED0C LDI R16,0xDC
01B6 E015 LDI R17,5
01B7 940E0067 CALL _beep
(0093) }
(0094)
(0095) /*串口测试*/
(0096) PORTB = 0xF7;
01B9 EF87 LDI R24,0xF7
01BA BB88 OUT 0x18,R24
(0097) delay_ms(3000);
01BB EB08 LDI R16,0xB8
01BC E01B LDI R17,0xB
01BD 940E007B CALL _delay_ms
(0098) Uart_Init();
01BF 940E0054 CALL _Uart_Init
01C1 C008 RJMP 0x01CA
(0099) while (1) {
(0100) temp = Uart_Receive(); /*等待接收数据*/
01C2 940E0063 CALL _Uart_Receive
01C4 8308 STD Y+0,R16
(0101) PORTB = ~temp; /*显示低电平有效*/
01C5 2E20 MOV R2,R16
01C6 9420 COM R2
01C7 BA28 OUT 0x18,R2
(0102) Uart_Transmit(temp); /*发送收到的数据*/
01C8 940E005F CALL _Uart_Transmit
01CA CFF7 RJMP 0x01C2
01CB 9621 ADIW R28,1
01CC 9508 RET
FILE: E:\ICCAVR\project\AVRMEG~2\icc\019-TEST\spi.c
(0001)
(0002) #include "iom16v.h"
(0003)
(0004) /*
(0005) 实验四:
(0006) SPI接口实险,LED数据管显示。
(0007) 1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
(0008) 2、内部1 M晶振,程序采用单任务方式,软件延时。
(0009) 3、进行此实验请插上JP1的所有8个短路块,JP6(SPI_EN)短路块。
(0010)
(0011) AVR mega16学习板
(0012) www.iccavr.com
(0013) 2006-01-10
(0014) */
(0015)
(0016) unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
(0017)
(0018) /*SPI接口初始化*/
(0019) void SPI_MasterInit(void) {
(0020)
(0021) DDRB |= 0xF0; /* 设置MOSI 和SCK 为输出,其他为输入 */
_SPI_MasterInit:
01CD B387 IN R24,0x17
01CE 6F80 ORI R24,0xF0
01CF BB87 OUT 0x17,R24
(0022) SPCR = (1<<SPE) | (1<<MSTR)
01D0 E583 LDI R24,0x53
01D1 B98D OUT 0x0D,R24
01D2 9508 RET
(0023) | (1<<SPR1) | (1<<SPR0); /* 使能SPI 主机模式,设置时钟速率为fck/128 */
(0024) }
(0025)
(0026) /*SPI数据发送*/
(0027) void SPI_MasterTransmit(unsigned char i) {
(0028)
(0029) SPDR = i; /* 启动数据传输 */
_SPI_MasterTransmit:
i --> R16
01D3 B90F OUT 0x0F,R16
(0030) while (!(SPSR & (1<<SPIF))) { /* 等待传输结束 */
01D4 9B77 SBIS 0x0E,7
01D5 CFFE RJMP 0x01D4
01D6 9508 RET
_SPI_595_Out:
i --> R20
01D7 940E02BE CALL push_gset1
01D9 2F40 MOV R20,R16
(0031) ;
(0032) }
(0033) }
(0034)
(0035) /*595数据输出*/
(0036) void SPI_595_Out(unsigned char i) {
(0037) PORTB &= ~(1 << 4); /*准备锁存*/
01DA 98C4 CBI 0x18,4
(0038) SPI_MasterTransmit(i);
01DB 2F04 MOV R16,R20
01DC DFF6 RCALL _SPI_MasterTransmit
(0039) PORTB |= (1 << 4); /*锁存数据*/
01DD 9AC4 SBI 0x18,4
01DE 940E02C1 CALL pop_gset1
01E0 9508 RET
_error:
type --> R16
01E1 940E02BE CALL push_gset1
FILE: E:\ICCAVR\project\AVRMEG~2\icc\019-TEST\twi.c
(0001) /*
(0002) I2C总线/TWI操作模块
(0003) 1、读取和写入函数
(0004) 2、地址有效范围255
(0005) 3、数据长度为单字节
(0006) 4、函数采用查询方式
(0007) 5、可直接嵌入到项目中使用
(0008) 6、晶振频率:1M
(0009) 7、总线速度:50K
(0010)
(0011) AVR_AFA
(0012) www.iccavr.com
(0013) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -