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

📄 1602.s

📁 l602的读写
💻 S
字号:
	.module _1602.c
	.area text(rom, con, rel)
	.dbfile D:\我的文档\MYDESI~1\1602\1602.c
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 30
; //说明:此程序在LCD1602上显示“Velcome! ”“www.iccavr.com”同时实现左右移动。
; 
; /*********************************
; *     字符LCD1602应用例子   *
; * 实验环境:本站的M16学习板   *
; * 接线方式:RS=PD.3,E=PC.6   *
; *           Db0-Db7=PB0-PB7   *
; * 作    者:tonghe     *
; * 日    期:2007年03月06日   *
; * 版    本:V1.2     *
; * 修改日期:2007年08月11日   *
; * 编 译 器:ICCAVR6.31A    *
; *********************************/
; #include "iom8v.h"
; 
; //宏定义
; #define RS1602 PD3       //RS接在PORTD.3上
; #define E1602 PC6      //E接在PORTC.6上
; #define LCD_DATA PORTB     //8位数据联接在PORTB上
; #define CLR_RS PORTD&=~(1<<RS1602)//RS清0
; #define SET_RS PORTD|=1<<RS1602   //RS置1
; #define CLR_E PORTC&=~(1<<E1602)  //E清0
; #define SET_E PORTC|=1<<E1602   //E置1
; 
; #define uchar unsigned char
; #define uint unsigned int
; 
; //配置端口
; void port_init(void)
;  {
	.dbline 33
; // PORTA = 0xFF;
;  //DDRA  = 0x00;
;  DDRB  = 0xFF;
	ldi R24,255
	out 0x17,R24
	.dbline 34
;  PORTB = 0xFF;
	out 0x18,R24
	.dbline 35
;  DDRD  = 0xFF;
	out 0x11,R24
	.dbline 36
;  PORTD = 0x00;
	clr R2
	out 0x12,R2
	.dbline 38
;  
;  DDRC  = 0xFF;      //定义C口为输出
	out 0x14,R24
	.dbline 39
;  PORTC = 0x00;           //开背光:接在PC7
	out 0x15,R2
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e delay_ms _delay_ms fV
;              a -> R20,R21
;              i -> R16,R17
	.even
_delay_ms::
	st -y,R20
	st -y,R21
	.dbline -1
	.dbline 45
;    
;  }
; 
; //延时函数:入口i,单位mS,最大65536mS
; void delay_ms(uint i)
;     {
	.dbline 47
;     uint a;
;     for(;i;i--)
	rjmp L6
L3:
	.dbline 48
;   {
	.dbline 49
;   for(a=150;a!=0;a--)      //针对时钟频率为1M
	ldi R20,150
	ldi R21,0
	rjmp L10
L7:
	.dbline 50
;    {;}
	.dbline 50
	.dbline 50
L8:
	.dbline 49
	subi R20,1
	sbci R21,0
L10:
	.dbline 49
	cpi R20,0
	cpc R20,R21
	brne L7
X0:
	.dbline 51
;   }
L4:
	.dbline 47
	subi R16,1
	sbci R17,0
L6:
	.dbline 47
	cpi R16,0
	cpc R16,R17
	brne L3
X1:
	.dbline -2
L2:
	.dbline 0 ; func end
	ld R21,y+
	ld R20,y+
	ret
	.dbsym r a 20 i
	.dbsym r i 16 i
	.dbend
	.dbfunc e lcd_da _lcd_da fV
;           data -> R10
	.even
_lcd_da::
	st -y,R10
	mov R10,R16
	.dbline -1
	.dbline 56
;     }
; 
; //写数据到LCD的函数
; void lcd_da(uchar data)
;  {
	.dbline 57
;  SET_RS;       //RS置高,写数据
	sbi 0x12,3
	.dbline 58
;  delay_ms(1);
	ldi R16,1
	ldi R17,0
	rcall _delay_ms
	.dbline 59
;  SET_E;
	sbi 0x15,6
	.dbline 60
;  LCD_DATA = data;
	out 0x18,R10
	.dbline 61
;  delay_ms(1);
	ldi R16,1
	ldi R17,0
	rcall _delay_ms
	.dbline 62
;  CLR_E;
	cbi 0x15,6
	.dbline 63
;  delay_ms(1);    //延时5MS
	ldi R16,1
	ldi R17,0
	rcall _delay_ms
	.dbline -2
L11:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym r data 10 c
	.dbend
	.dbfunc e lcd_comm _lcd_comm fV
;           data -> R10
	.even
_lcd_comm::
	st -y,R10
	mov R10,R16
	.dbline -1
	.dbline 68
;  } 
; 
; //写指令到LCD的函数
; void lcd_comm(uchar data)
;  {
	.dbline 69
;  CLR_RS;       //RS清0,写指令
	cbi 0x12,3
	.dbline 70
;  delay_ms(1);    //延时5MS
	ldi R16,1
	ldi R17,0
	rcall _delay_ms
	.dbline 71
;  SET_E;
	sbi 0x15,6
	.dbline 72
;  LCD_DATA = data;
	out 0x18,R10
	.dbline 73
;  delay_ms(1);
	ldi R16,1
	ldi R17,0
	rcall _delay_ms
	.dbline 74
;  CLR_E;
	cbi 0x15,6
	.dbline 75
;  delay_ms(1);    //延时5MS
	ldi R16,1
	ldi R17,0
	rcall _delay_ms
	.dbline -2
L12:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym r data 10 c
	.dbend
	.dbfunc e lcd _lcd fV
;              s -> R20,R21
	.even
_lcd::
	st -y,R20
	st -y,R21
	movw R20,R16
	.dbline -1
	.dbline 80
;  } 
; 
; //显示字符串函数:入口:待显示的字符串
; void lcd(char *s)
;     {
	rjmp L15
L14:
	.dbline 82
;  while(*s)
;      {
	.dbline 83
;   lcd_da(*s);
	movw R30,R20
	ldd R16,z+0
	rcall _lcd_da
	.dbline 84
;   s++;
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 85
;   }
L15:
	.dbline 81
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L14
X2:
	.dbline -2
L13:
	.dbline 0 ; func end
	ld R21,y+
	ld R20,y+
	ret
	.dbsym r s 20 pc
	.dbend
	.dbfunc e cls _cls fV
	.even
_cls::
	.dbline -1
	.dbline 90
;  }
;  
; //清屏指令函数
; void cls(void)
;     {
	.dbline 91
;  lcd_comm(0x01);
	ldi R16,1
	rcall _lcd_comm
	.dbline 92
;  delay_ms(5);
	ldi R16,5
	ldi R17,0
	rcall _delay_ms
	.dbline -2
L17:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e locate _locate fV
;              x -> R20
;              b -> R22
;              a -> R10
	.even
_locate::
	rcall push_xgsetF00C
	mov R22,R18
	mov R10,R16
	.dbline -1
	.dbline 97
;  }
; 
; //定位指令函数
; void locate(uchar a,uchar b)
;     {
	.dbline 99
;  uchar x;
;  if(a==1)
	mov R24,R10
	cpi R24,1
	brne L19
X3:
	.dbline 100
;      x=0x80+b-1;
	mov R20,R22
	subi R20,128    ; addi 128
	subi R20,1
L19:
	.dbline 101
;  if(a==2)
	mov R24,R10
	cpi R24,2
	brne L21
X4:
	.dbline 102
;      x=0xC0+b-1;
	mov R20,R22
	subi R20,64    ; addi 192
	subi R20,1
L21:
	.dbline 103
;  lcd_comm(x);
	mov R16,R20
	rcall _lcd_comm
	.dbline 104
;  delay_ms(1);
	ldi R16,1
	ldi R17,0
	rcall _delay_ms
	.dbline -2
L18:
	.dbline 0 ; func end
	rjmp pop_xgsetF00C
	.dbsym r x 20 c
	.dbsym r b 22 c
	.dbsym r a 10 c
	.dbend
	.dbfunc e lcd_init _lcd_init fV
	.even
_lcd_init::
	.dbline -1
	.dbline 109
;  }
; 
; //LCD初始化函数
; void lcd_init(void)
;  {
	.dbline 110
;  lcd_comm(0x38);    //写指令:8位数据、2行显示、5*8点阵
	ldi R16,56
	rcall _lcd_comm
	.dbline 111
;  delay_ms(5);
	ldi R16,5
	ldi R17,0
	rcall _delay_ms
	.dbline 112
;  lcd_comm(0x06);    //写指令:自左向右显示
	ldi R16,6
	rcall _lcd_comm
	.dbline 113
;  delay_ms(5);
	ldi R16,5
	ldi R17,0
	rcall _delay_ms
	.dbline 114
;  lcd_comm(0x0C);    //写指令:显示开
	ldi R16,12
	rcall _lcd_comm
	.dbline 115
;  delay_ms(5);
	ldi R16,5
	ldi R17,0
	rcall _delay_ms
	.dbline 118
; // lcd_comm(0x80);    //写指令:第1行地址
; // delay_ms(5);  
;  lcd_comm(0x01);    //写指令:CLS
	ldi R16,1
	rcall _lcd_comm
	.dbline -2
L23:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;              i -> R20
	.even
_main::
	.dbline -1
	.dbline 123
;  }
;  
; //主函数
; void main(void)
;     {
	.dbline 126
;  uchar i;
; 
;  port_init();    //端口初始化
	rcall _port_init
	.dbline 127
;  delay_ms(50);    //延时500ms
	ldi R16,50
	ldi R17,0
	rcall _delay_ms
	.dbline 128
;  lcd_init();     //LCD初始化
	rcall _lcd_init
	.dbline 130
;  
;  delay_ms(50);
	ldi R16,50
	ldi R17,0
	rcall _delay_ms
	.dbline 131
;  locate(1,5);     //第一行显示位置
	ldi R18,5
	ldi R16,1
	rcall _locate
	.dbline 132
;  lcd("Velcome!");   //第一行显示内容
	ldi R16,<L25
	ldi R17,>L25
	rcall _lcd
	.dbline 133
;  locate(2,2);    //第二行显示位置
	ldi R18,2
	ldi R16,2
	rcall _locate
	.dbline 134
;  lcd("www.iccavr.com");  //第二行显示内容
	ldi R16,<L26
	ldi R17,>L26
	rcall _lcd
	.dbline 136
; 
;  for(i=5;i;i--)    //先右移5位
	ldi R20,5
	rjmp L30
L27:
	.dbline 137
;   {
	.dbline 138
;   lcd_comm(0x1C);
	ldi R16,28
	rcall _lcd_comm
	.dbline 139
;   delay_ms(100);
	ldi R16,100
	ldi R17,0
	rcall _delay_ms
	.dbline 140
;   }
L28:
	.dbline 136
	dec R20
L30:
	.dbline 136
	tst R20
	brne L27
X5:
	rjmp L32
L31:
	.dbline 143
;     
;  while (1)
;         {
	.dbline 144
;   for(i=10;i;i--)   //左移10位
	ldi R20,10
	rjmp L37
L34:
	.dbline 145
;    {
	.dbline 146
;    lcd_comm(0x18);
	ldi R16,24
	rcall _lcd_comm
	.dbline 147
;    if(i==6)delay_ms(2000);  //移到中间暂停2秒
	cpi R20,6
	brne L38
X6:
	.dbline 147
	ldi R16,2000
	ldi R17,7
	rcall _delay_ms
L38:
	.dbline 148
;    delay_ms(400);
	ldi R16,400
	ldi R17,1
	rcall _delay_ms
	.dbline 149
;    }
L35:
	.dbline 144
	dec R20
L37:
	.dbline 144
	tst R20
	brne L34
X7:
	.dbline 150
;   for(i=10;i;i--)      //右移10位
	ldi R20,10
	rjmp L43
L40:
	.dbline 151
;    {
	.dbline 152
;    lcd_comm(0x1C);
	ldi R16,28
	rcall _lcd_comm
	.dbline 153
;    if(i==6)delay_ms(2000);
	cpi R20,6
	brne L44
X8:
	.dbline 153
	ldi R16,2000
	ldi R17,7
	rcall _delay_ms
L44:
	.dbline 154
;    delay_ms(400);
	ldi R16,400
	ldi R17,1
	rcall _delay_ms
	.dbline 155
;    }
L41:
	.dbline 150
	dec R20
L43:
	.dbline 150
	tst R20
	brne L40
X9:
	.dbline 156
;   }
L32:
	.dbline 142
	rjmp L31
X10:
	.dbline -2
L24:
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.area data(ram, con, rel)
	.dbfile D:\我的文档\MYDESI~1\1602\1602.c
L26:
	.blkb 15
	.area idata
	.byte 'w,'w,'w,46,'i,'c,'c,'a,'v,'r,46,'c,'o,'m,0
	.area data(ram, con, rel)
	.dbfile D:\我的文档\MYDESI~1\1602\1602.c
L25:
	.blkb 9
	.area idata
	.byte 'V,'e,'l,'c,'o,'m,'e,33,0
	.area data(ram, con, rel)
	.dbfile D:\我的文档\MYDESI~1\1602\1602.c
;     }

⌨️ 快捷键说明

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