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

📄 1602.s

📁 用AVR单片机Mega16控制的1602液晶屏显示
💻 S
字号:
	.module _1602.c
	.area data(ram, con, rel)
_DATA1::
	.blkb 17
	.area idata
	.byte 32,32,32,'W,'e,'l,'c,'o,'m,'e,32,'t,'o,32,32,32
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\单片机\单片机程序\AVR程序\1602\1602.c
	.dbsym e DATA1 _DATA1 A[17:17]c
_DATA2::
	.blkb 28
	.area idata
	.byte 32,32,32,32,32,32,32,32,32,32,32,'C,'U,'M,'T,33
	.byte 32,32,32,32,32,32,32,32,32,32,32,0
	.area data(ram, con, rel)
	.dbfile E:\单片机\单片机程序\AVR程序\1602\1602.c
	.dbsym e DATA2 _DATA2 A[28:28]c
	.area text(rom, con, rel)
	.dbfile E:\单片机\单片机程序\AVR程序\1602\1602.c
	.dbfunc e delay _delay fV
;              t -> R16,R17
	.even
_delay::
	.dbline -1
	.dbline 18
; #include <iom16v.h>
; #include <macros.h>
; #include <stdio.h>			//标准输入输出头文件
; #define uchar unsigned char
; #define uint  unsigned int
; 
; //uchar DATA[16] = {'W','e','l','c','o','m','e',' ','t','o',' ','C','U','M','T','!'};
; uchar DATA1[] = {"   Welcome to   "};
; uchar DATA2[] = {"           CUMT!           "};
; /********** LCD1602接线引脚定义 ***********/
; //E  -- PD4
; //RW -- PD5
; //RS -- PD6
; //DB0~7  --  PC0~7
; 
; /****************** 延时函数 *****************/
; void delay(uint t)
; {
L2:
	.dbline 19
L3:
	.dbline 19
;   while(t--);
	movw R2,R16
	subi R16,1
	sbci R17,0
	tst R2
	brne L2
	tst R3
	brne L2
X0:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r t 16 i
	.dbend
	.dbfunc e delay_ms _delay_ms fV
;              i -> R20,R21
;              j -> R22,R23
;              t -> R16,R17
	.even
_delay_ms::
	xcall push_gset2
	.dbline -1
	.dbline 23
; }
; 
; void delay_ms(uint t)
; {
	.dbline 25
;  uint i,j;
;  for(i=t;i>0;i--)
	movw R20,R16
	xjmp L9
L6:
	.dbline 26
	clr R22
	clr R23
	xjmp L13
L10:
	.dbline 26
L11:
	.dbline 26
	subi R22,255  ; offset = 1
	sbci R23,255
L13:
	.dbline 26
	cpi R22,116
	ldi R30,4
	cpc R23,R30
	brlo L10
L7:
	.dbline 25
	subi R20,1
	sbci R21,0
L9:
	.dbline 25
	cpi R20,0
	cpc R20,R21
	brne L6
X1:
	.dbline -2
L5:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r j 22 i
	.dbsym r t 16 i
	.dbend
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 31
;     for(j=0;j<1140;j++);
; }
; 
; /****************** 端口初始化 *****************/
; void port_init(void)
; {
	.dbline 32
;  PORTA = 0x00;
	clr R2
	out 0x1b,R2
	.dbline 33
;  DDRA  = 0xFF;
	ldi R24,255
	out 0x1a,R24
	.dbline 34
;  PORTB = 0x00;
	out 0x18,R2
	.dbline 35
;  DDRB  = 0x00;
	out 0x17,R2
	.dbline 36
;  PORTC = 0x00;
	out 0x15,R2
	.dbline 37
;  DDRC  = 0xFF;
	out 0x14,R24
	.dbline 38
;  PORTD = 0x00;
	out 0x12,R2
	.dbline 39
;  DDRD  = 0xFF;
	out 0x11,R24
	.dbline -2
L14:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e init_devices _init_devices fV
	.even
_init_devices::
	.dbline -1
	.dbline 44
; }
; 
; /****************** mega16 初始化 *****************/
; void init_devices(void)
; {
	.dbline 45
;  CLI();
	cli
	.dbline 46
;  port_init();
	xcall _port_init
	.dbline 47
;  MCUCR = 0x00;
	clr R2
	out 0x35,R2
	.dbline 48
;  GICR  = 0x00;
	out 0x3b,R2
	.dbline 49
;  TIMSK = 0x00;
	out 0x39,R2
	.dbline 50
;  SEI();
	sei
	.dbline -2
L15:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e lcd_busy _lcd_busy fV
	.even
_lcd_busy::
	.dbline -1
	.dbline 55
; }
; 
; /****************** 检查忙信号 *****************/
; void lcd_busy()
; {
	.dbline 56
;  DDRC = 0X00;  		   //PC 口改为输入
	clr R2
	out 0x14,R2
	.dbline 57
;  PORTD = 0X20;
	ldi R24,32
	out 0x12,R24
	.dbline 58
;  delay(10);
	ldi R16,10
	ldi R17,0
	xcall _delay
	.dbline 59
;  PORTD = 0X30;
	ldi R24,48
	out 0x12,R24
L17:
	.dbline 60
L18:
	.dbline 60
;  while(PINC & 0X80);  //lcd 忙,则在此循环
	sbic 0x13,7
	rjmp L17
	.dbline 61
;  PORTD = 0X20;
	ldi R24,32
	out 0x12,R24
	.dbline 62
;  DDRC = 0XFF;  		   //PC 口改为输出
	ldi R24,255
	out 0x14,R24
	.dbline -2
L16:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e lcd_cmd _lcd_cmd fV
;            cmd -> R20
	.even
_lcd_cmd::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 67
; }
; 
; /****************** 写命令函数 *****************/
; void lcd_cmd(uchar cmd)
; {
	.dbline 68
;  lcd_busy();
	xcall _lcd_busy
	.dbline 69
;  PORTD = 0X00;
	clr R2
	out 0x12,R2
	.dbline 70
;  delay(1);
	ldi R16,1
	ldi R17,0
	xcall _delay
	.dbline 71
;  PORTC = cmd; 	   	   //PC 口输出命令
	out 0x15,R20
	.dbline 72
;  delay(1);
	ldi R16,1
	ldi R17,0
	xcall _delay
	.dbline 73
;  PORTD = 0X10;
	ldi R24,16
	out 0x12,R24
	.dbline 74
;  delay(1);	  		   //延时
	ldi R16,1
	ldi R17,0
	xcall _delay
	.dbline 75
;  PORTD = 0X00;
	clr R2
	out 0x12,R2
	.dbline -2
L20:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r cmd 20 c
	.dbend
	.dbfunc e lcd_data _lcd_data fV
;           data -> R20
	.even
_lcd_data::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 80
; }
; 
; /****************** 写数据函数 *****************/
; void lcd_data(uchar data)
; {
	.dbline 81
;  lcd_busy();
	xcall _lcd_busy
	.dbline 82
;  PORTD = 0X40;
	ldi R24,64
	out 0x12,R24
	.dbline 83
;  delay(1);
	ldi R16,1
	ldi R17,0
	xcall _delay
	.dbline 84
;  PORTC = data;		//写要显示的字
	out 0x15,R20
	.dbline 85
;  delay(1);
	ldi R16,1
	ldi R17,0
	xcall _delay
	.dbline 86
;  PORTD = 0X50;
	ldi R24,80
	out 0x12,R24
	.dbline 87
;  delay(1);
	ldi R16,1
	ldi R17,0
	xcall _delay
	.dbline 88
;  PORTD = 0X40;
	ldi R24,64
	out 0x12,R24
	.dbline -2
L21:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbend
	.dbfunc e lcd_DAT _lcd_DAT fV
;            DAT -> y+4
;              y -> R22
;              x -> R20
	.even
_lcd_DAT::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 93
; }
; 
; /****************** 显示函数 *****************/
; void lcd_DAT(uchar x,uchar y,uchar DAT)
; {
	.dbline 94
;  if(y) x += 0x40;
	tst R22
	breq L23
	.dbline 94
	subi R20,192    ; addi 64
L23:
	.dbline 95
;  x |= 0x80;
	ori R20,128
	.dbline 96
;  lcd_cmd(x);	   //写要显示的地址
	mov R16,R20
	xcall _lcd_cmd
	.dbline 97
;  lcd_data(DAT);	   //写显示的内容
	ldd R16,y+4
	xcall _lcd_data
	.dbline -2
L22:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l DAT 4 c
	.dbsym r y 22 c
	.dbsym r x 20 c
	.dbend
	.dbfunc e lcd_init _lcd_init fV
	.even
_lcd_init::
	.dbline -1
	.dbline 102
; }
; 
; /****************** lcd 初始化 *****************/
; void lcd_init()
; {
	.dbline 103
;  lcd_cmd(0x38);
	ldi R16,56
	xcall _lcd_cmd
	.dbline 104
;  lcd_cmd(0x08);
	ldi R16,8
	xcall _lcd_cmd
	.dbline 105
;  lcd_cmd(0x01);
	ldi R16,1
	xcall _lcd_cmd
	.dbline 106
;  lcd_cmd(0x06);
	ldi R16,6
	xcall _lcd_cmd
	.dbline 107
;  lcd_cmd(0x0c);
	ldi R16,12
	xcall _lcd_cmd
	.dbline -2
L25:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;              p -> R20
;              m -> R22
;              i -> R10
	.even
_main::
	sbiw R28,1
	.dbline -1
	.dbline 112
; }
; 
; /****************** 主函数 *****************/
; void main(void)
; {
	.dbline 113
;  uchar i,p=1;
	ldi R20,1
	.dbline 114
;  char m = 11;
	ldi R22,11
	.dbline 115
;  init_devices();
	xcall _init_devices
	.dbline 116
;  delay_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _delay_ms
	.dbline 117
;  lcd_init();
	xcall _lcd_init
	.dbline 126
;  
;  /*lcd_DAT(0,0,'G');
;  lcd_DAT(1,0,'O');
;  lcd_DAT(2,0,'O');
;  lcd_DAT(3,0,'D');
;  lcd_DAT(5,1,'B');
;  lcd_DAT(6,1,'Y');
;  lcd_DAT(7,1,'E');*/
;  lcd_cmd(0x80);
	ldi R16,128
	xcall _lcd_cmd
	.dbline 127
;  for(i=0;DATA1[i] != '\0';i++)
	clr R10
	xjmp L30
L27:
	.dbline 128
	.dbline 129
	ldi R24,<_DATA1
	ldi R25,>_DATA1
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	std y+0,R2
	clr R18
	mov R16,R10
	xcall _lcd_DAT
	.dbline 130
L28:
	.dbline 127
	inc R10
L30:
	.dbline 127
	ldi R24,<_DATA1
	ldi R25,>_DATA1
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	tst R2
	brne L27
	xjmp L32
L31:
	.dbline 132
;   {
;    lcd_DAT(i,0,DATA1[i]);
;   }
;  while(1)
;  {  
	.dbline 133
;   for(i=0;i<16;i++)
	clr R10
	xjmp L37
L34:
	.dbline 134
	.dbline 135
	mov R2,R22
	clr R3
	mov R30,R10
	clr R31
	add R30,R2
	adc R31,R3
	ldi R24,<_DATA2
	ldi R25,>_DATA2
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	std y+0,R2
	ldi R18,1
	mov R16,R10
	xcall _lcd_DAT
	.dbline 136
L35:
	.dbline 133
	inc R10
L37:
	.dbline 133
	mov R24,R10
	cpi R24,16
	brlo L34
	.dbline 137
;   {
;    lcd_DAT(i,1,DATA2[i+m]);
;   }
;   delay_ms(700);		   	  //滚动屏
	ldi R16,700
	ldi R17,2
	xcall _delay_ms
	.dbline 138
;   if(p == 1) m --;
	cpi R20,1
	brne L38
	.dbline 138
	dec R22
	xjmp L39
L38:
	.dbline 139
;   else if(p == 0) m++;
	tst R20
	brne L40
	.dbline 139
	inc R22
L40:
L39:
	.dbline 140
;   if(m >= 11) p = 1;
	cpi R22,11
	brlo L42
	.dbline 140
	ldi R20,1
	xjmp L43
L42:
	.dbline 141
;   else if(m <= 0) p = 0;
	clr R2
	cp R2,R22
	brlo L44
	.dbline 141
	clr R20
L44:
L43:
	.dbline 142
L32:
	.dbline 131
	xjmp L31
X2:
	.dbline -2
L26:
	adiw R28,1
	.dbline 0 ; func end
	ret
	.dbsym r p 20 c
	.dbsym r m 22 c
	.dbsym r i 10 c
	.dbend

⌨️ 快捷键说明

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