📄 ad.lst
字号:
__text_start:
__start:
0039 E5CF LDI R28,0x5F
003A E0D4 LDI R29,4
003B BFCD OUT 0x3D,R28
003C BFDE OUT 0x3E,R29
003D 51C0 SUBI R28,0x10
003E 40D0 SBCI R29,0
003F EA0A LDI R16,0xAA
0040 8308 STD Y+0,R16
0041 2400 CLR R0
0042 E6E0 LDI R30,0x60
0043 E0F0 LDI R31,0
0044 E010 LDI R17,0
0045 36E2 CPI R30,0x62
0046 07F1 CPC R31,R17
0047 F011 BEQ 0x004A
0048 9201 ST R0,Z+
0049 CFFB RJMP 0x0045
004A 8300 STD Z+0,R16
004B E7E2 LDI R30,0x72
004C E0F0 LDI R31,0
004D E6A0 LDI R26,0x60
004E E0B0 LDI R27,0
004F E010 LDI R17,0
0050 37E2 CPI R30,0x72
0051 07F1 CPC R31,R17
0052 F021 BEQ 0x0057
0053 95C8 LPM
0054 9631 ADIW R30,1
0055 920D ST R0,X+
0056 CFF9 RJMP 0x0050
0057 940E02D5 CALL _main
_exit:
0059 CFFF RJMP _exit
_delay:
i --> R20
n --> R16
005A 940E030A CALL push_gset1
FILE: E:\尤虎\程序设计\AVR单片机\MAGE16\ADCAND~1\lcd.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003)
(0004) #define uchar unsigned char
(0005) #define uint unsigned int
(0006)
(0007) #define LCD_EN_PORT PORTA //数据寄存器,以下2个要设为同一个口
(0008) #define LCD_EN_DDR DDRA //数据方向寄存器
(0009) #define LCD_RS_PORT PORTA //以下2个要设为同一个口
(0010) #define LCD_RS_DDR DDRA
(0011) #define LCD_DATA_PORT PORTA //以下3个要设为同一个口
(0012) #define LCD_DATA_DDR DDRA //一定要用高4位
(0013) #define LCD_DATA_PIN PINA //端口输入引脚
(0014) #define LCD_RS (1<<PA3) //0x04 portA3 out
(0015) #define LCD_EN (1<<PA2) //0x08 portA2 out
(0016) #define LCD_DATA ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0 portA4/5/6/7 out
(0017)
(0018)
(0019)
(0020) void LCD_init(void);
(0021) void LCD_en_write(void);
(0022) void LCD_write_command(uchar command);
(0023) void LCD_write_data(uchar data);
(0024) void LCD_set_xy (uchar x, uchar y);
(0025)
(0026) void delay(uint n) //N ms延时函数
(0027) {
005C C009 RJMP 0x0066
(0028) uint i;
(0029) while(n--)
(0030) for (i=0;i<125;i++);
005D 2744 CLR R20
005E 2755 CLR R21
005F C002 RJMP 0x0062
0060 5F4F SUBI R20,0xFF
0061 4F5F SBCI R21,0xFF
0062 374D CPI R20,0x7D
0063 E0E0 LDI R30,0
0064 075E CPC R21,R30
0065 F3D0 BCS 0x0060
0066 0118 MOVW R2,R16
0067 5001 SUBI R16,1
0068 4010 SBCI R17,0
0069 2022 TST R2
006A F791 BNE 0x005D
006B 2033 TST R3
006C F781 BNE 0x005D
006D 940E030D CALL pop_gset1
006F 9508 RET
(0031) }
(0032)
(0033) void LCD_init(void) //液晶初始化
(0034) {
(0035) LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出
_LCD_init:
0070 B38A IN R24,0x1A
0071 6F80 ORI R24,0xF0
0072 BB8A OUT 0x1A,R24
(0036) LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
0073 9AD2 SBI 0x1A,2
(0037) LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
0074 9AD3 SBI 0x1A,3
(0038) LCD_write_command(0x28);
0075 E208 LDI R16,0x28
0076 D014 RCALL _LCD_write_command
(0039) LCD_en_write();
0077 D00D RCALL _LCD_en_write
(0040) delay(40);
0078 E208 LDI R16,0x28
0079 E010 LDI R17,0
007A DFDF RCALL _delay
(0041) LCD_write_command(0x28); //4位显示
007B E208 LDI R16,0x28
007C D00E RCALL _LCD_write_command
(0042) LCD_write_command(0x0c); //显示开
007D E00C LDI R16,0xC
007E D00C RCALL _LCD_write_command
(0043) LCD_write_command(0x01); //清屏
007F E001 LDI R16,1
0080 D00A RCALL _LCD_write_command
(0044) delay(2);
0081 E002 LDI R16,2
0082 E010 LDI R17,0
0083 DFD6 RCALL _delay
0084 9508 RET
(0045) }
(0046)
(0047) void LCD_en_write(void) //液晶使能
(0048) {
(0049) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
0085 9ADA SBI 0x1B,2
(0050) delay(1);
0086 E001 LDI R16,1
0087 E010 LDI R17,0
0088 DFD1 RCALL _delay
(0051) LCD_EN_PORT&=~LCD_EN;
0089 98DA CBI 0x1B,2
008A 9508 RET
_LCD_write_command:
command --> R20
008B 940E030A CALL push_gset1
008D 2F40 MOV R20,R16
(0052) }
(0053)
(0054) void LCD_write_command(uchar command) //写指令
(0055) {
(0056) delay(16);
008E E100 LDI R16,0x10
008F E010 LDI R17,0
0090 DFC9 RCALL _delay
(0057) LCD_RS_PORT&=~LCD_RS; //RS=0
0091 98DB CBI 0x1B,3
(0058) LCD_DATA_PORT&=0X0f; //清高四位
0092 B38B IN R24,0x1B
0093 708F ANDI R24,0xF
0094 BB8B OUT 0x1B,R24
(0059) LCD_DATA_PORT|=command&0xf0; //写高四位
0095 2F84 MOV R24,R20
0096 7F80 ANDI R24,0xF0
0097 B22B IN R2,0x1B
0098 2A28 OR R2,R24
0099 BA2B OUT 0x1B,R2
(0060) LCD_en_write();
009A DFEA RCALL _LCD_en_write
(0061) command=command<<4; //低四位移到高四位
009B 2F84 MOV R24,R20
009C 708F ANDI R24,0xF
009D 9582 SWAP R24
009E 2F48 MOV R20,R24
(0062) LCD_DATA_PORT&=0x0f; //清高四位
009F B38B IN R24,0x1B
00A0 708F ANDI R24,0xF
00A1 BB8B OUT 0x1B,R24
(0063) LCD_DATA_PORT|=command&0xf0; //写低四位
00A2 2F84 MOV R24,R20
00A3 7F80 ANDI R24,0xF0
00A4 B22B IN R2,0x1B
00A5 2A28 OR R2,R24
00A6 BA2B OUT 0x1B,R2
(0064) LCD_en_write();
00A7 DFDD RCALL _LCD_en_write
00A8 940E030D CALL pop_gset1
00AA 9508 RET
_LCD_write_data:
data --> R20
00AB 940E030A CALL push_gset1
00AD 2F40 MOV R20,R16
(0065)
(0066) }
(0067)
(0068) void LCD_write_data(uchar data) //写数据
(0069) {
(0070) delay(16);
00AE E100 LDI R16,0x10
00AF E010 LDI R17,0
00B0 DFA9 RCALL _delay
(0071) LCD_RS_PORT|=LCD_RS; //RS=1
00B1 9ADB SBI 0x1B,3
(0072) LCD_DATA_PORT&=0X0f; //清高四位
00B2 B38B IN R24,0x1B
00B3 708F ANDI R24,0xF
00B4 BB8B OUT 0x1B,R24
(0073) LCD_DATA_PORT|=data&0xf0; //写高四位
00B5 2F84 MOV R24,R20
00B6 7F80 ANDI R24,0xF0
00B7 B22B IN R2,0x1B
00B8 2A28 OR R2,R24
00B9 BA2B OUT 0x1B,R2
(0074) LCD_en_write();
00BA DFCA RCALL _LCD_en_write
(0075) data=data<<4; //低四位移到高四位
00BB 2F84 MOV R24,R20
00BC 708F ANDI R24,0xF
00BD 9582 SWAP R24
00BE 2F48 MOV R20,R24
(0076) LCD_DATA_PORT&=0X0f; //清高四位
00BF B38B IN R24,0x1B
00C0 708F ANDI R24,0xF
00C1 BB8B OUT 0x1B,R24
(0077) LCD_DATA_PORT|=data&0xf0; //写低四位
00C2 2F84 MOV R24,R20
00C3 7F80 ANDI R24,0xF0
00C4 B22B IN R2,0x1B
00C5 2A28 OR R2,R24
00C6 BA2B OUT 0x1B,R2
(0078) LCD_en_write();
00C7 DFBD RCALL _LCD_en_write
00C8 940E030D CALL pop_gset1
00CA 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
00CB 940E0308 CALL push_gset2
00CD 2F42 MOV R20,R18
00CE 2F60 MOV R22,R16
(0079) }
(0080)
(0081)
(0082) void LCD_set_xy( uchar x, uchar y ) //写地址函数
(0083) {
(0084) uchar address;
(0085) if (y == 0) address = 0x80 + x;
00CF 2344 TST R20
00D0 F419 BNE 0x00D4
00D1 2F46 MOV R20,R22
00D2 5840 SUBI R20,0x80
00D3 C002 RJMP 0x00D6
(0086) else address = 0xc0 + x;
00D4 2F46 MOV R20,R22
00D5 5440 SUBI R20,0x40
(0087) LCD_write_command( address);
00D6 2F04 MOV R16,R20
00D7 DFB3 RCALL _LCD_write_command
00D8 940E02F9 CALL pop_gset2
00DA 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
00DB 940E0306 CALL push_gset3
00DD 2EA2 MOV R10,R18
00DE 2F60 MOV R22,R16
00DF 814E LDD R20,Y+6
00E0 815F LDD R21,Y+7
(0088) }
(0089)
(0090) void LCD_write_string(uchar X,uchar Y,uchar *s) //列x=0~15,行y=0,1
(0091) {
(0092) LCD_set_xy( X, Y ); //写地址
00E1 2D2A MOV R18,R10
00E2 2F06 MOV R16,R22
00E3 DFE7 RCALL _LCD_set_xy
00E4 C005 RJMP 0x00EA
(0093) while (*s) // 写显示字符
(0094) {
(0095) LCD_write_data( *s );
00E5 01FA MOVW R30,R20
00E6 8100 LDD R16,Z+0
00E7 DFC3 RCALL _LCD_write_data
(0096) s ++;
00E8 5F4F SUBI R20,0xFF
00E9 4F5F SBCI R21,0xFF
00EA 01FA MOVW R30,R20
00EB 8020 LDD R2,Z+0
00EC 2022 TST R2
00ED F7B9 BNE 0x00E5
00EE 940E02FC CALL pop_gset3
00F0 9508 RET
_LCD_write_char:
data --> Y+4
Y --> R22
X --> R20
00F1 940E0308 CALL push_gset2
00F3 2F62 MOV R22,R18
00F4 2F40 MOV R20,R16
(0097) }
(0098)
(0099) }
(0100)
(0101) void LCD_write_char(uchar X,uchar Y,uchar data) //列x=0~15,行y=0,1
(0102) {
(0103) LCD_set_xy( X, Y ); //写地址
00F5 2F26 MOV R18,R22
00F6 2F04 MOV R16,R20
00F7 DFD3 RCALL _LCD_set_xy
(0104) LCD_write_data( data);
00F8 810C LDD R16,Y+4
00F9 DFB1 RCALL _LCD_write_data
00FA 940E02F9 CALL pop_gset2
00FC 9508 RET
(0105)
(0106) }
(0107)
(0108) void init_lcd(void)
(0109) {
(0110) CLI(); //禁止所有中断
_init_lcd:
00FD 94F8 BCLR 7
(0111) LCD_init();
00FE DF71 RCALL _LCD_init
(0112) MCUCR = 0x00;
00FF 2422 CLR R2
0100 BE25 OUT 0x35,R2
(0113) GICR = 0x00;
0101 BE2B OUT 0x3B,R2
(0114) TIMSK = 0x00;
0102 BE29 OUT 0x39,R2
(0115) SEI(); //重新开启所有中断
0103 9478 BSET 7
0104 9508 RET
FILE: E:\尤虎\程序设计\AVR单片机\MAGE16\ADCAND~1\adc.c
(0001) //Project :ADC(10 bit) and LCD Display
(0002) //ICC-AVR application builder : 2007-5-10 21:20:44
(0003) // Target : M16
(0004) // Crystal : 8.0000Mhz
(0005) // Writer : you hu
(0006) #include <iom16v.h>
(0007) #include <macros.h>
(0008) #include "lcd.h"
(0009) #include "display.h"
(0010)
(0011) typedef unsigned char uchar;
(0012) typedef unsigned int uint;
(0013)
(0014) int value; //全局变量,存储10位的AD转换数据
(0015)
(0016)
(0017) //ADC initialize
(0018) // Conversion time: 52uS
(0019)
(0020) void adc_init(void)
(0021) {
(0022) ADCSR = 0x00; //禁止AD启动
_adc_init:
0105 2422 CLR R2
0106 B826 OUT 0x06,R2
(0023) ADMUX = 0xC0; //选择通道0,默认的右对齐方式
0107 EC80 LDI R24,0xC0
0108 B987 OUT 0x07,R24
(0024) ACSR = 0x80;
0109 E880 LDI R24,0x80
010A B988 OUT 0x08,R24
(0025) ADCSR = 0xED; //启动AD转换
010B EE8D LDI R24,0xED
010C B986 OUT 0x06,R24
010D 9508 RET
_adc_isr:
010E 922A ST R2,-Y
010F 923A ST R3,-Y
0110 924A ST R4,-Y
0111 925A ST R5,-Y
0112 B62F IN R2,0x3F
0113 922A ST R2,-Y
(0026) }
(0027)
(0028) #pragma interrupt_handler adc_isr:15 //中断方式读取AD转换值
(0029) void adc_isr(void)
(0030) {
(0031) value=ADCL; //读取低8位转换值
0114 B024 IN R2,0x04
0115 2433 CLR R3
0116 92300061 STS value+1,R3
0118 92200060 STS value,R2
(0032) value|=(int)ADCH << 8; //读取高2位转换值
011A B025 IN R2,0x05
011B 2433 CLR R3
011C 2C32 MOV R3,R2
011D 2422 CLR R2
011E 90400060 LDS R4,value
0120 90500061 LDS R5,value+1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -