📄 ks0108.lst
字号:
__start:
__text_start:
0B1A E5CF LDI R28,0x5F
0B1B E0D4 LDI R29,4
0B1C BFCD OUT 0x3D,R28
0B1D BFDE OUT 0x3E,R29
0B1E 51CE SUBI R28,0x1E
0B1F 40D0 SBCI R29,0
0B20 EA0A LDI R16,0xAA
0B21 8308 STD Y+0,R16
0B22 2400 CLR R0
0B23 E6E0 LDI R30,0x60
0B24 E0F0 LDI R31,0
0B25 E010 LDI R17,0
0B26 36E0 CPI R30,0x60
0B27 07F1 CPC R31,R17
0B28 F011 BEQ 0x0B2B
0B29 9201 ST R0,Z+
0B2A CFFB RJMP 0x0B26
0B2B 8300 STD Z+0,R16
0B2C E3E4 LDI R30,0x34
0B2D E1F6 LDI R31,0x16
0B2E E6A0 LDI R26,0x60
0B2F E0B0 LDI R27,0
0B30 E116 LDI R17,0x16
0B31 33E4 CPI R30,0x34
0B32 07F1 CPC R31,R17
0B33 F021 BEQ 0x0B38
0B34 95C8 LPM
0B35 9631 ADIW R30,1
0B36 920D ST R0,X+
0B37 CFF9 RJMP 0x0B31
0B38 940E0C53 CALL _main
_exit:
0B3A CFFF RJMP _exit
FILE: D:\PROGRA~1\AVRTOO~1\Icc\include\delay.h
(0001) void delay_1us(void) //1us延时函数
(0002) {
(0003) asm("nop");
_delay_1us:
0B3B 0000 NOP
0B3C 9508 RET
_delay_nus:
i --> R20
n --> R22
0B3D 940E0C82 CALL push_gset2
0B3F 01B8 MOVW R22,R16
(0004) }
(0005)
(0006) void delay_nus(unsigned int n) //N us延时函数
(0007) {
(0008) unsigned int i=0;
0B40 2744 CLR R20
0B41 2755 CLR R21
(0009) for (i=0;i<n;i++)
0B42 C003 RJMP 0x0B46
(0010) delay_1us();
0B43 DFF7 RCALL _delay_1us
0B44 5F4F SUBI R20,0xFF
0B45 4F5F SBCI R21,0xFF
0B46 1746 CP R20,R22
0B47 0757 CPC R21,R23
0B48 F3D0 BCS 0x0B43
0B49 940E0C73 CALL pop_gset2
0B4B 9508 RET
(0011) }
(0012)
(0013) void delay_1ms(void) //1ms延时函数
(0014) {
(0015) unsigned int i;
(0016) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
0B4C 2700 CLR R16
0B4D 2711 CLR R17
0B4E C002 RJMP 0x0B51
0B4F 5F0F SUBI R16,0xFF
0B50 4F1F SBCI R17,0xFF
0B51 3704 CPI R16,0x74
0B52 E0E4 LDI R30,4
0B53 071E CPC R17,R30
0B54 F3D0 BCS 0x0B4F
0B55 9508 RET
_delay_nms:
i --> R20
n --> R22
0B56 940E0C82 CALL push_gset2
0B58 01B8 MOVW R22,R16
(0017) }
(0018)
(0019) void delay_nms(unsigned int n) //N ms延时函数
(0020) {
(0021) unsigned int i=0;
0B59 2744 CLR R20
0B5A 2755 CLR R21
(0022) for (i=0;i<n;i++)
0B5B C003 RJMP 0x0B5F
(0023) delay_1ms();
0B5C DFEF RCALL _delay_1ms
0B5D 5F4F SUBI R20,0xFF
0B5E 4F5F SBCI R21,0xFF
0B5F 1746 CP R20,R22
0B60 0757 CPC R21,R23
0B61 F3D0 BCS 0x0B5C
0B62 940E0C73 CALL pop_gset2
0B64 9508 RET
_LCD_WriteC:
cmd --> R20
0B65 940E0C84 CALL push_gset1
0B67 2F40 MOV R20,R16
FILE: C:\DOCUME~1\wpzhao.USTC\MYDOCU~1\我的文档\我的ICC\LCD_KS0108\LCD.h
(0001) /*-----------------------------------------------------
(0002) 显示开/关: 0x3E:Off,0x3F:On
(0003) 设置列(y)地址: 0x40+y,y:0-63
(0004) 设置页(x)地址: 0xB8+x,x:0-7
(0005) 设置起始行: 0xC0+l,l:0-63
(0006) 写显示数据: 0x**
(0007) DI R/W Function
(0008) 0 0 写指令
(0009) 1 0 写数据
(0010) 引脚连接:
(0011) CS1:PA0
(0012) CS2:PA1
(0013) DI: PA2
(0014) RW: PA3
(0015) E: PA4
(0016) DB0-DB7:PB0-PB7
(0017) ------------------------------------------------------*/
(0018)
(0019) #define uchar unsigned char
(0020) #define uint unsigned int
(0021)
(0022) #define L 0x10
(0023) #define R 0x20
(0024) #define LR 0x30
(0025)
(0026) #define CS1_PORT PORTA
(0027) #define CS2_PORT PORTA
(0028) #define DI_PORT PORTA
(0029) #define RW_PORT PORTA
(0030) #define E_PORT PORTA
(0031)
(0032) #define CS1_DDR DDRA
(0033) #define CS2_DDR DDRA
(0034) #define RW_DDR DDRA
(0035) #define E_DDR DDRA
(0036) #define DI_DDR DDRA
(0037)
(0038) #define DATA_PORT PORTB
(0039) #define DATA_DDR DDRB
(0040) #define DATA_IN PINB
(0041)
(0042) #define LCD_DI (1<<PA2)
(0043) #define LCD_CS1 (1<<PA0)
(0044) #define LCD_CS2 (1<<PA1)
(0045) #define LCD_RW (1<<PA3)
(0046) #define LCD_E (1<<PA4)
(0047) #define LCD_DATA_OUT 0xff
(0048) #define LCD_DATA_IN 0x00
(0049)
(0050) #define Set_RW_0 RW_PORT&=~LCD_RW
(0051) #define Set_RW_1 RW_PORT|=LCD_RW
(0052) #define Set_E_0 E_PORT&=~LCD_E
(0053) #define Set_E_1 E_PORT|=LCD_E
(0054) #define Set_DI_I DI_PORT&=~LCD_DI //instruction
(0055) #define Set_DI_D DI_PORT|=LCD_DI //data
(0056) #define Set_CS1_0 CS1_PORT&=~LCD_CS1
(0057) #define Set_CS1_1 CS1_PORT|=LCD_CS1
(0058) #define Set_CS2_0 CS2_PORT&=~LCD_CS2
(0059) #define Set_CS2_1 CS2_PORT|=LCD_CS2
(0060)
(0061) void LCD_WriteC(uchar cmd)
(0062) {Set_RW_0;
0B68 98DB CBI 0x1B,3
(0063) Set_DI_I;
0B69 98DA CBI 0x1B,2
(0064) Set_E_0;
0B6A 98DC CBI 0x1B,4
(0065) DATA_PORT=cmd;
0B6B BB48 OUT 0x18,R20
(0066) Set_E_1;
0B6C 9ADC SBI 0x1B,4
(0067) delay_nus(1);
0B6D E001 LDI R16,1
0B6E E010 LDI R17,0
0B6F DFCD RCALL _delay_nus
(0068) Set_E_0;
0B70 98DC CBI 0x1B,4
(0069) delay_nus(20);
0B71 E104 LDI R16,0x14
0B72 E010 LDI R17,0
0B73 DFC9 RCALL _delay_nus
0B74 940E0C87 CALL pop_gset1
0B76 9508 RET
_LCD_WriteD:
data --> R20
0B77 940E0C84 CALL push_gset1
0B79 2F40 MOV R20,R16
(0070) }
(0071) void LCD_WriteD(uchar data)
(0072) {Set_RW_0;
0B7A 98DB CBI 0x1B,3
(0073) Set_DI_D;
0B7B 9ADA SBI 0x1B,2
(0074) Set_E_0;
0B7C 98DC CBI 0x1B,4
(0075) DATA_PORT=data;
0B7D BB48 OUT 0x18,R20
(0076) Set_E_1;
0B7E 9ADC SBI 0x1B,4
(0077) delay_nus(1);
0B7F E001 LDI R16,1
0B80 E010 LDI R17,0
0B81 DFBB RCALL _delay_nus
(0078) Set_E_0;
0B82 98DC CBI 0x1B,4
(0079) delay_nus(20);
0B83 E104 LDI R16,0x14
0B84 E010 LDI R17,0
0B85 DFB7 RCALL _delay_nus
0B86 940E0C87 CALL pop_gset1
0B88 9508 RET
_Set_XY:
y --> R20
x --> R22
0B89 940E0C82 CALL push_gset2
0B8B 2F42 MOV R20,R18
0B8C 2F60 MOV R22,R16
(0080) }
(0081) /*------------------------------------
(0082) 设置显示位置坐标
(0083) x:页地址:0-7 :0xB8+x
(0084) y:列地址:0-63:0x40+y
(0085) -------------------------------------*/
(0086) void Set_XY(uchar x,uchar y)
(0087) {x+=0xB8;
0B8D 5468 SUBI R22,0x48
(0088) y+=0x40;
0B8E 5C40 SUBI R20,0xC0
(0089) LCD_WriteC(x);
0B8F 2F06 MOV R16,R22
0B90 DFD4 RCALL _LCD_WriteC
(0090) LCD_WriteC(y);
0B91 2F04 MOV R16,R20
0B92 DFD2 RCALL _LCD_WriteC
0B93 940E0C73 CALL pop_gset2
0B95 9508 RET
_Set_Startline:
i --> R20
0B96 940E0C84 CALL push_gset1
0B98 2F40 MOV R20,R16
(0091) }
(0092) /*-------------------------------------
(0093) 设置起始行 0xC0+i,i:0-63
(0094) -------------------------------------*/
(0095) void Set_Startline(uchar i)
(0096) {
(0097) LCD_WriteC(i+0xC0);
0B99 2F04 MOV R16,R20
0B9A 5400 SUBI R16,0x40
0B9B DFC9 RCALL _LCD_WriteC
0B9C 940E0C87 CALL pop_gset1
0B9E 9508 RET
(0098) }
(0099) /*-------------------------------------
(0100) 左右屏幕选择:
(0101) L:左;R:右;LR:左右
(0102) ---------------------------------------*/
(0103) void LCD_Select(uchar x)
(0104) {if(x==L){
_LCD_Select:
x --> R16
0B9F 3100 CPI R16,0x10
0BA0 F419 BNE 0x0BA4
(0105) Set_CS1_1;
0BA1 9AD8 SBI 0x1B,0
(0106) Set_CS2_0;}
0BA2 98D9 CBI 0x1B,1
0BA3 C00C RJMP 0x0BB0
(0107) else if(x==R){
0BA4 3200 CPI R16,0x20
0BA5 F419 BNE 0x0BA9
(0108) Set_CS1_0;
0BA6 98D8 CBI 0x1B,0
(0109) Set_CS2_1;}
0BA7 9AD9 SBI 0x1B,1
0BA8 C007 RJMP 0x0BB0
(0110) else if(x==LR){
0BA9 3300 CPI R16,0x30
0BAA F419 BNE 0x0BAE
(0111) Set_CS2_1;
0BAB 9AD9 SBI 0x1B,1
(0112) Set_CS1_1;}
0BAC 9AD8 SBI 0x1B,0
0BAD C002 RJMP 0x0BB0
(0113) else{
(0114) Set_CS1_0;
0BAE 98D8 CBI 0x1B,0
(0115) Set_CS2_0;}
0BAF 98D9 CBI 0x1B,1
0BB0 9508 RET
_LCD_Clear:
i --> R20
j --> R22
k --> R22
0BB1 940E0C82 CALL push_gset2
0BB3 2F60 MOV R22,R16
(0116) }
(0117) /*-----------------------------------
(0118) 清屏:
(0119) 从k(0-7)行开始清屏
(0120) ------------------------------------*/
(0121) void LCD_Clear(uchar k)
(0122) {uchar i,j;
(0123) LCD_Select(LR);
0BB4 E300 LDI R16,0x30
0BB5 DFE9 RCALL _LCD_Select
(0124) for(i=k;i<8;i++){
0BB6 2F46 MOV R20,R22
0BB7 C00B RJMP 0x0BC3
(0125) Set_XY(i,0);
0BB8 2722 CLR R18
0BB9 2F04 MOV R16,R20
0BBA DFCE RCALL _Set_XY
(0126) for(j=0;j<64;j++){
0BBB 2766 CLR R22
0BBC C003 RJMP 0x0BC0
(0127) LCD_WriteD(0x00);}}
0BBD 2700 CLR R16
0BBE DFB8 RCALL _LCD_WriteD
0BBF 9563 INC R22
0BC0 3460 CPI R22,0x40
0BC1 F3D8 BCS 0x0BBD
0BC2 9543 INC R20
0BC3 3048 CPI R20,0x8
0BC4 F398 BCS 0x0BB8
0BC5 940E0C73 CALL pop_gset2
0BC7 9508 RET
(0128) }
(0129) /*---------------------------
(0130) LCD初始化
(0131) 显示开/关:0x3E:Off,0x3F:On
(0132) ----------------------------*/
(0133) void LCD_Init()
(0134) {CS1_DDR|=LCD_CS1;
_LCD_Init:
0BC8 9AD0 SBI 0x1A,0
(0135) CS2_DDR|=LCD_CS2;
0BC9 9AD1 SBI 0x1A,1
(0136) RW_DDR|=LCD_RW;
0BCA 9AD3 SBI 0x1A,3
(0137) E_DDR|=LCD_E;
0BCB 9AD4 SBI 0x1A,4
(0138) DI_DDR|=LCD_DI;
0BCC 9AD2 SBI 0x1A,2
(0139) DATA_DDR=LCD_DATA_OUT;//设置各端口为输出
0BCD EF8F LDI R24,0xFF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -