📄 avr_ks0108.lst
字号:
__start:
__text_start:
022B E5CF LDI R28,0x5F
022C E0D4 LDI R29,4
022D BFCD OUT 0x3D,R28
022E BFDE OUT 0x3E,R29
022F 51C0 SUBI R28,0x10
0230 40D0 SBCI R29,0
0231 EA0A LDI R16,0xAA
0232 8308 STD Y+0,R16
0233 2400 CLR R0
0234 E8EF LDI R30,0x8F
0235 E0F0 LDI R31,0
0236 E010 LDI R17,0
0237 39E3 CPI R30,0x93
0238 07F1 CPC R31,R17
0239 F011 BEQ 0x023C
023A 9201 ST R0,Z+
023B CFFB RJMP 0x0237
023C 8300 STD Z+0,R16
023D E2E6 LDI R30,0x26
023E E0F4 LDI R31,4
023F E6A0 LDI R26,0x60
0240 E0B0 LDI R27,0
0241 E014 LDI R17,4
0242 35E5 CPI R30,0x55
0243 07F1 CPC R31,R17
0244 F021 BEQ 0x0249
0245 95C8 LPM
0246 9631 ADIW R30,1
0247 920D ST R0,X+
0248 CFF9 RJMP 0x0242
0249 940E08F2 CALL _main
_exit:
024B CFFF RJMP _exit
FILE: E:\dongshanyiyu\12864\AVR_KS0108\delay.h
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 系统时钟:8M
(0004) -----------------------------------------------------------------------*/
(0005)
(0006) void delay_1us(void); //1us延时函数
(0007) void delay_nus(unsigned int n); //N us延时函数
(0008) void delay_1ms(void) ; //1ms延时函数
(0009) void delay_nms(unsigned int n) ; //N ms延时函数
(0010)
(0011) /***********************************************************************/
(0012) /**********************************************************************/
(0013) void delay_1us(void) //1us延时函数
(0014) {
(0015) asm("nop");
_delay_1us:
024C 0000 NOP
024D 9508 RET
_delay_nus:
i --> R20
n --> R22
024E 940E0999 CALL push_gset2
0250 01B8 MOVW R22,R16
(0016) }
(0017)
(0018) void delay_nus(unsigned int n) //N us延时函数
(0019) {
(0020) unsigned int i=0;
0251 2744 CLR R20
0252 2755 CLR R21
(0021) for (i=0;i<n;i++)
0253 C003 RJMP 0x0257
(0022) delay_1us();
0254 DFF7 RCALL _delay_1us
0255 5F4F SUBI R20,0xFF
0256 4F5F SBCI R21,0xFF
0257 1746 CP R20,R22
0258 0757 CPC R21,R23
0259 F3D0 BCS 0x0254
025A 940E098A CALL pop_gset2
025C 9508 RET
(0023) }
(0024)
(0025) void delay_1ms(void) //1ms延时函数
(0026) {
(0027) unsigned int i;
(0028) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
025D 2700 CLR R16
025E 2711 CLR R17
025F C002 RJMP 0x0262
0260 5F0F SUBI R16,0xFF
0261 4F1F SBCI R17,0xFF
0262 3704 CPI R16,0x74
0263 E0E4 LDI R30,4
0264 071E CPC R17,R30
0265 F3D0 BCS 0x0260
0266 9508 RET
_delay_nms:
i --> R20
n --> R22
0267 940E0999 CALL push_gset2
0269 01B8 MOVW R22,R16
(0029) }
(0030)
(0031) void delay_nms(unsigned int n) //N ms延时函数
(0032) {
(0033) unsigned int i=0;
026A 2744 CLR R20
026B 2755 CLR R21
(0034) for (i=0;i<n;i++)
026C C003 RJMP 0x0270
(0035) {
(0036) delay_1ms();
026D DFEF RCALL _delay_1ms
026E 5F4F SUBI R20,0xFF
026F 4F5F SBCI R21,0xFF
0270 1746 CP R20,R22
0271 0757 CPC R21,R23
0272 F3D0 BCS 0x026D
0273 940E098A CALL pop_gset2
0275 9508 RET
FILE: E:\dongshanyiyu\12864\AVR_KS0108\ks0108.c
(0001) /*
(0002) KS0108 128*64 LCD C语言驱动
(0003) LCD引脚定义
(0004) 1---GND
(0005) 2---VCC
(0006) 3---VLCD
(0007) 4---D/I
(0008) 5---R/W
(0009) 6---E
(0010) 7到14 D0-D7
(0011) 15--CS1
(0012) 16--CS2
(0013) 17--RESET
(0014) 18--VEE
(0015) 19--SW
(0016) 20--NC
(0017) */
(0018) #include <iom16v.h>
(0019) #include <macros.h>
(0020) #include "delay.h"
(0021) unsigned char CurOffset,CurRow,CurPage,CurCol;
(0022) #define uchar unsigned char
(0023) /* 常量定义 */
(0024) #define LCD_STATUS_BUSY 0x80
(0025) #define START_LINE0 0xc0
(0026) #define DISPLAY_ON 0x3f
(0027) #define DISPLAY_OFF 0x3e
(0028) #define PARA1 0x40
(0029) //#define BIT(x) (1<<x)
(0030) //PORTA---数据口 PORTB----控制口
(0031) volatile unsigned char *LCD_DIR_PORT = &DDRA;
(0032) volatile unsigned char *LCD_IP_PORT = &PINA;
(0033) volatile unsigned char *LCD_OP_PORT = &PORTA;
(0034)
(0035) volatile unsigned char *LCD_RES_PORT = &PORTB;
(0036) volatile unsigned char *LCD_EN_PORT = &PORTB;
(0037) volatile unsigned char *LCD_CS2_PORT = &PORTB;
(0038) volatile unsigned char *LCD_CS1_PORT = &PORTB;
(0039) volatile unsigned char *LCD_RW_PORT = &PORTB;
(0040) volatile unsigned char *LCD_DI_PORT = &PORTB;
(0041)
(0042) char LCD_RES_BIT = BIT(5);
(0043) char LCD_EN_BIT = BIT(4);
(0044) char LCD_CS2_BIT = BIT(3);
(0045) char LCD_CS1_BIT = BIT(2);
(0046) char LCD_RW_BIT = BIT(1);
(0047) char LCD_DI_BIT = BIT(0);
(0048)
(0049) #define REST_LCD *LCD_RES_PORT |= LCD_RES_BIT
(0050) #define SET_LCD_E *LCD_EN_PORT |= LCD_EN_BIT
(0051) //LCD使能
(0052) #define CLEAR_LCD_E *LCD_EN_PORT &= ~LCD_EN_BIT
(0053) //LCD禁止
(0054)
(0055) #define SET_LCD_DATA *LCD_DI_PORT |= LCD_DI_BIT
(0056) //选择指令端口
(0057) #define SET_LCD_CMD *LCD_DI_PORT &= ~LCD_DI_BIT
(0058) //选择数据端口
(0059)
(0060) #define SET_LCD_READ *LCD_RW_PORT |= LCD_RW_BIT
(0061) //读模式
(0062) #define SET_LCD_WRITE *LCD_RW_PORT &= ~LCD_RW_BIT
(0063) //写模式
(0064)
(0065) #define SET_LCD_CS2 *LCD_CS2_PORT |= LCD_CS2_BIT
(0066) //左屏选择禁止
(0067) #define CLEAR_LCD_CS2 *LCD_CS2_PORT &= ~LCD_CS2_BIT
(0068) //左屏选择使能
(0069)
(0070) #define SET_LCD_CS1 *LCD_CS1_PORT |= LCD_CS1_BIT
(0071) //左屏选择禁止
(0072) #define CLEAR_LCD_CS1 *LCD_CS1_PORT &= ~LCD_CS1_BIT
(0073) //左屏选择使能
(0074)
(0075) #define LEFT 0
(0076) #define RIGHT 1
(0077) #define CMD 0
(0078) #define DATA 1
(0079)
(0080) void LCD_BUSY(unsigned char lr) //判断忙标志
(0081) {
(0082) // unsigned char status;
(0083) asm("cli");
_LCD_BUSY:
lr --> R16
0276 94F8 BCLR 7
(0084) if(lr==LEFT)
0277 2300 TST R16
0278 F4A1 BNE 0x028D
(0085) {
(0086) CLEAR_LCD_CS2; //cs2=0
0279 90200074 LDS R2,LCD_CS2_BIT
027B 9420 COM R2
027C 91E0006A LDS R30,LCD_CS2_PORT
027E 91F0006B LDS R31,LCD_CS2_PORT+1
0280 8030 LDD R3,Z+0
0281 2032 AND R3,R2
0282 8230 STD Z+0,R3
(0087) SET_LCD_CS1; //cs1=1
0283 90200075 LDS R2,LCD_CS1_BIT
0285 91E0006C LDS R30,LCD_CS1_PORT
0287 91F0006D LDS R31,LCD_CS1_PORT+1
0289 8030 LDD R3,Z+0
028A 2832 OR R3,R2
028B 8230 STD Z+0,R3
(0088) }
028C C013 RJMP 0x02A0
(0089) else
(0090) {
(0091) SET_LCD_CS2; //cs2=1
028D 90200074 LDS R2,LCD_CS2_BIT
028F 91E0006A LDS R30,LCD_CS2_PORT
0291 91F0006B LDS R31,LCD_CS2_PORT+1
0293 8030 LDD R3,Z+0
0294 2832 OR R3,R2
0295 8230 STD Z+0,R3
(0092) CLEAR_LCD_CS1; //cs1=0
0296 90200075 LDS R2,LCD_CS1_BIT
0298 9420 COM R2
0299 91E0006C LDS R30,LCD_CS1_PORT
029B 91F0006D LDS R31,LCD_CS1_PORT+1
029D 8030 LDD R3,Z+0
029E 2032 AND R3,R2
029F 8230 STD Z+0,R3
(0093) }
(0094) SET_LCD_CMD;
02A0 90200077 LDS R2,LCD_DI_BIT
02A2 9420 COM R2
02A3 91E00070 LDS R30,LCD_DI_PORT
02A5 91F00071 LDS R31,LCD_DI_PORT+1
02A7 8030 LDD R3,Z+0
02A8 2032 AND R3,R2
02A9 8230 STD Z+0,R3
(0095) *LCD_DIR_PORT = 0x00;
02AA 2422 CLR R2
02AB 91E00060 LDS R30,LCD_DIR_PORT
02AD 91F00061 LDS R31,LCD_DIR_PORT+1
02AF 8220 STD Z+0,R2
(0096) *LCD_OP_PORT = 0xff;
02B0 EF8F LDI R24,0xFF
02B1 91E00064 LDS R30,LCD_OP_PORT
02B3 91F00065 LDS R31,LCD_OP_PORT+1
02B5 8380 STD Z+0,R24
(0097) SET_LCD_READ;
02B6 90200076 LDS R2,LCD_RW_BIT
02B8 91E0006E LDS R30,LCD_RW_PORT
02BA 91F0006F LDS R31,LCD_RW_PORT+1
02BC 8030 LDD R3,Z+0
02BD 2832 OR R3,R2
02BE 8230 STD Z+0,R3
(0098) SET_LCD_E;
02BF 90200073 LDS R2,LCD_EN_BIT
02C1 91E00068 LDS R30,LCD_EN_PORT
02C3 91F00069 LDS R31,LCD_EN_PORT+1
02C5 8030 LDD R3,Z+0
02C6 2832 OR R3,R2
02C7 8230 STD Z+0,R3
(0099) asm("nop");
02C8 0000 NOP
(0100) asm("nop");
02C9 0000 NOP
(0101) asm("nop");
02CA 0000 NOP
(0102) asm("nop");
02CB 0000 NOP
02CC C01B RJMP 0x02E8
(0103) while((*LCD_IP_PORT) & LCD_STATUS_BUSY)
(0104) {
(0105) CLEAR_LCD_E;
02CD 90200073 LDS R2,LCD_EN_BIT
02CF 9420 COM R2
02D0 91E00068 LDS R30,LCD_EN_PORT
02D2 91F00069 LDS R31,LCD_EN_PORT+1
02D4 8030 LDD R3,Z+0
02D5 2032 AND R3,R2
02D6 8230 STD Z+0,R3
(0106) asm("nop");
02D7 0000 NOP
(0107) asm("nop");
02D8 0000 NOP
(0108) asm("nop");
02D9 0000 NOP
(0109) asm("nop");
02DA 0000 NOP
(0110) SET_LCD_E;
02DB 90200073 LDS R2,LCD_EN_BIT
02DD 91E00068 LDS R30,LCD_EN_PORT
02DF 91F00069 LDS R31,LCD_EN_PORT+1
02E1 8030 LDD R3,Z+0
02E2 2832 OR R3,R2
02E3 8230 STD Z+0,R3
(0111) asm("nop");
02E4 0000 NOP
(0112) asm("nop");
02E5 0000 NOP
(0113) asm("nop");
02E6 0000 NOP
(0114) asm("nop");
02E7 0000 NOP
02E8 91E00062 LDS R30,LCD_IP_PORT
02EA 91F00063 LDS R31,LCD_IP_PORT+1
02EC 8020 LDD R2,Z+0
02ED FC27 SBRC R2,7
02EE CFDE RJMP 0x02CD
(0115) }
(0116) CLEAR_LCD_E;
02EF 90200073 LDS R2,LCD_EN_BIT
02F1 9420 COM R2
02F2 91E00068 LDS R30,LCD_EN_PORT
02F4 91F00069 LDS R31,LCD_EN_PORT+1
02F6 8030 LDD R3,Z+0
02F7 2032 AND R3,R2
02F8 8230 STD Z+0,R3
(0117) SET_LCD_WRITE;
02F9 90200076 LDS R2,LCD_RW_BIT
02FB 9420 COM R2
02FC 91E0006E LDS R30,LCD_RW_PORT
02FE 91F0006F LDS R31,LCD_RW_PORT+1
0300 8030 LDD R3,Z+0
0301 2032 AND R3,R2
0302 8230 STD Z+0,R3
(0118) *LCD_OP_PORT = 0xff;
0303 EF8F LDI R24,0xFF
0304 91E00064 LDS R30,LCD_OP_PORT
0306 91F00065 LDS R31,LCD_OP_PORT+1
0308 8380 STD Z+0,R24
(0119) asm("sei");//)asm("sei");
0309 9478 BSET 7
030A 9508 RET
_write_LCD:
data --> Y+4
cd --> R20
lr --> R22
030B 940E0999 CALL push_gset2
030D 2F42 MOV R20,R18
030E 2F60 MOV R22,R16
(0120) }
(0121)
(0122) void write_LCD(unsigned char lr,unsigned char cd,unsigned char data) /*写入指令或数据*/
(0123) {
(0124) asm("cli");//)asm("cli");
030F 94F8 BCLR 7
(0125) LCD_BUSY(lr);
0310 2F06 MOV R16,R22
0311 DF64 RCALL _LCD_BUSY
(0126) if(cd==CMD)
0312 2344 TST R20
0313 F459 BNE 0x031F
(0127) {
(0128) SET_LCD_CMD;
0314 90200077 LDS R2,LCD_DI_BIT
0316 9420 COM R2
0317 91E00070 LDS R30,LCD_DI_PORT
0319 91F00071 LDS R31,LCD_DI_PORT+1
031B 8030 LDD R3,Z+0
031C 2032 AND R3,R2
031D 8230 STD Z+0,R3
(0129) }
031E C009 RJMP 0x0328
(0130) else
(0131) {
(0132) SET_LCD_DATA;
031F 90200077 LDS R2,LCD_DI_BIT
0321 91E00070 LDS R30,LCD_DI_PORT
0323 91F00071 LDS R31,LCD_DI_PORT+1
0325 8030 LDD R3,Z+0
0326 2832 OR R3,R2
0327 8230 STD Z+0,R3
(0133) }
(0134) SET_LCD_WRITE;
0328 90200076 LDS R2,LCD_RW_BIT
032A 9420 COM R2
032B 91E0006E LDS R30,LCD_RW_PORT
032D 91F0006F LDS R31,LCD_RW_PORT+1
032F 8030 LDD R3,Z+0
0330 2032 AND R3,R2
0331 8230 STD Z+0,R3
(0135) SET_LCD_E;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -