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

📄 1602test.lst

📁 三星公司的一款1602vfd显示屏
💻 LST
📖 第 1 页 / 共 3 页
字号:
    02BF E005      LDI	R16,5
    02C0 E010      LDI	R17,0
    02C1 D086      RCALL	_delay_nms
(0216)  
(0217)  vfd_write_command(0x38,1);//显示模式设置(从此之后均需vfd空闲)
    02C2 E021      LDI	R18,1
    02C3 E308      LDI	R16,0x38
    02C4 D00C      RCALL	_vfd_write_command
(0218)  vfd_write_command(0x08,1);//显示关闭
    02C5 E021      LDI	R18,1
    02C6 E008      LDI	R16,0x8
    02C7 D009      RCALL	_vfd_write_command
(0219)  vfd_write_command(0x01,1);//显示清屏
    02C8 E021      LDI	R18,1
    02C9 E001      LDI	R16,1
    02CA D006      RCALL	_vfd_write_command
(0220)  vfd_write_command(0x06,1);//显示光标移动设置
    02CB E021      LDI	R18,1
    02CC E006      LDI	R16,6
    02CD D003      RCALL	_vfd_write_command
(0221)  vfd_write_command(0x0c,1);//显示开及光标设置
    02CE E021      LDI	R18,1
    02CF E00C      LDI	R16,0xC
(0222) }
    02D0 C000      RJMP	_vfd_write_command
    02D1 940E038F  CALL	push_gset2
    02D3 2F62      MOV	R22,R18
    02D4 2F40      MOV	R20,R16
(0223) //写指令函数: E=高脉冲 RS=0 RW=0
(0224) void vfd_write_command(unsigned char command,unsigned char wait_en)//command为指令,wait_en指定是否要检测VFD忙信号
(0225) {
(0226)  if(wait_en)wait_enable();//若wait_en为1,则要检测VFD忙信号,等待其空闲
    02D5 2366      TST	R22
    02D6 F009      BEQ	0x02D8
    02D7 D018      RCALL	_wait_enable
(0227)  vfd_control_port&=~vfd_RS;//RS=0
    02D8 9895      CBI	0x12,5
(0228)  vfd_control_port&=~vfd_RW;//RW=0
    02D9 9897      CBI	0x12,7
(0229)  vfd_control_port&=~vfd_EN;//E=0,下面给VFD一个高脉冲
    02DA 9896      CBI	0x12,6
(0230)  NOP();
    02DB 0000      NOP
(0231)  vfd_control_port|=vfd_EN;//E=1
    02DC 9A96      SBI	0x12,6
(0232)  vfd_data_port=command;
    02DD BB48      OUT	0x18,R20
(0233)  vfd_control_port&=~vfd_EN;//重设E=0
    02DE 9896      CBI	0x12,6
(0234) }
    02DF 940E036F  CALL	pop_gset2
    02E1 9508      RET
_vfd_write_data:
  char_data            --> R20
    02E2 940E0378  CALL	push_gset1
    02E4 2F40      MOV	R20,R16
(0235) //写数据函数: E =高脉冲 RS=1 RW=0
(0236) void vfd_write_data(unsigned char char_data)
(0237) {
(0238)  wait_enable();//等待VFD空闲
    02E5 D00A      RCALL	_wait_enable
(0239)  vfd_control_port|=vfd_RS;//RS=1
    02E6 9A95      SBI	0x12,5
(0240)  vfd_control_port&=~vfd_RW;//RW=0
    02E7 9897      CBI	0x12,7
(0241) 
(0242)  vfd_control_port&=~vfd_EN;//E=0,下面给VFD一个高脉冲
    02E8 9896      CBI	0x12,6
(0243)  NOP();
    02E9 0000      NOP
(0244)  vfd_control_port|=vfd_EN;//E=1
    02EA 9A96      SBI	0x12,6
(0245)  vfd_data_port=char_data;
    02EB BB48      OUT	0x18,R20
(0246)  vfd_control_port&=~vfd_EN;//重设E=0
    02EC 9896      CBI	0x12,6
(0247) } 
    02ED 940E037B  CALL	pop_gset1
    02EF 9508      RET
(0248) //正常读写操作之前必须检测VFD控制器状态:E=1 RS=0 RW=1;DB7: 0 VFD控制器空闲,1 VFD控制器忙。
(0249) //检测忙信号,等待VFD空闲函数
(0250) void wait_enable(void)
(0251) {
(0252)  //delay_nms(10);
(0253)  vfd_busy_ddr&=~busy;//设置busy口为输入
_wait_enable:
    02F0 98BF      CBI	0x17,7
(0254)  vfd_control_port&=~vfd_RS;//RS=0
    02F1 9895      CBI	0x12,5
(0255)  vfd_control_port|=vfd_RW;//RW=1
    02F2 9A97      SBI	0x12,7
(0256)  NOP();
    02F3 0000      NOP
(0257)  vfd_control_port|=vfd_EN;//E=1
    02F4 9A96      SBI	0x12,6
(0258)  while(vfd_busy_pin&busy);//等待VFD_DB7为0
    02F5 99B7      SBIC	0x16,7
    02F6 CFFE      RJMP	0x02F5
(0259)  vfd_control_port&=~vfd_EN;//重设E=0
    02F7 9896      CBI	0x12,6
(0260)  vfd_busy_ddr|=busy;//设置busy口为输出
    02F8 9ABF      SBI	0x17,7
(0261) }
    02F9 9508      RET
_display_a_char:
  position_tem         --> R22
  char_data            --> R20
  position             --> R10
    02FA 940E0393  CALL	push_gset3
    02FC 2F42      MOV	R20,R18
    02FD 2EA0      MOV	R10,R16
(0262) //指定位置显示一个字符:第一行位置0~15,第二行16~31
(0263) //显示一个字符函数
(0264) void display_a_char(unsigned char position,unsigned char char_data)//参数position指定位置0~31,char_data为要显示的字符
(0265) {
(0266)  unsigned char position_tem;
(0267)  if(position>=0x10)
    02FE 2D8A      MOV	R24,R10
    02FF 3180      CPI	R24,0x10
    0300 F018      BCS	0x0304
(0268)  position_tem=position+0xb0;
    0301 2F68      MOV	R22,R24
    0302 5560      SUBI	R22,0x50
    0303 C002      RJMP	0x0306
(0269)  else
(0270)  position_tem=position+0x80;
    0304 2D6A      MOV	R22,R10
    0305 5860      SUBI	R22,0x80
(0271)  vfd_write_command(position_tem,1);
    0306 E021      LDI	R18,1
    0307 2F06      MOV	R16,R22
    0308 DFC8      RCALL	_vfd_write_command
(0272)  vfd_write_data(char_data);
    0309 2F04      MOV	R16,R20
    030A DFD7      RCALL	_vfd_write_data
(0273) }
    030B 940E0372  CALL	pop_gset3
    030D 9508      RET
_d_a_s:
  col_tem              --> R20
  i                    --> R22
  ptr                  --> R10
  col                  --> R20
    030E 940E0393  CALL	push_gset3
    0310 0159      MOVW	R10,R18
    0311 2F40      MOV	R20,R16
(0274) //指定一行显示连续字符串:0显示在第一行,1显示在第二行,注字符串不能长于16个字符
(0275) //显示一行连续字符串函数
(0276) void d_a_s(unsigned char col,unsigned char *ptr)//参数col指定行,*ptr指字符串数组的首指针
(0277) {
(0278)  unsigned char col_tem,i;
(0279)  col_tem=col<<4;//若col为1(即在VFD第二行显示字符串),先把col左移4位,使显示字符的首位置改到第二行首位,即位置16
    0312 2F84      MOV	R24,R20
    0313 708F      ANDI	R24,0xF
    0314 9582      SWAP	R24
    0315 2F48      MOV	R20,R24
(0280)  for(i=0;i<16;i++)
    0316 2766      CLR	R22
    0317 C00A      RJMP	0x0322
(0281)  display_a_char(col_tem++,*(ptr+i));
    0318 2FE6      MOV	R30,R22
    0319 27FF      CLR	R31
    031A 0DEA      ADD	R30,R10
    031B 1DFB      ADC	R31,R11
    031C 8120      LDD	R18,Z+0
    031D 2E24      MOV	R2,R20
    031E 5F4F      SUBI	R20,0xFF
    031F 2D02      MOV	R16,R2
    0320 DFD9      RCALL	_display_a_char
    0321 9563      INC	R22
    0322 3160      CPI	R22,0x10
    0323 F3A0      BCS	0x0318
(0282)  }
    0324 940E0372  CALL	pop_gset3
    0326 9508      RET
_display_a_ch_r:
  position_tem         --> R20
  char_data            --> R22
  position             --> R10
    0327 940E0393  CALL	push_gset3
    0329 2F62      MOV	R22,R18
    032A 2EA0      MOV	R10,R16
(0283) //光标定位子程序
(0284) void display_a_ch_r(unsigned char position,unsigned char char_data)//参数position指定位置0~31,char_data为要显示的字符
(0285) {
(0286)  unsigned char position_tem;
(0287)  if(position>=0x10)
    032B 2D8A      MOV	R24,R10
    032C 3180      CPI	R24,0x10
    032D F018      BCS	0x0331
(0288)  position_tem=position+0xb0;
    032E 2F48      MOV	R20,R24
    032F 5540      SUBI	R20,0x50
    0330 C002      RJMP	0x0333
(0289)  else
(0290)  position_tem=position+0x80;
    0331 2D4A      MOV	R20,R10
    0332 5840      SUBI	R20,0x80
(0291)  vfd_write_command(position_tem,1);
    0333 E021      LDI	R18,1
    0334 2F04      MOV	R16,R20
    0335 DF9B      RCALL	_vfd_write_command
(0292)  vfd_write_data(char_data);
    0336 2F06      MOV	R16,R22
    0337 DFAA      RCALL	_vfd_write_data
(0293)  vfd_write_command(position_tem,1);
    0338 E021      LDI	R18,1
    0339 2F04      MOV	R16,R20
    033A DF96      RCALL	_vfd_write_command
(0294) }
    033B 940E0372  CALL	pop_gset3
    033D 9508      RET
(0295) /*---------------------------------------延时函数-------------------------------------*/
(0296) //1ms延时函数
(0297) void delay_1ms(void)
(0298) {
(0299)  unsigned int i;
(0300)  for(i=0;i<600;i++);
_delay_1ms:
  i                    --> R16
    033E 2700      CLR	R16
    033F 2711      CLR	R17
    0340 C002      RJMP	0x0343
    0341 5F0F      SUBI	R16,0xFF
    0342 4F1F      SBCI	R17,0xFF
    0343 3508      CPI	R16,0x58
    0344 E0E2      LDI	R30,2
    0345 071E      CPC	R17,R30
    0346 F3D0      BCS	0x0341
(0301) }
    0347 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    0348 940E038F  CALL	push_gset2
    034A 01B8      MOVW	R22,R16
(0302) //n ms延时函数
(0303) void delay_nms(unsigned int n)
(0304) {
(0305)  unsigned int i;
(0306)  for(i=0;i<n;i++)delay_1ms();
    034B 2744      CLR	R20
    034C 2755      CLR	R21
    034D C003      RJMP	0x0351
    034E DFEF      RCALL	_delay_1ms
    034F 5F4F      SUBI	R20,0xFF
    0350 4F5F      SBCI	R21,0xFF
    0351 1746      CP	R20,R22
    0352 0757      CPC	R21,R23
    0353 F3D0      BCS	0x034E
(0307) }
FILE: <library>
    0354 940E036F  CALL	pop_gset2
    0356 9508      RET
mod8u:
    0357 9468      BSET	6
    0358 C001      RJMP	xdiv8u
div8u:
    0359 94E8      BCLR	6
xdiv8u:
    035A 932A      ST	R18,-Y
    035B 92FA      ST	R15,-Y
    035C 92EA      ST	R14,-Y
    035D 24FF      CLR	R15
    035E 24EE      CLR	R14
    035F E120      LDI	R18,0x10
    0360 0F00      LSL	R16
    0361 1CFF      ROL	R15
    0362 1CEE      ROL	R14
    0363 16E1      CP	R14,R17
    0364 F010      BCS	0x0367
    0365 1AE1      SUB	R14,R17
    0366 9503      INC	R16
    0367 952A      DEC	R18
    0368 F7B9      BNE	0x0360
    0369 F40E      BRTC	0x036B
    036A 2D0E      MOV	R16,R14
    036B 90E9      LD	R14,Y+
    036C 90F9      LD	R15,Y+
    036D 9129      LD	R18,Y+
    036E 9508      RET
pop_gset2:
    036F E0E2      LDI	R30,2
    0370 940C037C  JMP	pop
pop_gset3:
    0372 E0E4      LDI	R30,4
    0373 940C037C  JMP	pop
pop_gset4:
    0375 E0E8      LDI	R30,0x8
    0376 940C037C  JMP	pop
push_gset1:
    0378 935A      ST	R21,-Y
    0379 934A      ST	R20,-Y
    037A 9508      RET
pop_gset1:
    037B E0E1      LDI	R30,1
pop:
    037C 9149      LD	R20,Y+
    037D 9159      LD	R21,Y+
    037E FDE0      SBRC	R30,0
    037F 9508      RET
    0380 9169      LD	R22,Y+
    0381 9179      LD	R23,Y+
    0382 FDE1      SBRC	R30,1
    0383 9508      RET
    0384 90A9      LD	R10,Y+
    0385 90B9      LD	R11,Y+
    0386 FDE2      SBRC	R30,2
    0387 9508      RET
    0388 90C9      LD	R12,Y+
    0389 90D9      LD	R13,Y+
    038A FDE3      SBRC	R30,3
    038B 9508      RET
    038C 90E9      LD	R14,Y+
    038D 90F9      LD	R15,Y+
    038E 9508      RET
push_gset2:
    038F 937A      ST	R23,-Y
    0390 936A      ST	R22,-Y
    0391 940C0378  JMP	push_gset1
push_gset3:
    0393 92BA      ST	R11,-Y
    0394 92AA      ST	R10,-Y
    0395 940C038F  JMP	push_gset2
push_gset4:
    0397 92DA      ST	R13,-Y
    0398 92CA      ST	R12,-Y
    0399 940C0393  JMP	push_gset3
lsr16:
    039B 2322      TST	R18
    039C F021      BEQ	0x03A1
    039D 9516      LSR	R17
    039E 9507      ROR	R16
    039F 952A      DEC	R18
    03A0 CFFA      RJMP	lsr16
    03A1 9508      RET

⌨️ 快捷键说明

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