📄 sleep.lst
字号:
__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 + -