⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 计算器.lst

📁 通过单片机实现计算器的功能
💻 LST
📖 第 1 页 / 共 5 页
字号:
__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 + -