📄 nrf2401.lst
字号:
(0085) for(i=0;i<len;i++)
0167 2744 CLR R20
0168 C00D RJMP 0x0176
(0086) {
(0087) //if(*Ptr!='/0')
(0088) //if(*Ptr!=0)
(0089) {
(0090) displaybyte(*Ptr);
0169 2DEA MOV R30,R10
016A 2DFB MOV R31,R11
016B 8100 LDD R16,Z+0
016C DF83 RCALL _displaybyte
(0091) Ptr++ ;
016D 2D8A MOV R24,R10
016E 2D9B MOV R25,R11
016F 9601 ADIW R24,1
0170 2EA8 MOV R10,R24
0171 2EB9 MOV R11,R25
(0092) lcd_write_data(' ');
0172 E200 LDI R16,0x20
0173 E010 LDI R17,0
0174 D030 RCALL _lcd_write_data
0175 9543 INC R20
0176 1746 CP R20,R22
0177 F388 BCS 0x0169
0178 D330 RCALL pop_gset3
0179 9508 RET
_delay:
i --> R20
times --> R16
017A D33A RCALL push_gset1
FILE: F:\programme\nrf2401\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++)
017B 2744 CLR R20
017C 2755 CLR R21
017D C002 RJMP 0x0180
017E 5F4F SUBI R20,0xFF
017F 4F5F SBCI R21,0xFF
0180 1740 CP R20,R16
0181 0751 CPC R21,R17
0182 F3D8 BCS 0x017E
0183 D334 RCALL pop_gset1
0184 9508 RET
_lcd_send_byte:
data1 --> R20
i --> R22
data --> R10
0185 D32B RCALL push_gset3
0186 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++)
0187 2766 CLR R22
0188 2777 CLR R23
0189 C015 RJMP 0x019F
(0029) {data1=data&0x80; //test data bit7 为零则放送零,为一则放送一
018A 2D4A MOV R20,R10
018B 2755 CLR R21
018C 7840 ANDI R20,0x80
018D 7050 ANDI R21,0
(0030) if(data1!=0)
018E 3040 CPI R20,0
018F 0745 CPC R20,R21
0190 F029 BEQ 0x0196
(0031) { PORTD|=BIT(PD7);
0191 9A97 SBI 0x12,7
(0032) delay(20);
0192 E104 LDI R16,0x14
0193 E010 LDI R17,0
0194 DFE5 RCALL _delay
(0033) }
0195 C004 RJMP 0x019A
(0034) else {PORTD&=~BIT(PD7); ///当单片机速度太快时,加延时
0196 9897 CBI 0x12,7
(0035) delay(20); }
0197 E104 LDI R16,0x14
0198 E010 LDI R17,0
0199 DFE0 RCALL _delay
(0036)
(0037) //PORTD=PORTD&data;
(0038) PORTD|=BIT(PD6); // set sclk high
019A 9A96 SBI 0x12,6
(0039)
(0040) PORTD&=~BIT(PD6); // set sclk low
019B 9896 CBI 0x12,6
(0041) data=data<<1;
019C 0CAA LSL R10
019D 5F6F SUBI R22,0xFF
019E 4F7F SBCI R23,0xFF
019F 3068 CPI R22,0x8
01A0 E0E0 LDI R30,0
01A1 077E CPC R23,R30
01A2 F338 BCS 0x018A
01A3 D305 RCALL pop_gset3
01A4 9508 RET
_lcd_write_data:
data2 --> R22
data1 --> R10
data3 --> R20
data --> R20
01A5 D30B RCALL push_gset3
01A6 2F40 MOV R20,R16
(0042) }
(0043) }
(0044) /////////////////////////////////////////////////////////////
(0045) ////
(0046) ////////////////////////////////////////////////////////////
(0047) void lcd_write_data(char data)
(0048) {char data1=0xfa,data2,data3;
01A7 EF8A LDI R24,0xFA
01A8 2EA8 MOV R10,R24
(0049)
(0050) PORTD|=BIT(PD5); //set cs high
01A9 9A95 SBI 0x12,5
(0051)
(0052) data2=data&0xf0;
01AA 2F64 MOV R22,R20
01AB 7F60 ANDI R22,0xF0
(0053) data3=data&0x0f;
01AC 704F ANDI R20,0xF
(0054) data3=data3<<4;
01AD 2F84 MOV R24,R20
01AE 708F ANDI R24,0xF
01AF 9582 SWAP R24
01B0 2F48 MOV R20,R24
(0055)
(0056) lcd_send_byte(data1);
01B1 2D0A MOV R16,R10
01B2 DFD2 RCALL _lcd_send_byte
(0057) lcd_send_byte(data2);
01B3 2F06 MOV R16,R22
01B4 DFD0 RCALL _lcd_send_byte
(0058) lcd_send_byte(data3);
01B5 2F04 MOV R16,R20
01B6 DFCE RCALL _lcd_send_byte
(0059)
(0060) PORTD&=~BIT(PD5); //set cs low
01B7 9895 CBI 0x12,5
01B8 D2F0 RCALL pop_gset3
01B9 9508 RET
_lcd_write_comm:
data2 --> R22
data1 --> R10
data3 --> R20
data --> R20
01BA D2F6 RCALL push_gset3
01BB 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;
01BC EF88 LDI R24,0xF8
01BD 2EA8 MOV R10,R24
(0069) PORTD|=BIT(PD5); //set cs high
01BE 9A95 SBI 0x12,5
(0070)
(0071) data2=data&0xf0;
01BF 2F64 MOV R22,R20
01C0 7F60 ANDI R22,0xF0
(0072) data3=data&0x0f;
01C1 704F ANDI R20,0xF
(0073) data3=data3<<4;
01C2 2F84 MOV R24,R20
01C3 708F ANDI R24,0xF
01C4 9582 SWAP R24
01C5 2F48 MOV R20,R24
(0074)
(0075) lcd_send_byte(data1);
01C6 2D0A MOV R16,R10
01C7 DFBD RCALL _lcd_send_byte
(0076) lcd_send_byte(data2);
01C8 2F06 MOV R16,R22
01C9 DFBB RCALL _lcd_send_byte
(0077) lcd_send_byte(data3);
01CA 2F04 MOV R16,R20
01CB DFB9 RCALL _lcd_send_byte
(0078)
(0079) PORTD&=~BIT(PD5); //set cs low
01CC 9895 CBI 0x12,5
01CD D2DB RCALL pop_gset3
01CE 9508 RET
(0080)
(0081) }
(0082) void lcd_initial(void)
(0083) {
(0084)
(0085) lcd_write_comm(0x30); //基本指令集
_lcd_initial:
01CF E300 LDI R16,0x30
01D0 DFE9 RCALL _lcd_write_comm
(0086) lcd_write_comm(0x01); //清除显示屏幕,把DDRAM位址计数器调整为"00H"
01D1 E001 LDI R16,1
01D2 DFE7 RCALL _lcd_write_comm
(0087) lcd_write_comm(0x03); //把DDRAM位址计数器调整为"00H",游标回原点,该功能不影响显示DDRAM
01D3 E003 LDI R16,3
01D4 DFE5 RCALL _lcd_write_comm
(0088) lcd_write_comm(0x06); //光标右移
01D5 E006 LDI R16,6
01D6 DFE3 RCALL _lcd_write_comm
(0089) lcd_write_comm(0x0c); //显示屏打开
01D7 E00C LDI R16,0xC
01D8 DFE1 RCALL _lcd_write_comm
01D9 9508 RET
_screen:
j --> Y+1
i --> R20
data --> R22
01DA D2D8 RCALL push_gset2
01DB 2F60 MOV R22,R16
01DC 2F71 MOV R23,R17
(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);
01DD E008 LDI R16,0x8
01DE DFDB RCALL _lcd_write_comm
(0101) for (i=0;i<64;i++)
01DF 2744 CLR R20
01E0 2755 CLR R21
01E1 C020 RJMP 0x0202
(0102) {lcd_write_data(data[i]);
01E2 2FE4 MOV R30,R20
01E3 2FF5 MOV R31,R21
01E4 0FE6 ADD R30,R22
01E5 1FF7 ADC R31,R23
01E6 8100 LDD R16,Z+0
01E7 DFBD RCALL _lcd_write_data
(0103) if (i==15)
01E8 304F CPI R20,0xF
01E9 E0E0 LDI R30,0
01EA 075E CPC R21,R30
01EB F411 BNE 0x01EE
(0104) lcd_write_comm(0x90); //设定DDRAM第二行,第一列
01EC E900 LDI R16,0x90
01ED DFCC RCALL _lcd_write_comm
(0105) if (i==31)
01EE 314F CPI R20,0x1F
01EF E0E0 LDI R30,0
01F0 075E CPC R21,R30
01F1 F411 BNE 0x01F4
(0106) lcd_write_comm(0x88); //设定DDRAM第三行,第一列
01F2 E808 LDI R16,0x88
01F3 DFC6 RCALL _lcd_write_comm
(0107) if (i==47)
01F4 324F CPI R20,0x2F
01F5 E0E0 LDI R30,0
01F6 075E CPC R21,R30
01F7 F411 BNE 0x01FA
(0108) lcd_write_comm(0x98); //设定DDRAM第四行,第一列
01F8 E908 LDI R16,0x98
01F9 DFC0 RCALL _lcd_write_comm
(0109) if (i==63)
01FA 334F CPI R20,0x3F
01FB E0E0 LDI R30,0
01FC 075E CPC R21,R30
01FD F411 BNE 0x0200
(0110) lcd_write_comm(0x80); //设定DDRAM第一行,第一列
01FE E800 LDI R16,0x80
01FF DFBA RCALL _lcd_write_comm
0200 5F4F SUBI R20,0xFF
0201 4F5F SBCI R21,0xFF
0202 3440 CPI R20,0x40
0203 E0E0 LDI R30,0
0204 075E CPC R21,R30
0205 F2E0 BCS 0x01E2
(0111) }
(0112) lcd_write_comm(0x0c);
0206 E00C LDI R16,0xC
0207 DFB2 RCALL _lcd_write_comm
0208 D29E RCALL pop_gset2
0209 9508 RET
_fanxian:
y --> R20
x --> R22
j --> R10
i --> R12
hang --> R14
020A D2A2 RCALL push_gset5
020B 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); //开启绘图功能显示
020C E304 LDI R16,0x34
020D DFAC RCALL _lcd_write_comm
(0119) lcd_write_comm(0x34);
020E E304 LDI R16,0x34
020F DFAA RCALL _lcd_write_comm
(0120)
(0121) y=0x80;
0210 E840 LDI R20,0x80
(0122) x=0x80;
0211 E860 LDI R22,0x80
(0123) lcd_write_data(0x00);
0212 2700 CLR R16
0213 DF91 RCALL _lcd_write_data
(0124) lcd_write_comm(x); //设置x 坐标
0214 2F06 MOV R16,R22
0215 DFA4 RCALL _lcd_write_comm
(0125) lcd_write_comm(y);
0216 2F04 MOV R16,R20
0217 DFA2 RCALL _lcd_write_comm
(0126) for (j=0;j<32;j++)
0218 24AA CLR R10
0219 C010 RJMP 0x022A
(0127) {for (i=0;i<16;i++)
021A 24CC CLR R12
021B C003 RJMP 0x021F
(0128) lcd_write_data(0x00);
021C 2700 CLR R16
021D DF87 RCALL _lcd_write_data
021E 94C3 INC R12
021F 2D8C MOV R24,R12
0220 3180 CPI R24,0x10
0221 F3D0 BCS 0x021C
(0129)
(0130)
(0131) lcd_write_comm(++x);
0222 2F86 MOV R24,R22
0223 5F8F SUBI R24,0xFF
0224 2F68 MOV R22,R24
0225 2F08 MOV R16,R24
0226 DF93 RCALL _lcd_write_comm
(0132) lcd_write_comm(y);
0227 2F04 MOV R16,R20
0228 DF91 RCALL _lcd_write_comm
0229 94A3 INC R10
022A 2D8A MOV R24,R10
022B 3280 CPI R24,0x20
022C F368 BCS 0x021A
(0133)
(0134) }
(0135)
(0136) y=0x88;
022D E848 LDI R20,0x88
(0137) x=0x80;
022E E860 LDI R22,0x80
(0138) lcd_write_data(0x00);
022F 2700 CLR R16
0230 DF74 RCALL _lcd_write_data
(0139) lcd_write_comm(x);
0231 2F06 MOV R16,R22
0232 DF87 RCALL _lcd_write_comm
(0140) lcd_write_comm(y);
0233 2F04 MOV R16,R20
0234 DF85 RCALL _lcd_write_comm
(0141) for (j=32;j<64;j++)
0235 E280 LDI R24,0x20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -