📄 ad转化.lst
字号:
__start:
__text_start:
003A E5CF LDI R28,0x5F
003B E0D4 LDI R29,4
003C BFCD OUT 0x3D,R28
003D BFDE OUT 0x3E,R29
003E 51C0 SUBI R28,0x10
003F 40D0 SBCI R29,0
0040 EA0A LDI R16,0xAA
0041 8308 STD Y+0,R16
0042 2400 CLR R0
0043 E7EF LDI R30,0x7F
0044 E0F0 LDI R31,0
0045 E010 LDI R17,0
0046 37EF CPI R30,0x7F
0047 07F1 CPC R31,R17
0048 F011 BEQ 0x004B
0049 9201 ST R0,Z+
004A CFFB RJMP 0x0046
004B 8300 STD Z+0,R16
004C E5E4 LDI R30,0x54
004D E0F0 LDI R31,0
004E E6A0 LDI R26,0x60
004F E0B0 LDI R27,0
0050 E010 LDI R17,0
0051 37E3 CPI R30,0x73
0052 07F1 CPC R31,R17
0053 F021 BEQ 0x0058
0054 95C8 LPM
0055 9631 ADIW R30,1
0056 920D ST R0,X+
0057 CFF9 RJMP 0x0051
0058 940E0154 CALL _main
_exit:
005A CFFF RJMP _exit
FILE: E:\单片机\PROJECT\高精度三维太阳自动跟踪器\程序\传感器控制\delay.h
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 编译器:ICC-AVR v6.31A
(0004) 目标芯片 : M16
(0005) 时钟: 1.0000Mhz
(0006) -----------------------------------------------------------------------*/
(0007) #ifndef __delay_h
(0008) #define __delay_h
(0009) void delay_nus(unsigned int n);
(0010) void delay_nms(unsigned int n);
(0011) void delay_1us(void);
(0012) void delay_1ms(void) ;
(0013)
(0014) void delay_1us(void) //1us延时函数
(0015) {
(0016) asm("nop");
_delay_1us:
005B 0000 NOP
005C 9508 RET
_delay_nus:
i --> R20
n --> R22
005D 940E01EC CALL push_gset2
005F 01B8 MOVW R22,R16
(0017) }
(0018)
(0019) void delay_nus(unsigned int n) //N us延时函数
(0020) {
(0021) unsigned int i=0;
0060 2744 CLR R20
0061 2755 CLR R21
(0022) for (i=0;i<n;i++)
0062 C003 RJMP 0x0066
(0023) delay_1us();
0063 DFF7 RCALL _delay_1us
0064 5F4F SUBI R20,0xFF
0065 4F5F SBCI R21,0xFF
0066 1746 CP R20,R22
0067 0757 CPC R21,R23
0068 F3D0 BCS 0x0063
0069 940E01E0 CALL pop_gset2
006B 9508 RET
(0024) }
(0025)
(0026) void delay_1ms(void) //1ms延时函数
(0027) {
(0028) unsigned int i;
(0029) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
006C 2700 CLR R16
006D 2711 CLR R17
006E C002 RJMP 0x0071
006F 5F0F SUBI R16,0xFF
0070 4F1F SBCI R17,0xFF
0071 3704 CPI R16,0x74
0072 E0E4 LDI R30,4
0073 071E CPC R17,R30
0074 F3D0 BCS 0x006F
0075 9508 RET
_delay_nms:
i --> R20
n --> R22
0076 940E01EC CALL push_gset2
0078 01B8 MOVW R22,R16
(0030) }
(0031)
(0032) void delay_nms(unsigned int n) //N ms延时函数
(0033) {
(0034) unsigned int i=0;
0079 2744 CLR R20
007A 2755 CLR R21
(0035) for (i=0;i<n;i++)
007B C003 RJMP 0x007F
(0036) delay_1ms();
007C DFEF RCALL _delay_1ms
007D 5F4F SUBI R20,0xFF
007E 4F5F SBCI R21,0xFF
007F 1746 CP R20,R22
0080 0757 CPC R21,R23
0081 F3D0 BCS 0x007C
0082 940E01E0 CALL pop_gset2
0084 9508 RET
FILE: E:\单片机\PROJECT\高精度三维太阳自动跟踪器\程序\传感器控制\1602.h
(0001)
(0002) /* 用法:
(0003) LCD_init();
(0004) LCD_write_string(列,行,"字符串");
(0005) LCD_write_char(列,行,'字符');
(0006) ---------------------------------------------------------------
(0007) 下面是AVR与LCD连接信息
(0008) PA2 ->RS
(0009) PA3 ->EN
(0010) 地 ->RW
(0011) PA4 ->D4
(0012) PA5 ->D5
(0013) PA6 ->D6
(0014) PA7 ->D7
(0015) 要使用本驱动,改变下面配置信息即可
(0016) -----------------------------------------------------------------*/
(0017) #define LCD_EN_PORT PORTC //以下2个要设为同一个口
(0018) #define LCD_EN_DDR DDRC
(0019) #define LCD_RS_PORT PORTC //以下2个要设为同一个口
(0020) #define LCD_RS_DDR DDRC
(0021) #define LCD_DATA_PORT PORTA //以下3个要设为同一个口
(0022) #define LCD_DATA_DDR DDRA //一定要用高4位
(0023) #define LCD_DATA_PIN PINA
(0024) #define LCD_RS (1<<PC6) //0x04 portC6 out
(0025) #define LCD_EN (1<<PC7) //0x08 portC7 out
(0026) #define LCD_DATA ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0 portA4/5/6/7 out
(0027) /*--------------------------------------------------------------------------------------------------
(0028) 函数说明
(0029) --------------------------------------------------------------------------------------------------*/
(0030) void LCD_init(void);
(0031) void LCD_en_write(void);
(0032) void LCD_write_command(unsigned char command) ;
(0033) void LCD_write_data(unsigned char data);
(0034) void LCD_set_xy (unsigned char x, unsigned char y);
(0035) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
(0036) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data);
(0037)
(0038) //-----------------------------------------------------------------------------------------
(0039)
(0040) #include <iom16v.h>
(0041) #include <macros.h>
(0042) #include "delay.h"
(0043)
(0044) void LCD_init(void) //液晶初始化
(0045) {
(0046) LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出
_LCD_init:
0085 B38A IN R24,0x1A
0086 6F80 ORI R24,0xF0
0087 BB8A OUT 0x1A,R24
(0047) LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
0088 9AA7 SBI 0x14,7
(0048) LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
0089 9AA6 SBI 0x14,6
(0049) LCD_write_command(0x28);
008A E208 LDI R16,0x28
008B D014 RCALL _LCD_write_command
(0050) LCD_en_write();
008C D00D RCALL _LCD_en_write
(0051) delay_nus(40);
008D E208 LDI R16,0x28
008E E010 LDI R17,0
008F DFCD RCALL _delay_nus
(0052) LCD_write_command(0x28); //4位显示
0090 E208 LDI R16,0x28
0091 D00E RCALL _LCD_write_command
(0053) LCD_write_command(0x0c); //显示开
0092 E00C LDI R16,0xC
0093 D00C RCALL _LCD_write_command
(0054) LCD_write_command(0x01); //清屏
0094 E001 LDI R16,1
0095 D00A RCALL _LCD_write_command
(0055) delay_nms(2);
0096 E002 LDI R16,2
0097 E010 LDI R17,0
0098 DFDD RCALL _delay_nms
0099 9508 RET
(0056) }
(0057)
(0058) void LCD_en_write(void) //液晶使能
(0059) {
(0060) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
009A 9AAF SBI 0x15,7
(0061) delay_nus(1);
009B E001 LDI R16,1
009C E010 LDI R17,0
009D DFBF RCALL _delay_nus
(0062) LCD_EN_PORT&=~LCD_EN;
009E 98AF CBI 0x15,7
009F 9508 RET
_LCD_write_command:
command --> R20
00A0 940E01EE CALL push_gset1
00A2 2F40 MOV R20,R16
(0063) }
(0064)
(0065) void LCD_write_command(unsigned char command) //写指令
(0066) {
(0067) delay_nus(16);
00A3 E100 LDI R16,0x10
00A4 E010 LDI R17,0
00A5 DFB7 RCALL _delay_nus
(0068) LCD_RS_PORT&=~LCD_RS; //RS=0
00A6 98AE CBI 0x15,6
(0069) LCD_DATA_PORT&=0X0f; //清高四位
00A7 B38B IN R24,0x1B
00A8 708F ANDI R24,0xF
00A9 BB8B OUT 0x1B,R24
(0070) LCD_DATA_PORT|=command&0xf0; //写高四位
00AA 2F84 MOV R24,R20
00AB 7F80 ANDI R24,0xF0
00AC B22B IN R2,0x1B
00AD 2A28 OR R2,R24
00AE BA2B OUT 0x1B,R2
(0071) LCD_en_write();
00AF DFEA RCALL _LCD_en_write
(0072) command=command<<4; //低四位移到高四位
00B0 2F84 MOV R24,R20
00B1 708F ANDI R24,0xF
00B2 9582 SWAP R24
00B3 2F48 MOV R20,R24
(0073) LCD_DATA_PORT&=0x0f; //清高四位
00B4 B38B IN R24,0x1B
00B5 708F ANDI R24,0xF
00B6 BB8B OUT 0x1B,R24
(0074) LCD_DATA_PORT|=command&0xf0; //写低四位
00B7 2F84 MOV R24,R20
00B8 7F80 ANDI R24,0xF0
00B9 B22B IN R2,0x1B
00BA 2A28 OR R2,R24
00BB BA2B OUT 0x1B,R2
(0075) LCD_en_write();
00BC DFDD RCALL _LCD_en_write
00BD 940E01F1 CALL pop_gset1
00BF 9508 RET
_LCD_write_data:
data --> R20
00C0 940E01EE CALL push_gset1
00C2 2F40 MOV R20,R16
(0076)
(0077) }
(0078)
(0079) void LCD_write_data(unsigned char data) //写数据
(0080) {
(0081) delay_nus(16);
00C3 E100 LDI R16,0x10
00C4 E010 LDI R17,0
00C5 DF97 RCALL _delay_nus
(0082) LCD_RS_PORT|=LCD_RS; //RS=1
00C6 9AAE SBI 0x15,6
(0083) LCD_DATA_PORT&=0X0f; //清高四位
00C7 B38B IN R24,0x1B
00C8 708F ANDI R24,0xF
00C9 BB8B OUT 0x1B,R24
(0084) LCD_DATA_PORT|=data&0xf0; //写高四位
00CA 2F84 MOV R24,R20
00CB 7F80 ANDI R24,0xF0
00CC B22B IN R2,0x1B
00CD 2A28 OR R2,R24
00CE BA2B OUT 0x1B,R2
(0085) LCD_en_write();
00CF DFCA RCALL _LCD_en_write
(0086) data=data<<4; //低四位移到高四位
00D0 2F84 MOV R24,R20
00D1 708F ANDI R24,0xF
00D2 9582 SWAP R24
00D3 2F48 MOV R20,R24
(0087) LCD_DATA_PORT&=0X0f; //清高四位
00D4 B38B IN R24,0x1B
00D5 708F ANDI R24,0xF
00D6 BB8B OUT 0x1B,R24
(0088) LCD_DATA_PORT|=data&0xf0; //写低四位
00D7 2F84 MOV R24,R20
00D8 7F80 ANDI R24,0xF0
00D9 B22B IN R2,0x1B
00DA 2A28 OR R2,R24
00DB BA2B OUT 0x1B,R2
(0089) LCD_en_write();
00DC DFBD RCALL _LCD_en_write
00DD 940E01F1 CALL pop_gset1
00DF 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
00E0 940E01EC CALL push_gset2
00E2 2F42 MOV R20,R18
00E3 2F60 MOV R22,R16
(0090) }
(0091)
(0092)
(0093) void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
(0094) {
(0095) unsigned char address;
(0096) if (y == 0) address = 0x80 + x;
00E4 2344 TST R20
00E5 F419 BNE 0x00E9
00E6 2F46 MOV R20,R22
00E7 5840 SUBI R20,0x80
00E8 C002 RJMP 0x00EB
(0097) else address = 0xc0 + x;
00E9 2F46 MOV R20,R22
00EA 5440 SUBI R20,0x40
(0098) LCD_write_command( address);
00EB 2F04 MOV R16,R20
00EC DFB3 RCALL _LCD_write_command
00ED 940E01E0 CALL pop_gset2
00EF 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
00F0 940E01EA CALL push_gset3
00F2 2EA2 MOV R10,R18
00F3 2F60 MOV R22,R16
00F4 814E LDD R20,Y+6
00F5 815F LDD R21,Y+7
(0099) }
(0100)
(0101) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
(0102) {
(0103) LCD_set_xy( X, Y ); //写地址
00F6 2D2A MOV R18,R10
00F7 2F06 MOV R16,R22
00F8 DFE7 RCALL _LCD_set_xy
00F9 C005 RJMP 0x00FF
(0104) while (*s) // 写显示字符
(0105) {
(0106) LCD_write_data( *s );
00FA 01FA MOVW R30,R20
00FB 8100 LDD R16,Z+0
00FC DFC3 RCALL _LCD_write_data
(0107) s ++;
00FD 5F4F SUBI R20,0xFF
00FE 4F5F SBCI R21,0xFF
00FF 01FA MOVW R30,R20
0100 8020 LDD R2,Z+0
0101 2022 TST R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -