📄 5110.lst
字号:
__text_start:
__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 E3EA LDI R30,0x3A
0289 E0F2 LDI R31,2
028A E012 LDI R17,2
028B 33EA CPI R30,0x3A
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 E2E4 LDI R30,0x24
0292 E0F3 LDI R31,3
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 972A SBIW R28,0xA
FILE: D:\avrvi\democode\5110_综合演示\source\main.c
(0001) /************************************************
(0002) 文件:main.c
(0003) 用途:3310_5510LCD驱动演示文件
(0004) 注意:
(0005) 创建:2008.1.25
(0006) 修改:2008.1.25
(0007) Copy Right (c) www.avrvi.com AVR与虚拟仪器
(0008) ************************************************/
(0009)
(0010) #include "config.h"
(0011) #include "lib\bmp_pixel.h"
(0012) #include "lib\write_chinese_string_pixel.h"
(0013) #include "lib\move_chinese_string_pixel.h"
(0014) /******************************************************************************/
(0015) void main(void)
(0016) {
(0017) OSCCAL=0x9d; // 8M系统内部时钟校准
02A1 E98D LDI R24,0x9D
02A2 BF81 OUT 0x31,R24
(0018) //设置MCU的I/O口(SPI)
(0019) 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
(0020) SPSR |= BIT(SPI2X); // 设置SPI时钟倍速
02A6 9A70 SBI 0x0E,0
(0021) SPCR |= BIT(SPE)|BIT(MSTR); // 使能SPI接口,主机模式,4M时钟
02A7 B18D IN R24,0x0D
02A8 6580 ORI R24,0x50
02A9 B98D OUT 0x0D,R24
(0022)
(0023) LCD_init(); //初始化液晶
02AA 940E02EB CALL _LCD_init
(0024) LCD_draw_bmp_pixel(18,1,AVR_bmp,48,24); //显示AVR大图
02AC E188 LDI R24,0x18
02AD 838C STD Y+4,R24
02AE E380 LDI R24,0x30
02AF 838A STD Y+2,R24
02B0 E680 LDI R24,0x60
02B1 E090 LDI R25,0
02B2 8399 STD Y+1,R25
02B3 8388 STD Y+0,R24
02B4 E021 LDI R18,1
02B5 E102 LDI R16,0x12
02B6 940E045C CALL _LCD_draw_bmp_pixel
(0025) delay_nms(1500);
02B8 ED0C LDI R16,0xDC
02B9 E015 LDI R17,5
02BA 940E04CA CALL _delay_nms
(0026) LCD_clear();
02BC 940E030A CALL _LCD_clear
02BE C029 RJMP 0x02E8
(0027)
(0028) while(1)
(0029) {
(0030) LCD_write_english_string(0,3,"AVR");
02BF E386 LDI R24,0x36
02C0 E092 LDI R25,2
02C1 8399 STD Y+1,R25
02C2 8388 STD Y+0,R24
02C3 E023 LDI R18,3
02C4 2700 CLR R16
02C5 940E034A CALL _LCD_write_english_string
(0031) LCD_write_chinese_string(24,3,12,5,0,0,write_chinese_string); //显示“与虚拟仪器”,在x=24,y=3位置,显示write_chinese_string的12点阵汉字,显示5个,从第0个开始显示,行距为0,
02C7 EF80 LDI R24,0xF0
02C8 E090 LDI R25,0
02C9 8799 STD Y+9,R25
02CA 8788 STD Y+8,R24
02CB 2422 CLR R2
02CC 822E STD Y+6,R2
02CD 822C STD Y+4,R2
02CE E085 LDI R24,5
02CF 838A STD Y+2,R24
02D0 E08C LDI R24,0xC
02D1 8388 STD Y+0,R24
02D2 E023 LDI R18,3
02D3 E108 LDI R16,0x18
02D4 940E0360 CALL _LCD_write_chinese_string
(0032) LCD_write_english_string(0,5,"www.avrvi.com");
02D6 E288 LDI R24,0x28
02D7 E092 LDI R25,2
02D8 8399 STD Y+1,R25
02D9 8388 STD Y+0,R24
02DA E025 LDI R18,5
02DB 2700 CLR R16
02DC 940E034A CALL _LCD_write_english_string
(0033) LCD_move_chinese_string(0,0,200,move_chinese_string); //在屏幕最上面一行显示:欢迎光临本网站!显示速度为200,数值越大,速度越慢。
02DE E688 LDI R24,0x68
02DF E091 LDI R25,1
02E0 839B STD Y+3,R25
02E1 838A STD Y+2,R24
02E2 EC88 LDI R24,0xC8
02E3 8388 STD Y+0,R24
02E4 2722 CLR R18
02E5 2700 CLR R16
02E6 940E03A4 CALL _LCD_move_chinese_string
02E8 CFD6 RJMP 0x02BF
02E9 962A ADIW R28,0xA
02EA 9508 RET
FILE: D:\avrvi\democode\5110_综合演示\source\lib\3310_5110LCD.c
(0001) /************************************************
(0002) 文件:3310_5510LCD.c
(0003) 用途:3310_5510LCD驱动
(0004) 注意:
(0005) 创建:2008.1.25
(0006) 修改:2008.1.25
(0007) Copy Right (c) www.avrvi.com AVR与虚拟仪器
(0008) ************************************************/
(0009)
(0010) #include "..\config.h"
(0011) #include "lib\english_6x8_pixel.h"
(0012) /*************************************************************************
(0013) ** 函数名称: LCD_init(void)
(0014) ** 功能描述: 3310_5110LCD初始化
(0015) ** 输 入:
(0016) ** 输出 :
(0017) ** 全局变量: 无
(0018) ** 调用模块:
(0019) ** 说明:
(0020) ** 注意:
(0021) **************************************************************************/
(0022) void LCD_init(void)
(0023) {
(0024) PORTB &= ~LCD_RST; // 产生一个让LCD复位的低电平脉冲
_LCD_init:
02EB 98C6 CBI 0x18,6
(0025) delay_1us();
02EC 940E04AF CALL _delay_1us
(0026) PORTB |= LCD_RST;
02EE 9AC6 SBI 0x18,6
(0027)
(0028) PORTB &= ~LCD_CE ; // 关闭LCD
02EF 98C4 CBI 0x18,4
(0029) delay_1us();
02F0 940E04AF CALL _delay_1us
(0030) PORTB |= LCD_CE; // 使能LCD
02F2 9AC4 SBI 0x18,4
(0031) delay_1us();
02F3 940E04AF CALL _delay_1us
(0032)
(0033) LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式
02F5 2722 CLR R18
02F6 E201 LDI R16,0x21
02F7 D1AC RCALL _LCD_write_byte
(0034) LCD_write_byte(0xc8, 0); // 设置偏置电压
02F8 2722 CLR R18
02F9 EC08 LDI R16,0xC8
02FA D1A9 RCALL _LCD_write_byte
(0035) LCD_write_byte(0x06, 0); // 温度校正
02FB 2722 CLR R18
02FC E006 LDI R16,6
02FD D1A6 RCALL _LCD_write_byte
(0036) LCD_write_byte(0x13, 0); // 1:48
02FE 2722 CLR R18
02FF E103 LDI R16,0x13
0300 D1A3 RCALL _LCD_write_byte
(0037) LCD_write_byte(0x20, 0); // 使用基本命令
0301 2722 CLR R18
0302 E200 LDI R16,0x20
0303 D1A0 RCALL _LCD_write_byte
(0038) LCD_clear(); // 清屏
0304 D005 RCALL _LCD_clear
(0039) LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示
0305 2722 CLR R18
0306 E00C LDI R16,0xC
0307 D19C RCALL _LCD_write_byte
(0040)
(0041) PORTB &= ~LCD_CE ; // 关闭LCD
0308 98C4 CBI 0x18,4
0309 9508 RET
_LCD_clear:
i --> R20
030A 940E0517 CALL push_gset1
(0042) }
(0043) /*************************************************************************
(0044) ** 函数名称: LCD_clear(void)
(0045) ** 功能描述: LCD清屏函数
(0046) ** 输 入:
(0047) ** 输出 :
(0048) ** 全局变量: 无
(0049) ** 调用模块:
(0050) ** 说明:
(0051) ** 注意:
(0052) **************************************************************************/
(0053) void LCD_clear(void)
(0054) {
(0055) unsigned int i;
(0056)
(0057) LCD_write_byte(0x0c, 0);
030C 2722 CLR R18
030D E00C LDI R16,0xC
030E D195 RCALL _LCD_write_byte
(0058) LCD_write_byte(0x80, 0);
030F 2722 CLR R18
0310 E800 LDI R16,0x80
0311 D192 RCALL _LCD_write_byte
(0059)
(0060) for (i=0; i<504; i++)
0312 2744 CLR R20
0313 2755 CLR R21
0314 C005 RJMP 0x031A
(0061) LCD_write_byte(0, 1);
0315 E021 LDI R18,1
0316 2700 CLR R16
0317 D18C RCALL _LCD_write_byte
0318 5F4F SUBI R20,0xFF
0319 4F5F SBCI R21,0xFF
031A 3F48 CPI R20,0xF8
031B E0E1 LDI R30,1
031C 075E CPC R21,R30
031D F3B8 BCS 0x0315
031E 940E051A CALL pop_gset1
0320 9508 RET
_LCD_set_XY:
Y --> R22
X --> R20
0321 940E0515 CALL push_gset2
0323 2F62 MOV R22,R18
0324 2F40 MOV R20,R16
(0062) }
(0063) /*************************************************************************
(0064) ** 函数名称: LCD_set_XY(unsigned char X, unsigned char Y)
(0065) ** 功能描述: 设置LCD坐标函数
(0066) ** 输 入: X :0-83 X 坐标
(0067) Y :0-5 Y 坐标
(0068) ** 输出 :
(0069) ** 全局变量: 无
(0070) ** 调用模块:
(0071) ** 说明:
(0072) ** 注意:
(0073) **************************************************************************/
(0074) void LCD_set_XY(unsigned char X, unsigned char Y)
(0075) {
(0076) LCD_write_byte(0x40 | Y, 0); // column
0325 2722 CLR R18
0326 2F06 MOV R16,R22
0327 6400 ORI R16,0x40
0328 D17B RCALL _LCD_write_byte
(0077) LCD_write_byte(0x80 | X, 0); // row
0329 2722 CLR R18
032A 2F04 MOV R16,R20
032B 6800 ORI R16,0x80
032C D177 RCALL _LCD_write_byte
032D 940E0506 CALL pop_gset2
032F 9508 RET
_LCD_write_char:
line --> R20
c --> R22
0330 940E0515 CALL push_gset2
0332 2F60 MOV R22,R16
(0078) }
(0079) /*************************************************************************
(0080) ** 函数名称: LCD_write_char(unsigned char c)
(0081) ** 功能描述: 显示英文字符
(0082) ** 输 入: c :显示的字符
(0083) ** 输出 :
(0084) ** 全局变量: 无
(0085) ** 调用模块:
(0086) ** 说明:
(0087) ** 注意:
(0088) **************************************************************************/
(0089) void LCD_write_char(unsigned char c)
(0090) {
(0091) unsigned char line;
(0092)
(0093) c -= 32;
0333 5260 SUBI R22,0x20
(0094)
(0095) for (line=0; line<6; line++)
0334 2744 CLR R20
0335 C00F RJMP 0x0345
(0096) LCD_write_byte(font6x8[c][line], 1);
0336 E021 LDI R18,1
0337 E086 LDI R24,6
0338 9F86 MUL R24,R22
0339 0110 MOVW R2,R0
033A E584 LDI R24,0x54
033B E090 LDI R25,0
033C 0E28 ADD R2,R24
033D 1E39 ADC R3,R25
033E 2FE4 MOV R30,R20
033F 27FF CLR R31
0340 0DE2 ADD R30,R2
0341 1DF3 ADC R31,R3
0342 9104 LPM R16,0(Z)
0343 D160 RCALL _LCD_write_byte
0344 9543 INC R20
0345 3046 CPI R20,6
0346 F378 BCS 0x0336
0347 940E0506 CALL pop_gset2
0349 9508 RET
_LCD_write_english_string:
s --> R20
Y --> R10
X --> R22
034A 940E0513 CALL push_gset3
034C 2EA2 MOV R10,R18
034D 2F60 MOV R22,R16
034E 814E LDD R20,Y+6
034F 815F LDD R21,Y+7
(0097) }
(0098) /*************************************************************************
(0099) ** 函数名称: LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
(0100) ** 功能描述: 英文字符串显示函数
(0101) ** 输 入: *s :英文字符串指针;
(0102) X、Y : 显示字符串的位置,x 0-83 ,y 0-5
(0103) ** 输出 :
(0104) ** 全局变量: 无
(0105) ** 调用模块:
(0106) ** 说明:
(0107) ** 注意:
(0108) **************************************************************************/
(0109) void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
(0110) {
(0111) LCD_set_XY(X,Y);
0350 2D2A MOV R18,R10
0351 2F06 MOV R16,R22
0352 DFCE RCALL _LCD_set_XY
0353 C005 RJMP 0x0359
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -