📄 ir.lst
字号:
data --> R12
command --> R10
34D D262 RCALL push_xgsetF03C
34E 0169 MOVW R12,R18
34F 0158 MOVW R10,R16
(0069) }
(0070) /*------------------------------------------------------------
(0071) 函数: 写命令或数据到lcd1602
(0072) 参数:command: 0---写数据, 1---写命令
(0073) data: 所要写的命令或数据
(0074) *-------------------------------------------------------------*/
(0075) void LCD_write_char(unsigned command,unsigned data)
(0076) {
(0077) unsigned command_temp,data_temp;
(0078) command_temp=command;
350 01A5 MOVW R20,R10
(0079) data_temp=data;
351 01B6 MOVW R22,R12
(0080) delay_us(25);
352 E109 LDI R16,0x19
353 E010 LDI R17,0
354 DD75 RCALL _delay_us
(0081) if(command==0)
355 3040 CPI R20,0
356 0745 CPC R20,R21
357 F4C1 BNE 0x0370
(0082) {
(0083) LCD_RS_PORT|=LCD_RS; //RS=1
358 9AAA SBI 0x15,2
(0084) LCD_DATA_PORT&=0X0f;
359 B385 IN R24,0x15
35A 708F ANDI R24,0xF
35B BB85 OUT 0x15,R24
(0085) LCD_DATA_PORT|=data_temp&0xf0; //写高四位
35C 01CB MOVW R24,R22
35D 940E 05CC CALL 0x05CC
(0086) LCD_en_write();
35F DFE7 RCALL _LCD_en_write
(0087) data_temp=data_temp<<4;
360 0F66 LSL R22
361 1F77 ROL R23
362 0F66 LSL R22
363 1F77 ROL R23
364 0F66 LSL R22
365 1F77 ROL R23
366 0F66 LSL R22
367 1F77 ROL R23
(0088) LCD_DATA_PORT&=0X0f;
368 B385 IN R24,0x15
369 708F ANDI R24,0xF
36A BB85 OUT 0x15,R24
(0089) LCD_DATA_PORT|=data_temp&0xf0; //写低四位
36B 01CB MOVW R24,R22
36C 940E 05CC CALL 0x05CC
(0090) LCD_en_write();
36E DFD8 RCALL _LCD_en_write
(0091) }
36F C013 RJMP 0x0383
(0092) else
(0093) {
(0094) LCD_RS_PORT&=~LCD_RS; //RS=0
370 98AA CBI 0x15,2
(0095) LCD_DATA_PORT&=0X0f;
371 B385 IN R24,0x15
372 708F ANDI R24,0xF
373 BB85 OUT 0x15,R24
(0096) LCD_DATA_PORT|=command_temp&0xf0; //写高四位
374 01CA MOVW R24,R20
375 940E 05CC CALL 0x05CC
(0097) LCD_en_write();
377 DFCF RCALL _LCD_en_write
378 940E 05E0 CALL 0x05E0
37A 940E 05E0 CALL 0x05E0
(0098) command_temp=command_temp<<4;
(0099) LCD_DATA_PORT&=0x0f;
37C B385 IN R24,0x15
37D 708F ANDI R24,0xF
37E BB85 OUT 0x15,R24
(0100) LCD_DATA_PORT|=command_temp&0xf0; //写低四位
37F 01CA MOVW R24,R20
380 940E 05CC CALL 0x05CC
(0101) LCD_en_write();
382 DFC4 RCALL _LCD_en_write
(0102) }
383 C233 RJMP pop_xgsetF03C
_clear:
i --> R20
384 934A ST R20,-Y
(0103) }
(0104) /*-------------------------------------------------------------
(0105) 函数: 清屏lcd1602
(0106) ---------------------------------------------------------------*/
(0107) void clear(void)
(0108) {
(0109) unsigned char i;
(0110) LCD_set_xy(0,0);
385 2722 CLR R18
386 2700 CLR R16
387 DFAF RCALL _LCD_set_xy
(0111) for(i=0;i<16;i++)
388 2744 CLR R20
389 C004 RJMP 0x038E
(0112) LCD_write_char(0,' ');
38A 940E 0604 CALL 0x0604
38C DFC0 RCALL _LCD_write_char
38D 9543 INC R20
38E 3140 CPI R20,0x10
38F F3D0 BCS 0x038A
(0113) LCD_set_xy(0,1);
390 E021 LDI R18,1
391 2700 CLR R16
392 DFA4 RCALL _LCD_set_xy
(0114) for(i=0;i<16;i++)
393 2744 CLR R20
394 C004 RJMP 0x0399
(0115) LCD_write_char(0,' ');
395 940E 0604 CALL 0x0604
397 DFB5 RCALL _LCD_write_char
398 9543 INC R20
399 3140 CPI R20,0x10
39A F3D0 BCS 0x0395
39B 9149 LD R20,Y+
39C 9508 RET
_LCD_write_string:
s --> R20
Y --> R12
X --> R10
39D D208 RCALL push_xgset303C
39E 2EC2 MOV R12,R18
39F 2EA0 MOV R10,R16
3A0 814E LDD R20,Y+6
3A1 815F LDD R21,Y+7
(0116) }
(0117) /*-------------------------------------------------------------
(0118) 函数: 写字符串
(0119) 参数:列---X=0~15,行---Y=0~1 写地址
(0120) s为所要写的字符串
(0121) ---------------------------------------------------------------*/
(0122) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0123) {
(0124) LCD_set_xy(X,Y);
3A2 2D2C MOV R18,R12
3A3 2D0A MOV R16,R10
3A4 DF92 RCALL _LCD_set_xy
3A5 C006 RJMP 0x03AC
(0125) while(*s)
(0126) {
(0127) LCD_write_char(0,*s);
3A6 01FA MOVW R30,R20
3A7 940E 0609 CALL 0x0609
3A9 DFA3 RCALL _LCD_write_char
(0128) s++;
3AA 5F4F SUBI R20,0xFF
3AB 4F5F SBCI R21,0xFF
3AC 01FA MOVW R30,R20
3AD 8020 LDD R2,Z+0
3AE 2022 TST R2
3AF F7B1 BNE 0x03A6
3B0 C1FC RJMP pop_xgset303C
_LCD_write_data:
data --> Y,+0
i --> R20
dat --> R14
Y --> R12
X --> R10
3B1 D1DF RCALL push_xgset30FC
3B2 2EC2 MOV R12,R18
3B3 2EA0 MOV R10,R16
3B4 9724 SBIW R28,4
3B5 84EC LDD R14,Y+12
3B6 84FD LDD R15,Y+13
(0129) }
(0130) }
(0131)
(0132) /*-------------------------------------------------------------
(0133) 函数: 写数字
(0134) 参数:列---X=0~15,行---Y=0~1 写地址
(0135) dat为所要写的数字
(0136) ---------------------------------------------------------------*/
(0137) void LCD_write_data(unsigned char X,unsigned char Y,int dat)
(0138) {
(0139) //unsigned char fuhao;
(0140) unsigned char data[4];
(0141) unsigned char i;
(0142)
(0143) /*if(dat<0)
(0144) {
(0145) fuhao='-';
(0146) dat=0-dat;
(0147) }
(0148) else
(0149) fuhao=' ';
(0150) data[0]=fuhao;*/
(0151) data[0]=dat/1000+0x30; dat%=1000;
3B7 EE28 LDI R18,0xE8
3B8 E033 LDI R19,3
3B9 0187 MOVW R16,R14
3BA D19A RCALL div16s
3BB 01C8 MOVW R24,R16
3BC 96C0 ADIW R24,0x30
3BD 8388 STD Y+0,R24
3BE EE28 LDI R18,0xE8
3BF E033 LDI R19,3
3C0 0187 MOVW R16,R14
3C1 D18F RCALL mod16s
3C2 0178 MOVW R14,R16
(0152) data[1]=dat/100+0x30; dat%=100;
3C3 E624 LDI R18,0x64
3C4 E030 LDI R19,0
3C5 D18F RCALL div16s
3C6 01C8 MOVW R24,R16
3C7 96C0 ADIW R24,0x30
3C8 8389 STD Y+1,R24
3C9 E624 LDI R18,0x64
3CA E030 LDI R19,0
3CB 0187 MOVW R16,R14
3CC D184 RCALL mod16s
3CD 0178 MOVW R14,R16
(0153) data[2]=dat/10+0x30;
3CE E02A LDI R18,0xA
3CF E030 LDI R19,0
3D0 D184 RCALL div16s
3D1 01C8 MOVW R24,R16
3D2 96C0 ADIW R24,0x30
3D3 838A STD Y+2,R24
(0154) data[3]=dat%10+0x30;
3D4 E02A LDI R18,0xA
3D5 E030 LDI R19,0
3D6 0187 MOVW R16,R14
3D7 D179 RCALL mod16s
3D8 01C8 MOVW R24,R16
3D9 96C0 ADIW R24,0x30
3DA 838B STD Y+3,R24
(0155)
(0156) LCD_set_xy(X,Y);
3DB 2D2C MOV R18,R12
3DC 2D0A MOV R16,R10
3DD DF59 RCALL _LCD_set_xy
(0157) for(i=0;i<4;i++)
3DE 2744 CLR R20
3DF C009 RJMP 0x03E9
(0158) LCD_write_char(0,data[i]);
3E0 01CE MOVW R24,R28
3E1 2FE4 MOV R30,R20
3E2 27FF CLR R31
3E3 0FE8 ADD R30,R24
3E4 1FF9 ADC R31,R25
3E5 940E 0609 CALL 0x0609
3E7 DF65 RCALL _LCD_write_char
3E8 9543 INC R20
3E9 3044 CPI R20,4
3EA F3A8 BCS 0x03E0
3EB 9624 ADIW R28,4
3EC C199 RJMP pop_xgset30FC
FILE: D:\mega16_32实验板资料\ICCAVR源程序\遥控器\ir_test.c
(0001) //ICC-AVR application builder : 2008-11-12 11:41:28
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007)
(0008) #include "delay.h"
(0009) #include "ir.h"
(0010) #include "lcd1602.h"
(0011)
(0012) void port_init(void)
(0013) {
(0014) PORTD = 0xC0;
_port_init:
3ED EC80 LDI R24,0xC0
3EE BB82 OUT 0x12,R24
(0015) DDRD = 0x80;
3EF E880 LDI R24,0x80
3F0 BB81 OUT 0x11,R24
3F1 9508 RET
(0016) }
(0017)
(0018) //TIMER1 initialize - prescale:8
(0019) // WGM: 0) Normal, TOP=0xFFFF
(0020) // desired value: 8uSec
(0021) // actual value: 8.000uSec (0.0%)
(0022) void timer1_init(void)
(0023) {
(0024) TCCR1B = 0x00; //stop
_timer1_init:
3F2 2422 CLR R2
3F3 BC2E OUT 0x2E,R2
(0025) ICR1H = 0x00;
3F4 BC27 OUT 0x27,R2
(0026) ICR1L = 0x08;
3F5 E088 LDI R24,0x8
3F6 BD86 OUT 0x26,R24
(0027) TCCR1A = 0x00;
3F7 BC2F OUT 0x2F,R2
(0028) TCCR1B = 0x82; //start Timer
3F8 E882 LDI R24,0x82
3F9 BD8E OUT 0x2E,R24
3FA 9508 RET
(0029) }
(0030)
(0031)
(0032) //call this routine to initialize all peripherals
(0033) void init_devices(void)
(0034) {
(0035) //stop errant interrupts until set up
(0036) CLI(); //disable all interrupts
_init_devices:
3FB 94F8 BCLR 7
(0037) port_init();
3FC DFF0 RCALL _port_init
(0038) timer1_init();
3FD DFF4 RCALL _timer1_init
(0039) LCD_init();
3FE DF19 RCALL _LCD_init
(0040)
(0041) MCUCR = 0x00;
3FF 2422 CLR R2
400 BE25 OUT 0x35,R2
(0042) GICR = 0x00;
401 BE2B OUT 0x3B,R2
(0043) TIMSK = 0x20; //timer interrupt sources
402 E280 LDI R24,0x20
403 BF89 OUT 0x39,R24
(0044) SEI(); //re-enable interrupts
404 9478 BSET 7
405 9508 RET
_main:
406 9722 SBIW R28,2
(0045) //all peripherals are now initialized
(0046) }
(0047)
(0048) //
(0049) void main(void)
(0050) {
(0051) init_devices();
407 DFF3 RCALL _init_devices
(0052) //insert your functional code here...
(0053) LCD_write_string(0,0,"opr_code:");
408 E48E LDI R24,0x4E
409 E091 LDI R25,1
40A 8399 STD Y+1,R25
40B 8388 STD Y+0,R24
40C 2722 CLR R18
40D 2700 CLR R16
40E DF8E RCALL _LCD_write_string
(0054) LCD_write_string(0,1,"key dis:");
40F E484 LDI R24,0x44
410 E091 LDI R25,1
411 8399 STD Y+1,R25
412 8388 STD Y+0,R24
413 E021 LDI R18,1
414 2700 CLR R16
415 DF87 RCALL _LCD_write_string
416 C137 RJMP 0x054E
(0055) while(1)
(0056) {
(0057) get_ir_code();
417 DD71 RCALL _get_ir_code
(0058) if(ir_num==0)
418 9020 015A LDS R2,ir_num
41A 9030 015B LDS R3,ir_num+1
41C 2022 TST R2
41D F439 BNE 0x0425
41E 2033 TST R3
41F F429 BNE 0x0425
(0059) LCD_write_string(9,1," 0 ");
420 E38C LDI R24,0x3C
421 E091 LDI R25,1
422 940E 05C7 CALL 0x05C7
424 DF78 RCALL _LCD_write_string
(0060) if(ir_num==1)
425 940E 05C2 CALL 0x05C2
427 3081 CPI R24,1
428 E0E0 LDI R30,0
429 079E CPC R25,R30
42A F429 BNE 0x0430
(0061) LCD_write_string(9,1," 1 ");
42B E384 LDI R24,0x34
42C E091 LDI R25,1
42D 940E 05C7 CALL 0x05C7
42F DF6D RCALL _LCD_write_string
(0062) if(ir_num==2)
430 940E 05C2 CALL 0x05C2
432 3082 CPI R24,2
433 E0E0 LDI R30,0
434 079E CPC R25,R30
435 F429 BNE 0x043B
(0063) LCD_write_string(9,1," 2 ");
436 E28C LDI R24,0x2C
437 E091 LDI R25,1
438 940E 05C7 CALL 0x05C7
43A DF62 RCALL _LCD_write_string
(0064) if(ir_num==3)
43B 940E 05C2 CALL 0x05C2
43D 3083 CPI R24,3
43E E0E0 LDI R30,0
43F 079E CPC R25,R30
440 F429 BNE 0x0446
(0065) LCD_write_string(9,1," 3 ");
441 E284 LDI R24,0x24
442 E091 LDI R25,1
443 940E 05C7 CALL 0x05C7
445 DF57 RCALL _LCD_write_string
(0066) if(ir_num==4)
446 940E 05C2 CALL 0x05C2
448 3084 CPI R24,4
449 E0E0 LDI R30,0
44A 079E CPC R25,R30
44B F429 BNE 0x0451
(0067) LCD_write_string(9,1," 4 ");
44C E18C LDI R24,0x1C
44D E091 LDI R25,1
44E 940E 05C7 CALL 0x05C7
450 DF4C RCALL _LCD_write_string
(0068) if(ir_num==5)
451 940E 05C2 CALL 0x05C2
453 3085 CPI R24,5
454 E0E0 LDI R30,0
455 079E CPC R25,R30
456 F429 BNE 0x045C
(0069) LCD_write_string(9,1," 5 ");
457 E184 LDI R24,0x14
458 E091 LDI R25,1
459 940E 05C7 CALL 0x05C7
45B DF41 RCALL _LCD_write_string
(0070) if(ir_num==6)
45C 940E 05C2 CALL 0x05C2
45E 3086 CPI R24,6
45F E0E0 LDI R30,0
460 079E CPC R25,R30
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -