📄 019.lst
字号:
__start:
__text_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 E7E2 LDI R30,0x72
003D E0F0 LDI R31,0
003E E010 LDI R17,0
003F 37E2 CPI R30,0x72
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 E5E4 LDI R30,0x54
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 940E0124 CALL _main
_exit:
0053 CFFF RJMP _exit
FILE: E:\ICCAVR\project\AVRMEG~2\icc\019-TEST\uart.c
(0001) #include "iom16v.h"
(0002)
(0003) /*串口初始化函数*/
(0004) void Uart_Init(void) {
(0005) UCSRA = 0x02; /*倍速*/
_Uart_Init:
0054 E082 LDI R24,2
0055 B98B OUT 0x0B,R24
(0006) UCSRB = 0x18; /*允许接收和发送*/
0056 E188 LDI R24,0x18
0057 B98A OUT 0x0A,R24
(0007) UCSRC = 0x06; /*8位数据*/
0058 E086 LDI R24,6
0059 BD80 OUT 0x20,R24
(0008) UBRRH = 0x00;
005A 2422 CLR R2
005B BC20 OUT 0x20,R2
(0009) UBRRL = 12; /*9600*/
005C E08C LDI R24,0xC
005D B989 OUT 0x09,R24
005E 9508 RET
(0010) }
(0011)
(0012) /*数据发送,查询方式*/
(0013) void Uart_Transmit(unsigned char i) {
(0014)
(0015) while (!(UCSRA & (1<<UDRE))); /* 等待发送缓冲器为空*/
_Uart_Transmit:
i --> R16
005F 9B5D SBIS 0x0B,5
0060 CFFE RJMP _Uart_Transmit
(0016) UDR = i; /* 发送数据*/
0061 B90C OUT 0x0C,R16
0062 9508 RET
(0017) }
(0018)
(0019) /*数据接收,查询方式*/
(0020) unsigned char Uart_Receive( void ) {
(0021)
(0022) while (!(UCSRA & (1<<RXC))); /* 等待接收数据*/
_Uart_Receive:
0063 9B5F SBIS 0x0B,7
0064 CFFE RJMP _Uart_Receive
(0023) return UDR; /* 获取并返回数据*/
0065 B10C IN R16,0x0C
0066 9508 RET
_beep:
i --> R20
0067 940E02BE CALL push_gset1
0069 01A8 MOVW R20,R16
FILE: E:\ICCAVR\project\AVRMEG~2\icc\019-TEST\beep.c
(0001) #include "iom16v.h"
(0002)
(0003) /*
(0004) 内部1 M晶振。
(0005) 定时器实险,周期信号驱动无源蜂鸣器。
(0006) 程序中实现单一频率的周期性提示音。
(0007) 程序采用单任务方式,软件延时。
(0008) */
(0009) #include "delay.h"
(0010) void beep(unsigned int i) {
(0011) TCCR1A = 0x40;
006A E480 LDI R24,0x40
006B BD8F OUT 0x2F,R24
(0012) TCCR1B = 0x09;
006C E089 LDI R24,0x9
006D BD8E OUT 0x2E,R24
(0013) OCR1A = 1000;
006E EE88 LDI R24,0xE8
006F E093 LDI R25,3
0070 BD9B OUT 0x2B,R25
0071 BD8A OUT 0x2A,R24
(0014) delay_ms(i);
0072 018A MOVW R16,R20
0073 940E007B CALL _delay_ms
(0015) TCCR1A = 0x00;
0075 2422 CLR R2
0076 BC2F OUT 0x2F,R2
(0016) PORTD |= (1 << 5);;
0077 9A95 SBI 0x12,5
0078 940E02C1 CALL pop_gset1
007A 9508 RET
_delay_ms:
a --> R20
b --> R22
i --> R16
007B 940E02BC CALL push_gset2
FILE: E:\ICCAVR\project\AVRMEG~2\icc\019-TEST\delay.c
(0001) /*延时函数*/
(0002) void delay_ms(unsigned int i) {
(0003)
(0004) unsigned int a;
(0005) unsigned char b;
(0006) for (a = 1; a < i; a++) {
007D E041 LDI R20,1
007E E050 LDI R21,0
007F C007 RJMP 0x0087
(0007) for (b = 1; b; b++) {
0080 E061 LDI R22,1
0081 C001 RJMP 0x0083
0082 9563 INC R22
0083 2366 TST R22
0084 F7E9 BNE 0x0082
0085 5F4F SUBI R20,0xFF
0086 4F5F SBCI R21,0xFF
0087 1740 CP R20,R16
0088 0751 CPC R21,R17
0089 F3B0 BCS 0x0080
008A 940E02B3 CALL pop_gset2
008C 9508 RET
_ds1302_write_byte:
i --> R20
d --> R18
addr --> R16
008D 940E02BE CALL push_gset1
FILE: E:\ICCAVR\project\AVRMEG~2\icc\019-TEST\ds1302.c
(0001)
(0002) #include "iom16v.h"
(0003)
(0004) /*复位脚*/
(0005) #define RST_CLR PORTC &= ~(1 << PC4)/*电平置低*/
(0006) #define RST_SET PORTC |= (1 << PC4)/*电平置高*/
(0007) #define RST_IN DDRC &= ~(1 << PC4)/*方向输入*/
(0008) #define RST_OUT DDRC |= (1 << PC4)/*方向输出*/
(0009)
(0010) /*双向数据*/
(0011) #define IO_CLR PORTC &= ~(1 << PC3)/*电平置低*/
(0012) #define IO_SET PORTC |= (1 << PC3)/*电平置高*/
(0013) #define IO_R PINC & (1 << PC3)/*电平读取*/
(0014) #define IO_IN DDRC &= ~(1 << PC3)/*方向输入*/
(0015) #define IO_OUT DDRC |= (1 << PC3)/*方向输出*/
(0016)
(0017) /*时钟信号*/
(0018) #define SCK_CLR PORTC &= ~(1 << PC2)/*时钟信号*/
(0019) #define SCK_SET PORTC |= (1 << PC2)/*电平置高*/
(0020) #define SCK_IN DDRC &= ~(1 << PC2)/*方向输入*/
(0021) #define SCK_OUT DDRC |= (1 << PC2)/*方向输出*/
(0022)
(0023) #define ds1302_sec_add 0x80 //秒数据地址
(0024) #define ds1302_min_add 0x82 //分数据地址
(0025) #define ds1302_hr_add 0x84 //时数据地址
(0026) #define ds1302_date_add 0x86 //日数据地址
(0027) #define ds1302_month_add 0x88 //月数据地址
(0028) #define ds1302_day_add 0x8a //星期数据地址
(0029) #define ds1302_year_add 0x8c //年数据地址
(0030) #define ds1302_control_add 0x8e //控制数据地址
(0031) #define ds1302_charger_add 0x90
(0032) #define ds1302_clkburst_add 0xbe
(0033)
(0034) unsigned char time_buf[8] = {0x20,0x07,0x05,0x08,0x16,0x15,0x00,0x02};
(0035)
(0036) /*向DS1302写入一字节数据*/
(0037) void ds1302_write_byte(unsigned char addr, unsigned char d) {
(0038)
(0039) unsigned char i;
(0040) RST_SET; /*启动DS1302总线*/
008F 9AAC SBI 0x15,4
(0041)
(0042) /*写入目标地址:addr*/
(0043) IO_OUT;
0090 9AA3 SBI 0x14,3
(0044) addr = addr & 0xFE;/*最低位置零*/
0091 7F0E ANDI R16,0xFE
(0045) for (i = 0; i < 8; i ++) {
0092 2744 CLR R20
0093 C009 RJMP 0x009D
(0046) if (addr & 0x01) {
0094 FF00 SBRS R16,0
0095 C002 RJMP 0x0098
(0047) IO_SET;
0096 9AAB SBI 0x15,3
(0048) }
0097 C001 RJMP 0x0099
(0049) else {
(0050) IO_CLR;
0098 98AB CBI 0x15,3
(0051) }
(0052) SCK_SET;
0099 9AAA SBI 0x15,2
(0053) SCK_CLR;
009A 98AA CBI 0x15,2
(0054) addr = addr >> 1;
009B 9506 LSR R16
009C 9543 INC R20
009D 3048 CPI R20,0x8
009E F3A8 BCS 0x0094
(0055) }
(0056)
(0057) /*写入数据:d*/
(0058) IO_OUT;
009F 9AA3 SBI 0x14,3
(0059) for (i = 0; i < 8; i ++) {
00A0 2744 CLR R20
00A1 C009 RJMP 0x00AB
(0060) if (d & 0x01) {
00A2 FF20 SBRS R18,0
00A3 C002 RJMP 0x00A6
(0061) IO_SET;
00A4 9AAB SBI 0x15,3
(0062) }
00A5 C001 RJMP 0x00A7
(0063) else {
(0064) IO_CLR;
00A6 98AB CBI 0x15,3
(0065) }
(0066) SCK_SET;
00A7 9AAA SBI 0x15,2
(0067) SCK_CLR;
00A8 98AA CBI 0x15,2
(0068) d = d >> 1;
00A9 9526 LSR R18
00AA 9543 INC R20
00AB 3048 CPI R20,0x8
00AC F3A8 BCS 0x00A2
(0069) }
(0070) RST_CLR; /*停止DS1302总线*/
00AD 98AC CBI 0x15,4
00AE 940E02C1 CALL pop_gset1
00B0 9508 RET
_ds1302_read_byte:
temp --> R20
i --> R22
addr --> R16
00B1 940E02BC CALL push_gset2
(0071) }
(0072)
(0073) /*从DS1302读出一字节数据*/
(0074) unsigned char ds1302_read_byte(unsigned char addr) {
(0075)
(0076) unsigned char i;
(0077) unsigned char temp;
(0078) RST_SET; /*启动DS1302总线*/
00B3 9AAC SBI 0x15,4
(0079)
(0080) /*写入目标地址:addr*/
(0081) IO_OUT;
00B4 9AA3 SBI 0x14,3
(0082) addr = addr | 0x01;/*最低位置高*/
00B5 6001 ORI R16,1
(0083) for (i = 0; i < 8; i ++) {
00B6 2766 CLR R22
00B7 C009 RJMP 0x00C1
(0084) if (addr & 0x01) {
00B8 FF00 SBRS R16,0
00B9 C002 RJMP 0x00BC
(0085) IO_SET;
00BA 9AAB SBI 0x15,3
(0086) }
00BB C001 RJMP 0x00BD
(0087) else {
(0088) IO_CLR;
00BC 98AB CBI 0x15,3
(0089) }
(0090) SCK_SET;
00BD 9AAA SBI 0x15,2
(0091) SCK_CLR;
00BE 98AA CBI 0x15,2
(0092) addr = addr >> 1;
00BF 9506 LSR R16
00C0 9563 INC R22
00C1 3068 CPI R22,0x8
00C2 F3A8 BCS 0x00B8
(0093) }
(0094)
(0095) /*输出数据:temp*/
(0096) IO_IN;
00C3 98A3 CBI 0x14,3
(0097) for (i = 0; i < 8; i ++) {
00C4 2766 CLR R22
00C5 C009 RJMP 0x00CF
(0098) temp = temp >> 1;
00C6 9546 LSR R20
(0099) if (IO_R) {
00C7 9B9B SBIS 0x13,3
00C8 C002 RJMP 0x00CB
(0100) temp |= 0x80;
00C9 6840 ORI R20,0x80
(0101) }
00CA C001 RJMP 0x00CC
(0102) else {
(0103) temp &= 0x7F;
00CB 774F ANDI R20,0x7F
(0104) }
(0105) SCK_SET;
00CC 9AAA SBI 0x15,2
(0106) SCK_CLR;
00CD 98AA CBI 0x15,2
00CE 9563 INC R22
00CF 3068 CPI R22,0x8
00D0 F3A8 BCS 0x00C6
(0107) }
(0108)
(0109) RST_CLR; /*停止DS1302总线*/
00D1 98AC CBI 0x15,4
(0110) return temp;
00D2 2F04 MOV R16,R20
00D3 940E02B3 CALL pop_gset2
00D5 9508 RET
(0111) }
(0112)
(0113) /*向DS302写入时钟数据*/
(0114) void ds1302_write_time(void) {
(0115)
(0116) ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护
_ds1302_write_time:
00D6 2722 CLR R18
00D7 E80E LDI R16,0x8E
00D8 DFB4 RCALL _ds1302_write_byte
(0117) ds1302_write_byte(ds1302_sec_add,0x80); //暂停
00D9 E820 LDI R18,0x80
00DA E800 LDI R16,0x80
00DB DFB1 RCALL _ds1302_write_byte
(0118) //ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电
(0119) ds1302_write_byte(ds1302_year_add,time_buf[1]); //年
00DC 91200061 LDS R18,time_buf+1
00DE E80C LDI R16,0x8C
00DF DFAD RCALL _ds1302_write_byte
(0120) ds1302_write_byte(ds1302_month_add,time_buf[2]); //月
00E0 91200062 LDS R18,time_buf+2
00E2 E808 LDI R16,0x88
00E3 DFA9 RCALL _ds1302_write_byte
(0121) ds1302_write_byte(ds1302_date_add,time_buf[3]); //日
00E4 91200063 LDS R18,time_buf+3
00E6 E806 LDI R16,0x86
00E7 DFA5 RCALL _ds1302_write_byte
(0122) ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
00E8 91200067 LDS R18,0x67
00EA E80A LDI R16,0x8A
00EB DFA1 RCALL _ds1302_write_byte
(0123) ds1302_write_byte(ds1302_hr_add,time_buf[4]); //时
00EC 91200064 LDS R18,0x64
00EE E804 LDI R16,0x84
00EF DF9D RCALL _ds1302_write_byte
(0124) ds1302_write_byte(ds1302_min_add,time_buf[5]); //分
00F0 91200065 LDS R18,0x65
00F2 E802 LDI R16,0x82
00F3 DF99 RCALL _ds1302_write_byte
(0125) ds1302_write_byte(ds1302_sec_add,time_buf[6]); //秒
00F4 91200066 LDS R18,0x66
00F6 E800 LDI R16,0x80
00F7 DF95 RCALL _ds1302_write_byte
(0126) ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
00F8 91200067 LDS R18,0x67
00FA E80A LDI R16,0x8A
00FB DF91 RCALL _ds1302_write_byte
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -