📄 lcdexper.lst
字号:
__start:
__text_start:
295 EFCF LDI R28,0xFF
296 E2D1 LDI R29,0x21
297 BFCD OUT 0x3D,R28
298 BFDE OUT 0x3E,R29
299 51CE SUBI R28,0x1E
29A 40D0 SBCI R29,0
29B EA0A LDI R16,0xAA
29C 8308 STD Y+0,R16
29D 2400 CLR R0
29E E0E0 LDI R30,0
29F E0F2 LDI R31,2
2A0 E012 LDI R17,2
2A1 30E0 CPI R30,0
2A2 07F1 CPC R31,R17
2A3 F011 BEQ 0x02A6
2A4 9201 ST R0,Z+
2A5 CFFB RJMP 0x02A1
2A6 8300 STD Z+0,R16
2A7 E2E9 LDI R30,0x29
2A8 E0F5 LDI R31,5
2A9 E0A0 LDI R26,0
2AA E0B2 LDI R27,2
2AB E015 LDI R17,5
2AC E000 LDI R16,0
2AD BF0B OUT 0x3B,R16
2AE 32E9 CPI R30,0x29
2AF 07F1 CPC R31,R17
2B0 F021 BEQ 0x02B5
2B1 95C8 LPM
2B2 9631 ADIW R30,1
2B3 920D ST R0,X+
2B4 CFF9 RJMP 0x02AE
2B5 940E 03FC CALL _main
_exit:
2B7 CFFF RJMP _exit
_Delay:
i --> R20
t --> R16
2B8 934A ST R20,-Y
2B9 935A ST R21,-Y
FILE: E:\example\icc\lcd_exper\lcdexper.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003)
(0004) #define uchar unsigned char
(0005) #define uint unsigned int
(0006)
(0007) #define DB PORTA
(0008) /******************************************************************** */
(0009) #define SETBIT(x,y) (x|=(1<<y)) //set bit y in byte x
(0010) #define CLRBIT(x,y) (x&=(~(1<<y))) //clear bit y in byte x
(0011) #define CHKBIT(x,y) (x&(1<<y)) //check bit y in byte x
(0012) /******************************************************************** */
(0013) #define RS 0
(0014) #define RW 1
(0015) #define E 2
(0016) #define PSB 3
(0017) #define RST 4
(0018)
(0019) unsigned flash char Chanping1[]={"简易信号采集系统"};
(0020) unsigned flash char jieguo_1[]={"南方医科大学"};
(0021) unsigned flash char jieguo_2[]={"生物医学工程学院"};
(0022) unsigned flash char jieguo_3[]={"2005级影像工程"};
(0023) unsigned flash char jieguo_4[]={"欧阳斌"};
(0024)
(0025) //***************延时*********************************/
(0026) void Delay(uint t)
(0027) {
(0028) uint i=0;
2BA 2744 CLR R20
2BB 2755 CLR R21
(0029) for(i=0;i<=t;i++);
2BC C002 RJMP 0x02BF
2BD 5F4F SUBI R20,0xFF
2BE 4F5F SBCI R21,0xFF
2BF 1704 CP R16,R20
2C0 0715 CPC R17,R21
2C1 F7D8 BCC 0x02BD
2C2 9159 LD R21,Y+
2C3 9149 LD R20,Y+
2C4 9508 RET
_delay_ms:
t2 --> R20
t --> R16
2C5 934A ST R20,-Y
(0030) }
(0031)
(0032) void delay_ms(unsigned int t)
(0033) {
(0034) unsigned char t2=200;
2C6 EC48 LDI R20,0xC8
2C7 C005 RJMP 0x02CD
(0035) while(t--)while(t2--);
2C8 2E24 MOV R2,R20
2C9 2433 CLR R3
2CA 5041 SUBI R20,1
2CB 2022 TST R2
2CC F7D9 BNE 0x02C8
2CD 0118 MOVW R2,R16
2CE 5001 SUBI R16,1
2CF 4010 SBCI R17,0
2D0 2022 TST R2
2D1 F7B1 BNE 0x02C8
2D2 2033 TST R3
2D3 F7A1 BNE 0x02C8
2D4 9149 LD R20,Y+
2D5 9508 RET
(0036) }
(0037)
(0038) void port_init(void)
(0039) {
(0040) PORTA = 0xFF;
_port_init:
2D6 EF8F LDI R24,0xFF
2D7 BB8B OUT 0x1B,R24
(0041) DDRA = 0xFF;
2D8 BB8A OUT 0x1A,R24
(0042) PORTB = 0xFF;
2D9 BB88 OUT 0x18,R24
(0043) DDRB = 0xFF;
2DA BB87 OUT 0x17,R24
2DB 9508 RET
(0044) }
(0045)
(0046) /*-----------------------------------------------------
(0047) 状态检查函数,判断是否处于忙状态
(0048) -------------------------------------------------------*/
(0049) void Check_Busy(void)
(0050) {
(0051) unsigned char dat;
(0052) CLRBIT(PORTB,RS); //RS=0
_Check_Busy:
dat --> Y,+1
2DC 98C0 CBI 0x18,0
(0053) SETBIT(PORTB,RW); //RW=1
2DD 9AC1 SBI 0x18,1
(0054) DDRA=0x00; // portA as input
2DE 2422 CLR R2
2DF BA2A OUT 0x1A,R2
(0055) do
(0056) {
(0057) SETBIT(PORTB,E);
2E0 9AC2 SBI 0x18,2
(0058) CLRBIT(PORTB,E);
2E1 98C2 CBI 0x18,2
(0059) }
(0060) while (PINA&0x80);
2E2 99CF SBIC 0x19,7
2E3 CFFC RJMP 0x02E0
2E4 9508 RET
_Write_Command:
cmdcode --> R10
2E5 92AA ST R10,-Y
2E6 2EA0 MOV R10,R16
(0061) }
(0062) //**********************写命令到LCD***************************/
(0063)
(0064) void Write_Command(uchar cmdcode)
(0065) {
(0066) Check_Busy();
2E7 DFF4 RCALL _Check_Busy
(0067) DDRB=0xff;
2E8 EF8F LDI R24,0xFF
2E9 BB87 OUT 0x17,R24
(0068) CLRBIT(PORTB,RS);//RS=0;
2EA 98C0 CBI 0x18,0
(0069) CLRBIT(PORTB,RW);//RW=0;
2EB 98C1 CBI 0x18,1
(0070) DDRA=0xff;
2EC BB8A OUT 0x1A,R24
(0071) DB=cmdcode;
2ED BAAB OUT 0x1B,R10
(0072) Delay(1);//Delay(1);
2EE E001 LDI R16,1
2EF E010 LDI R17,0
2F0 DFC7 RCALL _Delay
(0073) SETBIT(PORTB,E);//E=1;
2F1 9AC2 SBI 0x18,2
(0074) Delay(1);//Delay(1);Delay(1);
2F2 E001 LDI R16,1
2F3 E010 LDI R17,0
2F4 DFC3 RCALL _Delay
(0075) CLRBIT(PORTB,E);//E=0;
2F5 98C2 CBI 0x18,2
2F6 90A9 LD R10,Y+
2F7 9508 RET
_Write_Data:
datacode --> R10
2F8 92AA ST R10,-Y
2F9 2EA0 MOV R10,R16
(0076) }
(0077) //**************************写数据到LCD*************************/
(0078) void Write_Data(uchar datacode)
(0079) {
(0080) Check_Busy();
2FA DFE1 RCALL _Check_Busy
(0081) DDRB=0xff;
2FB EF8F LDI R24,0xFF
2FC BB87 OUT 0x17,R24
(0082) SETBIT(PORTB,RS);//RS=1;
2FD 9AC0 SBI 0x18,0
(0083) CLRBIT(PORTB,RW);//RW=0;
2FE 98C1 CBI 0x18,1
(0084) DDRA=0xff;
2FF BB8A OUT 0x1A,R24
(0085) DB=datacode;
300 BAAB OUT 0x1B,R10
(0086) Delay(1);//Delay(1);
301 E001 LDI R16,1
302 E010 LDI R17,0
303 DFB4 RCALL _Delay
(0087) SETBIT(PORTB,E);//E=1;
304 9AC2 SBI 0x18,2
(0088) Delay(1);//Delay(1);Delay(1);
305 E001 LDI R16,1
306 E010 LDI R17,0
307 DFB0 RCALL _Delay
(0089) CLRBIT(PORTB,E);//E=0;
308 98C2 CBI 0x18,2
309 90A9 LD R10,Y+
30A 9508 RET
(0090) }
(0091) //**************************初始化LCD***********************/
(0092) void Initial_LCD(void)
(0093) {
(0094) Delay(10);
_Initial_LCD:
30B E00A LDI R16,0xA
30C E010 LDI R17,0
30D DFAA RCALL _Delay
(0095) Write_Command(0x30);//30H--基本指令操作
30E E300 LDI R16,0x30
30F DFD5 RCALL _Write_Command
(0096) Delay(5);
310 E005 LDI R16,5
311 E010 LDI R17,0
312 DFA5 RCALL _Delay
(0097) Write_Command(0x0c);//开显示,关光标,不闪烁.
313 E00C LDI R16,0xC
314 DFD0 RCALL _Write_Command
(0098) Delay(10);
315 E00A LDI R16,0xA
316 E010 LDI R17,0
317 DFA0 RCALL _Delay
(0099) Write_Command(0x02);
318 E002 LDI R16,2
319 DFCB RCALL _Write_Command
(0100) Delay(10);
31A E00A LDI R16,0xA
31B E010 LDI R17,0
31C DF9B RCALL _Delay
(0101) Write_Command(0x06);//指定在资料写入或读取时,光标的移动方向,DDRAM的地址计数器(AC)加1。
31D E006 LDI R16,6
31E DFC6 RCALL _Write_Command
(0102) Delay(10);
31F E00A LDI R16,0xA
320 E010 LDI R17,0
321 DF96 RCALL _Delay
(0103) Write_Command(0x01);//清除显示
322 E001 LDI R16,1
323 DFC1 RCALL _Write_Command
(0104) Delay(10);
324 E00A LDI R16,0xA
325 E010 LDI R17,0
326 DF91 RCALL _Delay
(0105) Write_Command(0x80);//光标复位
327 E800 LDI R16,0x80
328 DFBC RCALL _Write_Command
329 9508 RET
_Write_String:
i --> R20
datacode --> R10
32A 940E 0450 CALL push_xgset300C
32C 0158 MOVW R10,R16
(0106) }
(0107)
(0108) //*************************写一串字符到LCM**************************/
(0109) void Write_String(unsigned flash char datacode[])
(0110) {
(0111) uchar i=0;
32D 2744 CLR R20
32E C00A RJMP 0x0339
(0112) while(datacode[i])
(0113) {
(0114) Write_Data(datacode[i]);
32F 2FE4 MOV R30,R20
330 27FF CLR R31
331 0DEA ADD R30,R10
332 1DFB ADC R31,R11
333 9106 ELPM R16,10(Z)
334 DFC3 RCALL _Write_Data
(0115) i++;
335 9543 INC R20
(0116) if(i==0xff)break;
336 3F4F CPI R20,0xFF
337 F409 BNE 0x0339
338 C007 RJMP 0x0340
339 2FE4 MOV R30,R20
33A 27FF CLR R31
33B 0DEA ADD R30,R10
33C 1DFB ADC R31,R11
33D 9026 ELPM R2,7(Z)
33E 2022 TST R2
33F F779 BNE 0x032F
340 940C 0455 JMP pop_xgset300C
_Location_XY:
y --> R20
x --> R22
342 940E 045A CALL push_xgsetF00C
344 2F42 MOV R20,R18
345 2F60 MOV R22,R16
(0117) }
(0118) }
(0119) /**********************设置坐标*****************/
(0120) void Location_XY(uchar x,uchar y)
(0121) {
(0122) switch(y)
346 2EA4 MOV R10,R20
347 24BB CLR R11
348 20AA TST R10
349 F411 BNE 0x034C
34A 20BB TST R11
34B F071 BEQ 0x035A
34C 01C5 MOVW R24,R10
34D 3081 CPI R24,1
34E E0E0 LDI R30,0
34F 079E CPC R25,R30
350 F059 BEQ 0x035C
351 3082 CPI R24,2
352 E0E0 LDI R30,0
353 079E CPC R25,R30
354 F049 BEQ 0x035E
355 3083 CPI R24,3
356 E0E0 LDI R30,0
357 079E CPC R25,R30
358 F039 BEQ 0x0360
359 C008 RJMP 0x0362
(0123) {
(0124) case 0:
(0125) y=0x80;break;
35A E840 LDI R20,0x80
35B C007 RJMP 0x0363
(0126) case 1:
(0127) y=0x90;break;
35C E940 LDI R20,0x90
35D C005 RJMP 0x0363
(0128) case 2:
(0129) y=0x88;break;
35E E848 LDI R20,0x88
35F C003 RJMP 0x0363
(0130) case 3:
(0131) y=0x98;break;
360 E948 LDI R20,0x98
361 C001 RJMP 0x0363
(0132) default:
(0133) y=0x80;
362 E840 LDI R20,0x80
(0134) }
(0135) x=x&0x07;
363 7067 ANDI R22,7
(0136) Write_Command(x+y);
364 2F06 MOV R16,R22
365 0F04 ADD R16,R20
366 DF7E RCALL _Write_Command
367 940C 0461 JMP pop_xgsetF00C
_Write_String_atXY:
string --> Y,+2
y --> R12
x --> R10
369 92AA ST R10,-Y
36A 92CA ST R12,-Y
36B 2EC2 MOV R12,R18
36C 2EA0 MOV R10,R16
(0137) }
(0138) //************************在(x,y)处显示字符串string*************/
(0139) void Write_String_atXY(uchar x,uchar y,unsigned flash char string[])
(0140) {
(0141) Location_XY(x,y);
36D 2D2C MOV R18,R12
36E 2D0A MOV R16,R10
36F DFD2 RCALL _Location_XY
(0142) Write_String(string);
370 810A LDD R16,Y+2
371 811B LDD R17,Y+3
372 DFB7 RCALL _Write_String
373 90C9 LD R12,Y+
374 90A9 LD R10,Y+
375 9508 RET
_Clear_Lcd:
i --> R20
j --> R22
376 934A ST R20,-Y
377 936A ST R22,-Y
(0143) }
(0144)
(0145) //***********清屏******************************/
(0146) void Clear_Lcd( void )
(0147) {
(0148) uchar i,j;
(0149) Write_Command(0x34);
378 E304 LDI R16,0x34
379 DF6B RCALL _Write_Command
(0150) Write_Command(0x36);
37A E306 LDI R16,0x36
37B DF69 RCALL _Write_Command
(0151) for(i=0;i<32;i++)
37C 2744 CLR R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -