📄 lcd0.lis
字号:
.module lcd0.c
.area text(rom, con, rel)
; i -> R10
; j -> R16,R17
.even
0000 _timeDelay::
0000 AA92 st -y,R10
0002 ; #include "lcd0.h"
0002 ;
0002 ; void timeDelay(unsigned int j) /* 延时 */
0002 ; {
0002 ; unsigned char i;
0002 ;
0002 ; for(i = 0;i < j;i++);
0002 AA24 clr R10
0004 01C0 xjmp L5
0006 L2:
0006 L3:
0006 A394 inc R10
0008 L5:
0008 2A2C mov R2,R10
000A 3324 clr R3
000C 2016 cp R2,R16
000E 3106 cpc R3,R17
0010 D0F3 brlo L2
0012 X0:
0012 L1:
0012 .dbline 0 ; func end
0012 A990 ld R10,y+
0014 0895 ret
0016 ; ucData -> R16
.even
0016 _lcdWrite::
0016 ; }
0016 ;
0016 ; void lcdWrite(unsigned char ucData)
0016 ; {
0016 L7:
0016 ; while ((PINE & 0x80) != 0x00); /* ASK=1,状态为忙,不能接收数据 */
0016 L8:
0016 0F99 sbic 0x1,7
0018 FECF rjmp L7
001A X1:
001A ;
001A ; DATA_H;
001A C09A sbi 0x18,0
001C ; PORTA = ucData;
001C 0BBB out 0x1b,R16
001E ; DATA_L;
001E C098 cbi 0x18,0
0020 ; REQUEST_H;
0020 1E9A sbi 0x03,6
0022 L10:
0022 ;
0022 ; while((PINE & 0x80) == 0x00); /* ASK=0,闲,接收数据 */
0022 L11:
0022 0F9B sbis 0x1,7
0024 FECF rjmp L10
0026 X2:
0026 L6:
0026 .dbline 0 ; func end
0026 0895 ret
.even
0028 _lcdInitiate::
0028 ; }
0028 ;
0028 ; void lcdInitiate(void)
0028 ; {
0028 ; DDRB |= 0x01; /* 定义PB0(LCD)口为输出 */
0028 B89A sbi 0x17,0
002A ; PORTB &= 0xfe; /* PB0口输出为0 */
002A 88B3 in R24,0x18
002C 8E7F andi R24,254
002E 88BB out 0x18,R24
0030 ; DDRE = 0x40; /* PE6为输出 */
0030 80E4 ldi R24,64
0032 82B9 out 0x2,R24
0034 ; PORTE = 0xff; /* PE口输出为1 */
0034 8FEF ldi R24,255
0036 83B9 out 0x3,R24
0038 ; timeDelay(10);
0038 0AE0 ldi R16,10
003A 10E0 ldi R17,0
003C E1DF xcall _timeDelay
003E L13:
003E .dbline 0 ; func end
003E 0895 ret
.even
0040 _lcdClear::
0040 ; }
0040 ;
0040 ; void lcdClear(void)
0040 ; {
0040 ; lcdWrite(0xf4); /* 清屏 */
0040 04EF ldi R16,244
0042 E9DF xcall _lcdWrite
0044 L14:
0044 .dbline 0 ; func end
0044 0895 ret
0046 ; ucpData -> R20,R21
0046 ; ucY -> R10
0046 ; ucX -> R22
.even
0046 _characterDisplay::
0046 0E940000 xcall push_xgsetF00C
004A A22E mov R10,R18
004C 602F mov R22,R16
004E 4E81 ldd R20,y+6
0050 5F81 ldd R21,y+7
0052 ; }
0052 ;
0052 ; void characterDisplay(unsigned char ucX,unsigned char ucY,unsigned char *ucpData)
0052 ; {
0052 13C0 xjmp L17
0054 L16:
0054 ; while (*ucpData)
0054 ; {
0054 ; lcdWrite(0xf1); /* 显示8*8 ASCLL 字符 */
0054 01EF ldi R16,241
0056 DFDF xcall _lcdWrite
0058 ; lcdWrite(ucX); /* X坐标 */
0058 062F mov R16,R22
005A DDDF xcall _lcdWrite
005C ; lcdWrite(ucY); /* Y坐标 */
005C 0A2D mov R16,R10
005E DBDF xcall _lcdWrite
0060 ; lcdWrite(*ucpData);
0060 FA01 movw R30,R20
0062 0081 ldd R16,z+0
0064 D8DF xcall _lcdWrite
0066 ; ucpData++;
0066 4F5F subi R20,255 ; offset = 1
0068 5F4F sbci R21,255
006A ;
006A ; if (ucX >= 19) /* 换行 */
006A 6331 cpi R22,19
006C 28F0 brlo L19
006E X3:
006E ; {
006E ; ucX = 0x04;
006E 64E0 ldi R22,4
0070 ; ucY += 8;
0070 8A2D mov R24,R10
0072 885F subi R24,248 ; addi 8
0074 A82E mov R10,R24
0076 ; }
0076 01C0 xjmp L20
0078 L19:
0078 ; else
0078 ; {
0078 ; ucX++;
0078 6395 inc R22
007A ; }
007A L20:
007A ; }
007A L17:
007A FA01 movw R30,R20
007C 2080 ldd R2,z+0
007E 2220 tst R2
0080 49F7 brne L16
0082 X4:
0082 L15:
0082 .dbline 0 ; func end
0082 0C940000 xjmp pop_xgsetF00C
0086 ; ucpData -> R20,R21
0086 ; ucY -> R10
0086 ; ucX -> R22
.even
0086 _chineseDisplay::
0086 0E940000 xcall push_xgsetF00C
008A A22E mov R10,R18
008C 602F mov R22,R16
008E 4E81 ldd R20,y+6
0090 5F81 ldd R21,y+7
0092 ; }
0092 ;
0092 ; void chineseDisplay(unsigned char ucX,unsigned char ucY,unsigned char *ucpData)
0092 ; {
0092 18C0 xjmp L23
0094 L22:
0094 ;
0094 ; while (*ucpData)
0094 ; {
0094 ; lcdWrite(0xf0); /* 显示国标汉字 */
0094 00EF ldi R16,240
0096 BFDF xcall _lcdWrite
0098 ; lcdWrite(ucX);
0098 062F mov R16,R22
009A BDDF xcall _lcdWrite
009C ; lcdWrite(ucY);
009C 0A2D mov R16,R10
009E BBDF xcall _lcdWrite
00A0 ; lcdWrite(*ucpData - 0xa0);
00A0 FA01 movw R30,R20
00A2 0081 ldd R16,z+0
00A4 005A subi R16,160
00A6 B7DF xcall _lcdWrite
00A8 ; ucpData++;
00A8 4F5F subi R20,255 ; offset = 1
00AA 5F4F sbci R21,255
00AC ; lcdWrite(*ucpData - 0xa0);
00AC FA01 movw R30,R20
00AE 0081 ldd R16,z+0
00B0 005A subi R16,160
00B2 B1DF xcall _lcdWrite
00B4 ; ucpData++;
00B4 4F5F subi R20,255 ; offset = 1
00B6 5F4F sbci R21,255
00B8 ; if (ucX >= 9)
00B8 6930 cpi R22,9
00BA 18F0 brlo L25
00BC X5:
00BC ; {
00BC ; ucX = 2;
00BC 62E0 ldi R22,2
00BE ; ucY ++;
00BE A394 inc R10
00C0 ; }else
00C0 01C0 xjmp L26
00C2 L25:
00C2 ; {
00C2 ; ucX++;
00C2 6395 inc R22
00C4 ; }
00C4 L26:
00C4 ; }
00C4 L23:
00C4 FA01 movw R30,R20
00C6 2080 ldd R2,z+0
00C8 2220 tst R2
00CA 21F7 brne L22
00CC X6:
00CC L21:
00CC .dbline 0 ; func end
00CC 0C940000 xjmp pop_xgsetF00C
00D0 ; }
00D0 ;
00D0 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -