📄 lcd5110.lst
字号:
__text_start:
__start:
01EB E5CF LDI R28,0x5F
01EC E0D4 LDI R29,4
01ED BFCD OUT 0x3D,R28
01EE BFDE OUT 0x3E,R29
01EF 51C0 SUBI R28,0x10
01F0 40D0 SBCI R29,0
01F1 EA0A LDI R16,0xAA
01F2 8308 STD Y+0,R16
01F3 2400 CLR R0
01F4 E1E1 LDI R30,0x11
01F5 E0F1 LDI R31,1
01F6 E011 LDI R17,1
01F7 31E1 CPI R30,0x11
01F8 07F1 CPC R31,R17
01F9 F011 BEQ 0x01FC
01FA 9201 ST R0,Z+
01FB CFFB RJMP 0x01F7
01FC 8300 STD Z+0,R16
01FD E2E4 LDI R30,0x24
01FE E0F3 LDI R31,3
01FF E6A0 LDI R26,0x60
0200 E0B0 LDI R27,0
0201 E013 LDI R17,3
0202 3DE5 CPI R30,0xD5
0203 07F1 CPC R31,R17
0204 F021 BEQ 0x0209
0205 95C8 LPM
0206 9631 ADIW R30,1
0207 920D ST R0,X+
0208 CFF9 RJMP 0x0202
0209 940E0225 CALL _main
_exit:
020B CFFF RJMP _exit
FILE: D:\(H-drive)\程序范例\Mega16例程\19.LCD5110\main.c
(0001) #include <iom16v.h>
(0002) #include <MACROS.h>
(0003) #include "Define.h"
(0004) #include "5110.h"
(0005)
(0006) /******************************************************************************/
(0007) void Delay_us(unsigned int time)
(0008) {
(0009) while(time--);
_Delay_us:
time --> R16
020C 0118 MOVW R2,R16
020D 5001 SUBI R16,1
020E 4010 SBCI R17,0
020F 2022 TST R2
0210 F7D9 BNE 0x020C
0211 2033 TST R3
0212 F7C9 BNE 0x020C
0213 9508 RET
_Delay_ms:
time --> R20
0214 940E03C8 CALL push_gset1
0216 01A8 MOVW R20,R16
(0010) }
(0011)
(0012) void Delay_ms(unsigned int time)
(0013) {
0217 C003 RJMP 0x021B
(0014) while(time--)
(0015) {
(0016) Delay_us(1000);
0218 EE08 LDI R16,0xE8
0219 E013 LDI R17,3
021A DFF1 RCALL _Delay_us
021B 011A MOVW R2,R20
021C 5041 SUBI R20,1
021D 4050 SBCI R21,0
021E 2022 TST R2
021F F7C1 BNE 0x0218
0220 2033 TST R3
0221 F7B1 BNE 0x0218
0222 940E03CB CALL pop_gset1
0224 9508 RET
_main:
0225 9727 SBIW R28,7
(0017) }
(0018) }
(0019)
(0020) void main(void)
(0021) {
(0022) LCD_init();//初始化液晶
0226 D040 RCALL _LCD_init
(0023) LCD_clear();
0227 D05C RCALL _LCD_clear
(0024)
(0025) SETBIT(DDRC,BACKLED_EN); //配置背光控制端口
0228 9AA7 SBI 0x14,7
(0026) CLEARBIT(PORTC,BACKLED_EN); //使能背光
0229 98AF CBI 0x15,7
022A C039 RJMP 0x0264
(0027)
(0028) while(1)
(0029) {
(0030) LCD_clear();
022B D058 RCALL _LCD_clear
(0031) LCD_write_english_string(0,0,"---ADEmbed----");
022C E082 LDI R24,2
022D E091 LDI R25,1
022E 8399 STD Y+1,R25
022F 8388 STD Y+0,R24
0230 2722 CLR R18
0231 2700 CLR R16
0232 D09B RCALL _LCD_write_english_string
(0032) LCD_write_english_string(0,5,"www.");
0233 EF8D LDI R24,0xFD
0234 E090 LDI R25,0
0235 8399 STD Y+1,R25
0236 8388 STD Y+0,R24
0237 E025 LDI R18,5
0238 2700 CLR R16
0239 D094 RCALL _LCD_write_english_string
(0033) LCD_write_english_string(21,5,"adembed.");
023A EF84 LDI R24,0xF4
023B E090 LDI R25,0
023C 8399 STD Y+1,R25
023D 8388 STD Y+0,R24
023E E025 LDI R18,5
023F E105 LDI R16,0x15
0240 D08D RCALL _LCD_write_english_string
(0034) LCD_write_english_string(66,5,"com");
0241 EF80 LDI R24,0xF0
0242 E090 LDI R25,0
0243 8399 STD Y+1,R25
0244 8388 STD Y+0,R24
0245 E025 LDI R18,5
0246 E402 LDI R16,0x42
0247 D086 RCALL _LCD_write_english_string
(0035) LCD_write_chinese_string(0,3,12,7,0,0);
0248 2422 CLR R2
0249 822E STD Y+6,R2
024A 822C STD Y+4,R2
024B E087 LDI R24,7
024C 838A STD Y+2,R24
024D E08C LDI R24,0xC
024E 8388 STD Y+0,R24
024F E023 LDI R18,3
0250 2700 CLR R16
0251 D092 RCALL _LCD_write_chinese_string
(0036)
(0037) Delay_ms(5000);
0252 E808 LDI R16,0x88
0253 E113 LDI R17,0x13
0254 DFBF RCALL _Delay_ms
(0038) LCD_clear();
0255 D02E RCALL _LCD_clear
(0039) LCD_draw_bmp_pixel(0,0,AVR_bmp,48,24);
0256 E188 LDI R24,0x18
0257 838C STD Y+4,R24
0258 E380 LDI R24,0x30
0259 838A STD Y+2,R24
025A E680 LDI R24,0x60
025B E090 LDI R25,0
025C 8399 STD Y+1,R25
025D 8388 STD Y+0,R24
025E 2722 CLR R18
025F 2700 CLR R16
0260 D0C8 RCALL _LCD_draw_bmp_pixel
(0040) Delay_ms(2000);
0261 ED00 LDI R16,0xD0
0262 E017 LDI R17,7
0263 DFB0 RCALL _Delay_ms
0264 CFC6 RJMP 0x022B
0265 9627 ADIW R28,7
0266 9508 RET
(0041) }
(0042)
(0043) }
(0044)
(0045)
(0046) /********************************************************************************************************************/
(0047) void LCD_init(void)
(0048) {
(0049) //先设置为输出
(0050) SETBIT(LCD_DIR,SCLK);
_LCD_init:
0267 9ABF SBI 0x17,7
(0051) SETBIT(LCD_DIR,SDIN);
0268 9ABD SBI 0x17,5
(0052) SETBIT(LCD_DIR,LCD_DC);
0269 9ABE SBI 0x17,6
(0053) SETBIT(LCD_DIR,LCD_CE);
026A 9ABC SBI 0x17,4
(0054) //SETBIT(LCD_DIR,LCD_RST);
(0055)
(0056) // 产生一个让LCD复位的低电平脉冲
(0057)
(0058) //CLEARBIT(LCD_PORT,LCD_RST);//LCD_RST = 0;
(0059) //delay_1us();
(0060) //SETBIT(LCD_PORT,LCD_RST);//LCD_RST = 1;
(0061)
(0062) // 关闭LCD
(0063) CLEARBIT(LCD_PORT,LCD_CE);//LCD_CE = 0;
026B 98C4 CBI 0x18,4
(0064) delay_1us();
026C D02E RCALL _delay_1us
(0065)
(0066) // 使能LCD
(0067) SETBIT(LCD_PORT,LCD_CE);//LCD_CE = 1;
026D 9AC4 SBI 0x18,4
(0068) delay_1us();
026E D02C RCALL _delay_1us
(0069)
(0070) LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式
026F 2722 CLR R18
0270 E201 LDI R16,0x21
0271 D0FF RCALL _LCD_write_byte
(0071) LCD_write_byte(0xc8, 0); // 设置偏置电压
0272 2722 CLR R18
0273 EC08 LDI R16,0xC8
0274 D0FC RCALL _LCD_write_byte
(0072) LCD_write_byte(0x06, 0); // 温度校正
0275 2722 CLR R18
0276 E006 LDI R16,6
0277 D0F9 RCALL _LCD_write_byte
(0073) LCD_write_byte(0x13, 0); // 1:48
0278 2722 CLR R18
0279 E103 LDI R16,0x13
027A D0F6 RCALL _LCD_write_byte
(0074) LCD_write_byte(0x20, 0); // 使用基本命令
027B 2722 CLR R18
027C E200 LDI R16,0x20
027D D0F3 RCALL _LCD_write_byte
(0075) LCD_clear(); // 清屏
027E D005 RCALL _LCD_clear
(0076) LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示
027F 2722 CLR R18
0280 E00C LDI R16,0xC
0281 D0EF RCALL _LCD_write_byte
(0077)
(0078) // 关闭LCD
(0079) CLEARBIT(LCD_PORT,LCD_CE);//LCD_CE = 0;
0282 98C4 CBI 0x18,4
0283 9508 RET
_LCD_clear:
i --> R20
0284 940E03C8 CALL push_gset1
(0080) }
(0081) /********************************************************************************************************************/
(0082) void LCD_clear(void)
(0083) {
(0084) unsigned int i;
(0085)
(0086) LCD_write_byte(0x0c, 0);
0286 2722 CLR R18
0287 E00C LDI R16,0xC
0288 D0E8 RCALL _LCD_write_byte
(0087) LCD_write_byte(0x80, 0);
0289 2722 CLR R18
028A E800 LDI R16,0x80
028B D0E5 RCALL _LCD_write_byte
(0088)
(0089) for (i=0; i<504; i++)
028C 2744 CLR R20
028D 2755 CLR R21
028E C005 RJMP 0x0294
(0090) {
(0091) LCD_write_byte(0, 1);
028F E021 LDI R18,1
0290 2700 CLR R16
0291 D0DF RCALL _LCD_write_byte
0292 5F4F SUBI R20,0xFF
0293 4F5F SBCI R21,0xFF
0294 3F48 CPI R20,0xF8
0295 E0E1 LDI R30,1
0296 075E CPC R21,R30
0297 F3B8 BCS 0x028F
0298 940E03CB CALL pop_gset1
029A 9508 RET
(0092) }
(0093) }
(0094) /********************************************************************************************************************/
(0095) void delay_1us(void) //1us延时函数
(0096) {
(0097) unsigned int i;
(0098) for(i=0;i<12000;i++);
_delay_1us:
i --> R16
029B 2700 CLR R16
029C 2711 CLR R17
029D C002 RJMP 0x02A0
029E 5F0F SUBI R16,0xFF
029F 4F1F SBCI R17,0xFF
02A0 3E00 CPI R16,0xE0
02A1 E2EE LDI R30,0x2E
02A2 071E CPC R17,R30
02A3 F3D0 BCS 0x029E
02A4 9508 RET
_LCD_set_XY:
Y --> R22
X --> R20
02A5 940E03C6 CALL push_gset2
02A7 2F62 MOV R22,R18
02A8 2F40 MOV R20,R16
(0099) }
(0100) /********************************************************************************************************************/
(0101) void LCD_set_XY(unsigned char X, unsigned char Y)
(0102) {
(0103) LCD_write_byte(0x40 | Y, 0);// column
02A9 2722 CLR R18
02AA 2F06 MOV R16,R22
02AB 6400 ORI R16,0x40
02AC D0C4 RCALL _LCD_write_byte
(0104) LCD_write_byte(0x80 | X, 0);// row
02AD 2722 CLR R18
02AE 2F04 MOV R16,R20
02AF 6800 ORI R16,0x80
02B0 D0C0 RCALL _LCD_write_byte
02B1 940E03B7 CALL pop_gset2
02B3 9508 RET
_LCD_write_char:
line --> R20
c --> R22
02B4 940E03C6 CALL push_gset2
02B6 2F60 MOV R22,R16
(0105) }
(0106) /********************************************************************************************************************/
(0107) void LCD_write_char(unsigned char c)
(0108) {
(0109) unsigned char line;
(0110)
(0111) c -= 32;
02B7 5260 SUBI R22,0x20
(0112) for (line=0; line<6; line++)
02B8 2744 CLR R20
02B9 C00F RJMP 0x02C9
(0113) {
(0114) LCD_write_byte(font6x8[c][line], 1);
02BA E021 LDI R18,1
02BB E086 LDI R24,6
02BC 9F86 MUL R24,R22
02BD 0110 MOVW R2,R0
02BE E584 LDI R24,0x54
02BF E090 LDI R25,0
02C0 0E28 ADD R2,R24
02C1 1E39 ADC R3,R25
02C2 2FE4 MOV R30,R20
02C3 27FF CLR R31
02C4 0DE2 ADD R30,R2
02C5 1DF3 ADC R31,R3
02C6 9104 LPM R16,0(Z)
02C7 D0A9 RCALL _LCD_write_byte
02C8 9543 INC R20
02C9 3046 CPI R20,6
02CA F378 BCS 0x02BA
02CB 940E03B7 CALL pop_gset2
02CD 9508 RET
_LCD_write_english_string:
s --> R20
Y --> R10
X --> R22
02CE 940E03C4 CALL push_gset3
02D0 2EA2 MOV R10,R18
02D1 2F60 MOV R22,R16
02D2 814E LDD R20,Y+6
02D3 815F LDD R21,Y+7
(0115) }
(0116) }
(0117) /********************************************************************************************************************/
(0118) /*-----------------------------------------------------------------------
(0119) LCD_write_english_String : 英文字符串显示函数
(0120)
(0121) 输入参数:*s :英文字符串指针;
(0122) X、Y : 显示字符串的位置,x 0-83 ,y 0-5
(0123) -----------------------------------------------------------------------*/
(0124) void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
(0125) {
(0126) LCD_set_XY(X,Y);
02D4 2D2A MOV R18,R10
02D5 2F06 MOV R16,R22
02D6 DFCE RCALL _LCD_set_XY
02D7 C005 RJMP 0x02DD
(0127) while (*s)
(0128) {
(0129) LCD_write_char(*s);
02D8 01FA MOVW R30,R20
02D9 8100 LDD R16,Z+0
02DA DFD9 RCALL _LCD_write_char
(0130) s++;
02DB 5F4F SUBI R20,0xFF
02DC 4F5F SBCI R21,0xFF
02DD 01FA MOVW R30,R20
02DE 8020 LDD R2,Z+0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -