📄 计算器.lst
字号:
__start:
__text_start:
0049 E5CF LDI R28,0x5F
004A E0D4 LDI R29,4
004B BFCD OUT 0x3D,R28
004C BFDE OUT 0x3E,R29
004D 51C0 SUBI R28,0x10
004E 40D0 SBCI R29,0
004F EA0A LDI R16,0xAA
0050 8308 STD Y+0,R16
0051 2400 CLR R0
0052 E9EE LDI R30,0x9E
0053 E0F0 LDI R31,0
0054 E010 LDI R17,0
0055 3AE7 CPI R30,0xA7
0056 07F1 CPC R31,R17
0057 F011 BEQ 0x005A
0058 9201 ST R0,Z+
0059 CFFB RJMP 0x0055
005A 8300 STD Z+0,R16
005B E5E4 LDI R30,0x54
005C E0F0 LDI R31,0
005D E6A0 LDI R26,0x60
005E E0B0 LDI R27,0
005F E010 LDI R17,0
0060 39E2 CPI R30,0x92
0061 07F1 CPC R31,R17
0062 F021 BEQ 0x0067
0063 95C8 LPM
0064 9631 ADIW R30,1
0065 920D ST R0,X+
0066 CFF9 RJMP 0x0060
0067 940E05C2 CALL _main
_exit:
0069 CFFF RJMP _exit
FILE: D:\avr\+++精华+++\计算器\delay.h
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 编译器:ICC-AVR v6.31A
(0004) 目标芯片 : M16
(0005) 时钟: 8.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:
006A 0000 NOP
006B 9508 RET
_delay_nus:
i --> R20
n --> R22
006C 940E06CC CALL push_gset2
006E 01B8 MOVW R22,R16
(0017) }
(0018)
(0019) void delay_nus(unsigned int n) //N us延时函数
(0020) {
(0021) unsigned int i=0;
006F 2744 CLR R20
0070 2755 CLR R21
(0022) for (i=0;i<n;i++)
0071 C003 RJMP 0x0075
(0023) delay_1us();
0072 DFF7 RCALL _delay_1us
0073 5F4F SUBI R20,0xFF
0074 4F5F SBCI R21,0xFF
0075 1746 CP R20,R22
0076 0757 CPC R21,R23
0077 F3D0 BCS 0x0072
0078 940E06C0 CALL pop_gset2
007A 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
007B 2700 CLR R16
007C 2711 CLR R17
007D C002 RJMP 0x0080
007E 5F0F SUBI R16,0xFF
007F 4F1F SBCI R17,0xFF
0080 3704 CPI R16,0x74
0081 E0E4 LDI R30,4
0082 071E CPC R17,R30
0083 F3D0 BCS 0x007E
0084 9508 RET
_delay_nms:
i --> R20
n --> R22
0085 940E06CC CALL push_gset2
0087 01B8 MOVW R22,R16
(0030) }
(0031)
(0032) void delay_nms(unsigned int n) //N ms延时函数
(0033) {
(0034) unsigned int i=0;
0088 2744 CLR R20
0089 2755 CLR R21
(0035) for (i=0;i<n;i++)
008A C003 RJMP 0x008E
(0036) delay_1ms();
008B DFEF RCALL _delay_1ms
008C 5F4F SUBI R20,0xFF
008D 4F5F SBCI R21,0xFF
008E 1746 CP R20,R22
008F 0757 CPC R21,R23
0090 F3D0 BCS 0x008B
0091 940E06C0 CALL pop_gset2
0093 9508 RET
FILE: D:\avr\+++精华+++\计算器\1602.h
(0001)
(0002) /* 用法:
(0003) LCD_init();
(0004) LCD_write_string(列,行,"字符串");
(0005) LCD_write_char(列,行,'字符');
(0006) ---------------------------------------------------------------
(0007) 下面是AVR与LCD连接信息
(0008) PC4 ->RS
(0009) PC5 ->EN
(0010) 地 ->RW
(0011) PC0 ->D4
(0012) PC1 ->D5
(0013) PC2 ->D6
(0014) PC3 ->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 //默认情况下连线必须使用高四位端口,如果不是请注意修改
(0023) #define LCD_DATA_PIN PINA
(0024) #define LCD_RS (1<<PC6) //0x20 portC6 out
(0025) #define LCD_EN (1<<PC7) //0x40 portC7 out
(0026) #define LCD_DATA ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0 portA 4/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 <macros.h>
(0041) #include "delay.h"
(0042)
(0043) void LCD_init(void) //液晶初始化
(0044) {
(0045) LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出
_LCD_init:
0094 B38A IN R24,0x1A
0095 6F80 ORI R24,0xF0
0096 BB8A OUT 0x1A,R24
(0046) LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
0097 9AA7 SBI 0x14,7
(0047) LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
0098 9AA6 SBI 0x14,6
(0048) LCD_write_command(0x28);
0099 E208 LDI R16,0x28
009A D014 RCALL _LCD_write_command
(0049) LCD_en_write();
009B D00D RCALL _LCD_en_write
(0050) delay_nus(40);
009C E208 LDI R16,0x28
009D E010 LDI R17,0
009E DFCD RCALL _delay_nus
(0051) LCD_write_command(0x28); //4位显示
009F E208 LDI R16,0x28
00A0 D00E RCALL _LCD_write_command
(0052) LCD_write_command(0x0c); //显示开
00A1 E00C LDI R16,0xC
00A2 D00C RCALL _LCD_write_command
(0053) LCD_write_command(0x01); //清屏
00A3 E001 LDI R16,1
00A4 D00A RCALL _LCD_write_command
(0054) delay_nms(2);
00A5 E002 LDI R16,2
00A6 E010 LDI R17,0
00A7 DFDD RCALL _delay_nms
00A8 9508 RET
(0055)
(0056)
(0057)
(0058) }
(0059)
(0060) void LCD_en_write(void) //液晶使能
(0061) {
(0062) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
00A9 9AAF SBI 0x15,7
(0063) delay_nus(1);
00AA E001 LDI R16,1
00AB E010 LDI R17,0
00AC DFBF RCALL _delay_nus
(0064) LCD_EN_PORT&=~LCD_EN;
00AD 98AF CBI 0x15,7
00AE 9508 RET
_LCD_write_command:
command --> R20
00AF 940E06CE CALL push_gset1
00B1 2F40 MOV R20,R16
(0065) }
(0066)
(0067) void LCD_write_command(unsigned char command) //写指令
(0068) {
(0069) //连线为高4位的写法
(0070) delay_nus(16);
00B2 E100 LDI R16,0x10
00B3 E010 LDI R17,0
00B4 DFB7 RCALL _delay_nus
(0071) LCD_RS_PORT&=~LCD_RS; //RS=0
00B5 98AE CBI 0x15,6
(0072) LCD_DATA_PORT&=0X0f; //清高四位
00B6 B38B IN R24,0x1B
00B7 708F ANDI R24,0xF
00B8 BB8B OUT 0x1B,R24
(0073) LCD_DATA_PORT|=command&0xf0; //写高四位
00B9 2F84 MOV R24,R20
00BA 7F80 ANDI R24,0xF0
00BB B22B IN R2,0x1B
00BC 2A28 OR R2,R24
00BD BA2B OUT 0x1B,R2
(0074) LCD_en_write();
00BE DFEA RCALL _LCD_en_write
(0075) command=command<<4; //低四位移到高四位
00BF 2F84 MOV R24,R20
00C0 708F ANDI R24,0xF
00C1 9582 SWAP R24
00C2 2F48 MOV R20,R24
(0076) LCD_DATA_PORT&=0x0f; //清高四位
00C3 B38B IN R24,0x1B
00C4 708F ANDI R24,0xF
00C5 BB8B OUT 0x1B,R24
(0077) LCD_DATA_PORT|=command&0xf0; //写低四位
00C6 2F84 MOV R24,R20
00C7 7F80 ANDI R24,0xF0
00C8 B22B IN R2,0x1B
00C9 2A28 OR R2,R24
00CA BA2B OUT 0x1B,R2
(0078) LCD_en_write();
00CB DFDD RCALL _LCD_en_write
00CC 940E06D1 CALL pop_gset1
00CE 9508 RET
_LCD_write_data:
data --> R20
00CF 940E06CE CALL push_gset1
00D1 2F40 MOV R20,R16
(0079)
(0080) /*
(0081) //连线为低四位的写法
(0082) delay_nus(16);
(0083) LCD_RS_PORT&=~LCD_RS; //RS=0
(0084) LCD_DATA_PORT&=0xf0; //清高四位
(0085) LCD_DATA_PORT|=(command>>4)&0x0f; //写高四位
(0086) LCD_en_write();
(0087) LCD_DATA_PORT&=0xf0; //清高四位
(0088) LCD_DATA_PORT|=command&0x0f; //写低四位
(0089) LCD_en_write();
(0090) */
(0091)
(0092) }
(0093)
(0094) void LCD_write_data(unsigned char data) //写数据
(0095) {
(0096) //连线为高4位的写法
(0097) delay_nus(16);
00D2 E100 LDI R16,0x10
00D3 E010 LDI R17,0
00D4 DF97 RCALL _delay_nus
(0098) LCD_RS_PORT|=LCD_RS; //RS=1
00D5 9AAE SBI 0x15,6
(0099) LCD_DATA_PORT&=0X0f; //清高四位
00D6 B38B IN R24,0x1B
00D7 708F ANDI R24,0xF
00D8 BB8B OUT 0x1B,R24
(0100) LCD_DATA_PORT|=data&0xf0; //写高四位
00D9 2F84 MOV R24,R20
00DA 7F80 ANDI R24,0xF0
00DB B22B IN R2,0x1B
00DC 2A28 OR R2,R24
00DD BA2B OUT 0x1B,R2
(0101) LCD_en_write();
00DE DFCA RCALL _LCD_en_write
(0102) data=data<<4; //低四位移到高四位
00DF 2F84 MOV R24,R20
00E0 708F ANDI R24,0xF
00E1 9582 SWAP R24
00E2 2F48 MOV R20,R24
(0103) LCD_DATA_PORT&=0X0f; //清高四位
00E3 B38B IN R24,0x1B
00E4 708F ANDI R24,0xF
00E5 BB8B OUT 0x1B,R24
(0104) LCD_DATA_PORT|=data&0xf0; //写低四位
00E6 2F84 MOV R24,R20
00E7 7F80 ANDI R24,0xF0
00E8 B22B IN R2,0x1B
00E9 2A28 OR R2,R24
00EA BA2B OUT 0x1B,R2
(0105) LCD_en_write();
00EB DFBD RCALL _LCD_en_write
00EC 940E06D1 CALL pop_gset1
00EE 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
00EF 940E06CC CALL push_gset2
00F1 2F42 MOV R20,R18
00F2 2F60 MOV R22,R16
(0106)
(0107) /*
(0108) //连线为低四位的写法
(0109) delay_nus(16);
(0110) LCD_RS_PORT|=LCD_RS; //RS=1
(0111) LCD_DATA_PORT&=0Xf0; //清高四位
(0112) LCD_DATA_PORT|=(data>>4)&0x0f; //写高四位
(0113) LCD_en_write();
(0114)
(0115) LCD_DATA_PORT&=0Xf0; //清高四位
(0116) LCD_DATA_PORT|=data&0x0f; //写低四位
(0117) LCD_en_write();
(0118) */
(0119)
(0120) }
(0121)
(0122)
(0123) void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
(0124) {
(0125) unsigned char address;
(0126) if (y == 0) address = 0x80 + x;
00F3 2344 TST R20
00F4 F419 BNE 0x00F8
00F5 2F46 MOV R20,R22
00F6 5840 SUBI R20,0x80
00F7 C002 RJMP 0x00FA
(0127) else address = 0xc0 + x;
00F8 2F46 MOV R20,R22
00F9 5440 SUBI R20,0x40
(0128) LCD_write_command( address);
00FA 2F04 MOV R16,R20
00FB DFB3 RCALL _LCD_write_command
00FC 940E06C0 CALL pop_gset2
00FE 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
00FF 940E06CA CALL push_gset3
0101 2EA2 MOV R10,R18
0102 2F60 MOV R22,R16
0103 814E LDD R20,Y+6
0104 815F LDD R21,Y+7
(0129) }
(0130)
(0131) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
(0132) {
(0133) LCD_set_xy( X, Y ); //写地址
0105 2D2A MOV R18,R10
0106 2F06 MOV R16,R22
0107 DFE7 RCALL _LCD_set_xy
0108 C005 RJMP 0x010E
(0134) while (*s) // 写显示字符
(0135) {
(0136) LCD_write_data( *s );
0109 01FA MOVW R30,R20
010A 8100 LDD R16,Z+0
010B DFC3 RCALL _LCD_write_data
(0137) s ++;
010C 5F4F SUBI R20,0xFF
010D 4F5F SBCI R21,0xFF
010E 01FA MOVW R30,R20
010F 8020 LDD R2,Z+0
0110 2022 TST R2
0111 F7B9 BNE 0x0109
0112 940E06C3 CALL pop_gset3
0114 9508 RET
_LCD_write_char:
data --> Y+4
Y --> R22
X --> R20
0115 940E06CC CALL push_gset2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -