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

📄 second.lst

📁 关于单片机的哈吉阿 吉阿 将阿吉阿吉阿吉阿吉阿吉阿
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0045 E5CF      LDI	R28,0x5F
    0046 E0D4      LDI	R29,4
    0047 BFCD      OUT	0x3D,R28
    0048 BFDE      OUT	0x3E,R29
    0049 51C0      SUBI	R28,0x10
    004A 40D0      SBCI	R29,0
    004B EA0A      LDI	R16,0xAA
    004C 8308      STD	Y+0,R16
    004D 2400      CLR	R0
    004E E8EC      LDI	R30,0x8C
    004F E0F0      LDI	R31,0
    0050 E010      LDI	R17,0
    0051 38EC      CPI	R30,0x8C
    0052 07F1      CPC	R31,R17
    0053 F011      BEQ	0x0056
    0054 9201      ST	R0,Z+
    0055 CFFB      RJMP	0x0051
    0056 8300      STD	Z+0,R16
    0057 E5EE      LDI	R30,0x5E
    0058 E0F0      LDI	R31,0
    0059 E6A0      LDI	R26,0x60
    005A E0B0      LDI	R27,0
    005B E010      LDI	R17,0
    005C 38EA      CPI	R30,0x8A
    005D 07F1      CPC	R31,R17
    005E F021      BEQ	0x0063
    005F 95C8      LPM
    0060 9631      ADIW	R30,1
    0061 920D      ST	R0,X+
    0062 CFF9      RJMP	0x005C
    0063 940E012C  CALL	_main
_exit:
    0065 CFFF      RJMP	_exit
FILE: D:\mega16学习板资料\例程\m16\1602\1602.h
(0001) //ICC-AVR application builder : 2006-5-30 8:29:21
(0002) // Target : M8
(0003) // Crystal: 4.0000Mhz
(0004) 
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) 
(0008) #define lcd_data_port PORTB       //定义数据口为PB口
(0009) #define lcd_data_ddr DDRB
(0010) #define lcd_busy_pin PINB
(0011) #define lcd_busy_ddr DDRB
(0012) #define lcd_control_port PORTA    //定义控制口为PA口
(0013) #define lcd_control_ddr DDRA  
(0014) 
(0015) #define lcd_RS (1<<6) //PORTA^6
(0016) #define lcd_RW (1<<5) //PORTA^5
(0017) #define lcd_EN (1<<4) //PORTA^4
(0018) #define busy 0x80 //LCD_DB7
(0019) 
(0020) 
(0021) /*----------------------------------函数声明------------------------------------------*/
(0022) void lcd_init(void);
(0023) void lcd_write_command(unsigned char command,unsigned char wait_en);
(0024) void lcd_write_data(unsigned char char_data);
(0025) void wait_enable(void);
(0026) void display_a_char(unsigned char position,unsigned char char_data);
(0027) void display_a_string(unsigned char col,unsigned char *ptr);
(0028) void delay_1ms(void);
(0029) void delay_nms(unsigned int n);
(0030) const unsigned char seg_table[]={0x30,0x31,0x32,0x33,0x34,0x35,
(0031) 0x36,0x37,0x38,0x39};
(0032) 
(0033) 
(0034) 
(0035) //液晶初始化
(0036) void lcd_init(void)
(0037) {
(0038)  delay_nms(100);
_lcd_init:
    0066 E604      LDI	R16,0x64
    0067 E010      LDI	R17,0
    0068 D02B      RCALL	_delay_nms
(0039)  lcd_write_command(0x38,0);//显示模式设置三次(此时不管lcd空闲与否)
    0069 2722      CLR	R18
    006A E308      LDI	R16,0x38
    006B D037      RCALL	_lcd_write_command
(0040)  delay_nms(20);
    006C E104      LDI	R16,0x14
    006D E010      LDI	R17,0
    006E D025      RCALL	_delay_nms
(0041)  lcd_write_command(0x38,0);
    006F 2722      CLR	R18
    0070 E308      LDI	R16,0x38
    0071 D031      RCALL	_lcd_write_command
(0042)  delay_nms(20);
    0072 E104      LDI	R16,0x14
    0073 E010      LDI	R17,0
    0074 D01F      RCALL	_delay_nms
(0043)  lcd_write_command(0x38,0);
    0075 2722      CLR	R18
    0076 E308      LDI	R16,0x38
    0077 D02B      RCALL	_lcd_write_command
(0044)  delay_nms(20);
    0078 E104      LDI	R16,0x14
    0079 E010      LDI	R17,0
    007A D019      RCALL	_delay_nms
(0045)  
(0046)  lcd_write_command(0x38,1);//显示模式设置(从此之后均需lcd空闲)
    007B E021      LDI	R18,1
    007C E308      LDI	R16,0x38
    007D D025      RCALL	_lcd_write_command
(0047)  lcd_write_command(0x08,1);//显示关闭
    007E E021      LDI	R18,1
    007F E008      LDI	R16,0x8
    0080 D022      RCALL	_lcd_write_command
(0048)  lcd_write_command(0x01,1);//显示清屏
    0081 E021      LDI	R18,1
    0082 E001      LDI	R16,1
    0083 D01F      RCALL	_lcd_write_command
(0049)  lcd_write_command(0x06,1);//显示光标移动设置
    0084 E021      LDI	R18,1
    0085 E006      LDI	R16,6
    0086 D01C      RCALL	_lcd_write_command
(0050)  lcd_write_command(0x0c,1);//显示开及光标设置
    0087 E021      LDI	R18,1
    0088 E00C      LDI	R16,0xC
(0051) }
    0089 C019      RJMP	_lcd_write_command
(0052) 
(0053) /*---------------------------------------延时函数-------------------------------------*/
(0054) //1ms延时函数
(0055) void delay_1ms(void)
(0056) {
(0057)  unsigned int i;
(0058)  for(i=0;i<1600;i++);
_delay_1ms:
  i                    --> R16
    008A 2700      CLR	R16
    008B 2711      CLR	R17
    008C C002      RJMP	0x008F
    008D 5F0F      SUBI	R16,0xFF
    008E 4F1F      SBCI	R17,0xFF
    008F 3400      CPI	R16,0x40
    0090 E0E6      LDI	R30,6
    0091 071E      CPC	R17,R30
    0092 F3D0      BCS	0x008D
(0059) }
    0093 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    0094 940E0169  CALL	push_gset2
    0096 01B8      MOVW	R22,R16
(0060) 
(0061) //n ms延时函数
(0062) void delay_nms(unsigned int n)
(0063) {
(0064)  unsigned int i;
(0065)  for(i=0;i<n;i++)delay_1ms();
    0097 2744      CLR	R20
    0098 2755      CLR	R21
    0099 C003      RJMP	0x009D
    009A DFEF      RCALL	_delay_1ms
    009B 5F4F      SUBI	R20,0xFF
    009C 4F5F      SBCI	R21,0xFF
    009D 1746      CP	R20,R22
    009E 0757      CPC	R21,R23
    009F F3D0      BCS	0x009A
(0066) }
    00A0 940E014C  CALL	pop_gset2
    00A2 9508      RET
_lcd_write_command:
  wait_en              --> R22
  command              --> R20
    00A3 940E0169  CALL	push_gset2
    00A5 2F62      MOV	R22,R18
    00A6 2F40      MOV	R20,R16
(0067) 
(0068) //写指令函数: E=高脉冲 RS=0 RW=0
(0069) void lcd_write_command(unsigned char command,unsigned char wait_en)//command为指令,wait_en指定是否要检测LCD忙信号
(0070) {
(0071)  if(wait_en)wait_enable();//若wait_en为1,则要检测LCD忙信号,等待其空闲
    00A7 2366      TST	R22
    00A8 F009      BEQ	0x00AA
    00A9 D045      RCALL	_wait_enable
(0072)  lcd_control_port&=~lcd_RS;//RS=0
    00AA 98DE      CBI	0x1B,6
(0073)  lcd_control_port&=~lcd_RW;//RW=0
    00AB 98DD      CBI	0x1B,5
(0074)  lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲
    00AC 98DC      CBI	0x1B,4
(0075)  NOP();
    00AD 0000      NOP
(0076)  lcd_control_port|=lcd_EN;//E=1
    00AE 9ADC      SBI	0x1B,4
(0077)  lcd_data_port=command;
    00AF BB48      OUT	0x18,R20
(0078)  lcd_control_port&=~lcd_EN;//重设E=0
    00B0 98DC      CBI	0x1B,4
(0079) }
    00B1 940E014C  CALL	pop_gset2
    00B3 9508      RET
_display_a_char:
  position_tem         --> R22
  char_data            --> R20
  position             --> R10
    00B4 940E016D  CALL	push_gset3
    00B6 2F42      MOV	R20,R18
    00B7 2EA0      MOV	R10,R16
(0080) 
(0081) //指定位置显示一个字符:第一行位置0~15,第二行16~31
(0082) //显示一个字符函数
(0083) void display_a_char(unsigned char position,unsigned char char_data)//参数position指定位置0~31,char_data为要显示的字符
(0084) {
(0085)  unsigned char position_tem;
(0086)  if(position>=0x10)
    00B8 2D8A      MOV	R24,R10
    00B9 3180      CPI	R24,0x10
    00BA F018      BCS	0x00BE
(0087)  position_tem=position+0xb0;
    00BB 2F68      MOV	R22,R24
    00BC 5560      SUBI	R22,0x50
    00BD C002      RJMP	0x00C0
(0088)  else
(0089)  position_tem=position+0x80;
    00BE 2D6A      MOV	R22,R10
    00BF 5860      SUBI	R22,0x80
(0090)  lcd_write_command(position_tem,1);
    00C0 E021      LDI	R18,1
    00C1 2F06      MOV	R16,R22
    00C2 DFE0      RCALL	_lcd_write_command
(0091)  lcd_write_data(char_data);
    00C3 2F04      MOV	R16,R20
    00C4 D01C      RCALL	_lcd_write_data
(0092) }
    00C5 940E014F  CALL	pop_gset3
    00C7 9508      RET
_display_a_string:
  col_tem              --> R20
  i                    --> R22
  ptr                  --> R10
  col                  --> R20
    00C8 940E016D  CALL	push_gset3
    00CA 0159      MOVW	R10,R18
    00CB 2F40      MOV	R20,R16
(0093) 
(0094) //指定一行显示连续字符串:0显示在第一行,1显示在第二行,注字符串不能长于16个字符
(0095) //显示一行连续字符串函数
(0096) void display_a_string(unsigned char col,unsigned char *ptr)//参数col指定行,*ptr指字符串数组的首指针
(0097) {
(0098)  unsigned char col_tem,i;
(0099)  col_tem=col<<4;//若col为1(即在LCD第二行显示字符串),先把col左移4位,使显示字符的首位置改到第二行首位,即位置16
    00CC 2F84      MOV	R24,R20
    00CD 708F      ANDI	R24,0xF
    00CE 9582      SWAP	R24
    00CF 2F48      MOV	R20,R24
(0100)  for(i=0;i<16;i++)
    00D0 2766      CLR	R22
    00D1 C00A      RJMP	0x00DC
(0101)  display_a_char(col_tem++,*(ptr+i));
    00D2 2FE6      MOV	R30,R22
    00D3 27FF      CLR	R31
    00D4 0DEA      ADD	R30,R10
    00D5 1DFB      ADC	R31,R11
    00D6 8120      LDD	R18,Z+0
    00D7 2E24      MOV	R2,R20
    00D8 5F4F      SUBI	R20,0xFF
    00D9 2D02      MOV	R16,R2
    00DA DFD9      RCALL	_display_a_char
    00DB 9563      INC	R22
    00DC 3160      CPI	R22,0x10
    00DD F3A0      BCS	0x00D2
(0102) }
    00DE 940E014F  CALL	pop_gset3
    00E0 9508      RET
_lcd_write_data:
  char_data            --> R20
    00E1 940E0152  CALL	push_gset1
    00E3 2F40      MOV	R20,R16
(0103) 
(0104) //写数据函数: E =高脉冲 RS=1 RW=0

⌨️ 快捷键说明

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