📄 lcd.s
字号:
.module lcd.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\USING07-07\Mega128\12c887\lcd.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 8
; #include <iom128v.h>
; #include <macros.h>
; #include "lcd.h"
; typedef unsigned char uchar;
; typedef unsigned int uint;
;
; void port_init(void)
; {
.dbline 10
; //访问外部ram的总线端口
; PORTA = 0x00;
clr R2
out 0x1b,R2
.dbline 11
; DDRA = 0x00;
out 0x1a,R2
.dbline 12
; PORTC = 0x00;
out 0x15,R2
.dbline 13
; DDRC = 0xFF;
ldi R24,255
out 0x14,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e check_busy _check_busy fV
; temp -> R20
; cs -> R16
.even
_check_busy::
xcall push_gset1
.dbline -1
.dbline 17
; }
;
; void check_busy(uchar cs)
; {
xjmp L4
L3:
.dbline 20
; uchar temp;
; while(temp)
; {
.dbline 21
; if(cs)
tst R16
breq L6
.dbline 22
; temp=R_staus&0X80; //将忙状态读到temp中进行确定
lds R20,39168
andi R20,128
xjmp L7
L6:
.dbline 24
; else
; temp=L_staus&0X80;
lds R20,38144
andi R20,128
L7:
.dbline 25
L4:
.dbline 19
tst R20
brne L3
.dbline -2
L2:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbsym r cs 16 c
.dbend
.dbfunc e lcdcommand _lcdcommand fV
; com -> R20
; cs -> R22
.even
_lcdcommand::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 30
; }
; }
;
;
; void lcdcommand(uchar cs,uchar com)
; {
.dbline 31
; if(cs)
tst R22
breq L9
.dbline 32
; {
.dbline 33
; check_busy(1);
ldi R16,1
xcall _check_busy
.dbline 34
; R_command=com;
sts 38912,R20
.dbline 35
; }
xjmp L10
L9:
.dbline 37
.dbline 38
clr R16
xcall _check_busy
.dbline 39
sts 37888,R20
.dbline 40
L10:
.dbline -2
L8:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r com 20 c
.dbsym r cs 22 c
.dbend
.dbfunc e lcddatas _lcddatas fV
; dd -> R20
; cs -> R22
.even
_lcddatas::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 46
; else
; {
; check_busy(0);
; L_command=com;
; }
; }
;
; /*************************向LCD写数据函数*************************/
;
; void lcddatas(char cs,uchar dd)
; {
.dbline 47
; if(cs)
tst R22
breq L12
.dbline 48
; {
.dbline 49
; check_busy(1);
ldi R16,1
xcall _check_busy
.dbline 50
; R_data=dd;
sts 39424,R20
.dbline 51
; }
xjmp L13
L12:
.dbline 53
.dbline 54
clr R16
xcall _check_busy
.dbline 55
sts 38400,R20
.dbline 56
L13:
.dbline -2
L11:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r dd 20 c
.dbsym r cs 22 c
.dbend
.dbfunc e LCD_Clean _LCD_Clean fV
; x -> R20
; y -> R22
.even
_LCD_Clean::
xcall push_gset2
.dbline -1
.dbline 62
; else
; {
; check_busy(0);
; L_data=dd;
; }
; }
;
; /**************************** LCD清屏函数*******************************/
;
; void LCD_Clean(void)
; {
.dbline 64
; unsigned char x,y;
; for(x=0xb8;x<=0xbf;x++) //一页一页的写
ldi R20,184
xjmp L18
L15:
.dbline 65
; {
.dbline 66
; lcdcommand(0,x);
mov R18,R20
clr R16
xcall _lcdcommand
.dbline 67
; lcdcommand(1,x); //设定X方向地址,X地址不能自增。要靠程序加
mov R18,R20
ldi R16,1
xcall _lcdcommand
.dbline 68
; lcdcommand(0,LCD_Y); //设置Y的初始地址,Y可自加
ldi R18,64
clr R16
xcall _lcdcommand
.dbline 69
; lcdcommand(1,LCD_Y);
ldi R18,64
ldi R16,1
xcall _lcdcommand
.dbline 70
; for(y=0;y<64;y++)
clr R22
xjmp L22
L19:
.dbline 71
.dbline 72
clr R18
clr R16
xcall _lcddatas
.dbline 73
clr R18
ldi R16,1
xcall _lcddatas
.dbline 74
L20:
.dbline 70
inc R22
L22:
.dbline 70
cpi R22,64
brlo L19
.dbline 75
L16:
.dbline 64
inc R20
L18:
.dbline 64
ldi R24,191
cp R24,R20
brsh L15
.dbline -2
L14:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r x 20 c
.dbsym r y 22 c
.dbend
.dbfunc e LCD_Init _LCD_Init fV
.even
_LCD_Init::
.dbline -1
.dbline 79
; {
; lcddatas(0,0x00);
; lcddatas(1,0x00); //Y地址可以自增
; }
; }
; }
;
; void LCD_Init(void) //LCD初始化子函数
; {
.dbline 81
; /*首先关闭12864的显示*/
; check_busy(0); //LCD左半屏正在工作,等待......
clr R16
xcall _check_busy
.dbline 82
; L_command=LCD_OFF; //先关闭LCD左半屏的显示
ldi R24,62
sts 37888,R24
.dbline 83
; check_busy(1); //LCD右半屏正在工作,等待......
ldi R16,1
xcall _check_busy
.dbline 84
; R_command=LCD_OFF; //先关闭LCD右半屏的显示
ldi R24,62
sts 38912,R24
.dbline 87
;
; /*开启12864的显示*/
; check_busy(0);
clr R16
xcall _check_busy
.dbline 88
; L_command=LCD_ON; //打开LCD左半屏的显示
ldi R24,63
sts 37888,R24
.dbline 89
; check_busy(1);
ldi R16,1
xcall _check_busy
.dbline 90
; R_command=LCD_ON; //打开LCD右半屏的显示
ldi R24,63
sts 38912,R24
.dbline 93
;
; /*设置LCD显示的起始行*/
; check_busy(0);
clr R16
xcall _check_busy
.dbline 94
; L_command=LCD_X; //LCD左半屏起始行为0
ldi R24,192
sts 37888,R24
.dbline 95
; check_busy(1);
ldi R16,1
xcall _check_busy
.dbline 96
; R_command=LCD_X; //LCD右半屏起始行为0
ldi R24,192
sts 38912,R24
.dbline -2
L23:
.dbline 0 ; func end
ret
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 100
; }
;
; void init_devices(void)
; {
.dbline 101
; XMCRA = 0x00; //外部存储器控制
clr R2
sts 109,R2
.dbline 102
; XMCRB = 0x00; //外存储高位地址屏蔽,释放端口C
sts 108,R2
.dbline 103
; port_init();
xcall _port_init
.dbline 104
; MCUCR = 0x80; //外部SRAM使能
ldi R24,128
out 0x35,R24
.dbline -2
L24:
.dbline 0 ; func end
ret
.dbend
.dbfunc e displaychar_left _displaychar_left fV
; i -> R20
; y -> y+4
; x -> R20
; array -> R22,R23
.even
_displaychar_left::
xcall push_gset2
mov R20,R18
movw R22,R16
.dbline -1
.dbline 110
; }
;
; /**********************************LCD字符显示函数(8*8)**********************************************/
;
; void displaychar_left(uchar *array,uchar x,uchar y)
; {
.dbline 112
; uchar i;
; lcdcommand(0,LCD_PAGE+x);
mov R18,R20
subi R18,72 ; addi 184
clr R16
xcall _lcdcommand
.dbline 113
; lcdcommand(0,LCD_Y+y);
ldd R18,y+4
subi R18,192 ; addi 64
clr R16
xcall _lcdcommand
.dbline 114
; for(i=0;i<8;i++)
clr R20
xjmp L29
L26:
.dbline 115
.dbline 116
mov R30,R20
clr R31
add R30,R22
adc R31,R23
ldd R18,z+0
clr R16
xcall _lcddatas
.dbline 117
L27:
.dbline 114
inc R20
L29:
.dbline 114
cpi R20,8
brlo L26
.dbline -2
L25:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym l y 4 c
.dbsym r x 20 c
.dbsym r array 22 pc
.dbend
.dbfunc e displaychar_right _displaychar_right fV
; i -> R20
; y -> y+4
; x -> R20
; array -> R22,R23
.even
_displaychar_right::
xcall push_gset2
mov R20,R18
movw R22,R16
.dbline -1
.dbline 122
; {
; lcddatas(0,*(array+i));
; }
; }
;
;
; void displaychar_right(uchar *array,uchar x,uchar y)
; {
.dbline 124
; uchar i;
; lcdcommand(1,LCD_PAGE+x);
mov R18,R20
subi R18,72 ; addi 184
ldi R16,1
xcall _lcdcommand
.dbline 125
; lcdcommand(1,LCD_Y+y);
ldd R18,y+4
subi R18,192 ; addi 64
ldi R16,1
xcall _lcdcommand
.dbline 126
; for(i=0;i<8;i++)
clr R20
xjmp L34
L31:
.dbline 127
.dbline 128
mov R30,R20
clr R31
add R30,R22
adc R31,R23
ldd R18,z+0
ldi R16,1
xcall _lcddatas
.dbline 129
L32:
.dbline 126
inc R20
L34:
.dbline 126
cpi R20,8
brlo L31
.dbline -2
L30:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym l y 4 c
.dbsym r x 20 c
.dbsym r array 22 pc
.dbend
.dbfunc e display_char _display_char fV
; heng -> R10
; zong -> R22
; array2 -> R20,R21
; array1 -> R12,R13
.even
_display_char::
xcall push_gset4
movw R20,R18
movw R12,R16
sbiw R28,1
ldd R22,y+9
ldd R10,y+11
.dbline -1
.dbline 134
; {
; lcddatas(1,*(array+i));
; }
; }
;
;
; void display_char(uchar*array1,uchar*array2,uchar zong,uchar heng)
; {
.dbline 135
; if((heng>=0)&&(heng<=7))
mov R24,R10
cpi R24,0
brlo L36
ldi R24,7
cp R24,R10
brlo L36
.dbline 136
; {displaychar_left(array1,zong,heng*8); displaychar_left(array2,zong+1,heng*8);}
.dbline 136
ldi R24,8
mul R24,R10
std y+0,R0
mov R18,R22
movw R16,R12
xcall _displaychar_left
.dbline 136
ldi R24,8
mul R24,R10
std y+0,R0
mov R18,R22
subi R18,255 ; addi 1
movw R16,R20
xcall _displaychar_left
.dbline 136
L36:
.dbline 138
mov R24,R10
cpi R24,8
brlo L38
ldi R24,15
cp R24,R10
brlo L38
.dbline 139
.dbline 139
ldi R24,8
mul R24,R10
mov R24,R0
subi R24,64
std y+0,R24
mov R18,R22
movw R16,R12
xcall _displaychar_right
.dbline 139
ldi R24,8
mul R24,R10
mov R24,R0
subi R24,64
std y+0,R24
mov R18,R22
subi R18,255 ; addi 1
movw R16,R20
xcall _displaychar_right
.dbline 139
L38:
.dbline -2
L35:
adiw R28,1
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r heng 10 c
.dbsym r zong 22 c
.dbsym r array2 20 pc
.dbsym r array1 12 pc
.dbend
.dbfunc e displayL _displayL fV
; i -> R20
; y -> y+4
; x -> R20
; array -> R22,R23
.even
_displayL::
xcall push_gset2
mov R20,R18
movw R22,R16
.dbline -1
.dbline 145
;
; if((heng>=8)&&(heng<=15))
; {displaychar_right(array1,zong,(heng-8)*8); displaychar_right(array2,zong+1,(heng-8)*8);}
; }
;
; /****************************** LCD汉字显示函数(8*16)****************************************/
;
; void displayL(uchar*array,uchar x,uchar y) //array是点阵字模指针,x是指屏竖方向的坐标,y是指屏横方向上的坐标
; {
.dbline 147
; uchar i;
; lcdcommand(0,0xb8+x); //设置显示本字符的初始地址
mov R18,R20
subi R18,72 ; addi 184
clr R16
xcall _lcdcommand
.dbline 148
; lcdcommand(0,0x40+y);
ldd R18,y+4
subi R18,192 ; addi 64
clr R16
xcall _lcdcommand
.dbline 149
; for(i=0;i<16;i++) //每半个字代码为16元素的数组
clr R20
xjmp L44
L41:
.dbline 150
.dbline 151
mov R30,R20
clr R31
add R30,R22
adc R31,R23
ldd R18,z+0
clr R16
xcall _lcddatas
.dbline 153
L42:
.dbline 149
inc R20
L44:
.dbline 149
cpi R20,16
brlo L41
.dbline -2
L40:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym l y 4 c
.dbsym r x 20 c
.dbsym r array 22 pc
.dbend
.dbfunc e displayR _displayR fV
; i -> R20
; y -> y+4
; x -> R20
; array -> R22,R23
.even
_displayR::
xcall push_gset2
mov R20,R18
movw R22,R16
.dbline -1
.dbline 159
; {
; lcddatas(0,*(array+i));
;
; }
;
; }
;
;
; void displayR(uchar*array,uchar x,uchar y) //array是点阵字模指针,x是指屏竖方向的坐标,y是指屏横方向上的坐标
; {
.dbline 162
; uchar i;
;
; lcdcommand(1,0xb8+x);
mov R18,R20
subi R18,72 ; addi 184
ldi R16,1
xcall _lcdcommand
.dbline 163
; lcdcommand(1,0x40+y);
ldd R18,y+4
subi R18,192 ; addi 64
ldi R16,1
xcall _lcdcommand
.dbline 165
;
; for(i=0;i<16;i++) //每半个字代码为16元素的数组
clr R20
xjmp L49
L46:
.dbline 166
.dbline 167
mov R30,R20
clr R31
add R30,R22
adc R31,R23
ldd R18,z+0
ldi R16,1
xcall _lcddatas
.dbline 168
L47:
.dbline 165
inc R20
L49:
.dbline 165
cpi R20,16
brlo L46
.dbline -2
L45:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym l y 4 c
.dbsym r x 20 c
.dbsym r array 22 pc
.dbend
.dbfunc e display_chinese _display_chinese fV
; heng -> R10
; zong -> R22
; array2 -> R20,R21
; array1 -> R12,R13
.even
_display_chinese::
xcall push_gset4
movw R20,R18
movw R12,R16
sbiw R28,1
ldd R22,y+9
ldd R10,y+11
.dbline -1
.dbline 173
; {
; lcddatas(1,*(array+i));
; }
;
; }
;
; void display_chinese(uchar*array1,uchar*array2,uchar zong,uchar heng)
; {
.dbline 174
; if((heng>=0)&&(heng<=3)) //左半屏显示
mov R24,R10
cpi R24,0
brlo L51
ldi R24,3
cp R24,R10
brlo L51
.dbline 175
; {
.dbline 176
; displayL(array1,zong*2,heng*16); displayL(array2,zong*2+1,heng*16);
ldi R24,16
mul R24,R10
std y+0,R0
ldi R24,2
mul R24,R22
mov R18,R0
movw R16,R12
xcall _displayL
.dbline 176
ldi R24,16
mul R24,R10
std y+0,R0
ldi R24,2
mul R24,R22
mov R18,R0
subi R18,255 ; addi 1
movw R16,R20
xcall _displayL
.dbline 177
; }
L51:
.dbline 178
mov R24,R10
cpi R24,4
brlo L53
ldi R24,7
cp R24,R10
brlo L53
.dbline 179
.dbline 180
ldi R24,16
mul R24,R10
mov R24,R0
subi R24,64
std y+0,R24
ldi R24,2
mul R24,R22
mov R18,R0
movw R16,R12
xcall _displayR
.dbline 180
ldi R24,16
mul R24,R10
mov R24,R0
subi R24,64
std y+0,R24
ldi R24,2
mul R24,R22
mov R18,R0
subi R18,255 ; addi 1
movw R16,R20
xcall _displayR
.dbline 181
L53:
.dbline -2
L50:
adiw R28,1
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r heng 10 c
.dbsym r zong 22 c
.dbsym r array2 20 pc
.dbsym r array1 12 pc
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -