📄 lcd.lis
字号:
.module lcd.c
.area text(rom, con, rel)
0000 .dbfile C:\DOCUME~1\Administrator\桌面\USING07-07\Mega128\12c887\lcd.c
0000 .dbfunc e port_init _port_init fV
.even
0000 _port_init::
0000 .dbline -1
0000 .dbline 8
0000 ; #include <iom128v.h>
0000 ; #include <macros.h>
0000 ; #include "lcd.h"
0000 ; typedef unsigned char uchar;
0000 ; typedef unsigned int uint;
0000 ;
0000 ; void port_init(void)
0000 ; {
0000 .dbline 10
0000 ; //访问外部ram的总线端口
0000 ; PORTA = 0x00;
0000 2224 clr R2
0002 2BBA out 0x1b,R2
0004 .dbline 11
0004 ; DDRA = 0x00;
0004 2ABA out 0x1a,R2
0006 .dbline 12
0006 ; PORTC = 0x00;
0006 25BA out 0x15,R2
0008 .dbline 13
0008 ; DDRC = 0xFF;
0008 8FEF ldi R24,255
000A 84BB out 0x14,R24
000C .dbline -2
000C L1:
000C .dbline 0 ; func end
000C 0895 ret
000E .dbend
000E .dbfunc e check_busy _check_busy fV
000E ; temp -> R20
000E ; cs -> R16
.even
000E _check_busy::
000E 0E940000 xcall push_gset1
0012 .dbline -1
0012 .dbline 17
0012 ; }
0012 ;
0012 ; void check_busy(uchar cs)
0012 ; {
0012 09C0 xjmp L4
0014 L3:
0014 .dbline 20
0014 ; uchar temp;
0014 ; while(temp)
0014 ; {
0014 .dbline 21
0014 ; if(cs)
0014 0023 tst R16
0016 21F0 breq L6
0018 .dbline 22
0018 ; temp=R_staus&0X80; //将忙状态读到temp中进行确定
0018 40910099 lds R20,39168
001C 4078 andi R20,128
001E 03C0 xjmp L7
0020 L6:
0020 .dbline 24
0020 ; else
0020 ; temp=L_staus&0X80;
0020 40910095 lds R20,38144
0024 4078 andi R20,128
0026 L7:
0026 .dbline 25
0026 L4:
0026 .dbline 19
0026 4423 tst R20
0028 A9F7 brne L3
002A .dbline -2
002A L2:
002A 0E940000 xcall pop_gset1
002E .dbline 0 ; func end
002E 0895 ret
0030 .dbsym r temp 20 c
0030 .dbsym r cs 16 c
0030 .dbend
0030 .dbfunc e lcdcommand _lcdcommand fV
0030 ; com -> R20
0030 ; cs -> R22
.even
0030 _lcdcommand::
0030 0E940000 xcall push_gset2
0034 422F mov R20,R18
0036 602F mov R22,R16
0038 .dbline -1
0038 .dbline 30
0038 ; }
0038 ; }
0038 ;
0038 ;
0038 ; void lcdcommand(uchar cs,uchar com)
0038 ; {
0038 .dbline 31
0038 ; if(cs)
0038 6623 tst R22
003A 29F0 breq L9
003C .dbline 32
003C ; {
003C .dbline 33
003C ; check_busy(1);
003C 01E0 ldi R16,1
003E E7DF xcall _check_busy
0040 .dbline 34
0040 ; R_command=com;
0040 40930098 sts 38912,R20
0044 .dbline 35
0044 ; }
0044 04C0 xjmp L10
0046 L9:
0046 .dbline 37
0046 .dbline 38
0046 0027 clr R16
0048 E2DF xcall _check_busy
004A .dbline 39
004A 40930094 sts 37888,R20
004E .dbline 40
004E L10:
004E .dbline -2
004E L8:
004E 0E940000 xcall pop_gset2
0052 .dbline 0 ; func end
0052 0895 ret
0054 .dbsym r com 20 c
0054 .dbsym r cs 22 c
0054 .dbend
0054 .dbfunc e lcddatas _lcddatas fV
0054 ; dd -> R20
0054 ; cs -> R22
.even
0054 _lcddatas::
0054 0E940000 xcall push_gset2
0058 422F mov R20,R18
005A 602F mov R22,R16
005C .dbline -1
005C .dbline 46
005C ; else
005C ; {
005C ; check_busy(0);
005C ; L_command=com;
005C ; }
005C ; }
005C ;
005C ; /*************************向LCD写数据函数*************************/
005C ;
005C ; void lcddatas(char cs,uchar dd)
005C ; {
005C .dbline 47
005C ; if(cs)
005C 6623 tst R22
005E 29F0 breq L12
0060 .dbline 48
0060 ; {
0060 .dbline 49
0060 ; check_busy(1);
0060 01E0 ldi R16,1
0062 D5DF xcall _check_busy
0064 .dbline 50
0064 ; R_data=dd;
0064 4093009A sts 39424,R20
0068 .dbline 51
0068 ; }
0068 04C0 xjmp L13
006A L12:
006A .dbline 53
006A .dbline 54
006A 0027 clr R16
006C D0DF xcall _check_busy
006E .dbline 55
006E 40930096 sts 38400,R20
0072 .dbline 56
0072 L13:
0072 .dbline -2
0072 L11:
0072 0E940000 xcall pop_gset2
0076 .dbline 0 ; func end
0076 0895 ret
0078 .dbsym r dd 20 c
0078 .dbsym r cs 22 c
0078 .dbend
0078 .dbfunc e LCD_Clean _LCD_Clean fV
0078 ; x -> R20
0078 ; y -> R22
.even
0078 _LCD_Clean::
0078 0E940000 xcall push_gset2
007C .dbline -1
007C .dbline 62
007C ; else
007C ; {
007C ; check_busy(0);
007C ; L_data=dd;
007C ; }
007C ; }
007C ;
007C ; /**************************** LCD清屏函数*******************************/
007C ;
007C ; void LCD_Clean(void)
007C ; {
007C .dbline 64
007C ; unsigned char x,y;
007C ; for(x=0xb8;x<=0xbf;x++) //一页一页的写
007C 48EB ldi R20,184
007E 18C0 xjmp L18
0080 L15:
0080 .dbline 65
0080 ; {
0080 .dbline 66
0080 ; lcdcommand(0,x);
0080 242F mov R18,R20
0082 0027 clr R16
0084 D5DF xcall _lcdcommand
0086 .dbline 67
0086 ; lcdcommand(1,x); //设定X方向地址,X地址不能自增。要靠程序加
0086 242F mov R18,R20
0088 01E0 ldi R16,1
008A D2DF xcall _lcdcommand
008C .dbline 68
008C ; lcdcommand(0,LCD_Y); //设置Y的初始地址,Y可自加
008C 20E4 ldi R18,64
008E 0027 clr R16
0090 CFDF xcall _lcdcommand
0092 .dbline 69
0092 ; lcdcommand(1,LCD_Y);
0092 20E4 ldi R18,64
0094 01E0 ldi R16,1
0096 CCDF xcall _lcdcommand
0098 .dbline 70
0098 ; for(y=0;y<64;y++)
0098 6627 clr R22
009A 07C0 xjmp L22
009C L19:
009C .dbline 71
009C .dbline 72
009C 2227 clr R18
009E 0027 clr R16
00A0 D9DF xcall _lcddatas
00A2 .dbline 73
00A2 2227 clr R18
00A4 01E0 ldi R16,1
00A6 D6DF xcall _lcddatas
00A8 .dbline 74
00A8 L20:
00A8 .dbline 70
00A8 6395 inc R22
00AA L22:
00AA .dbline 70
00AA 6034 cpi R22,64
00AC B8F3 brlo L19
00AE .dbline 75
00AE L16:
00AE .dbline 64
00AE 4395 inc R20
00B0 L18:
00B0 .dbline 64
00B0 8FEB ldi R24,191
00B2 8417 cp R24,R20
00B4 28F7 brsh L15
00B6 .dbline -2
00B6 L14:
00B6 0E940000 xcall pop_gset2
00BA .dbline 0 ; func end
00BA 0895 ret
00BC .dbsym r x 20 c
00BC .dbsym r y 22 c
00BC .dbend
00BC .dbfunc e LCD_Init _LCD_Init fV
.even
00BC _LCD_Init::
00BC .dbline -1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -