📄 new.lst
字号:
_delay:
i --> R20
times --> R16
0434 D38F RCALL push_gset1
FILE: F:\programme\RF905\lcd.c
(0001) ///****************************************************************//
(0002) //液晶显示模块,采用ATmega8单片机和OCM4*8液晶,串行方式
(0003) //采用PORTD的高三位
(0004) //pd5---lcd_cs
(0005) //pd7---lcd_sdat
(0006) //pd6---lcd_sclk
(0007) //周金广2006年7月20日整理
(0008) ///****************************************************************//
(0009) ///////////////////////////////////////////////////
(0010) //lcd初始化程序
(0011) //////////////////////////////////////////////////
(0012) #include <stdio.h>
(0013) #include <iom8v.h>
(0014) #include <macros.h>
(0015)
(0016)
(0017) ///////////////////////////////////////////////
(0018) //
(0019) //////////////////////////////////////////////
(0020) void delay(unsigned int times)
(0021) {unsigned int i;
(0022) for(i=0;i<times;i++)
0435 2744 CLR R20
0436 2755 CLR R21
0437 C002 RJMP 0x043A
0438 5F4F SUBI R20,0xFF
0439 4F5F SBCI R21,0xFF
043A 1740 CP R20,R16
043B 0751 CPC R21,R17
043C F3D8 BCS 0x0438
043D D389 RCALL pop_gset1
043E 9508 RET
_lcd_send_byte:
data1 --> R20
i --> R22
data --> R10
043F D380 RCALL push_gset3
0440 2EA0 MOV R10,R16
(0023) ;
(0024) }
(0025)
(0026) void lcd_send_byte(char data)
(0027) {unsigned int i,data1;
(0028) for(i=0;i<8;i++)
0441 2766 CLR R22
0442 2777 CLR R23
0443 C015 RJMP 0x0459
(0029) {data1=data&0x80; //test data bit7 为零则放送零,为一则放送一
0444 2D4A MOV R20,R10
0445 2755 CLR R21
0446 7840 ANDI R20,0x80
0447 7050 ANDI R21,0
(0030) if(data1!=0)
0448 3040 CPI R20,0
0449 0745 CPC R20,R21
044A F029 BEQ 0x0450
(0031) { PORTD|=BIT(PD7);
044B 9A97 SBI 0x12,7
(0032) delay(20);
044C E104 LDI R16,0x14
044D E010 LDI R17,0
044E DFE5 RCALL _delay
(0033) }
044F C004 RJMP 0x0454
(0034) else {PORTD&=~BIT(PD7); ///当单片机速度太快时,加延时
0450 9897 CBI 0x12,7
(0035) delay(20); }
0451 E104 LDI R16,0x14
0452 E010 LDI R17,0
0453 DFE0 RCALL _delay
(0036)
(0037) //PORTD=PORTD&data;
(0038) PORTD|=BIT(PD6); // set sclk high
0454 9A96 SBI 0x12,6
(0039)
(0040) PORTD&=~BIT(PD6); // set sclk low
0455 9896 CBI 0x12,6
(0041) data=data<<1;
0456 0CAA LSL R10
0457 5F6F SUBI R22,0xFF
0458 4F7F SBCI R23,0xFF
0459 3068 CPI R22,0x8
045A E0E0 LDI R30,0
045B 077E CPC R23,R30
045C F338 BCS 0x0444
045D D35A RCALL pop_gset3
045E 9508 RET
_lcd_write_data:
data2 --> R22
data1 --> R10
data3 --> R20
data --> R20
045F D360 RCALL push_gset3
0460 2F40 MOV R20,R16
(0042) }
(0043) }
(0044) /////////////////////////////////////////////////////////////
(0045) ////
(0046) ////////////////////////////////////////////////////////////
(0047) void lcd_write_data(char data)
(0048) {char data1=0xfa,data2,data3;
0461 EF8A LDI R24,0xFA
0462 2EA8 MOV R10,R24
(0049)
(0050) PORTD|=BIT(PD5); //set cs high
0463 9A95 SBI 0x12,5
(0051)
(0052) data2=data&0xf0;
0464 2F64 MOV R22,R20
0465 7F60 ANDI R22,0xF0
(0053) data3=data&0x0f;
0466 704F ANDI R20,0xF
(0054) data3=data3<<4;
0467 2F84 MOV R24,R20
0468 708F ANDI R24,0xF
0469 9582 SWAP R24
046A 2F48 MOV R20,R24
(0055)
(0056) lcd_send_byte(data1);
046B 2D0A MOV R16,R10
046C DFD2 RCALL _lcd_send_byte
(0057) lcd_send_byte(data2);
046D 2F06 MOV R16,R22
046E DFD0 RCALL _lcd_send_byte
(0058) lcd_send_byte(data3);
046F 2F04 MOV R16,R20
0470 DFCE RCALL _lcd_send_byte
(0059)
(0060) PORTD&=~BIT(PD5); //set cs low
0471 9895 CBI 0x12,5
0472 D345 RCALL pop_gset3
0473 9508 RET
_lcd_write_comm:
data2 --> R22
data1 --> R10
data3 --> R20
data --> R20
0474 D34B RCALL push_gset3
0475 2F40 MOV R20,R16
(0061)
(0062) }
(0063) /////////////////////////////////////////////////////////////
(0064) ////
(0065) ////////////////////////////////////////////////////////////
(0066) void lcd_write_comm(char data)
(0067) //int data;
(0068) {char data1=0xf8,data2,data3;
0476 EF88 LDI R24,0xF8
0477 2EA8 MOV R10,R24
(0069) PORTD|=BIT(PD5); //set cs high
0478 9A95 SBI 0x12,5
(0070)
(0071) data2=data&0xf0;
0479 2F64 MOV R22,R20
047A 7F60 ANDI R22,0xF0
(0072) data3=data&0x0f;
047B 704F ANDI R20,0xF
(0073) data3=data3<<4;
047C 2F84 MOV R24,R20
047D 708F ANDI R24,0xF
047E 9582 SWAP R24
047F 2F48 MOV R20,R24
(0074)
(0075) lcd_send_byte(data1);
0480 2D0A MOV R16,R10
0481 DFBD RCALL _lcd_send_byte
(0076) lcd_send_byte(data2);
0482 2F06 MOV R16,R22
0483 DFBB RCALL _lcd_send_byte
(0077) lcd_send_byte(data3);
0484 2F04 MOV R16,R20
0485 DFB9 RCALL _lcd_send_byte
(0078)
(0079) PORTD&=~BIT(PD5); //set cs low
0486 9895 CBI 0x12,5
0487 D330 RCALL pop_gset3
0488 9508 RET
(0080)
(0081) }
(0082) void lcd_initial(void)
(0083) {
(0084)
(0085) lcd_write_comm(0x30); //基本指令集
_lcd_initial:
0489 E300 LDI R16,0x30
048A DFE9 RCALL _lcd_write_comm
(0086) lcd_write_comm(0x01); //清除显示屏幕,把DDRAM位址计数器调整为"00H"
048B E001 LDI R16,1
048C DFE7 RCALL _lcd_write_comm
(0087) lcd_write_comm(0x03); //把DDRAM位址计数器调整为"00H",游标回原点,该功能不影响显示DDRAM
048D E003 LDI R16,3
048E DFE5 RCALL _lcd_write_comm
(0088) lcd_write_comm(0x06); //光标右移
048F E006 LDI R16,6
0490 DFE3 RCALL _lcd_write_comm
(0089) lcd_write_comm(0x0c); //显示屏打开
0491 E00C LDI R16,0xC
0492 DFE1 RCALL _lcd_write_comm
0493 9508 RET
_screen:
j --> Y+1
i --> R20
data --> R22
0494 D32D RCALL push_gset2
0495 01B8 MOVW R22,R16
(0090) }
(0091) /////////////////////////////////////////////////////
(0092) ////
(0093) /////////////////////////////////////////////////////
(0094)
(0095) void screen(data)
(0096) char data[65];
(0097)
(0098) {
(0099) unsigned int i,j;
(0100) lcd_write_comm(0x08);
0496 E008 LDI R16,0x8
0497 DFDC RCALL _lcd_write_comm
(0101) for (i=0;i<64;i++)
0498 2744 CLR R20
0499 2755 CLR R21
049A C01F RJMP 0x04BA
(0102) {lcd_write_data(data[i]);
049B 01FA MOVW R30,R20
049C 0FE6 ADD R30,R22
049D 1FF7 ADC R31,R23
049E 8100 LDD R16,Z+0
049F DFBF RCALL _lcd_write_data
(0103) if (i==15)
04A0 304F CPI R20,0xF
04A1 E0E0 LDI R30,0
04A2 075E CPC R21,R30
04A3 F411 BNE 0x04A6
(0104) lcd_write_comm(0x90); //设定DDRAM第二行,第一列
04A4 E900 LDI R16,0x90
04A5 DFCE RCALL _lcd_write_comm
(0105) if (i==31)
04A6 314F CPI R20,0x1F
04A7 E0E0 LDI R30,0
04A8 075E CPC R21,R30
04A9 F411 BNE 0x04AC
(0106) lcd_write_comm(0x88); //设定DDRAM第三行,第一列
04AA E808 LDI R16,0x88
04AB DFC8 RCALL _lcd_write_comm
(0107) if (i==47)
04AC 324F CPI R20,0x2F
04AD E0E0 LDI R30,0
04AE 075E CPC R21,R30
04AF F411 BNE 0x04B2
(0108) lcd_write_comm(0x98); //设定DDRAM第四行,第一列
04B0 E908 LDI R16,0x98
04B1 DFC2 RCALL _lcd_write_comm
(0109) if (i==63)
04B2 334F CPI R20,0x3F
04B3 E0E0 LDI R30,0
04B4 075E CPC R21,R30
04B5 F411 BNE 0x04B8
(0110) lcd_write_comm(0x80); //设定DDRAM第一行,第一列
04B6 E800 LDI R16,0x80
04B7 DFBC RCALL _lcd_write_comm
04B8 5F4F SUBI R20,0xFF
04B9 4F5F SBCI R21,0xFF
04BA 3440 CPI R20,0x40
04BB E0E0 LDI R30,0
04BC 075E CPC R21,R30
04BD F2E8 BCS 0x049B
(0111) }
(0112) lcd_write_comm(0x0c);
04BE E00C LDI R16,0xC
04BF DFB4 RCALL _lcd_write_comm
04C0 D2F5 RCALL pop_gset2
04C1 9508 RET
_fanxian:
y --> R20
x --> R22
j --> R10
i --> R12
hang --> R14
04C2 D2F9 RCALL push_gset5
04C3 2EE0 MOV R14,R16
(0113) }
(0114) //////////////////////////////////
(0115) void fanxian(unsigned char hang) // 0x80-1 0x90-2 0x88-3 0x98-4
(0116) {
(0117) unsigned char x,y,i,j;
(0118) lcd_write_comm(0x34); //开启绘图功能显示
04C4 E304 LDI R16,0x34
04C5 DFAE RCALL _lcd_write_comm
(0119) lcd_write_comm(0x34);
04C6 E304 LDI R16,0x34
04C7 DFAC RCALL _lcd_write_comm
(0120)
(0121) y=0x80;
04C8 E840 LDI R20,0x80
(0122) x=0x80;
04C9 E860 LDI R22,0x80
(0123) lcd_write_data(0x00);
04CA 2700 CLR R16
04CB DF93 RCALL _lcd_write_data
(0124) lcd_write_comm(x); //设置x 坐标
04CC 2F06 MOV R16,R22
04CD DFA6 RCALL _lcd_write_comm
(0125) lcd_write_comm(y);
04CE 2F04 MOV R16,R20
04CF DFA4 RCALL _lcd_write_comm
(0126) for (j=0;j<32;j++)
04D0 24AA CLR R10
04D1 C010 RJMP 0x04E2
(0127) {for (i=0;i<16;i++)
04D2 24CC CLR R12
04D3 C003 RJMP 0x04D7
(0128) lcd_write_data(0x00);
04D4 2700 CLR R16
04D5 DF89 RCALL _lcd_write_data
04D6 94C3 INC R12
04D7 2D8C MOV R24,R12
04D8 3180 CPI R24,0x10
04D9 F3D0 BCS 0x04D4
(0129)
(0130)
(0131) lcd_write_comm(++x);
04DA 2F86 MOV R24,R22
04DB 5F8F SUBI R24,0xFF
04DC 2F68 MOV R22,R24
04DD 2F08 MOV R16,R24
04DE DF95 RCALL _lcd_write_comm
(0132) lcd_write_comm(y);
04DF 2F04 MOV R16,R20
04E0 DF93 RCALL _lcd_write_comm
04E1 94A3 INC R10
04E2 2D8A MOV R24,R10
04E3 3280 CPI R24,0x20
04E4 F368 BCS 0x04D2
(0133)
(0134) }
(0135)
(0136) y=0x88;
04E5 E848 LDI R20,0x88
(0137) x=0x80;
04E6 E860 LDI R22,0x80
(0138) lcd_write_data(0x00);
04E7 2700 CLR R16
04E8 DF76 RCALL _lcd_write_data
(0139) lcd_write_comm(x);
04E9 2F06 MOV R16,R22
04EA DF89 RCALL _lcd_write_comm
(0140) lcd_write_comm(y);
04EB 2F04 MOV R16,R20
04EC DF87 RCALL _lcd_write_comm
(0141) for (j=32;j<64;j++)
04ED E280 LDI R24,0x20
04EE 2EA8 MOV R10,R24
04EF C010 RJMP 0x0500
(0142) {for (i=0;i<16;i++)
04F0 24CC CLR R12
04F1 C003 RJMP 0x04F5
(0143) lcd_write_data(0x00);
04F2 2700 CLR R16
04F3 DF6B RCALL _lcd_write_data
04F4 94C3 INC R12
04F5 2D8C MOV R24,R12
04F6 3180 CPI R24,0x10
04F7 F3D0 BCS 0x04F2
(0144) lcd_write_comm(++x);
04F8 2F86 MOV R24,R22
04F9 5F8F SUBI R24,0xFF
04FA 2F68 MOV R22,R24
04FB 2F08 MOV R16,R24
04FC DF77 RCALL _lcd_write_comm
(0145) lcd_write_comm(y);
04FD 2F04 MOV R16,R20
04FE DF75 RCALL _lcd_write_comm
04FF 94A3 INC R10
0500 2D8A MOV R24,R10
0501 3480 CPI R24,0x40
0502 F368 BCS 0x04F0
(0146)
(0147)
(0148) }
(0149)
(0150) lcd_write_comm(0x36); //开启绘图功能显示
0503 E306 LDI R16,0x36
0504 DF6F RCALL _lcd_write_comm
(0151)
(0152) if(hang==1)
0505 2D8E MOV R24,R14
0506 3081 CPI R24,1
0507 F419 BNE 0x050B
(0153) {
(0154) y=0x80;
0508 E840 LDI R20,0x80
(0155) x=0x80;}
0509 E860 LDI R22,0x80
050A C00E RJMP 0x0519
(0156) else if(hang==2)
050B 2D8E MOV R24,R14
050C 3082 CPI R24,2
050D F419 BNE 0x0511
(0157) {
(0158) y=0x80;
050E E840 LDI R20,0x80
(0159) x=0x90;}
050F E960 LDI R22,0x90
0510 C008 RJMP 0x0519
(0160) else if(hang==3)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -