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

📄 sleep.lst

📁 ATmega16休眠模式的应用:使用程序关闭没有使用的模块
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    0059 E5CF      LDI	R28,0x5F
    005A E0D4      LDI	R29,4
    005B BFCD      OUT	0x3D,R28
    005C BFDE      OUT	0x3E,R29
    005D 51C0      SUBI	R28,0x10
    005E 40D0      SBCI	R29,0
    005F EA0A      LDI	R16,0xAA
    0060 8308      STD	Y+0,R16
    0061 2400      CLR	R0
    0062 EBED      LDI	R30,0xBD
    0063 E0F0      LDI	R31,0
    0064 E010      LDI	R17,0
    0065 3CE5      CPI	R30,0xC5
    0066 07F1      CPC	R31,R17
    0067 F011      BEQ	0x006A
    0068 9201      ST	R0,Z+
    0069 CFFB      RJMP	0x0065
    006A 8300      STD	Z+0,R16
    006B E5E4      LDI	R30,0x54
    006C E0F0      LDI	R31,0
    006D E6A0      LDI	R26,0x60
    006E E0B0      LDI	R27,0
    006F E010      LDI	R17,0
    0070 3BE1      CPI	R30,0xB1
    0071 07F1      CPC	R31,R17
    0072 F021      BEQ	0x0077
    0073 95C8      LPM
    0074 9631      ADIW	R30,1
    0075 920D      ST	R0,X+
    0076 CFF9      RJMP	0x0070
    0077 940E0281  CALL	_main
_exit:
    0079 CFFF      RJMP	_exit
FILE: F:\radio\第十二篇\sleep\usart.c
(0001) #include <iom16v.h>
(0002) #include "delay.h"
(0003) #define fosc 8000000 //晶振8MHZ
(0004) #define baud 19200	 //波特率
(0005) /*  		字符输出函数 		 */
(0006) void putchar(unsigned char coutput)
(0007) {	 
(0008)    while (!(UCSRA&(1<<UDRE)));
_putchar:
  coutput              --> R16
    007A 9B5D      SBIS	0x0B,5
    007B CFFE      RJMP	_putchar
(0009)    UDR=coutput;    
    007C B90C      OUT	0x0C,R16
    007D 9508      RET
(0010) }
(0011) /*  		字符输入函数 		 */	
(0012) unsigned char getchar(void)
(0013) {
(0014)    while(!(UCSRA& (1<<RXC)));
_getchar:
    007E 9B5F      SBIS	0x0B,7
    007F CFFE      RJMP	_getchar
(0015)    return UDR;
    0080 B10C      IN	R16,0x0C
    0081 9508      RET
_puts:
  s                    --> R20
    0082 940E0393  CALL	push_gset1
    0084 01A8      MOVW	R20,R16
(0016) }		
(0017) /*			字符串输出函数	   	 */	
(0018) int puts(char *s)
(0019) {
    0085 C005      RJMP	0x008B
(0020)    while (*s)
(0021)    {
(0022) 	  putchar(*s);
    0086 01FA      MOVW	R30,R20
    0087 8100      LDD	R16,Z+0
    0088 DFF1      RCALL	_putchar
(0023) 	  s++;
    0089 5F4F      SUBI	R20,0xFF
    008A 4F5F      SBCI	R21,0xFF
    008B 01FA      MOVW	R30,R20
    008C 8020      LDD	R2,Z+0
    008D 2022      TST	R2
    008E F7B9      BNE	0x0086
(0024)    }	
(0025)    putchar(0x0d);
    008F E00D      LDI	R16,0xD
    0090 DFE9      RCALL	_putchar
(0026)    putchar(0x0a);//回车换行
    0091 E00A      LDI	R16,0xA
    0092 DFE7      RCALL	_putchar
(0027)    return 1;
    0093 E001      LDI	R16,1
    0094 E010      LDI	R17,0
    0095 940E0396  CALL	pop_gset1
    0097 9508      RET
_putstr:
  s                    --> R20
    0098 940E0393  CALL	push_gset1
    009A 01A8      MOVW	R20,R16
(0028) }
(0029) /*	 	   不含回车换行的字符串输出函数 	 */	
(0030) void putstr(char *s)
(0031) {
    009B C005      RJMP	0x00A1
(0032)    while (*s)
(0033)    {
(0034) 	  putchar(*s);
    009C 01FA      MOVW	R30,R20
    009D 8100      LDD	R16,Z+0
    009E DFDB      RCALL	_putchar
(0035) 	  s++;
    009F 5F4F      SUBI	R20,0xFF
    00A0 4F5F      SBCI	R21,0xFF
    00A1 01FA      MOVW	R30,R20
    00A2 8020      LDD	R2,Z+0
    00A3 2022      TST	R2
    00A4 F7B9      BNE	0x009C
    00A5 940E0396  CALL	pop_gset1
    00A7 9508      RET
(0036)    }	
(0037) }	
(0038) /*			UART初始化				*/	
(0039) void uart_init(void)
(0040) {
(0041)  UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
_uart_init:
    00A8 E188      LDI	R24,0x18
    00A9 B98A      OUT	0x0A,R24
(0042)  UBRRL=(fosc/16/(baud+1))%256;
    00AA E18A      LDI	R24,0x1A
    00AB B989      OUT	0x09,R24
(0043)  UBRRH=(fosc/16/(baud+1))/256;
    00AC 2422      CLR	R2
    00AD BC20      OUT	0x20,R2
(0044)  UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
    00AE E886      LDI	R24,0x86
    00AF BD80      OUT	0x20,R24
    00B0 9508      RET
FILE: F:\radio\第十二篇\sleep\lcd.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "delay.h"
(0004) #define delay125ns NOP()
(0005) #define delay250ns NOP();NOP()
(0006) #define delay500ns NOP();NOP();NOP();NOP()
(0007) //;NOP()
(0008) 
(0009) #define delay1us NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP()
(0010) #define delay2us delay1us;delay1us
(0011) #define RS PD4
(0012) #define RW PD5
(0013) #define EN PD7
(0014) #define DataLcd PORTB
(0015) #define DataLcdIn PINB
(0016) #define DataOut DDRB = 0XFF
(0017) #define DataIn DDRB = 0
(0018) 
(0019) #define RS_0 PORTD &=~ (1<<RS)
(0020) #define RS_1 PORTD |=  (1<<RS)
(0021) #define RW_0 PORTD &=~ (1<<RW)
(0022) #define RW_1 PORTD |=  (1<<RW)
(0023) #define EN_0 PORTD &=~ (1<<EN)
(0024) #define EN_1 PORTD |=  (1<<EN)
(0025) /*时钟为8MHZ* /
(0026) void delay_1us(void)
(0027) {
(0028)    asm("nop");
(0029) }
(0030) void delay_us(unsigned int itimes)
(0031) {
(0032)    unsigned int itemp;
(0033)    for (itemp=0;itemp<itimes;itemp++)
(0034)       {
(0035) 	     delay_1us();
(0036) 	  }
(0037) }
(0038) /**/
(0039) void ClearLcd(void) 
(0040) {
(0041)    EN_0;
_ClearLcd:
    00B1 9897      CBI	0x12,7
(0042)    RS_0;
    00B2 9894      CBI	0x12,4
(0043)    RW_0;
    00B3 9895      CBI	0x12,5
(0044)    DataOut;
    00B4 EF8F      LDI	R24,0xFF
    00B5 BB87      OUT	0x17,R24
(0045)    DataLcd = 1;
    00B6 E081      LDI	R24,1
    00B7 BB88      OUT	0x18,R24
(0046)    delay250ns;
    00B8 0000      NOP
    00B9 0000      NOP
(0047)    EN_1;
    00BA 9A97      SBI	0x12,7
(0048)    delay500ns;
    00BB 0000      NOP
    00BC 0000      NOP
    00BD 0000      NOP
    00BE 0000      NOP
(0049)    EN_0;
    00BF 9897      CBI	0x12,7
(0050)    delay125ns;
    00C0 0000      NOP
(0051)    RS_1;
    00C1 9A94      SBI	0x12,4
(0052)    RW_1;
    00C2 9A95      SBI	0x12,5
    00C3 9508      RET
(0053) }   
(0054) /**/
(0055) void home(void)
(0056) {
(0057)    RS_0;
_home:
    00C4 9894      CBI	0x12,4
(0058)    RW_0;
    00C5 9895      CBI	0x12,5
(0059)    DataLcd = 2;
    00C6 E082      LDI	R24,2
    00C7 BB88      OUT	0x18,R24
(0060)    delay250ns;
    00C8 0000      NOP
    00C9 0000      NOP
(0061)    EN_1;
    00CA 9A97      SBI	0x12,7
(0062)    delay500ns;
    00CB 0000      NOP
    00CC 0000      NOP
    00CD 0000      NOP
    00CE 0000      NOP
(0063)    EN_0;
    00CF 9897      CBI	0x12,7
(0064)    delay125ns;
    00D0 0000      NOP
(0065)    RS_1;
    00D1 9A94      SBI	0x12,4
(0066)    RW_1;
    00D2 9A95      SBI	0x12,5
    00D3 9508      RET
(0067) }
(0068) void InputSet(void)
(0069) {
(0070)    RS_0;
_InputSet:
    00D4 9894      CBI	0x12,4
(0071)    RW_0;
    00D5 9895      CBI	0x12,5
(0072)    DataLcd = 6;   //
    00D6 E086      LDI	R24,6
    00D7 BB88      OUT	0x18,R24
(0073)    delay250ns;
    00D8 0000      NOP
    00D9 0000      NOP
(0074)    EN_1;
    00DA 9A97      SBI	0x12,7
(0075)    delay500ns;
    00DB 0000      NOP
    00DC 0000      NOP
    00DD 0000      NOP
    00DE 0000      NOP
(0076)    EN_0;
    00DF 9897      CBI	0x12,7
(0077)    delay125ns;
    00E0 0000      NOP
(0078)    RS_1;
    00E1 9A94      SBI	0x12,4
(0079)    RW_1;
    00E2 9A95      SBI	0x12,5
    00E3 9508      RET
(0080) }
(0081) void VisionSet(void)
(0082) {
(0083)    EN_0;
_VisionSet:
    00E4 9897      CBI	0x12,7
(0084)    RS_0;
    00E5 9894      CBI	0x12,4
(0085)    RW_0;
    00E6 9895      CBI	0x12,5
(0086)    DataLcd = 0x0f;   //设置D=1,C=1,B=1
    00E7 E08F      LDI	R24,0xF
    00E8 BB88      OUT	0x18,R24
(0087)    delay250ns;
    00E9 0000      NOP
    00EA 0000      NOP
(0088)    EN_1;
    00EB 9A97      SBI	0x12,7
(0089)    delay500ns;
    00EC 0000      NOP
    00ED 0000      NOP
    00EE 0000      NOP
    00EF 0000      NOP
(0090)    EN_0;
    00F0 9897      CBI	0x12,7
(0091)    delay125ns;
    00F1 0000      NOP
(0092)    RS_1;
    00F2 9A94      SBI	0x12,4
(0093)    RW_1;
    00F3 9A95      SBI	0x12,5
    00F4 9508      RET
(0094) }
(0095) void FunctionSet(void)
(0096) {
(0097)    DataOut;
_FunctionSet:
    00F5 EF8F      LDI	R24,0xFF
    00F6 BB87      OUT	0x17,R24
(0098)    EN_0;
    00F7 9897      CBI	0x12,7
(0099)    RS_0;
    00F8 9894      CBI	0x12,4
(0100)    RW_0;
    00F9 9895      CBI	0x12,5
(0101)    DataLcd = 0x38;   //设置DL=1,N=1,F=0
    00FA E388      LDI	R24,0x38
    00FB BB88      OUT	0x18,R24
(0102)    delay250ns;       //地址建立时间,最小140ns
    00FC 0000      NOP
    00FD 0000      NOP
(0103)    EN_1;
    00FE 9A97      SBI	0x12,7
(0104)    delay500ns;      //脉冲宽度,最小450ns
    00FF 0000      NOP
    0100 0000      NOP
    0101 0000      NOP
    0102 0000      NOP
(0105)    EN_0;
    0103 9897      CBI	0x12,7
(0106)    delay125ns;     //地址保持时间,最小10ns
    0104 0000      NOP
(0107)    RS_1;
    0105 9A94      SBI	0x12,4
(0108)    RW_1;
    0106 9A95      SBI	0x12,5
    0107 9508      RET
(0109) }
(0110) void CgramSet(void)
(0111) {
_CgramSet:
    0108 9508      RET
(0112)    
(0113) }
(0114) void DdramSet(unsigned char addr)
(0115) {
(0116)    EN_0;
_DdramSet:
  addr                 --> R16
    0109 9897      CBI	0x12,7
(0117)    RS_0;
    010A 9894      CBI	0x12,4
(0118)    RW_0;
    010B 9895      CBI	0x12,5
(0119)    DataLcd = (0x80+addr);   //
    010C 2F80      MOV	R24,R16
    010D 5880      SUBI	R24,0x80
    010E BB88      OUT	0x18,R24
(0120)    delay250ns;
    010F 0000      NOP
    0110 0000      NOP
(0121)    EN_1;
    0111 9A97      SBI	0x12,7
(0122)    delay500ns;
    0112 0000      NOP
    0113 0000      NOP
    0114 0000      NOP
    0115 0000      NOP
(0123)    EN_0;
    0116 9897      CBI	0x12,7
(0124)    delay125ns; 
    0117 0000      NOP
(0125)    RS_1;
    0118 9A94      SBI	0x12,4
(0126)    RW_1;
    0119 9A95      SBI	0x12,5
    011A 9508      RET
(0127) }
(0128) unsigned char BFRead(void)
(0129) {
(0130)    unsigned char bf;
(0131)    RS_0;
_BFRead:
  bf                   --> R16
    011B 9894      CBI	0x12,4
(0132)    RW_1;  
    011C 9A95      SBI	0x12,5
(0133)    delay250ns;
    011D 0000      NOP
    011E 0000      NOP
(0134)    EN_1;
    011F 9A97      SBI	0x12,7
(0135)    delay500ns;
    0120 0000      NOP
    0121 0000      NOP
    0122 0000      NOP
    0123 0000      NOP
(0136)    DataIn;
    0124 2422      CLR	R2
    0125 BA27      OUT	0x17,R2
(0137)    bf = DataLcdIn;
    0126 B306      IN	R16,0x16
(0138)    EN_0;
    0127 9897      CBI	0x12,7
(0139)    delay125ns; 
    0128 0000      NOP
(0140)    RS_1;
    0129 9A94      SBI	0x12,4
(0141)    RW_0;
    012A 9895      CBI	0x12,5
(0142)    
(0143)    return bf;
    012B 9508      RET
_LCDReady:
  bf                   --> R20
    012C 940E0393  CALL	push_gset1
(0144) }
(0145) void LCDReady(void)
(0146) {
(0147)    unsigned char bf;
(0148)    do
(0149)       {bf = BFRead();
    012E DFEC      RCALL	_BFRead
    012F 2F40      MOV	R20,R16
(0150) 	  //PORTA = bf;       //just for debug
(0151) 	  }
(0152)    while((bf&0x80)==0x80);
    0130 2E24      MOV	R2,R20
    0131 2433      CLR	R3
    0132 FC27      SBRC	R2,7
    0133 CFFA      RJMP	0x012E
(0153)    DataOut;
    0134 EF8F      LDI	R24,0xFF
    0135 BB87      OUT	0x17,R24
    0136 940E0396  CALL	pop_gset1
    0138 9508      RET
_CharWrite:
  data                 --> R20
    0139 940E0393  CALL	push_gset1
    013B 2F40      MOV	R20,R16
(0154) }
(0155) void CharWrite(unsigned char data)
(0156) {
(0157)    LCDReady();
    013C DFEF      RCALL	_LCDReady
(0158)    RS_1;
    013D 9A94      SBI	0x12,4
(0159)    RW_0;
    013E 9895      CBI	0x12,5
(0160)    DataLcd = data;   //
    013F BB48      OUT	0x18,R20
(0161)    delay250ns;
    0140 0000      NOP
    0141 0000      NOP
(0162)    EN_1;
    0142 9A97      SBI	0x12,7
(0163)    delay500ns;
    0143 0000      NOP
    0144 0000      NOP
    0145 0000      NOP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -