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

📄 lcd1602.s

📁 数控电压源程序数控电压源程序数控电压源程序数控电压源程序
💻 S
字号:
	.module LCD1602.C
	.area text(rom, con, rel)
	.dbfile E:\张秋伟\我的实验\数控电压源\LCD1602.C
	.dbfunc e delay_ms _delay_ms fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delay_ms::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 25
; #include <iom16v.h>
; #include <macros.h>
; #include "delay.h"
; /*
;  数据口接PB口:PB0--DB0,PB1--DB1,.....PB7--DB7;
;  控制总线RS--PD3 RW--PD5 EN--PD4
; 
; */
; #define LCDPORT PORTC
; #define LCDDDR DDRC
; #define LCDPIN PINC
; 
; #define RS_CLR	PORTA&= ~(1 << PA0)
; #define RS_SET	PORTA |= (1 << PA0)
; 
; #define RW_CLR	PORTA &= ~(1 << PA1)
; #define RW_SET	PORTA |= (1 << PA1)
; 
; #define EN_CLR	PORTA &= ~(1 << PA2)
; #define EN_SET	PORTA |= (1 << PA2)
; #define Clear_Screen  Write_Command(0x01)
; 
; 
; void delay_ms(unsigned int n)
; {
	.dbline 27
	clr R20
	clr R21
	xjmp L5
L2:
	.dbline 27
	xcall _delay_1ms
L3:
	.dbline 27
	subi R20,255  ; offset = 1
	sbci R21,255
L5:
	.dbline 27
;  unsigned int i;
;  for(i=0;i<n;i++)delay_1ms();
	cp R20,R22
	cpc R21,R23
	brlo L2
	.dbline -2
L1:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.dbfunc e En_Toggle _En_Toggle fV
	.even
_En_Toggle::
	.dbline -1
	.dbline 31
; }
; 
; void En_Toggle()//产生一个使能脉冲
; {
	.dbline 32
;  EN_CLR;        //拉低使能位,产生一个下降沿
	cbi 0x1b,2
	.dbline 33
;  delay_ms(5);//保持低电平一定时间
	ldi R16,5
	ldi R17,0
	xcall _delay_ms
	.dbline 34
;  EN_SET;        //拉高使能位
	sbi 0x1b,2
	.dbline 35
;  delay_ms(3);//保持高电平一定时间
	ldi R16,3
	ldi R17,0
	xcall _delay_ms
	.dbline 36
;  EN_CLR;        //拉低使能位,产生一个下降沿
	cbi 0x1b,2
	.dbline -2
L6:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Wait_Until_Ready _Wait_Until_Ready fV
	.even
_Wait_Until_Ready::
	.dbline -1
	.dbline 41
; }
; 
; /* 不断检测LCD的忙标志 (BF),直到其为0,表示可以执行下一条指令*/ 
;  void Wait_Until_Ready(void)
;  {
	.dbline 42
;   RW_SET;     //设为读状态
	sbi 0x1b,1
	.dbline 43
;   RS_CLR;  //所读为状态位
	cbi 0x1b,0
	.dbline 44
;   LCDDDR&=~(1<<DDD7);//单片机设为输入,用以读取LCD的忙标志
	cbi 0x14,7
	.dbline 45
;   EN_SET;
	sbi 0x1b,2
	.dbline 46
;   delay_ms(5);
	ldi R16,5
	ldi R17,0
	xcall _delay_ms
L8:
	.dbline 47
L9:
	.dbline 47
;   while((LCDPIN&0x80)==0x80) ;    //不断循环,直至BF=0
	in R2,0x13
	clr R3
	sbrc R2,7
	rjmp L8
	.dbline 48
;   EN_CLR;
	cbi 0x1b,2
	.dbline 49
;   LCDDDR|=(1<<DDD7);
	sbi 0x14,7
	.dbline -2
L7:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Write_Command _Write_Command fV
;        Command -> R20
	.even
_Write_Command::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 53
;  }
; 
;  void Write_Command(unsigned char Command)   //向LCD写入命令字
;  {
	.dbline 54
;   RS_CLR;        //写入的是命令 
	cbi 0x1b,0
	.dbline 55
;   RW_CLR;        //置为写状态
	cbi 0x1b,1
	.dbline 56
;   LCDDDR=0xFF;
	ldi R24,255
	out 0x14,R24
	.dbline 57
;   LCDPORT=Command;  //写命令字 
	out 0x15,R20
	.dbline 58
;   delay_ms(2);
	ldi R16,2
	ldi R17,0
	xcall _delay_ms
	.dbline 59
;   En_Toggle();
	xcall _En_Toggle
	.dbline 60
;   Wait_Until_Ready(); //等待指令执行完毕
	xcall _Wait_Until_Ready
	.dbline -2
L11:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r Command 20 c
	.dbend
	.dbfunc e Write_Data _Write_Data fV
;           Data -> R20,R21
	.even
_Write_Data::
	xcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 64
;  } 
; 
; void Write_Data(unsigned int Data)
; {
	.dbline 65
;   RS_SET;
	sbi 0x1b,0
	.dbline 66
;   RW_CLR; //写入的是数据
	cbi 0x1b,1
	.dbline 67
;   LCDDDR=0xFF;
	ldi R24,255
	out 0x14,R24
	.dbline 68
;   delay_ms(2);
	ldi R16,2
	ldi R17,0
	xcall _delay_ms
	.dbline 69
;   LCDPORT=Data;
	out 0x15,R20
	.dbline 70
;   En_Toggle();
	xcall _En_Toggle
	.dbline 71
;   Wait_Until_Ready();
	xcall _Wait_Until_Ready
	.dbline -2
L12:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r Data 20 i
	.dbend
	.dbfunc e Write_Position _Write_Position fV
;              p -> R20
;          colum -> R22,R23
;            row -> R20,R21
	.even
_Write_Position::
	xcall push_gset2
	movw R22,R18
	movw R20,R16
	.dbline -1
	.dbline 75
; } 
; 
; void Write_Position(unsigned int row,unsigned int colum)//设字符位置
; {
	.dbline 77
;  unsigned char p;
;   if(row==1)
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	brne L14
	.dbline 78
;   {
	.dbline 79
;    p=0x80+colum-1;
	mov R20,R22
	subi R20,128  ; offset = 128
	sbci R21,255
	subi R20,1
	sbci R21,0
	.dbline 80
;    Write_Command(p);
	mov R16,R20
	xcall _Write_Command
	.dbline 81
;    }  
	xjmp L15
L14:
	.dbline 83
	.dbline 84
	mov R20,R22
	subi R20,64  ; offset = 192
	sbci R21,255
	subi R20,1
	sbci R21,0
	.dbline 85
	mov R16,R20
	xcall _Write_Command
	.dbline 86
L15:
	.dbline -2
L13:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r p 20 c
	.dbsym r colum 22 i
	.dbsym r row 20 i
	.dbend
	.dbfunc e Write_String _Write_String fV
;              s -> R20,R21
	.even
_Write_String::
	xcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 90
;    else 
;      {
;       p=0xC0+colum-1;
;       Write_Command(p);
;      }
; }
;   
; void Write_String(char *s)//写入字符串
; {
	.dbline 91
;  for(;*s!='\0';s++)
	xjmp L20
L17:
	.dbline 92
	movw R30,R20
	ldd R16,z+0
	clr R17
	xcall _Write_Data
L18:
	.dbline 91
	subi R20,255  ; offset = 1
	sbci R21,255
L20:
	.dbline 91
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L17
	.dbline -2
L16:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r s 20 pc
	.dbend
	.dbfunc e Initialize_LCD _Initialize_LCD fV
	.even
_Initialize_LCD::
	.dbline -1
	.dbline 95
;   Write_Data(*s);
; }
; void Initialize_LCD(void)
; { 
	.dbline 96
;  CLI(); //禁止所有中断
	cli
	.dbline 97
;  PORTA=0x00;
	clr R2
	out 0x1b,R2
	.dbline 98
;  DDRA=0X07;
	ldi R24,7
	out 0x1a,R24
	.dbline 99
;  LCDPORT=0x00;
	out 0x15,R2
	.dbline 100
;  LCDDDR=0xFF;
	ldi R24,255
	out 0x14,R24
	.dbline 101
;  Write_Command(0X38);
	ldi R16,56
	xcall _Write_Command
	.dbline 102
;  Write_Command(0x06);
	ldi R16,6
	xcall _Write_Command
	.dbline 103
;  Write_Command(0x0c);
	ldi R16,12
	xcall _Write_Command
	.dbline 104
;  Clear_Screen;
	ldi R16,1
	xcall _Write_Command
	.dbline 105
;  SEI();//开全局中断
	sei
	.dbline -2
L21:
	.dbline 0 ; func end
	ret
	.dbend

⌨️ 快捷键说明

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