⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1602_duoji.lst

📁 用avr的m16产生pwm波控制舵机的程序!
💻 LST
📖 第 1 页 / 共 4 页
字号:
__text_start:
__start:
    0048 E5CF      LDI	R28,0x5F
    0049 E0D4      LDI	R29,4
    004A BFCD      OUT	0x3D,R28
    004B BFDE      OUT	0x3E,R29
    004C 51C0      SUBI	R28,0x10
    004D 40D0      SBCI	R29,0
    004E EA0A      LDI	R16,0xAA
    004F 8308      STD	Y+0,R16
    0050 2400      CLR	R0
    0051 E9EB      LDI	R30,0x9B
    0052 E0F0      LDI	R31,0
    0053 E010      LDI	R17,0
    0054 3AE3      CPI	R30,0xA3
    0055 07F1      CPC	R31,R17
    0056 F011      BEQ	0x0059
    0057 9201      ST	R0,Z+
    0058 CFFB      RJMP	0x0054
    0059 8300      STD	Z+0,R16
    005A E5E4      LDI	R30,0x54
    005B E0F0      LDI	R31,0
    005C E6A0      LDI	R26,0x60
    005D E0B0      LDI	R27,0
    005E E010      LDI	R17,0
    005F 38EF      CPI	R30,0x8F
    0060 07F1      CPC	R31,R17
    0061 F021      BEQ	0x0066
    0062 95C8      LPM
    0063 9631      ADIW	R30,1
    0064 920D      ST	R0,X+
    0065 CFF9      RJMP	0x005F
    0066 940E0274  CALL	_main
_exit:
    0068 CFFF      RJMP	_exit
FILE: E:\mcu\avr\test\1602_duoji\1602B_LCD.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "1602LCD.h"
(0004) 
(0005) /**********************************************************
(0006) **********************************************************/
(0007) /**********************************************************
(0008) TC1602B LCD DISPLAY
(0009) 建立时间:2003年11月9号
(0010) 修改日期:2003年11月14号
(0011) LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
(0012)                    入命令
(0013) LCD第一行显示寄存器地址:0X80-0X8F
(0014) LCD第二行显示寄存器地址:0XC0-0XCF
(0015) **********************************************************/
(0016) void LCD_init(void)
(0017)   {
(0018)     delay_nms(15);
_LCD_init:
    0069 E00F      LDI	R16,0xF
    006A E010      LDI	R17,0
    006B 940E0344  CALL	_delay_nms
(0019)    
(0020)     LCD_write_char(0x28,0);      //4bit test
    006D 2722      CLR	R18
    006E 2733      CLR	R19
    006F E208      LDI	R16,0x28
    0070 E010      LDI	R17,0
    0071 D017      RCALL	_LCD_write_char
(0021)     LCD_write_char(0x0f,0);      //显示开,显示光标,产生闪烁
    0072 2722      CLR	R18
    0073 2733      CLR	R19
    0074 E00F      LDI	R16,0xF
    0075 E010      LDI	R17,0
    0076 D012      RCALL	_LCD_write_char
(0022)     LCD_write_char(0x01,0);      //显示清屏
    0077 2722      CLR	R18
    0078 2733      CLR	R19
    0079 E001      LDI	R16,1
    007A E010      LDI	R17,0
    007B D00D      RCALL	_LCD_write_char
(0023)     LCD_write_char(0x06,0);      //显示光标移动设置
    007C 2722      CLR	R18
    007D 2733      CLR	R19
    007E E006      LDI	R16,6
    007F E010      LDI	R17,0
    0080 D008      RCALL	_LCD_write_char
    0081 9508      RET
(0024)   }
(0025) 
(0026) void LCD_en_write(void)        //EN端产生一个高电平脉冲,写LCD
(0027)   {
(0028)     LCD_EN_PORT |= LCD_EN;
_LCD_en_write:
    0082 9A95      SBI	0x12,5
(0029)     delay_nus(1);
    0083 E001      LDI	R16,1
    0084 E010      LDI	R17,0
    0085 940E032B  CALL	_delay_nus
(0030)     LCD_EN_PORT &= ~LCD_EN;
    0087 9895      CBI	0x12,5
    0088 9508      RET
_LCD_write_char:
  data_temp            --> R22
  command_temp         --> R20
  data                 --> R12
  command              --> R10
    0089 940E0446  CALL	push_gset4
    008B 0169      MOVW	R12,R18
    008C 0158      MOVW	R10,R16
(0031)   }
(0032) 
(0033) /*-----------------------------------------------------------------------
(0034) LCD_write_char    : 英文字符串显示函数
(0035) 
(0036) 输入参数:*s      :英文字符串指针;
(0037)           X、Y    : 显示字符串的位置,X:0-15,Y:0-1
(0038)                     LCD第一行显示寄存器地址:0X80-0X8F
(0039)                     LCD第一行显示寄存器地址:0XC0-0XCF
(0040) 
(0041) 编写日期          :2003-11-19 
(0042) 最后修改日期      :2004-8-19 		
(0043) -----------------------------------------------------------------------*/
(0044) void LCD_write_char(unsigned command,unsigned data)//把写数据与写指令结合到了一起
(0045)   {
(0046)     unsigned command_temp,data_temp;        
(0047)    
(0048)     command_temp = command;
    008D 01A5      MOVW	R20,R10
(0049)     data_temp = data;
    008E 01B6      MOVW	R22,R12
(0050)    
(0051)     LCD_wait_Ready();
    008F D04F      RCALL	_LCD_wait_Ready
(0052)    
(0053)     LCD_RW_PORT &= ~LCD_RW;                 //RW=0
    0090 9893      CBI	0x12,3
(0054)    
(0055)     if (command == 0)
    0091 3040      CPI	R20,0
    0092 0745      CPC	R20,R21
    0093 F469      BNE	0x00A1
(0056)       {
(0057)    	 LCD_RS_PORT |= LCD_RS;             //RS=1 
    0094 9A94      SBI	0x12,4
(0058)    	 LCD_DATA_PORT &= 0X0F;
    0095 B388      IN	R24,0x18
    0096 708F      ANDI	R24,0xF
    0097 BB88      OUT	0x18,R24
(0059) 	 LCD_DATA_PORT |= data_temp&0xf0;   //send high 4bit
    0098 01CB      MOVW	R24,R22
    0099 7F80      ANDI	R24,0xF0
    009A 7090      ANDI	R25,0
    009B B228      IN	R2,0x18
    009C 2433      CLR	R3
    009D 2A28      OR	R2,R24
    009E 2A39      OR	R3,R25
    009F BA28      OUT	0x18,R2
(0060)       }
    00A0 C00C      RJMP	0x00AD
(0061)     else 
(0062)       {
(0063) 	 LCD_RS_PORT &= ~LCD_RS;            //RS=0
    00A1 9894      CBI	0x12,4
(0064) 	 LCD_DATA_PORT &= 0X0F;
    00A2 B388      IN	R24,0x18
    00A3 708F      ANDI	R24,0xF
    00A4 BB88      OUT	0x18,R24
(0065)          LCD_DATA_PORT |= command_temp&0xf0;//send high 4bit
    00A5 01CA      MOVW	R24,R20
    00A6 7F80      ANDI	R24,0xF0
    00A7 7090      ANDI	R25,0
    00A8 B228      IN	R2,0x18
    00A9 2433      CLR	R3
    00AA 2A28      OR	R2,R24
    00AB 2A39      OR	R3,R25
    00AC BA28      OUT	0x18,R2
(0066)       }
(0067)     LCD_en_write();
    00AD DFD4      RCALL	_LCD_en_write
(0068)    
(0069)     command_temp=command_temp << 4;         //send low 4bit
    00AE 0F44      LSL	R20
    00AF 1F55      ROL	R21
    00B0 0F44      LSL	R20
    00B1 1F55      ROL	R21
    00B2 0F44      LSL	R20
    00B3 1F55      ROL	R21
    00B4 0F44      LSL	R20
    00B5 1F55      ROL	R21
(0070)     data_temp=data_temp       << 4;
    00B6 0F66      LSL	R22
    00B7 1F77      ROL	R23
    00B8 0F66      LSL	R22
    00B9 1F77      ROL	R23
    00BA 0F66      LSL	R22
    00BB 1F77      ROL	R23
    00BC 0F66      LSL	R22
    00BD 1F77      ROL	R23
(0071)    
(0072)     LCD_DATA_PORT &= 0X0F;
    00BE B388      IN	R24,0x18
    00BF 708F      ANDI	R24,0xF
    00C0 BB88      OUT	0x18,R24
(0073)     if (command==0)
    00C1 20AA      TST	R10
    00C2 F459      BNE	0x00CE
    00C3 20BB      TST	R11
    00C4 F449      BNE	0x00CE
(0074)       LCD_DATA_PORT |= data_temp&0xf0;
    00C5 01CB      MOVW	R24,R22
    00C6 7F80      ANDI	R24,0xF0
    00C7 7090      ANDI	R25,0
    00C8 B228      IN	R2,0x18
    00C9 2433      CLR	R3
    00CA 2A28      OR	R2,R24
    00CB 2A39      OR	R3,R25
    00CC BA28      OUT	0x18,R2
    00CD C008      RJMP	0x00D6
(0075)     else
(0076)       LCD_DATA_PORT |= command_temp&0xf0;
    00CE 01CA      MOVW	R24,R20
    00CF 7F80      ANDI	R24,0xF0
    00D0 7090      ANDI	R25,0
    00D1 B228      IN	R2,0x18
    00D2 2433      CLR	R3
    00D3 2A28      OR	R2,R24
    00D4 2A39      OR	R3,R25
    00D5 BA28      OUT	0x18,R2
(0077)     LCD_en_write();
    00D6 DFAB      RCALL	_LCD_en_write
(0078)    
(0079)     LCD_RW_PORT |= LCD_RW;
    00D7 9A93      SBI	0x12,3
(0080)   
(0081)     LCD_RS_PORT ^= LCD_RS;    
    00D8 E180      LDI	R24,0x10
    00D9 B222      IN	R2,0x12
    00DA 2628      EOR	R2,R24
    00DB BA22      OUT	0x12,R2
    00DC 940E0441  CALL	pop_gset4
    00DE 9508      RET
(0082)   }
(0083) 
(0084) void LCD_wait_Ready(void)                  //等待LCD空闲
(0085)   {
(0086)     LCD_DATA_DDR &= ~0x80;                 //PD7 I/O口方向设置为输入
_LCD_wait_Ready:
    00DF 98BF      CBI	0x17,7
(0087)    
(0088)     LCD_RW_PORT |= LCD_RW;                 //RW=1
    00E0 9A93      SBI	0x12,3
(0089)    
(0090)     LCD_RS_PORT &= ~LCD_RS;                //RS=0
    00E1 9894      CBI	0x12,4
(0091)    
(0092)     LCD_EN_PORT |= LCD_EN;                 //EN=1
    00E2 9A95      SBI	0x12,5
(0093)    
(0094)     while (!( LCD_DATA_PIN&0x80 ) == 0);   //RW=1,读PD7,为0表示空闲;
    00E3 99B7      SBIC	0x16,7
    00E4 C003      RJMP	0x00E8
    00E5 E001      LDI	R16,1
    00E6 E010      LDI	R17,0
    00E7 C002      RJMP	0x00EA
    00E8 2700      CLR	R16
    00E9 2711      CLR	R17
    00EA 3000      CPI	R16,0
    00EB 0701      CPC	R16,R17
    00EC F3B1      BEQ	0x00E3
(0095)    
(0096)     LCD_EN_PORT &= ~LCD_EN;                //EN=0
    00ED 9895      CBI	0x12,5
(0097)    
(0098)     LCD_DATA_DDR |= 0xf0;
    00EE B387      IN	R24,0x17
    00EF 6F80      ORI	R24,0xF0
    00F0 BB87      OUT	0x17,R24
    00F1 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
    00F2 940E044A  CALL	push_gset2
    00F4 2F42      MOV	R20,R18
    00F5 2F60      MOV	R22,R16
(0099)   }
(0100) 
(0101) /*-----------------------------------------------------------------------
(0102) LCD_set_xy        : 设置LCD显示的起始位置
(0103) 
(0104) 输入参数:x、y    : 显示字符串的位置,X:0-15,Y:0-1
(0105)                     LCD第一行显示寄存器地址:0X80-0X8F
(0106)                     LCD第一行显示寄存器地址:0XC0-0XCF
(0107) 
(0108) 编写日期          :2004-8-19 
(0109) 最后修改日期      :2004-8-19 		
(0110) -----------------------------------------------------------------------*/
(0111) void LCD_set_xy( unsigned char x, unsigned char y )
(0112)   {
(0113)     unsigned char address;
(0114)     if (y == 0) address = 0x80 + x;
    00F6 2344      TST	R20
    00F7 F419      BNE	0x00FB
    00F8 2F46      MOV	R20,R22
    00F9 5840      SUBI	R20,0x80
    00FA C002      RJMP	0x00FD
(0115)     else 
(0116)        address = 0xc0 + x;
    00FB 2F46      MOV	R20,R22
    00FC 5440      SUBI	R20,0x40
(0117)     LCD_write_char( address, 0 );
    00FD 2722      CLR	R18
    00FE 2733      CLR	R19
    00FF 2F04      MOV	R16,R20
    0100 2711      CLR	R17
    0101 DF87      RCALL	_LCD_write_char
    0102 940E043B  CALL	pop_gset2
    0104 9508      RET
_LCD_write_string:
  s                    --> R20
  Y                    --> R10
  X                    --> R22
    0105 940E0448  CALL	push_gset3
    0107 2EA2      MOV	R10,R18
    0108 2F60      MOV	R22,R16
    0109 814E      LDD	R20,Y+6
    010A 815F      LDD	R21,Y+7
(0118)   }
(0119) /*-----------------------------------------------------------------------
(0120) LCD_write_string  : 英文字符串显示函数
(0121) 
(0122) 输入参数:*s      :英文字符串指针;
(0123)           X、Y    : 显示字符串的位置
(0124) 
(0125) 编写日期          :2004-8-19 
(0126) 最后修改日期      :2004-8-19 		
(0127) -----------------------------------------------------------------------*/
(0128) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0129)   {
(0130)     LCD_set_xy( X, Y );
    010B 2D2A      MOV	R18,R10
    010C 2F06      MOV	R16,R22
    010D DFE4      RCALL	_LCD_set_xy
    010E C008      RJMP	0x0117
(0131)     
(0132)     while (*s) 
(0133)       {
(0134)         LCD_write_char( 0, *s );
    010F 01FA      MOVW	R30,R20
    0110 8120      LDD	R18,Z+0
    0111 2733      CLR	R19
    0112 2700      CLR	R16
    0113 2711      CLR	R17
    0114 DF74      RCALL	_LCD_write_char
(0135) 	s ++;
    0115 5F4F      SUBI	R20,0xFF
    0116 4F5F      SBCI	R21,0xFF
    0117 01FA      MOVW	R30,R20
    0118 8020      LDD	R2,Z+0
    0119 2022      TST	R2
    011A F7A1      BNE	0x010F
    011B 940E043E  CALL	pop_gset3
    011D 9508      RET
_timer2_ovf_isr:
    011E 922A      ST	R2,-Y
    011F 923A      ST	R3,-Y
    0120 938A      ST	R24,-Y
    0121 939A      ST	R25,-Y
    0122 B62F      IN	R2,0x3F
    0123 922A      ST	R2,-Y
FILE: E:\mcu\avr\test\1602_duoji\1602B_LCD_TEST.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "1602LCD.h"
(0004) volatile int zkb;
(0005) volatile int zq;          
(0006) volatile int t1,t2;
(0007) uchar n=0,t=0;
(0008) void delay_1ms(void); //函数声明,本实验中会用到这两个函数
(0009) void delay_nms(unsigned int n);  
(0010) /*DS1302函数声明*/
(0011) void write_data(uchar addr,uchar data);
(0012) uchar read_data(uchar addr);
(0013) void init_1302(void);
(0014) void init_time(uchar sec,uchar min,uchar hour,uchar day,uchar month,uchar d,uchar year);
(0015) //PWM信号产生中断函数
(0016) #pragma interrupt_handler timer2_ovf_isr:5
(0017) void timer2_ovf_isr(void)
(0018) {
(0019) // Reinitialize Timer 2 value
(0020) //每次触发为20微秒
(0021) TCNT2 = 0xF1;           //反转值,理论值为0xEC 但是实测值为0xEF  有点没搞懂  ??
    0124 EF81      LDI	R24,0xF1
    0125 BD84      OUT	0x24,R24
(0022) 
(0023)   if((--zq)==0)
    0126 9180009F  LDS	R24,zq
    0128 919000A0  LDS	R25,zq+1
    012A 9701      SBIW	R24,1
    012B 939000A0  STS	zq+1,R25
    012D 9380009F  STS	zq,R24
    012F 3080      CPI	R24,0
    0130 0789      CPC	R24,R25
    0131 F4C9      BNE	0x014B

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -