📄 12864.lst
字号:
__text_start:
__start:
01C5 E5CF LDI R28,0x5F
01C6 E0D4 LDI R29,4
01C7 BFCD OUT 0x3D,R28
01C8 BFDE OUT 0x3E,R29
01C9 51C0 SUBI R28,0x10
01CA 40D0 SBCI R29,0
01CB EA0A LDI R16,0xAA
01CC 8308 STD Y+0,R16
01CD 2400 CLR R0
01CE E6E0 LDI R30,0x60
01CF E0F0 LDI R31,0
01D0 E010 LDI R17,0
01D1 36E4 CPI R30,0x64
01D2 07F1 CPC R31,R17
01D3 F011 BEQ 0x01D6
01D4 9201 ST R0,Z+
01D5 CFFB RJMP 0x01D1
01D6 8300 STD Z+0,R16
01D7 E8EA LDI R30,0x8A
01D8 E0F3 LDI R31,3
01D9 E6A0 LDI R26,0x60
01DA E0B0 LDI R27,0
01DB E013 LDI R17,3
01DC 38EA CPI R30,0x8A
01DD 07F1 CPC R31,R17
01DE F021 BEQ 0x01E3
01DF 95C8 LPM
01E0 9631 ADIW R30,1
01E1 920D ST R0,X+
01E2 CFF9 RJMP 0x01DC
01E3 940E061E CALL _main
_exit:
01E5 CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\12864-ICC\delay.h
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
(0004) 目标芯片 : M16
(0005) 时钟: 4.0000Mhz
(0006) -----------------------------------------------------------------------*/
(0007) #ifndef __delay_h
(0008) #define __delay_h
(0009) void delay_1ms(void);
(0010) void delay_nus(unsigned char n);
(0011) void delay_nms(unsigned int n);
(0012) /*******************************************************************
(0013)
(0014) 微秒级精确延时(ICC)
(0015)
(0016) *******************************************************************/
(0017)
(0018) /*======================================
(0019) 微秒级精确延时函数,晶振8M:
(0020) Delay = 0.125 *((tt*4-1)+9)微秒
(0021) 其中9包括了调用方的 r16 赋值 1t
(0022) rcall 3t nop 1t ret 4t
(0023) brne指令在当判断条件不成立时是单周期
(0024) 最后一次判断只有1个周期,补一个nop
(0025) 简化计算 = 0.5tt + 1 (us)
(0026) ======================================*/
(0027) void delay_nus(unsigned char tt)
(0028) {
(0029) asm("_L2: subi R16,1");
_delay_nus:
tt --> R16
01E6 5001 SUBI R16,1
(0030) asm(" nop")
01E7 0000 NOP
01E8 F7E9 BNE 0x01E6
(0031) asm(" brne _L2");
(0032) asm(" nop");
01E9 0000 NOP
(0033) asm(" ret");
01EA 9508 RET
01EB 9508 RET
(0034) }
(0035) /*************************************************************************
(0036)
(0037) 毫秒级精确延时(ICC)
(0038)
(0039) *************************************************************************/
(0040)
(0041) #define xtal 4 //以MHz为单位,不同的系统时钟要修改。
(0042)
(0043) void delay_1ms(void)
(0044) {
(0045) unsigned int i;
(0046) for(i=0;i<(unsigned int)(xtal*143-2);i++);
_delay_1ms:
i --> R16
01EC 2700 CLR R16
01ED 2711 CLR R17
01EE C002 RJMP 0x01F1
01EF 5F0F SUBI R16,0xFF
01F0 4F1F SBCI R17,0xFF
01F1 330A CPI R16,0x3A
01F2 E0E2 LDI R30,2
01F3 071E CPC R17,R30
01F4 F3D0 BCS 0x01EF
01F5 9508 RET
_delay_nms:
i --> R20
num --> R22
01F6 940E1812 CALL push_gset2
01F8 01B8 MOVW R22,R16
(0047) }
(0048)
(0049) void delay_nms(unsigned int num)
(0050) {
(0051) unsigned int i;
(0052) for(i=0;i<num;i++) delay_1ms();
01F9 2744 CLR R20
01FA 2755 CLR R21
01FB C003 RJMP 0x01FF
01FC DFEF RCALL _delay_1ms
01FD 5F4F SUBI R20,0xFF
01FE 4F5F SBCI R21,0xFF
01FF 1746 CP R20,R22
0200 0757 CPC R21,R23
0201 F3D0 BCS 0x01FC
0202 940E1800 CALL pop_gset2
0204 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\12864-ICC\lcd.c
(0001) #include <iom16v.h>
(0002) #include "lcd.h"
(0003) #include "delay.h"
(0004) #include "font.h"
(0005) unsigned char CurOffset,CurRow,CurPage,CurCol;//当前指针位置
(0006)
(0007) //--------------复位函数---------------------
(0008) void LCD_reset(void)
(0009) {
(0010) LCD_RST_DDR |= LCD_RST_BIT;
_LCD_reset:
0205 9ABD SBI 0x17,5
(0011) CLEAR_LCD_RST;
0206 98C5 CBI 0x18,5
(0012) delay_nms(10);
0207 E00A LDI R16,0xA
0208 E010 LDI R17,0
0209 DFEC RCALL _delay_nms
(0013) SET_LCD_RST;
020A 9AC5 SBI 0x18,5
020B 9508 RET
_LCD_BUSY:
lr --> R20
020C 940E1814 CALL push_gset1
020E 2F40 MOV R20,R16
(0014) }
(0015)
(0016) //-------------忙信号检测函数----------------
(0017) void LCD_BUSY(unsigned char lr) //判断忙标志
(0018) {
(0019) //unsigned char status;
(0020) asm("cli");
020F 94F8 BCLR 7
(0021) if(lr==RIGHT)
0210 3041 CPI R20,1
0211 F419 BNE 0x0215
(0022) {
(0023) CLEAR_LCD_CS2; //cs2=0
0212 98C4 CBI 0x18,4
(0024) SET_LCD_CS1; //cs1=1
0213 9AC3 SBI 0x18,3
(0025) }
0214 C002 RJMP 0x0217
(0026) else
(0027) {
(0028) SET_LCD_CS2; //cs2=1
0215 9AC4 SBI 0x18,4
(0029) CLEAR_LCD_CS1; //cs1=0
0216 98C3 CBI 0x18,3
(0030) }
(0031) SET_LCD_CMD;
0217 98C0 CBI 0x18,0
(0032) LCD_DIR_PORT = 0x00;
0218 2422 CLR R2
0219 BA2A OUT 0x1A,R2
(0033) LCD_OP_PORT = 0xff;
021A EF8F LDI R24,0xFF
021B BB8B OUT 0x1B,R24
(0034) SET_LCD_READ;
021C 9AC1 SBI 0x18,1
(0035) SET_LCD_E;
021D 9AC2 SBI 0x18,2
(0036) delay_nus(250);
021E EF0A LDI R16,0xFA
021F DFC6 RCALL _delay_nus
(0037) delay_nus(250);
0220 EF0A LDI R16,0xFA
0221 DFC4 RCALL _delay_nus
0222 C00A RJMP 0x022D
(0038) while((LCD_IP_PORT) & LCD_STATUS_BUSY)
(0039) {
(0040) CLEAR_LCD_E;
0223 98C2 CBI 0x18,2
(0041) delay_nus(250);
0224 EF0A LDI R16,0xFA
0225 DFC0 RCALL _delay_nus
(0042) delay_nus(250);
0226 EF0A LDI R16,0xFA
0227 DFBE RCALL _delay_nus
(0043) SET_LCD_E;
0228 9AC2 SBI 0x18,2
(0044) delay_nus(250);
0229 EF0A LDI R16,0xFA
022A DFBB RCALL _delay_nus
(0045) delay_nus(250);
022B EF0A LDI R16,0xFA
022C DFB9 RCALL _delay_nus
022D 99CF SBIC 0x19,7
022E CFF4 RJMP 0x0223
(0046) }
(0047) CLEAR_LCD_E;
022F 98C2 CBI 0x18,2
(0048) SET_LCD_WRITE;
0230 98C1 CBI 0x18,1
(0049) LCD_OP_PORT = 0xff;
0231 EF8F LDI R24,0xFF
0232 BB8B OUT 0x1B,R24
(0050) asm("sei");
0233 9478 BSET 7
0234 940E1817 CALL pop_gset1
0236 9508 RET
_write_LCD:
data --> Y+4
cd --> R20
lr --> R22
0237 940E1812 CALL push_gset2
0239 2F42 MOV R20,R18
023A 2F60 MOV R22,R16
(0051)
(0052) }
(0053)
(0054) //------------写指令(数据)函数---------------------
(0055) void write_LCD(unsigned char lr,unsigned char cd,unsigned char data)
(0056) {
(0057) asm("cli");
023B 94F8 BCLR 7
(0058) LCD_BUSY(lr);
023C 2F06 MOV R16,R22
023D DFCE RCALL _LCD_BUSY
(0059) if(cd==CMD)
023E 2344 TST R20
023F F411 BNE 0x0242
(0060) SET_LCD_CMD;
0240 98C0 CBI 0x18,0
0241 C001 RJMP 0x0243
(0061) else
(0062) SET_LCD_DATA;
0242 9AC0 SBI 0x18,0
(0063) SET_LCD_WRITE;
0243 98C1 CBI 0x18,1
(0064) SET_LCD_E;
0244 9AC2 SBI 0x18,2
(0065) LCD_DIR_PORT = 0xff;
0245 EF8F LDI R24,0xFF
0246 BB8A OUT 0x1A,R24
(0066) LCD_OP_PORT = data;
0247 800C LDD R0,Y+4
0248 BA0B OUT 0x1B,R0
(0067) delay_nus(250);
0249 EF0A LDI R16,0xFA
024A DF9B RCALL _delay_nus
(0068) delay_nus(250);
024B EF0A LDI R16,0xFA
024C DF99 RCALL _delay_nus
(0069) CLEAR_LCD_E;
024D 98C2 CBI 0x18,2
(0070) LCD_OP_PORT = 0xff;
024E EF8F LDI R24,0xFF
024F BB8B OUT 0x1B,R24
(0071) asm("sei");
0250 9478 BSET 7
0251 940E1800 CALL pop_gset2
0253 9508 RET
_read_LCD:
data --> R20
lr --> R22
0254 940E1812 CALL push_gset2
0256 2F60 MOV R22,R16
(0072)
(0073) }
(0074)
(0075) //--------------读数据函数-------------------
(0076) unsigned char read_LCD(unsigned char lr)
(0077) {
(0078) unsigned char data;
(0079)
(0080) asm("cli");
0257 94F8 BCLR 7
(0081) LCD_BUSY(lr);
0258 2F06 MOV R16,R22
0259 DFB2 RCALL _LCD_BUSY
(0082) SET_LCD_DATA;
025A 9AC0 SBI 0x18,0
(0083) LCD_DIR_PORT = 0x00;
025B 2422 CLR R2
025C BA2A OUT 0x1A,R2
(0084) LCD_OP_PORT = 0xff;
025D EF8F LDI R24,0xFF
025E BB8B OUT 0x1B,R24
(0085) SET_LCD_READ;
025F 9AC1 SBI 0x18,1
(0086) SET_LCD_E;
0260 9AC2 SBI 0x18,2
(0087) delay_nms(1);
0261 E001 LDI R16,1
0262 E010 LDI R17,0
0263 DF92 RCALL _delay_nms
(0088) data=LCD_IP_PORT;
0264 B349 IN R20,0x19
(0089) CLEAR_LCD_E;
0265 98C2 CBI 0x18,2
(0090) SET_LCD_WRITE;
0266 98C1 CBI 0x18,1
(0091)
(0092) LCD_BUSY(lr);
0267 2F06 MOV R16,R22
0268 DFA3 RCALL _LCD_BUSY
(0093) SET_LCD_DATA;
0269 9AC0 SBI 0x18,0
(0094) LCD_DIR_PORT = 0x00;
026A 2422 CLR R2
026B BA2A OUT 0x1A,R2
(0095) LCD_OP_PORT = 0xff;
026C EF8F LDI R24,0xFF
026D BB8B OUT 0x1B,R24
(0096) SET_LCD_READ;
026E 9AC1 SBI 0x18,1
(0097) SET_LCD_E;
026F 9AC2 SBI 0x18,2
(0098) delay_nus(250);
0270 EF0A LDI R16,0xFA
0271 DF74 RCALL _delay_nus
(0099) delay_nus(250);
0272 EF0A LDI R16,0xFA
0273 DF72 RCALL _delay_nus
(0100) data=LCD_IP_PORT;
0274 B349 IN R20,0x19
(0101) CLEAR_LCD_E;
0275 98C2 CBI 0x18,2
(0102) SET_LCD_WRITE;
0276 98C1 CBI 0x18,1
(0103) delay_nus(250);
0277 EF0A LDI R16,0xFA
0278 DF6D RCALL _delay_nus
(0104) delay_nus(250);
0279 EF0A LDI R16,0xFA
027A DF6B RCALL _delay_nus
(0105) asm("sei");
027B 9478 BSET 7
(0106) return data;
027C 2F04 MOV R16,R20
027D 940E1800 CALL pop_gset2
027F 9508 RET
_set_start_line_L:
line --> R20
0280 940E1814 CALL push_gset1
0282 2F40 MOV R20,R16
0283 9721 SBIW R28,1
(0107) }
(0108)
(0109) //-----------------行列页选择函数------------------
(0110) void set_start_line_L(unsigned char line) /*设置显示起始行*/ //0-63
(0111) {
(0112) write_LCD(LEFT,CMD,0xc0|line);
0284 2F84 MOV R24,R20
0285 6C80 ORI R24,0xC0
0286 8388 STD Y+0,R24
0287 2722 CLR R18
0288 2700 CLR R16
0289 DFAD RCALL _write_LCD
028A 9621 ADIW R28,1
028B 940E1817 CALL pop_gset1
028D 9508 RET
_set_start_line_R:
line --> R20
028E 940E1814 CALL push_gset1
0290 2F40 MOV R20,R16
0291 9721 SBIW R28,1
(0113) }
(0114)
(0115) void set_start_line_R(unsigned char line) /*设置显示起始行*/ //0-63
(0116) {
(0117) write_LCD(RIGHT,CMD,0xc0|line);
0292 2F84 MOV R24,R20
0293 6C80 ORI R24,0xC0
0294 8388 STD Y+0,R24
0295 2722 CLR R18
0296 E001 LDI R16,1
0297 DF9F RCALL _write_LCD
0298 9621 ADIW R28,1
0299 940E1817 CALL pop_gset1
029B 9508 RET
_set_page_L:
page --> R20
029C 940E1814 CALL push_gset1
029E 2F40 MOV R20,R16
029F 9721 SBIW R28,1
(0118) }
(0119)
(0120) void set_page_L(unsigned char page) /*设置X地址 设置页*/ //0-7
(0121) {
(0122) write_LCD(LEFT,CMD,0xb8|page);
02A0 2F84 MOV R24,R20
02A1 6B88 ORI R24,0xB8
02A2 8388 STD Y+0,R24
02A3 2722 CLR R18
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -