📄 nrf.lst
字号:
(0037)
(0038) //延时1S
(0039) void delay_ns( uchar n )
(0040) {
(0041) uchar i;
(0042) for( i = 0; i < n; i++ )
223 24AA CLR R10
224 C004 RJMP 0x0229
(0043) {
(0044) delay_nms( 1000 );
225 EE08 LDI R16,0xE8
226 E013 LDI R17,3
227 DFEA RCALL _delay_nms
228 94A3 INC R10
229 14AC CP R10,R12
22A F3D0 BCS 0x0225
22B 90C9 LD R12,Y+
22C 90A9 LD R10,Y+
22D 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\nrftest\lcd.c
(0001) #define _LCD_C_
(0002) #include "LCD.h"
(0003) #include <iom16v.h>
(0004) //==========================================
(0005) //函数名称:液晶模块使能
(0006) //函数作用: 使能液晶
(0007) //入口参数: 无
(0008) //返回类型:无
(0009) //==========================================
(0010) void LCD_en_write(void)
(0011) {
(0012) EN_SET;
_LCD_en_write:
22E 9A93 SBI 0x12,3
(0013) delay_nus(4);
22F E004 LDI R16,4
230 E010 LDI R17,0
231 940E 01FA CALL _delay_nus
(0014) EN_CLR;
233 9893 CBI 0x12,3
234 9508 RET
_LCD_write_command:
command --> R20
235 934A ST R20,-Y
236 2F40 MOV R20,R16
(0015) }
(0016)
(0017) //==========================================
(0018) //函数名称:写指令
(0019) //函数作用:
(0020) //入口参数: 液晶指令command
(0021) //返回类型:无
(0022) //==========================================
(0023) void LCD_write_command(uchar command)
(0024) {
(0025) delay_nus( 16 );
237 E100 LDI R16,0x10
238 E010 LDI R17,0
239 940E 01FA CALL _delay_nus
(0026) RS_CLR;
23B 9892 CBI 0x12,2
(0027) DB &= 0X0F; //清高四位
23C B382 IN R24,0x12
23D 708F ANDI R24,0xF
23E BB82 OUT 0x12,R24
(0028) DB |= command & 0xf0; //写高四位
23F 2F84 MOV R24,R20
240 7F80 ANDI R24,0xF0
241 B222 IN R2,0x12
242 2A28 OR R2,R24
243 BA22 OUT 0x12,R2
(0029) LCD_en_write();
244 DFE9 RCALL _LCD_en_write
(0030) command=command << 4; //低四位移到高四位
245 2F84 MOV R24,R20
246 708F ANDI R24,0xF
247 9582 SWAP R24
248 2F48 MOV R20,R24
(0031) DB &= 0x0f; //清高四位
249 B382 IN R24,0x12
24A 708F ANDI R24,0xF
24B BB82 OUT 0x12,R24
(0032) DB |= command & 0xf0; //写低四位
24C 2F84 MOV R24,R20
24D 7F80 ANDI R24,0xF0
24E B222 IN R2,0x12
24F 2A28 OR R2,R24
250 BA22 OUT 0x12,R2
(0033) LCD_en_write();
251 DFDC RCALL _LCD_en_write
252 9149 LD R20,Y+
253 9508 RET
_LCD_write_data:
DATA --> R20
254 934A ST R20,-Y
255 2F40 MOV R20,R16
(0034) //delay_nms(2); //清屏指令时间很长, 保险起见,可以增加
(0035) }
(0036)
(0037) //==========================================
(0038) //函数名称:写数据
(0039) //函数作用:
(0040) //入口参数: 数据DATA
(0041) //返回类型:无
(0042) //==========================================
(0043) void LCD_write_data(uchar DATA)
(0044) {
(0045) delay_nus(16);
256 E100 LDI R16,0x10
257 E010 LDI R17,0
258 940E 01FA CALL _delay_nus
(0046) RS_SET; //RS=1
25A 9A92 SBI 0x12,2
(0047) DB &= 0X0f; //清高四位
25B B382 IN R24,0x12
25C 708F ANDI R24,0xF
25D BB82 OUT 0x12,R24
(0048) DB |= DATA&0xf0; //写高四位
25E 2F84 MOV R24,R20
25F 7F80 ANDI R24,0xF0
260 B222 IN R2,0x12
261 2A28 OR R2,R24
262 BA22 OUT 0x12,R2
(0049) LCD_en_write();
263 DFCA RCALL _LCD_en_write
(0050) DATA = DATA << 4; //低四位移到高四位
264 2F84 MOV R24,R20
265 708F ANDI R24,0xF
266 9582 SWAP R24
267 2F48 MOV R20,R24
(0051) DB &= 0X0f; //清高四位
268 B382 IN R24,0x12
269 708F ANDI R24,0xF
26A BB82 OUT 0x12,R24
(0052) DB |= DATA&0xf0; //写低四位
26B 2F84 MOV R24,R20
26C 7F80 ANDI R24,0xF0
26D B222 IN R2,0x12
26E 2A28 OR R2,R24
26F BA22 OUT 0x12,R2
(0053) LCD_en_write();
270 DFBD RCALL _LCD_en_write
271 9149 LD R20,Y+
272 9508 RET
(0054) }
(0055)
(0056) //==========================================
(0057) //函数名称:液晶初始化函数
(0058) //函数作用:
(0059) //入口参数: 无
(0060) //返回类型:无
(0061) //==========================================
(0062) void LCD_init( void )
(0063) {
(0064) DB_DDR_OUT;
_LCD_init:
273 B381 IN R24,0x11
274 6F80 ORI R24,0xF0
275 BB81 OUT 0x11,R24
276 B381 IN R24,0x11
277 608C ORI R24,0xC
278 BB81 OUT 0x11,R24
(0065) LCD_write_command(0x28);
279 E208 LDI R16,0x28
27A DFBA RCALL _LCD_write_command
(0066) LCD_en_write(); //********总结这里一定要加这液晶使能*********
27B DFB2 RCALL _LCD_en_write
(0067) delay_nus(20);
27C E104 LDI R16,0x14
27D E010 LDI R17,0
27E 940E 01FA CALL _delay_nus
(0068) LCD_write_command(0x28); //4位显示
280 E208 LDI R16,0x28
281 DFB3 RCALL _LCD_write_command
(0069) LCD_write_command(0x0c); //显示开
282 E00C LDI R16,0xC
283 DFB1 RCALL _LCD_write_command
(0070) LCD_write_command(0x01); //清屏
284 E001 LDI R16,1
285 DFAF RCALL _LCD_write_command
(0071) delay_nms(5); //延时一定要长
286 E005 LDI R16,5
287 E010 LDI R17,0
288 940E 0212 CALL _delay_nms
28A 9508 RET
_LCD_set_rc:
address --> R20
c --> R22
r --> R10
28B 940E 0562 CALL push_xgsetF00C
28D 2F62 MOV R22,R18
28E 2EA0 MOV R10,R16
(0072) }
(0073)
(0074) //==========================================
(0075) //函数名称:写地址
(0076) //函数作用:
(0077) //入口参数: 行位置r, 列位置c
(0078) //返回类型:无
(0079) //==========================================
(0080) void LCD_set_rc( uchar r, uchar c )
(0081) {
(0082) uchar address;
(0083)
(0084) if (r == 1)
28F 2D8A MOV R24,R10
290 3081 CPI R24,1
291 F419 BNE 0x0295
(0085) address = 0x80 + c;
292 2F46 MOV R20,R22
293 5840 SUBI R20,0x80
294 C005 RJMP 0x029A
(0086) else if(r == 2)
295 2D8A MOV R24,R10
296 3082 CPI R24,2
297 F411 BNE 0x029A
(0087) address = 0xc0 + c;
298 2F46 MOV R20,R22
299 5440 SUBI R20,0x40
(0088)
(0089) LCD_write_command( address );
29A 2F04 MOV R16,R20
29B DF99 RCALL _LCD_write_command
29C 940C 0569 JMP pop_xgsetF00C
_LCD_write_string:
s --> R20
c --> R12
r --> R10
29E 940E 0570 CALL push_xgset303C
2A0 2EC2 MOV R12,R18
2A1 2EA0 MOV R10,R16
2A2 814E LDD R20,Y+6
2A3 815F LDD R21,Y+7
(0090) }
(0091)
(0092) //==========================================
(0093) //函数名称:写字符串
(0094) //函数作用: 在指定位置写一串字符串
(0095) //入口参数: 行位置r, 列位置c, 字符串*s
(0096) //返回类型:无
(0097) //==========================================
(0098) void LCD_write_string(uchar r, uchar c, uchar *s)
(0099) {
(0100) LCD_set_rc( r, c ); //写地址
2A4 2D2C MOV R18,R12
2A5 2D0A MOV R16,R10
2A6 DFE4 RCALL _LCD_set_rc
2A7 C005 RJMP 0x02AD
(0101)
(0102) while( *s ) // 写显示字符
(0103) {
(0104) LCD_write_data( *s );
2A8 01FA MOVW R30,R20
2A9 8100 LDD R16,Z+0
2AA DFA9 RCALL _LCD_write_data
(0105) s++;
2AB 5F4F SUBI R20,0xFF
2AC 4F5F SBCI R21,0xFF
2AD 01FA MOVW R30,R20
2AE 8020 LDD R2,Z+0
2AF 2022 TST R2
2B0 F7B9 BNE 0x02A8
2B1 940C 0577 JMP pop_xgset303C
_LCD_write_char:
DATA --> Y,+2
c --> R12
r --> R10
2B3 92AA ST R10,-Y
2B4 92CA ST R12,-Y
2B5 2EC2 MOV R12,R18
2B6 2EA0 MOV R10,R16
(0106) }
(0107) }
(0108)
(0109) void LCD_write_char(uchar r, uchar c, uchar DATA) //写字符
(0110) {
(0111) LCD_set_rc( r, c );
2B7 2D2C MOV R18,R12
2B8 2D0A MOV R16,R10
2B9 DFD1 RCALL _LCD_set_rc
(0112) LCD_write_data( DATA );
2BA 810A LDD R16,Y+2
2BB DF98 RCALL _LCD_write_data
2BC 90C9 LD R12,Y+
2BD 90A9 LD R10,Y+
2BE 9508 RET
_LCD_write_array:
i --> R10
array --> R12
c --> R22
r --> R20
2BF 940E 057E CALL push_xgsetF03C
2C1 2F62 MOV R22,R18
2C2 2F40 MOV R20,R16
2C3 9721 SBIW R28,1
2C4 84C9 LDD R12,Y+9
2C5 84DA LDD R13,Y+10
(0113) }
(0114)
(0115) //==========================================
(0116) //函数名称:写字符数组
(0117) //函数作用: 在指定位置写一串字符串
(0118) //入口参数: 行位置r, 列位置c, 字符数组chardata[], 字符个数
(0119) //返回类型:无
(0120) //==========================================
(0121) void LCD_write_array( uchar r, uchar c, uchar array[] )
(0122) {
(0123) uchar i = 0;
2C6 24AA CLR R10
2C7 C02A RJMP 0x02F2
(0124) while( array[i] != '\0' )
(0125) {
(0126) LCD_write_char( r, c, array[i] );
2C8 2DEA MOV R30,R10
2C9 27FF CLR R31
2CA 0DEC ADD R30,R12
2CB 1DFD ADC R31,R13
2CC 8020 LDD R2,Z+0
2CD 8228 STD Y+0,R2
2CE 2F26 MOV R18,R22
2CF 2F04 MOV R16,R20
2D0 DFE2 RCALL _LCD_write_char
(0127) if( ++c == 16 )
2D1 2F86 MOV R24,R22
2D2 5F8F SUBI R24,0xFF
2D3 2F68 MOV R22,R24
2D4 3160 CPI R22,0x10
2D5 F4D9 BNE 0x02F1
(0128) {
(0129) if( r == 1 )
2D6 3041 CPI R20,1
2D7 F461 BNE 0x02E4
(0130) {
(0131) c = 0;
2D8 2766 CLR R22
(0132) r = 2;
2D9 E042 LDI R20,2
(0133) LCD_write_char( r, c, array[i] );
2DA 2DEA MOV R30,R10
2DB 27FF CLR R31
2DC 0DEC ADD R30,R12
2DD 1DFD ADC R31,R13
2DE 8020 LDD R2,Z+0
2DF 8228 STD Y+0,R2
2E0 2F26 MOV R18,R22
2E1 2F04 MOV R16,R20
2E2 DFD0 RCALL _LCD_write_char
(0134) }
2E3 C00D RJMP 0x02F1
(0135)
(0136) else if( r == 2 )
2E4 3042 CPI R20,2
2E5 F459 BNE 0x02F1
(0137) {
(0138) c = 0;
2E6 2766 CLR R22
(0139) r = 1;
2E7 E041 LDI R20,1
(0140) LCD_write_char( r, c, array[i] );
2E8 2DEA MOV R30,R10
2E9 27FF CLR R31
2EA 0DEC ADD R30,R12
2EB 1DFD ADC R31,R13
2EC 8020 LDD R2,Z+0
2ED 8228 STD Y+0,R2
2EE 2F26 MOV R18,R22
2EF 2F04 MOV R16,R20
2F0 DFC2 RCALL _LCD_write_char
(0141) }
(0142) }
(0143) i++;
2F1 94A3 INC R10
2F2 2DEA MOV R30,R10
2F3 27FF CLR R31
2F4 0DEC ADD R30,R12
2F5 1DFD ADC R31,R13
2F6 8020 LDD R2,Z+0
2F7 2022 TST R2
2F8 F009 BEQ 0x02FA
2F9 CFCE RJMP 0x02C8
2FA 9621 ADIW R28,1
2FB 940C 0587 JMP pop_xgsetF03C
_lengh_longint:
data_n --> R20
datatmp --> Y,+0
datalongint --> Y,+5
2FD 940E 04D3 CALL push_arg4
2FF 934A ST R20,-Y
300 9724 SBIW R28,4
(0144) }
(0145) }
(0146)
(0147) //返回整形数据的长度
(0148) char lengh_longint( long unsigned datalongint )
(0149) {
(0150) long signed datatmp = datalongint;
301 802D LDD R2,Y+5
302 803E LDD R3,Y+6
303 804F LDD R4,Y+7
304 8458 LDD R5,Y+8
305 8228 STD Y+0,R2
306 8239 STD Y+1,R3
307 824A STD Y+2,R4
308 825B STD Y+3,R5
(0151) uchar data_n = 0;
309 2744 CLR R20
30A C013 RJMP 0x031E
(0152) while( datatmp != 0 )
(0153) {
(0154) datatmp /= 10;
30B E08A LDI R24,0xA
30C E090 LDI R25,0
30D E0A0 LDI R26,0
30E E0B0 LDI R27,0
30F 8108 LDD R16,Y+0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -