📄 mega32-lcm.lst
字号:
__start:
__text_start:
0246 E5CF LDI R28,0x5F
0247 E0D8 LDI R29,0x8
0248 BFCD OUT 0x3D,R28
0249 BFDE OUT 0x3E,R29
024A 51C0 SUBI R28,0x10
024B 40D0 SBCI R29,0
024C EA0A LDI R16,0xAA
024D 8308 STD Y+0,R16
024E 2400 CLR R0
024F ECE5 LDI R30,0xC5
0250 E0F0 LDI R31,0
0251 E010 LDI R17,0
0252 3CE9 CPI R30,0xC9
0253 07F1 CPC R31,R17
0254 F011 BEQ 0x0257
0255 9201 ST R0,Z+
0256 CFFB RJMP 0x0252
0257 8300 STD Z+0,R16
0258 E2E6 LDI R30,0x26
0259 E0F4 LDI R31,4
025A E6A0 LDI R26,0x60
025B E0B0 LDI R27,0
025C E014 LDI R17,4
025D 38EB CPI R30,0x8B
025E 07F1 CPC R31,R17
025F F021 BEQ 0x0264
0260 95C8 LPM
0261 9631 ADIW R30,1
0262 920D ST R0,X+
0263 CFF9 RJMP 0x025D
0264 940E0900 CALL _main
_exit:
0266 CFFF RJMP _exit
FILE: E:\PROTEU~1.7\User\MEGA32-LCM\MEGA32-LCM\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:
0267 0000 NOP
(0016) }
0268 9508 RET
_delay_nus:
i --> R20
n --> R22
0269 940E09DB CALL push_gset2
026B 01B8 MOVW R22,R16
(0017)
(0018) void delay_nus(unsigned int n) //N us延时函数
(0019) {
(0020) unsigned int i=0;
026C 2744 CLR R20
026D 2755 CLR R21
(0021) for (i=0;i<n;i++)
026E C003 RJMP 0x0272
(0022) delay_1us();
026F DFF7 RCALL _delay_1us
0270 5F4F SUBI R20,0xFF
0271 4F5F SBCI R21,0xFF
0272 1746 CP R20,R22
0273 0757 CPC R21,R23
0274 F3D0 BCS 0x026F
(0023) }
0275 940E09BB CALL pop_gset2
0277 9508 RET
(0024)
(0025) void delay_1ms(void) //1ms延时函数
(0026) {
(0027) unsigned int i;
(0028) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
0278 2700 CLR R16
0279 2711 CLR R17
027A C002 RJMP 0x027D
027B 5F0F SUBI R16,0xFF
027C 4F1F SBCI R17,0xFF
027D 3704 CPI R16,0x74
027E E0E4 LDI R30,4
027F 071E CPC R17,R30
0280 F3D0 BCS 0x027B
(0029) }
0281 9508 RET
_delay_nms:
i --> R20
n --> R22
0282 940E09DB CALL push_gset2
0284 01B8 MOVW R22,R16
(0030)
(0031) void delay_nms(unsigned int n) //N ms延时函数
(0032) {
(0033) unsigned int i=0;
0285 2744 CLR R20
0286 2755 CLR R21
(0034) for (i=0;i<n;i++)
0287 C003 RJMP 0x028B
(0035) {
(0036) delay_1ms();
0288 DFEF RCALL _delay_1ms
0289 5F4F SUBI R20,0xFF
028A 4F5F SBCI R21,0xFF
028B 1746 CP R20,R22
028C 0757 CPC R21,R23
028D F3D0 BCS 0x0288
(0037) }
(0038) }
028E 940E09BB CALL pop_gset2
0290 9508 RET
FILE: E:\PROTEU~1.7\User\MEGA32-LCM\MEGA32-LCM\DISPLAY.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 <iom32v.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_EN_PORT = &PORTB;
(0036) volatile unsigned char *LCD_CS2_PORT = &PORTC;
(0037) volatile unsigned char *LCD_CS1_PORT = &PORTC;
(0038) volatile unsigned char *LCD_RW_PORT = &PORTC;
(0039) volatile unsigned char *LCD_DI_PORT = &PORTC;
(0040)
(0041) char LCD_EN_BIT = BIT(4);
(0042) char LCD_CS2_BIT = BIT(3);
(0043) char LCD_CS1_BIT = BIT(2);
(0044) char LCD_RW_BIT = BIT(5);
(0045) char LCD_DI_BIT = BIT(4);
(0046)
(0047) #define SET_LCD_E *LCD_EN_PORT |= LCD_EN_BIT //LCD使能
(0048) #define CLEAR_LCD_E *LCD_EN_PORT &= ~LCD_EN_BIT //LCD禁止
(0049)
(0050) #define SET_LCD_DATA *LCD_DI_PORT |= LCD_DI_BIT //选择指令端口
(0051) #define SET_LCD_CMD *LCD_DI_PORT &= ~LCD_DI_BIT //选择数据端口
(0052)
(0053) #define SET_LCD_READ *LCD_RW_PORT |= LCD_RW_BIT //读模式
(0054) #define SET_LCD_WRITE *LCD_RW_PORT &= ~LCD_RW_BIT //写模式
(0055)
(0056) #define SET_LCD_CS2 *LCD_CS2_PORT |= LCD_CS2_BIT //左屏选择禁止
(0057) #define CLEAR_LCD_CS2 *LCD_CS2_PORT &= ~LCD_CS2_BIT //左屏选择使能
(0058)
(0059) #define SET_LCD_CS1 *LCD_CS1_PORT |= LCD_CS1_BIT //左屏选择禁止
(0060) #define CLEAR_LCD_CS1 *LCD_CS1_PORT &= ~LCD_CS1_BIT //左屏选择使能
(0061)
(0062) #define LEFT 0
(0063) #define RIGHT 1
(0064) #define CMD 0
(0065) #define DATA 1
(0066)
(0067) void LCD_BUSY(unsigned char lr) //判断忙标志
(0068) {
(0069) unsigned char status;
(0070) _CLI();
_LCD_BUSY:
status --> Y+1
lr --> R16
0291 94F8 BCLR 7
(0071) if(lr==LEFT)
0292 2300 TST R16
0293 F4A1 BNE 0x02A8
(0072) {
(0073) CLEAR_LCD_CS2; //cs2=0
0294 90200071 LDS R2,0x71
0296 9420 COM R2
0297 91E00068 LDS R30,0x68
0299 91F00069 LDS R31,0x69
029B 8030 LDD R3,Z+0
029C 2032 AND R3,R2
029D 8230 STD Z+0,R3
(0074) SET_LCD_CS1; //cs1=1
029E 90200072 LDS R2,0x72
02A0 91E0006A LDS R30,0x6A
02A2 91F0006B LDS R31,0x6B
02A4 8030 LDD R3,Z+0
02A5 2832 OR R3,R2
02A6 8230 STD Z+0,R3
(0075) }
02A7 C013 RJMP 0x02BB
(0076) else
(0077) {
(0078) SET_LCD_CS2; //cs2=1
02A8 90200071 LDS R2,0x71
02AA 91E00068 LDS R30,0x68
02AC 91F00069 LDS R31,0x69
02AE 8030 LDD R3,Z+0
02AF 2832 OR R3,R2
02B0 8230 STD Z+0,R3
(0079) CLEAR_LCD_CS1; //cs1=0
02B1 90200072 LDS R2,0x72
02B3 9420 COM R2
02B4 91E0006A LDS R30,0x6A
02B6 91F0006B LDS R31,0x6B
02B8 8030 LDD R3,Z+0
02B9 2032 AND R3,R2
02BA 8230 STD Z+0,R3
(0080) }
(0081) SET_LCD_CMD;
02BB 90200074 LDS R2,0x74
02BD 9420 COM R2
02BE 91E0006E LDS R30,0x6E
02C0 91F0006F LDS R31,0x6F
02C2 8030 LDD R3,Z+0
02C3 2032 AND R3,R2
02C4 8230 STD Z+0,R3
(0082) *LCD_DIR_PORT = 0x00;
02C5 2422 CLR R2
02C6 91E00060 LDS R30,0x60
02C8 91F00061 LDS R31,0x61
02CA 8220 STD Z+0,R2
(0083) *LCD_OP_PORT = 0xff;
02CB EF8F LDI R24,0xFF
02CC 91E00064 LDS R30,0x64
02CE 91F00065 LDS R31,0x65
02D0 8380 STD Z+0,R24
(0084) SET_LCD_READ;
02D1 90200073 LDS R2,0x73
02D3 91E0006C LDS R30,0x6C
02D5 91F0006D LDS R31,0x6D
02D7 8030 LDD R3,Z+0
02D8 2832 OR R3,R2
02D9 8230 STD Z+0,R3
(0085) SET_LCD_E;
02DA 90200070 LDS R2,0x70
02DC 91E00066 LDS R30,0x66
02DE 91F00067 LDS R31,0x67
02E0 8030 LDD R3,Z+0
02E1 2832 OR R3,R2
02E2 8230 STD Z+0,R3
(0086) _NOP();
02E3 0000 NOP
(0087) _NOP();
02E4 0000 NOP
(0088) _NOP();
02E5 0000 NOP
(0089) _NOP();
02E6 0000 NOP
02E7 C016 RJMP 0x02FE
(0090) while((*LCD_IP_PORT) & LCD_STATUS_BUSY)
(0091) {
(0092) CLEAR_LCD_E;
02E8 90200070 LDS R2,0x70
02EA 9420 COM R2
02EB 91E00066 LDS R30,0x66
02ED 91F00067 LDS R31,0x67
02EF 8030 LDD R3,Z+0
02F0 2032 AND R3,R2
02F1 8230 STD Z+0,R3
(0093) _NOP();
02F2 0000 NOP
(0094) _NOP();
02F3 0000 NOP
(0095) _NOP();
02F4 0000 NOP
(0096) _NOP();
02F5 0000 NOP
(0097) SET_LCD_E;
02F6 90200070 LDS R2,0x70
02F8 2832 OR R3,R2
02F9 8230 STD Z+0,R3
(0098) _NOP();
02FA 0000 NOP
(0099) _NOP();
02FB 0000 NOP
(0100) _NOP();
02FC 0000 NOP
(0101) _NOP();
02FD 0000 NOP
02FE 91E00062 LDS R30,0x62
0300 91F00063 LDS R31,0x63
0302 8020 LDD R2,Z+0
0303 FC27 SBRC R2,7
0304 CFE3 RJMP 0x02E8
(0102) }
(0103) CLEAR_LCD_E;
0305 90200070 LDS R2,0x70
0307 9420 COM R2
0308 91E00066 LDS R30,0x66
030A 91F00067 LDS R31,0x67
030C 8030 LDD R3,Z+0
030D 2032 AND R3,R2
030E 8230 STD Z+0,R3
(0104) SET_LCD_WRITE;
030F 90200073 LDS R2,0x73
0311 9420 COM R2
0312 91E0006C LDS R30,0x6C
0314 91F0006D LDS R31,0x6D
0316 8030 LDD R3,Z+0
0317 2032 AND R3,R2
0318 8230 STD Z+0,R3
(0105) *LCD_OP_PORT = 0xff;
0319 EF8F LDI R24,0xFF
031A 91E00064 LDS R30,0x64
031C 91F00065 LDS R31,0x65
031E 8380 STD Z+0,R24
(0106) asm("sei");//)asm("sei");
031F 9478 BSET 7
(0107) }
0320 9508 RET
_write_LCD:
data --> Y+4
cd --> R20
lr --> R22
0321 940E09DB CALL push_gset2
0323 2F42 MOV R20,R18
0324 2F60 MOV R22,R16
(0108)
(0109) void write_LCD(unsigned char lr,unsigned char cd,unsigned char data) /*写入指令或数据*/
(0110) {
(0111) _CLI();//_CLI();
0325 94F8 BCLR 7
(0112) LCD_BUSY(lr);
0326 2F06 MOV R16,R22
0327 DF69 RCALL _LCD_BUSY
(0113) if(cd==CMD)
0328 2344 TST R20
0329 F459 BNE 0x0335
(0114) {
(0115) SET_LCD_CMD;
032A 90200074 LDS R2,0x74
032C 9420 COM R2
032D 91E0006E LDS R30,0x6E
032F 91F0006F LDS R31,0x6F
0331 8030 LDD R3,Z+0
0332 2032 AND R3,R2
0333 8230 STD Z+0,R3
(0116) }
0334 C009 RJMP 0x033E
(0117) else
(0118) {
(0119) SET_LCD_DATA;
0335 90200074 LDS R2,0x74
0337 91E0006E LDS R30,0x6E
0339 91F0006F LDS R31,0x6F
033B 8030 LDD R3,Z+0
033C 2832 OR R3,R2
033D 8230 STD Z+0,R3
(0120) }
(0121) SET_LCD_WRITE;
033E 90200073 LDS R2,0x73
0340 9420 COM R2
0341 91E0006C LDS R30,0x6C
0343 91F0006D LDS R31,0x6D
0345 8030 LDD R3,Z+0
0346 2032 AND R3,R2
0347 8230 STD Z+0,R3
(0122) SET_LCD_E;
0348 90200070 LDS R2,0x70
034A 91E00066 LDS R30,0x66
034C 91F00067 LDS R31,0x67
034E 8030 LDD R3,Z+0
034F 2832 OR R3,R2
0350 8230 STD Z+0,R3
(0123) *LCD_DIR_PORT = 0xff;
0351 EF8F LDI R24,0xFF
0352 91E00060 LDS R30,0x60
0354 91F00061 LDS R31,0x61
0356 8380 STD Z+0,R24
(0124) *LCD_OP_PORT = data;
0357 91E00064 LDS R30,0x64
0359 91F00065 LDS R31,0x65
035B 800C LDD R0,Y+4
035C 8200 STD Z+0,R0
(0125) _NOP();
035D 0000 NOP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -