📄 lly.lst
字号:
__start:
__text_start:
047E EFCF LDI R28,0xFF
047F E1D0 LDI R29,0x10
0480 BFCD OUT P3D,R28
0481 BFDE OUT P3E,R29
0482 51C0 SUBI R28,0x10
0483 40D0 SBCI R29,0
0484 EA0A LDI R16,0xAA
0485 8308 STD R16,0+Y
0486 2400 CLR R0
0487 E7E0 LDI R30,0x70
0488 E0F1 LDI R31,1
0489 E011 LDI R17,1
048A 37E8 CPI R30,0x78
048B 07F1 CPC R31,R17
048C F011 BEQ 0x048F
048D 9201 ST R0,Z+
048E CFFB RJMP 0x048A
048F 8300 STD R16,0+Z
0490 E8EC LDI R30,0x8C
0491 E0F8 LDI R31,0x8
0492 E0A0 LDI R26,0
0493 E0B1 LDI R27,1
0494 E018 LDI R17,0x8
0495 3FEC CPI R30,0xFC
0496 07F1 CPC R31,R17
0497 F021 BEQ 0x049C
0498 95C8 LPM
0499 9631 ADIW R30,1
049A 920D ST R0,X+
049B CFF9 RJMP 0x0495
049C 940E0686 CALL _main
_exit:
049E CFFF RJMP _exit
FILE: E:\PQ-1A\我的AVR\12864LLY\lcd12864.h
(0001)
(0002) /************************串行工作**************************/
(0003)
(0004) #define CS_H PORTC|=(1<<0)
(0005) #define CS_L PORTC&=~(1<<0)
(0006) #define STD_H PORTC|=(1<<2)
(0007) #define STD_L PORTC&=~(1<<2)
(0008) #define SCLK_H PORTC|=(1<<4)
(0009) #define SCLK_L PORTC&=~(1<<4)
(0010)
(0011) // 显示用指针变量
(0012) char *line1;
(0013) char *line2;
(0014) char *line3;
(0015) char *line4;
(0016)
(0017)
(0018)
(0019)
(0020) /*****************************************
(0021) 液晶初始化程序
(0022)
(0023) *****************************************/
(0024) void lcd12864_init(void)
(0025) {
(0026) DDRC|=BIT(0)|BIT(2)|BIT(4);
_lcd12864_init:
049F B384 IN R24,P14
04A0 6185 ORI R24,0x15
04A1 BB84 OUT P14,R24
(0027) PORTC=0X00; //IO端口初始化
04A2 2422 CLR R2
04A3 BA25 OUT P15,R2
(0028) DDRG|=BIT(2);
04A4 91800064 LDS R24,0x64
04A6 6084 ORI R24,4
04A7 93800064 STS R24,0x64
(0029) //PORTG=0XFF;
(0030) PORTG &=~(1<<2); //串行
04A9 91800065 LDS R24,0x65
04AB 7F8B ANDI R24,0xFB
04AC 93800065 STS R24,0x65
(0031) delay_ms(6);
04AE E006 LDI R16,6
04AF E010 LDI R17,0
04B0 D1C6 RCALL _delay_ms
(0032)
(0033) write_com(0X30); //基本指令动作
04B1 E300 LDI R16,0x30
04B2 E010 LDI R17,0
04B3 D028 RCALL _write_com
(0034) write_com(0X01); //清屏,地址指针指向00H
04B4 E001 LDI R16,1
04B5 E010 LDI R17,0
04B6 D025 RCALL _write_com
(0035) delay_ms(6);
04B7 E006 LDI R16,6
04B8 E010 LDI R17,0
04B9 D1BD RCALL _delay_ms
(0036) write_com(0X0C); //开显示,关游标
04BA E00C LDI R16,0xC
04BB E010 LDI R17,0
04BC D01F RCALL _write_com
(0037) delay_ms(5);
04BD E005 LDI R16,5
04BE E010 LDI R17,0
(0038) }
04BF C1B7 RJMP _delay_ms
(0039)
(0040)
(0041) void clear_dis(void)
(0042) {
(0043) write_com(0x30);
_clear_dis:
04C0 E300 LDI R16,0x30
04C1 E010 LDI R17,0
04C2 D019 RCALL _write_com
(0044) write_com(0X01); //清屏,地址指针指向00H
04C3 E001 LDI R16,1
04C4 E010 LDI R17,0
04C5 D016 RCALL _write_com
(0045) delay_ms(10);
04C6 E00A LDI R16,0xA
04C7 E010 LDI R17,0
(0046) }
04C8 C1AE RJMP _delay_ms
_write_byte:
i --> R20
word --> R16
04C9 940E06FA CALL push_gset1
(0047)
(0048)
(0049) /*****************************************
(0050) 液晶发送子程序(串行)
(0051)
(0052) *****************************************/
(0053) void write_byte(unsigned char word)
(0054) {
(0055) unsigned char i;
(0056) for(i=0;i<8;i++)
04CB 2744 CLR R20
04CC C00A RJMP 0x04D7
(0057) {
(0058) SCLK_L;
04CD 98AC CBI P15,4
(0059) if(word & 0x80) STD_H;
04CE FF07 SBRS R16,7
04CF C002 RJMP 0x04D2
04D0 9AAA SBI P15,2
04D1 C001 RJMP 0x04D3
(0060) else STD_L;
04D2 98AA CBI P15,2
(0061) word<<=1;
04D3 0F00 LSL R16
(0062) SCLK_H;
04D4 9AAC SBI P15,4
(0063) SCLK_L;
04D5 98AC CBI P15,4
04D6 9543 INC R20
04D7 3048 CPI R20,0x8
04D8 F3A0 BCS 0x04CD
(0064) }
(0065) }
04D9 940E06FD CALL pop_gset1
04DB 9508 RET
_write_com:
com --> R20
04DC 940E06FA CALL push_gset1
04DE 2F40 MOV R20,R16
(0066) /*****************************************
(0067) 液晶写控制字程序
(0068)
(0069) *****************************************/
(0070) void write_com(unsigned char com)
(0071) {
(0072) CS_H;
04DF 9AA8 SBI P15,0
(0073) delay_ms(1);
04E0 E001 LDI R16,1
04E1 E010 LDI R17,0
04E2 D194 RCALL _delay_ms
(0074) write_byte(0XF8);
04E3 EF08 LDI R16,0xF8
04E4 DFE4 RCALL _write_byte
(0075) write_byte(com & 0XF0);
04E5 2F04 MOV R16,R20
04E6 7F00 ANDI R16,0xF0
04E7 DFE1 RCALL _write_byte
(0076) write_byte((com<<4) & 0XF0);
04E8 2F04 MOV R16,R20
04E9 700F ANDI R16,0xF
04EA 9502 SWAP R16
04EB 7F00 ANDI R16,0xF0
04EC DFDC RCALL _write_byte
(0077) CS_L;
04ED 98A8 CBI P15,0
(0078) }
04EE 940E06FD CALL pop_gset1
04F0 9508 RET
_write_data:
data --> R20
04F1 940E06FA CALL push_gset1
04F3 2F40 MOV R20,R16
(0079) /*****************************************
(0080) 液晶写数据字程序
(0081)
(0082) *****************************************/
(0083) void write_data(unsigned char data)
(0084) {
(0085) CS_H;
04F4 9AA8 SBI P15,0
(0086) delay_ms(1);
04F5 E001 LDI R16,1
04F6 E010 LDI R17,0
04F7 D17F RCALL _delay_ms
(0087) write_byte(0XFA);
04F8 EF0A LDI R16,0xFA
04F9 DFCF RCALL _write_byte
(0088) write_byte(data&0XF0);
04FA 2F04 MOV R16,R20
04FB 7F00 ANDI R16,0xF0
04FC DFCC RCALL _write_byte
(0089) write_byte((data<<4)&0XF0);
04FD 2F04 MOV R16,R20
04FE 700F ANDI R16,0xF
04FF 9502 SWAP R16
0500 7F00 ANDI R16,0xF0
0501 DFC7 RCALL _write_byte
(0090) CS_L;
0502 98A8 CBI P15,0
(0091) }
0503 940E06FD CALL pop_gset1
0505 9508 RET
_lcd_writexy:
str --> R20
y --> R22
x --> R10
0506 940E0715 CALL push_gset3
0508 2F62 MOV R22,R18
0509 2EA0 MOV R10,R16
050A 814E LDD R20,6+Y
050B 815F LDD R21,7+Y
(0092)
(0093) //指定位置写文字
(0094) void lcd_writexy(unsigned char x,unsigned char y,unsigned char *str)
(0095) {
(0096) switch(x)
050C 24BB CLR R11
050D 01C5 MOVW R24,R10
050E 3081 CPI R24,1
050F E0E0 LDI R30,0
0510 079E CPC R25,R30
0511 F069 BEQ 0x051F
0512 3082 CPI R24,2
0513 E0E0 LDI R30,0
0514 079E CPC R25,R30
0515 F069 BEQ 0x0523
0516 3083 CPI R24,3
0517 E0E0 LDI R30,0
0518 079E CPC R25,R30
0519 F069 BEQ 0x0527
051A 3084 CPI R24,4
051B E0E0 LDI R30,0
051C 079E CPC R25,R30
051D F069 BEQ 0x052B
051E C015 RJMP 0x0534
(0097) {
(0098) case 1: write_com(0x80+y);break;
051F 2F06 MOV R16,R22
0520 5800 SUBI R16,0x80
0521 DFBA RCALL _write_com
0522 C011 RJMP 0x0534
(0099) case 2: write_com(0x90+y);break;
0523 2F06 MOV R16,R22
0524 5700 SUBI R16,0x70
0525 DFB6 RCALL _write_com
0526 C00D RJMP 0x0534
(0100) case 3: write_com(0x88+y);break;
0527 2F06 MOV R16,R22
0528 5708 SUBI R16,0x78
0529 DFB2 RCALL _write_com
052A C009 RJMP 0x0534
(0101) case 4: write_com(0x98+y);break;
052B 2F06 MOV R16,R22
052C 5608 SUBI R16,0x68
052D DFAE RCALL _write_com
052E C005 RJMP 0x0534
(0102) }
(0103)
(0104) while( *str!=0x00 )
(0105) {
(0106) write_data(*str);
052F 01FA MOVW R30,R20
0530 8100 LDD R16,0+Z
0531 DFBF RCALL _write_data
(0107) *str++;
0532 5F4F SUBI R20,0xFF
0533 4F5F SBCI R21,0xFF
0534 01FA MOVW R30,R20
0535 8020 LDD R2,0+Z
0536 2022 TST R2
0537 F7B9 BNE 0x052F
(0108) }
(0109) }
0538 940E0724 CALL pop_gset3
053A 9508 RET
(0110)
(0111) /*****************************************
(0112) 液晶整行显示函数程序
(0113)
(0114) *****************************************/
(0115) void display(void)
(0116) {
(0117) write_com(0x80);
_display:
053B E800 LDI R16,0x80
053C DF9F RCALL _write_com
053D C00F RJMP 0x054D
(0118) while( *line1!=0x00 )
(0119) {
(0120) write_data(*line1);
053E 91E00176 LDS R30,_line1
0540 91F00177 LDS R31,_line1+1
0542 8100 LDD R16,0+Z
0543 DFAD RCALL _write_data
(0121) line1++;
0544 91800176 LDS R24,_line1
0546 91900177 LDS R25,_line1+1
0548 9601 ADIW R24,1
0549 93900177 STS R25,_line1+1
054B 93800176 STS R24,_line1
054D 91E00176 LDS R30,_line1
054F 91F00177 LDS R31,_line1+1
0551 8020 LDD R2,0+Z
0552 2022 TST R2
0553 F751 BNE 0x053E
(0122) }
(0123)
(0124) write_com(0x90);
0554 E900 LDI R16,0x90
0555 DF86 RCALL _write_com
0556 C00F RJMP 0x0566
(0125) while( *line2!=0x00 )
(0126) {
(0127) write_data(*line2);
0557 91E00174 LDS R30,_line2
0559 91F00175 LDS R31,_line2+1
055B 8100 LDD R16,0+Z
055C DF94 RCALL _write_data
(0128) line2++;
055D 91800174 LDS R24,_line2
055F 91900175 LDS R25,_line2+1
0561 9601 ADIW R24,1
0562 93900175 STS R25,_line2+1
0564 93800174 STS R24,_line2
0566 91E00174 LDS R30,_line2
0568 91F00175 LDS R31,_line2+1
056A 8020 LDD R2,0+Z
056B 2022 TST R2
056C F751 BNE 0x0557
(0129) }
(0130)
(0131) write_com(0x88);
056D E808 LDI R16,0x88
056E DF6D RCALL _write_com
056F C00F RJMP 0x057F
(0132) while( *line3!=0x00 )
(0133) {
(0134) write_data(*line3);
0570 91E00172 LDS R30,_line3
0572 91F00173 LDS R31,_line3+1
0574 8100 LDD R16,0+Z
0575 DF7B RCALL _write_data
(0135) line3++;
0576 91800172 LDS R24,_line3
0578 91900173 LDS R25,_line3+1
057A 9601 ADIW R24,1
057B 93900173 STS R25,_line3+1
057D 93800172 STS R24,_line3
057F 91E00172 LDS R30,_line3
0581 91F00173 LDS R31,_line3+1
0583 8020 LDD R2,0+Z
0584 2022 TST R2
0585 F751 BNE 0x0570
(0136) }
(0137)
(0138) write_com(0x98);
0586 E908 LDI R16,0x98
0587 DF54 RCALL _write_com
0588 C00F RJMP 0x0598
(0139) while( *line4!=0x00 )
(0140) {
(0141) write_data(*line4);
0589 91E00170 LDS R30,_line4
058B 91F00171 LDS R31,_line4+1
058D 8100 LDD R16,0+Z
058E DF62 RCALL _write_data
(0142) line4++;
058F 91800170 LDS R24,_line4
0591 91900171 LDS R25,_line4+1
0593 9601 ADIW R24,1
0594 93900171 STS R25,_line4+1
0596 93800170 STS R24,_line4
0598 91E00170 LDS R30,_line4
059A 91F00171 LDS R31,_line4+1
059C 8020 LDD R2,0+Z
059D 2022 TST R2
059E F751 BNE 0x0589
(0143) }
(0144) line1 = "";
059F E68F LDI R24,0x6F
05A0 E091 LDI R25,1
05A1 93900177 STS R25,_line1+1
05A3 93800176 STS R24,_line1
(0145) line2 = "";
05A5 93900175 STS R25,_line2+1
05A7 93800174 STS R24,_line2
(0146) line3 = "";
05A9 93900173 STS R25,_line3+1
05AB 93800172 STS R24,_line3
(0147) line4 = "";
05AD 93900171 STS R25,_line4+1
05AF 93800170 STS R24,_line4
(0148) }
05B1 9508 RET
_clear_disp_pic:
j --> R20
i --> R22
05B2 940E0711 CALL push_gset2
(0149)
(0150)
(0151) /*****************************************
(0152) 液晶画图清屏程序
(0153)
(0154) *****************************************/
(0155) void clear_disp_pic(void)
(0156) {
(0157) unsigned char i,j=0;
05B4 2744 CLR R20
(0158) for(j=0;j<32;j++)
05B5 C014 RJMP 0x05CA
(0159) {
(0160) for(i=0;i<16;i++)
05B6 2766 CLR R22
05B7 C00F RJMP 0x05C7
(0161) {
(0162) write_com(0X34);//选择四位数据接口,扩充指令操作
05B8 E304 LDI R16,0x34
05B9 DF22 RCALL _write_com
(0163) write_com(0x80+j);//四行
05BA 2F04 MOV R16,R20
05BB 5800 SUBI R16,0x80
05BC DF1F RCALL _write_com
(0164) write_com(0x80+i);//十六列
05BD 2F06 MOV R16,R22
05BE 5800 SUBI R16,0x80
05BF DF1C RCALL _write_com
(0165) write_com(0X30);
05C0 E300 LDI R16,0x30
05C1 DF1A RCALL _write_com
(0166) write_data(0x00);
05C2 2700 CLR R16
05C3 DF2D RCALL _write_data
(0167) write_data(0x00);
05C4 2700 CLR R16
05C5 DF2B RCALL _write_data
05C6 9563 INC R22
05C7 3160 CPI R22,0x10
05C8 F378 BCS 0x05B8
05C9 9543 INC R20
05CA 3240 CPI R20,0x20
05CB F350 BCS 0x05B6
(0168) }
(0169) }
(0170) }
05CC 940E0721 CALL pop_gset2
05CE 9508 RET
_disp_pic:
j --> R20
i --> R22
img --> R10
05CF 940E0715 CALL push_gset3
05D1 0158 MOVW R10,R16
(0171) /*****************************************
(0172) 液晶显示图形程序
(0173)
(0174) *****************************************/
(0175) void disp_pic(const unsigned char *img )
(0176) {
(0177) unsigned char i,j;
(0178) for(j=0;j<32;j++)
05D2 2744 CLR R20
05D3 C029 RJMP 0x05FD
(0179) {
(0180) for(i=0;i<8;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -