📄 ds1820.lst
字号:
__text_start:
__start:
0035 E5CF LDI R28,0x5F
0036 E0D4 LDI R29,4
0037 BFCD OUT 0x3D,R28
0038 BFDE OUT 0x3E,R29
0039 51C0 SUBI R28,0x10
003A 40D0 SBCI R29,0
003B EA0A LDI R16,0xAA
003C 8308 STD Y+0,R16
003D 2400 CLR R0
003E E7E5 LDI R30,0x75
003F E0F0 LDI R31,0
0040 E010 LDI R17,0
0041 37E7 CPI R30,0x77
0042 07F1 CPC R31,R17
0043 F011 BEQ 0x0046
0044 9201 ST R0,Z+
0045 CFFB RJMP 0x0041
0046 8300 STD Z+0,R16
0047 E5E4 LDI R30,0x54
0048 E0F0 LDI R31,0
0049 E6A0 LDI R26,0x60
004A E0B0 LDI R27,0
004B E010 LDI R17,0
004C 36E9 CPI R30,0x69
004D 07F1 CPC R31,R17
004E F021 BEQ 0x0053
004F 95C8 LPM
0050 9631 ADIW R30,1
0051 920D ST R0,X+
0052 CFF9 RJMP 0x004C
0053 940E0068 CALL _main
_exit:
0055 CFFF RJMP _exit
_delay_ms:
b --> R20
i --> R16
0056 940E0223 CALL push_gset1
FILE: E:\ICCAVR\project\AVRMEG~2\icc\030-DS18B20-LED4\main.c
(0001) /*
(0002) 实验四:
(0003) SPI接口实险,LED数据管显示。
(0004) 1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
(0005) 2、内部1 M晶振,程序采用单任务方式,软件延时。
(0006) 3、进行此实验请插上JP1的所有8个短路块,JP6(SPI_EN)短路块。
(0007)
(0008) AVR mega16学习板
(0009) www.iccavr.com
(0010) 2006-01-10
(0011) */
(0012)
(0013) #include "iom16v.h"
(0014) #include "ds1820.h"
(0015) #include "led4.h"
(0016)
(0017) /*延时函数*/
(0018) void delay_ms(unsigned int i) {
0058 C005 RJMP 0x005E
(0019)
(0020) unsigned char b;
(0021) while (i --) {
(0022) for (b = 1; b; b++) {
0059 E041 LDI R20,1
005A C001 RJMP 0x005C
005B 9543 INC R20
005C 2344 TST R20
005D F7E9 BNE 0x005B
005E 0118 MOVW R2,R16
005F 5001 SUBI R16,1
0060 4010 SBCI R17,0
0061 2022 TST R2
0062 F7B1 BNE 0x0059
0063 2033 TST R3
0064 F7A1 BNE 0x0059
0065 940E0226 CALL pop_gset1
0067 9508 RET
(0023) ;
(0024) }
(0025) }
(0026) }
(0027)
(0028) void main(void) {
(0029)
(0030) unsigned int i;
(0031)
(0032) DDRA = 0x00; /*方向输入*/
_main:
i --> R20
0068 2422 CLR R2
0069 BA2A OUT 0x1A,R2
(0033) PORTA = 0xFF; /*打开上拉*/
006A EF8F LDI R24,0xFF
006B BB8B OUT 0x1B,R24
(0034) DDRB = 0xFF; /*方向输出*/
006C BB87 OUT 0x17,R24
(0035) PORTB = 0xF0; /*电平设置*/
006D EF80 LDI R24,0xF0
006E BB88 OUT 0x18,R24
(0036) DDRC = 0x00;
006F BA24 OUT 0x14,R2
(0037) PORTC = 0xFF;
0070 EF8F LDI R24,0xFF
0071 BB85 OUT 0x15,R24
(0038) DDRD = 0x00;
0072 BA21 OUT 0x11,R2
(0039) PORTD = 0xFF;
0073 BB82 OUT 0x12,R24
(0040)
(0041) delay_ms(200);
0074 EC08 LDI R16,0xC8
0075 E010 LDI R17,0
0076 DFDF RCALL _delay_ms
(0042) ds1820_reset();
0077 940E013E CALL _ds1820_reset
(0043) led4_init();
0079 940E00BD CALL _led4_init
007B C03F RJMP 0x00BB
(0044) while (1) {
(0045) ds1820_start();
007C 940E01AA CALL _ds1820_start
(0046) delay_ms(2000);
007E ED00 LDI R16,0xD0
007F E017 LDI R17,7
0080 DFD5 RCALL _delay_ms
(0047) i = ds1820_read_temp();
0081 940E01B0 CALL _ds1820_read_temp
0083 01A8 MOVW R20,R16
(0048) i = (i * 10) / 16; /*数值处理*/
0084 E00A LDI R16,0xA
0085 E010 LDI R17,0
0086 019A MOVW R18,R20
0087 940E0208 CALL empy16s
0089 01A8 MOVW R20,R16
008A 9556 LSR R21
008B 9547 ROR R20
008C 9556 LSR R21
008D 9547 ROR R20
008E 9556 LSR R21
008F 9547 ROR R20
0090 9556 LSR R21
0091 9547 ROR R20
(0049) led_buf[3] = i / 1000;
0092 EE28 LDI R18,0xE8
0093 E033 LDI R19,3
0094 018A MOVW R16,R20
0095 940E01D6 CALL div16u
0097 93000073 STS led_buf+3,R16
(0050) i = i % 1000;
0099 EE28 LDI R18,0xE8
009A E033 LDI R19,3
009B 018A MOVW R16,R20
009C 940E01D4 CALL mod16u
009E 01A8 MOVW R20,R16
(0051) led_buf[2] = i / 100;
009F E624 LDI R18,0x64
00A0 E030 LDI R19,0
00A1 940E01D6 CALL div16u
00A3 93000072 STS led_buf+2,R16
(0052) i = i % 100;
00A5 E624 LDI R18,0x64
00A6 E030 LDI R19,0
00A7 018A MOVW R16,R20
00A8 940E01D4 CALL mod16u
00AA 01A8 MOVW R20,R16
(0053) led_buf[1] = i / 10;
00AB E02A LDI R18,0xA
00AC E030 LDI R19,0
00AD 940E01D6 CALL div16u
00AF 93000071 STS led_buf+1,R16
(0054) led_buf[0] = i % 10;
00B1 E02A LDI R18,0xA
00B2 E030 LDI R19,0
00B3 018A MOVW R16,R20
00B4 940E01D4 CALL mod16u
00B6 93000070 STS led_buf,R16
(0055) led_buf[4] = 1; /*小数点位置*/
00B8 E081 LDI R24,1
00B9 93800074 STS 0x74,R24
00BB CFC0 RJMP 0x007C
00BC 9508 RET
FILE: E:\ICCAVR\project\AVRMEG~2\icc\030-DS18B20-LED4\LED4.C
(0001) /*
(0002) 模块说明:
(0003)
(0004) LED数码管中断动态显示程序。
(0005) 1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
(0006) 2、动态调度由片内定时器1中断产生,中断周期为5mS。
(0007) 3、内部1 M晶振,程序采用单任务方式,软件延时。
(0008) 4、此模块文件为使用文件,可直接用于项目中。
(0009) www.iccavr.com
(0010) */
(0011) #include "iom16v.h"
(0012) #include <macros.h>
(0013)
(0014) unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
(0015)
(0016) /*
(0017) 前4位为显示数值。
(0018) 最后一位为小数点显示位置。
(0019) */
(0020) unsigned char led_buf[] = {1, 2, 3, 4, 8}; /*显示信息*/
(0021)
(0022) /*------------------------------------------------------------------*-
(0023)
(0024) Disp_Init()
(0025) 显示初始化
(0026)
(0027) -*------------------------------------------------------------------*/
(0028) void led4_init(void) {
(0029)
(0030) /*初始化定时器*/
(0031) OCR1A = 625; /*计数周期为5mS,F=1M*/
_led4_init:
00BD E781 LDI R24,0x71
00BE E092 LDI R25,2
00BF BD9B OUT 0x2B,R25
00C0 BD8A OUT 0x2A,R24
(0032) TIMSK |= (1 << OCIE1A); /*比较中断A允许*/
00C1 B789 IN R24,0x39
00C2 6180 ORI R24,0x10
00C3 BF89 OUT 0x39,R24
(0033) SREG = 0x80;
00C4 E880 LDI R24,0x80
00C5 BF8F OUT 0x3F,R24
(0034) TCCR1A = 0x00;
00C6 2422 CLR R2
00C7 BC2F OUT 0x2F,R2
(0035) TCCR1B = 0x08; /*定时器工作在CTC计数器模式*/
00C8 E088 LDI R24,0x8
00C9 BD8E OUT 0x2E,R24
(0036) TCCR1B |= 0x02; /*设置定时器的分频值为8分频*/
00CA B58E IN R24,0x2E
00CB 6082 ORI R24,2
00CC BD8E OUT 0x2E,R24
(0037)
(0038) /*SPI接口初始化*/
(0039) DDRB |= (1<<PB5) | (1<<PB7); /* 设置MOSI 和SCK 为输出,其他为输入 */
00CD B387 IN R24,0x17
00CE 6A80 ORI R24,0xA0
00CF BB87 OUT 0x17,R24
(0040) SPCR = (1<<SPE) | (1<<MSTR)
00D0 E583 LDI R24,0x53
00D1 B98D OUT 0x0D,R24
(0041) | (1<<SPR1) | (1<<SPR0); /* 使能SPI 主机模式,时钟为fck/128 */
(0042)
(0043) /*中断使能*/
(0044) SEI();
00D2 9478 BSET 7
00D3 9508 RET
_Int_TCCR1A:
temp --> R20
00D4 922A ST R2,-Y
00D5 923A ST R3,-Y
00D6 930A ST R16,-Y
00D7 931A ST R17,-Y
00D8 938A ST R24,-Y
00D9 939A ST R25,-Y
00DA 93EA ST R30,-Y
00DB 93FA ST R31,-Y
00DC B62F IN R2,0x3F
00DD 922A ST R2,-Y
00DE 940E0223 CALL push_gset1
(0045) }
(0046)
(0047) /*------------------------------------------------------------------*-
(0048)
(0049) Int_TCCR1A()
(0050) LED数码管动态显示函数
(0051)
(0052) 定时器'T1',A组比较中断产生5mS周期性中断
(0053) 在中断里刷新显示
(0054)
(0055) -*------------------------------------------------------------------*/
(0056) #pragma interrupt_handler Int_TCCR1A: 7
(0057) void Int_TCCR1A(void) {
(0058)
(0059) unsigned char temp;
(0060) static unsigned char i;
(0061)
(0062) PORTB &= ~(1 << 4); /*准备锁存*/
00E0 98C4 CBI 0x18,4
(0063) PORTB |= 0x0F;
00E1 B388 IN R24,0x18
00E2 608F ORI R24,0xF
00E3 BB88 OUT 0x18,R24
(0064) PORTB |= (1 << 4); /*锁存数据*/
00E4 9AC4 SBI 0x18,4
(0065) if (i == 3) { /*显示位*/
00E5 91800075 LDS R24,i
00E7 3083 CPI R24,3
00E8 F409 BNE 0x00EA
(0066) PORTB &= ~(1 << 2);
00E9 98C2 CBI 0x18,2
(0067) }
(0068) if (i == 2) {
00EA 91800075 LDS R24,i
00EC 3082 CPI R24,2
00ED F409 BNE 0x00EF
(0069) PORTB &= ~(1 << 1);
00EE 98C1 CBI 0x18,1
(0070) }
(0071) if (i == 1) {
00EF 91800075 LDS R24,i
00F1 3081 CPI R24,1
00F2 F409 BNE 0x00F4
(0072) PORTB &= ~(1 << 0);
00F3 98C0 CBI 0x18,0
(0073) }
(0074) if (i == 0) {
00F4 90200075 LDS R2,i
00F6 2022 TST R2
00F7 F409 BNE 0x00F9
(0075) PORTB &= ~(1 << 3);
00F8 98C3 CBI 0x18,3
(0076) }
(0077)
(0078) temp = led_buf[i] % 16;
00F9 E780 LDI R24,0x70
00FA E090 LDI R25,0
00FB 91E00075 LDS R30,i
00FD 27FF CLR R31
00FE 0FE8 ADD R30,R24
00FF 1FF9 ADC R31,R25
0100 8100 LDD R16,Z+0
0101 E110 LDI R17,0x10
0102 940E01F0 CALL mod8u
0104 2F40 MOV R20,R16
(0079) temp = disp[temp];
0105 E680 LDI R24,0x60
0106 E090 LDI R25,0
0107 2FE4 MOV R30,R20
0108 27FF CLR R31
0109 0FE8 ADD R30,R24
010A 1FF9 ADC R31,R25
010B 8140 LDD R20,Z+0
(0080) if (led_buf[4] == i) { /*显示小数点*/
010C 90200075 LDS R2,i
010E 90300074 LDS R3,0x74
0110 1432 CP R3,R2
0111 F421 BNE 0x0116
(0081) SPDR = temp & 0x7F;
0112 2F84 MOV R24,R20
0113 778F ANDI R24,0x7F
0114 B98F OUT 0x0F,R24
(0082) }
0115 C001 RJMP 0x0117
(0083) else {
(0084) SPDR = temp;
0116 B94F OUT 0x0F,R20
(0085) }
(0086)
(0087) i ++;
0117 91800075 LDS R24,i
0119 5F8F SUBI R24,0xFF
011A 93800075 STS i,R24
(0088) if (i > 3) { /*溢出处理*/
011C E083 LDI R24,3
011D 90200075 LDS R2,i
011F 1582 CP R24,R2
0120 F418 BCC 0x0124
(0089) i = 0;
0121 2422 CLR R2
0122 92200075 STS i,R2
(0090) }
0124 940E0226 CALL pop_gset1
0126 9029 LD R2,Y+
0127 BE2F OUT 0x3F,R2
0128 91F9 LD R31,Y+
0129 91E9 LD R30,Y+
012A 9199 LD R25,Y+
012B 9189 LD R24,Y+
012C 9119 LD R17,Y+
012D 9109 LD R16,Y+
012E 9039 LD R3,Y+
012F 9029 LD R2,Y+
0130 9518 RETI
FILE: E:\ICCAVR\project\AVRMEG~2\icc\030-DS18B20-LED4\DS1820.C
(0001) /*
(0002) LCD12864液晶屏驱动模块
(0003) 1、可直接嵌入到项目中使用
(0004) 2、晶振频率:1M
(0005) 3、如晶振提高低层驱动延时要作相应修改
(0006) AVR_AFA
(0007) www.iccavr.com
(0008) */
(0009)
(0010) #include <iom16v.h>
(0011) #include <macros.h>
(0012)
(0013) #define DQ_IN DDRA &= ~(1 << PA7) /*设置输入*/
(0014) #define DQ_OUT DDRA |= (1 << PA7) /*设置输出*/
(0015) #define DQ_CLR PORTA &= ~(1 << PA7) /*置低电平*/
(0016) #define DQ_SET PORTA |= (1 << PA7) /*置高电平*/
(0017) #define DQ_R PINA & (1 << PA7) /*读了电平*/
(0018)
(0019) unsigned char flag; /*中断标志缓存*/
(0020)
(0021) /*===================================================================
(0022) // 函数功能: DS18B20数据校验函数
(0023) // 形参: void
(0024) // 返回: unsigned char 校验结果
(0025) // 编写: 2004/8/25
(0026) // 备注: CRC公式为:CRC = X^8 + X^5 + X^4 + 1
(0027) ===================================================================*/
(0028) /*unsigned char crc(unsigned char *p,unsigned char len)
(0029) {
(0030) unsigned char bit0,cbit,r,temp,i,j,byte;
(0031) temp = 0;
(0032) for(j = 0; j < len; j++)
(0033) {
(0034) byte = p[j];
(0035) for(i = 0; i < 8; i++)
(0036) {
(0037) cbit = temp & 0x01;
(0038) bit0 = byte&0x01;
(0039) temp >>= 1;
(0040) r = cbit ^ bit0;
(0041) if(r == 1)
(0042) temp ^= 0x8c;
(0043) byte >>= 1;
(0044) }
(0045) }
(0046) return temp;
(0047) }*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -