📄 3310lcd_prj.lst
字号:
__start:
__text_start:
027F E5CF LDI R28,0x5F
0280 E0D4 LDI R29,4
0281 BFCD OUT 0x3D,R28
0282 BFDE OUT 0x3E,R29
0283 51C0 SUBI R28,0x10
0284 40D0 SBCI R29,0
0285 EA0A LDI R16,0xAA
0286 8308 STD Y+0,R16
0287 2400 CLR R0
0288 E0E2 LDI R30,2
0289 E0F1 LDI R31,1
028A E011 LDI R17,1
028B 30E2 CPI R30,2
028C 07F1 CPC R31,R17
028D F011 BEQ 0x0290
028E 9201 ST R0,Z+
028F CFFB RJMP 0x028B
0290 8300 STD Z+0,R16
0291 E5EC LDI R30,0x5C
0292 E0F4 LDI R31,4
0293 E6A0 LDI R26,0x60
0294 E0B0 LDI R27,0
0295 E014 LDI R17,4
0296 3FEE CPI R30,0xFE
0297 07F1 CPC R31,R17
0298 F021 BEQ 0x029D
0299 95C8 LPM
029A 9631 ADIW R30,1
029B 920D ST R0,X+
029C CFF9 RJMP 0x0296
029D 940E02A0 CALL _main
_exit:
029F CFFF RJMP _exit
_main:
02A0 9727 SBIW R28,7
FILE: C:\DOCUME~1\administrator\桌面\3310\3310LCD_main.c
(0001) //硬件连接方式
(0002) //#define LCD_DC 0x08 // LCD第4脚, Mega16:PB3 第4脚
(0003) //#define LCD_CE 0x10 // LCD第5脚, Mega16:PB4 第5脚
(0004) //#define SPI_MOSI 0x20 // LCD第3脚, Mega16:PB5(MOSI) 第6脚
(0005) //#define LCD_RST 0x40 // LCD第8脚, Mega16:PB6(MISO) 第7脚
(0006) //#define SPI_CLK 0x80 // LCD第2脚, Mega16:PB7(SCK) 第8脚
(0007)
(0008) #include <iom16v.h>
(0009) #include <macros.h>
(0010) #include "3310LCD_function.h"
(0011) #include "bmp_pixel.h"
(0012)
(0013) /******************************************************************************/
(0014) void main(void)
(0015) {
(0016) OSCCAL=0x9d; // 8M系统内部时钟校准
02A1 E98D LDI R24,0x9D
02A2 BF81 OUT 0x31,R24
(0017) //设置MCU的I/O口
(0018) DDRB |= LCD_RST | LCD_DC | LCD_CE | SPI_MOSI | SPI_CLK;
02A3 B387 IN R24,0x17
02A4 6F88 ORI R24,0xF8
02A5 BB87 OUT 0x17,R24
(0019) SPSR |= BIT(SPI2X); // 设置SPI时钟倍速
02A6 9A70 SBI 0x0E,0
(0020) SPCR |= BIT(SPE)|BIT(MSTR); // 使能SPI接口,主机模式,4M时钟
02A7 B18D IN R24,0x0D
02A8 6580 ORI R24,0x50
02A9 B98D OUT 0x0D,R24
(0021)
(0022) LCD_init(); //初始化液晶
02AA 940E02FB CALL _LCD_init
02AC C021 RJMP 0x02CE
(0023)
(0024) while(1)
(0025) {
(0026) LCD_write_chinese_string(24,3,12,5,0,0); //显示“与虚拟仪器”,在x=0,y=2位置,显示write_chinese_string的12点阵汉字,显示4个,从第0个开始显示,行距为0,
02AD 2422 CLR R2
02AE 822E STD Y+6,R2
02AF 822C STD Y+4,R2
02B0 E085 LDI R24,5
02B1 838A STD Y+2,R24
02B2 E08C LDI R24,0xC
02B3 8388 STD Y+0,R24
02B4 E023 LDI R18,3
02B5 E108 LDI R16,0x18
02B6 940E0370 CALL _LCD_write_chinese_string
(0027) LCD_write_english_string(0,3,"AVR");
02B8 EF8E LDI R24,0xFE
02B9 E090 LDI R25,0
02BA 8399 STD Y+1,R25
02BB 8388 STD Y+0,R24
02BC E023 LDI R18,3
02BD 2700 CLR R16
02BE 940E035A CALL _LCD_write_english_string
(0028) // LCD_draw_bmp_pixel(0,2,AVR_bmp,48,32); //显示AVR大图
(0029) LCD_write_english_string(0,5,"www.avrvi.com");
02C0 EF80 LDI R24,0xF0
02C1 E090 LDI R25,0
02C2 8399 STD Y+1,R25
02C3 8388 STD Y+0,R24
02C4 E025 LDI R18,5
02C5 2700 CLR R16
02C6 940E035A CALL _LCD_write_english_string
(0030) LCD_move_chinese_string(0, 0, 100); //在屏幕最上面一行显示:欢迎光临本网站!显示速度为100,数值越大,速度越慢。
02C8 E684 LDI R24,0x64
02C9 8388 STD Y+0,R24
02CA 2722 CLR R18
02CB 2700 CLR R16
02CC 940E03B5 CALL _LCD_move_chinese_string
02CE CFDE RJMP 0x02AD
02CF 9627 ADIW R28,7
02D0 9508 RET
FILE: C:\DOCUME~1\administrator\桌面\3310\delay_function.c
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 系统时钟:8M
(0004) -----------------------------------------------------------------------*/
(0005) void delay_1us(void) //1us延时函数
(0006) {
(0007) asm("nop");
_delay_1us:
02D1 0000 NOP
02D2 9508 RET
_delay_nus:
i --> R20
n --> R22
02D3 940E04F5 CALL push_gset2
02D5 01B8 MOVW R22,R16
(0008) }
(0009)
(0010) void delay_nus(unsigned int n) //N us延时函数
(0011) {
(0012) unsigned int i=0;
02D6 2744 CLR R20
02D7 2755 CLR R21
(0013) for (i=0;i<n;i++)
02D8 C003 RJMP 0x02DC
(0014) delay_1us();
02D9 DFF7 RCALL _delay_1us
02DA 5F4F SUBI R20,0xFF
02DB 4F5F SBCI R21,0xFF
02DC 1746 CP R20,R22
02DD 0757 CPC R21,R23
02DE F3D0 BCS 0x02D9
02DF 940E04E6 CALL pop_gset2
02E1 9508 RET
(0015) }
(0016)
(0017) void delay_1ms(void) //1ms延时函数
(0018) {
(0019) unsigned int i;
(0020) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
02E2 2700 CLR R16
02E3 2711 CLR R17
02E4 C002 RJMP 0x02E7
02E5 5F0F SUBI R16,0xFF
02E6 4F1F SBCI R17,0xFF
02E7 3704 CPI R16,0x74
02E8 E0E4 LDI R30,4
02E9 071E CPC R17,R30
02EA F3D0 BCS 0x02E5
02EB 9508 RET
_delay_nms:
i --> R20
n --> R22
02EC 940E04F5 CALL push_gset2
02EE 01B8 MOVW R22,R16
(0021) }
(0022)
(0023) void delay_nms(unsigned int n) //N ms延时函数
(0024) {
(0025) unsigned int i=0;
02EF 2744 CLR R20
02F0 2755 CLR R21
(0026) for (i=0;i<n;i++)
02F1 C003 RJMP 0x02F5
(0027) delay_1ms();
02F2 DFEF RCALL _delay_1ms
02F3 5F4F SUBI R20,0xFF
02F4 4F5F SBCI R21,0xFF
02F5 1746 CP R20,R22
02F6 0757 CPC R21,R23
02F7 F3D0 BCS 0x02F2
02F8 940E04E6 CALL pop_gset2
02FA 9508 RET
FILE: C:\DOCUME~1\administrator\桌面\3310\3310LCD_function.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "3310LCD_function.h"
(0004) #include "english_6x8_pixel.h"
(0005) #include "write_chinese_string_pixel.h"
(0006) #include "move_chinese_string_pixel.h"
(0007)
(0008) /*-----------------------------------------------------------------------
(0009) LCD_init : 3310LCD初始化
(0010)
(0011) 编写日期 :2004-8-10
(0012) 最后修改日期 :2004-8-10
(0013) -----------------------------------------------------------------------*/
(0014) void LCD_init(void)
(0015) {
(0016) PORTB &= ~LCD_RST; // 产生一个让LCD复位的低电平脉冲
_LCD_init:
02FB 98C6 CBI 0x18,6
(0017) delay_1us();
02FC 940E02D1 CALL _delay_1us
(0018) PORTB |= LCD_RST;
02FE 9AC6 SBI 0x18,6
(0019)
(0020) PORTB &= ~LCD_CE ; // 关闭LCD
02FF 98C4 CBI 0x18,4
(0021) delay_1us();
0300 940E02D1 CALL _delay_1us
(0022) PORTB |= LCD_CE; // 使能LCD
0302 9AC4 SBI 0x18,4
(0023) delay_1us();
0303 940E02D1 CALL _delay_1us
(0024)
(0025) LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式
0305 2722 CLR R18
0306 E201 LDI R16,0x21
0307 D1A6 RCALL _LCD_write_byte
(0026) LCD_write_byte(0xc8, 0); // 设置偏置电压
0308 2722 CLR R18
0309 EC08 LDI R16,0xC8
030A D1A3 RCALL _LCD_write_byte
(0027) LCD_write_byte(0x06, 0); // 温度校正
030B 2722 CLR R18
030C E006 LDI R16,6
030D D1A0 RCALL _LCD_write_byte
(0028) LCD_write_byte(0x13, 0); // 1:48
030E 2722 CLR R18
030F E103 LDI R16,0x13
0310 D19D RCALL _LCD_write_byte
(0029) LCD_write_byte(0x20, 0); // 使用基本命令
0311 2722 CLR R18
0312 E200 LDI R16,0x20
0313 D19A RCALL _LCD_write_byte
(0030) LCD_clear(); // 清屏
0314 D005 RCALL _LCD_clear
(0031) LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示
0315 2722 CLR R18
0316 E00C LDI R16,0xC
0317 D196 RCALL _LCD_write_byte
(0032)
(0033) PORTB &= ~LCD_CE ; // 关闭LCD
0318 98C4 CBI 0x18,4
0319 9508 RET
_LCD_clear:
i --> R20
031A 940E04F7 CALL push_gset1
(0034) }
(0035)
(0036) /*-----------------------------------------------------------------------
(0037) LCD_clear : LCD清屏函数
(0038)
(0039) 编写日期 :2004-8-10
(0040) 最后修改日期 :2004-8-10
(0041) -----------------------------------------------------------------------*/
(0042) void LCD_clear(void)
(0043) {
(0044) unsigned int i;
(0045)
(0046) LCD_write_byte(0x0c, 0);
031C 2722 CLR R18
031D E00C LDI R16,0xC
031E D18F RCALL _LCD_write_byte
(0047) LCD_write_byte(0x80, 0);
031F 2722 CLR R18
0320 E800 LDI R16,0x80
0321 D18C RCALL _LCD_write_byte
(0048)
(0049) for (i=0; i<504; i++)
0322 2744 CLR R20
0323 2755 CLR R21
0324 C005 RJMP 0x032A
(0050) LCD_write_byte(0, 1);
0325 E021 LDI R18,1
0326 2700 CLR R16
0327 D186 RCALL _LCD_write_byte
0328 5F4F SUBI R20,0xFF
0329 4F5F SBCI R21,0xFF
032A 3F48 CPI R20,0xF8
032B E0E1 LDI R30,1
032C 075E CPC R21,R30
032D F3B8 BCS 0x0325
032E 940E04FA CALL pop_gset1
0330 9508 RET
_LCD_set_XY:
Y --> R22
X --> R20
0331 940E04F5 CALL push_gset2
0333 2F62 MOV R22,R18
0334 2F40 MOV R20,R16
(0051) }
(0052)
(0053) /*-----------------------------------------------------------------------
(0054) LCD_set_XY : 设置LCD坐标函数
(0055)
(0056) 输入参数:X :0-83
(0057) Y :0-5
(0058)
(0059) 编写日期 :2004-8-10
(0060) 最后修改日期 :2004-8-10
(0061) -----------------------------------------------------------------------*/
(0062) void LCD_set_XY(unsigned char X, unsigned char Y)
(0063) {
(0064) LCD_write_byte(0x40 | Y, 0); // column
0335 2722 CLR R18
0336 2F06 MOV R16,R22
0337 6400 ORI R16,0x40
0338 D175 RCALL _LCD_write_byte
(0065) LCD_write_byte(0x80 | X, 0); // row
0339 2722 CLR R18
033A 2F04 MOV R16,R20
033B 6800 ORI R16,0x80
033C D171 RCALL _LCD_write_byte
033D 940E04E6 CALL pop_gset2
033F 9508 RET
_LCD_write_char:
line --> R20
c --> R22
0340 940E04F5 CALL push_gset2
0342 2F60 MOV R22,R16
(0066) }
(0067)
(0068) /*-----------------------------------------------------------------------
(0069) LCD_write_char : 显示英文字符
(0070)
(0071) 输入参数:c :显示的字符;
(0072)
(0073) 编写日期 :2004-8-10
(0074) 最后修改日期 :2004-8-10
(0075) -----------------------------------------------------------------------*/
(0076) void LCD_write_char(unsigned char c)
(0077) {
(0078) unsigned char line;
(0079)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -