📄 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 + -