📄 lm1602.s
字号:
.module lm1602.c
.area data(ram, con, rel)
_CGRAMtab::
.blkb 2
.area idata
.byte 12,18
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 18,12
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile F:\avr最小系统板\程序代码\ex15_ds18b20_1602\lm1602.c
.dbsym e CGRAMtab _CGRAMtab A[8:8]c
.area text(rom, con, rel)
.dbfile F:\avr最小系统板\程序代码\ex15_ds18b20_1602\lm1602.c
.dbfunc e CheckBusy _CheckBusy fc
.even
_CheckBusy::
.dbline -1
.dbline 14
; #include "lm1602.h"
; #include "string.h"
; #include <macros.h>
;
;
; /*自定义字符*/
; byte CGRAMtab[] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ; //度的符号
;
;
; void LcdInit(void);
; void DisplayTime(byte hour,byte minute,byte second);
;
; unsigned char CheckBusy(void)
; {
.dbline 16
;
; DDRB = 0x00;
clr R2
out 0x17,R2
.dbline 17
; NOP();
nop
.dbline 18
; NOP();
nop
.dbline 19
; NOP();
nop
.dbline 20
; NOP();
nop
.dbline 21
; NOP();
nop
.dbline 22
; NOP();
nop
.dbline 23
; NOP();
nop
.dbline 24
; NOP();
nop
.dbline 25
; RS_L;
cbi 0x1b,5
.dbline 26
; RW_H;
sbi 0x1b,6
.dbline 27
; EN_H;
sbi 0x1b,7
.dbline 28
; NOP();
nop
.dbline 29
; NOP();
nop
.dbline 30
; NOP();
nop
.dbline 31
; NOP();
nop
.dbline 32
; EN_L;
cbi 0x1b,7
.dbline 33
; if((PINB&0x80)==0x80)
in R24,0x16
andi R24,128
cpi R24,128
brne L2
.dbline 34
; {
.dbline 35
; DDRB = 0xFF;
ldi R24,255
out 0x17,R24
.dbline 36
; return 1;
ldi R16,1
xjmp L1
L2:
.dbline 39
; }
; else
; {
.dbline 40
; DDRB = 0xFF;
ldi R24,255
out 0x17,R24
.dbline 41
; return 0;
clr R16
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay _delay fV
; t -> R16,R17
.even
_delay::
.dbline -1
.dbline 47
; }
;
; }
;
; void delay(void)
; {
.dbline 49
clr R16
clr R17
xjmp L8
L5:
.dbline 49
L6:
.dbline 49
subi R16,255 ; offset = 1
sbci R17,255
L8:
.dbline 49
; unsigned int t;
; for(t=0;t<1000;t++);
cpi R16,232
ldi R30,3
cpc R17,R30
brlo L5
.dbline -2
L4:
.dbline 0 ; func end
ret
.dbsym r t 16 i
.dbend
.dbfunc e WriteCmd _WriteCmd fV
; cmd -> R20
.even
_WriteCmd::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 53
; }
;
; void WriteCmd(byte cmd)
; {
.dbline 55
;
; RS_L;
cbi 0x1b,5
.dbline 56
; RW_L;
cbi 0x1b,6
.dbline 57
; DATAPORT = cmd;
out 0x18,R20
.dbline 58
; EN_H;
sbi 0x1b,7
.dbline 60
; //while(CheckBusy());
; delay();
xcall _delay
.dbline 61
; EN_L;
cbi 0x1b,7
.dbline -2
L9:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r cmd 20 c
.dbend
.dbfunc e WriteData _WriteData fV
; datas -> R20
.even
_WriteData::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 65
; }
;
; void WriteData(byte datas)
; {
.dbline 66
; RS_H;
sbi 0x1b,5
.dbline 67
; RW_L;
cbi 0x1b,6
.dbline 68
; DATAPORT = datas;
out 0x18,R20
.dbline 69
; EN_H;
sbi 0x1b,7
.dbline 70
; delay();
xcall _delay
.dbline 71
; EN_L;
cbi 0x1b,7
.dbline -2
L10:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r datas 20 c
.dbend
.dbfunc e LCD_WriteCGRAM _LCD_WriteCGRAM fV
; i -> R20
; len -> R22
; cgram -> R10,R11
.even
_LCD_WriteCGRAM::
xcall push_gset3
mov R22,R18
movw R10,R16
.dbline -1
.dbline 75
; }
;
; void LCD_WriteCGRAM(byte *cgram,byte len) //自定义字符写入CGRAM函数
; {
.dbline 77
; byte i ;
; WriteCmd(0x40) ; //写CGRAM
ldi R16,64
xcall _WriteCmd
.dbline 78
; for (i = 0 ; i< len ; i++)
clr R20
xjmp L15
L12:
.dbline 79
mov R30,R20
clr R31
add R30,R10
adc R31,R11
ldd R16,z+0
xcall _WriteData
L13:
.dbline 78
inc R20
L15:
.dbline 78
cp R20,R22
brlo L12
.dbline -2
L11:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r len 22 c
.dbsym r cgram 10 pc
.dbend
.dbfunc e ClearLcd _ClearLcd fV
.even
_ClearLcd::
.dbline -1
.dbline 84
; WriteData(*(cgram+i)) ;
; }
;
;
; void ClearLcd(void)
; {
.dbline 85
; WriteCmd(CLR_DIS);
ldi R16,1
xcall _WriteCmd
.dbline -2
L16:
.dbline 0 ; func end
ret
.dbend
.dbfunc e CurReturn _CurReturn fV
.even
_CurReturn::
.dbline -1
.dbline 89
; }
;
; void CurReturn(void)
; {
.dbline 90
; WriteCmd(CUR_RET);
ldi R16,3
xcall _WriteCmd
.dbline -2
L17:
.dbline 0 ; func end
ret
.dbend
.dbfunc e SetInputMode _SetInputMode fV
; setData -> R20
; textMove -> R22
; curDir -> R10
.even
_SetInputMode::
xcall push_gset3
mov R22,R18
mov R10,R16
.dbline -1
.dbline 94
; }
;
; void SetInputMode(byte curDir, byte textMove)
; {
.dbline 95
; byte setData = 0x04;
ldi R20,4
.dbline 96
; if (curDir == 1) //光标右移
mov R24,R10
cpi R24,1
brne L19
.dbline 97
; setData |= 0x02;
ori R20,2
xjmp L20
L19:
.dbline 99
; else
; setData &= ~0x02;
andi R20,253
L20:
.dbline 101
;
; if (textMove == 1) //文字移动
cpi R22,1
brne L21
.dbline 102
; setData |= 0x01;
ori R20,1
xjmp L22
L21:
.dbline 104
; else //文字不移动
; setData &= ~0x01;
andi R20,254
L22:
.dbline 105
; WriteCmd(setData);
mov R16,R20
xcall _WriteCmd
.dbline -2
L18:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r setData 20 c
.dbsym r textMove 22 c
.dbsym r curDir 10 c
.dbend
.dbfunc e SetDisMode _SetDisMode fV
; setData -> R20
; curFlash -> y+6
; curDis -> R22
; allDis -> R10
.even
_SetDisMode::
xcall push_gset3
mov R22,R18
mov R10,R16
.dbline -1
.dbline 109
; }
;
; void SetDisMode(byte allDis, byte curDis, byte curFlash)
; {
.dbline 110
; byte setData = 0x08;
ldi R20,8
.dbline 112
;
; if (allDis == 1) //所有都显示
mov R24,R10
cpi R24,1
brne L24
.dbline 113
; setData |= 0x04;
ori R20,4
xjmp L25
L24:
.dbline 115
; else //都不显示
; setData &= ~0x04;
andi R20,251
L25:
.dbline 117
;
; if (curDis == 1) //光标显示
cpi R22,1
brne L26
.dbline 118
; setData |= 0x02;
ori R20,2
xjmp L27
L26:
.dbline 120
; else //光标不显示
; setData &= ~0x02;
andi R20,253
L27:
.dbline 122
;
; if (curFlash == 1) //光标闪烁
ldd R24,y+6
cpi R24,1
brne L28
.dbline 123
; setData |= 0x01;
ori R20,1
xjmp L29
L28:
.dbline 125
; else ///光标不闪烁
; setData &= ~0x01;
andi R20,254
L29:
.dbline 126
; WriteCmd(setData);
mov R16,R20
xcall _WriteCmd
.dbline -2
L23:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r setData 20 c
.dbsym l curFlash 6 c
.dbsym r curDis 22 c
.dbsym r allDis 10 c
.dbend
.dbfunc e SetFunction _SetFunction fV
; setData -> R20
; fDis -> y+6
; lineDis -> R22
; numBus -> R10
.even
_SetFunction::
xcall push_gset3
mov R22,R18
mov R10,R16
.dbline -1
.dbline 146
; }
; /*
; void SetShift(byte cMove, byte cDir)
; {
; byte setData = 0x10;
;
; if (cMove == 1) //移动文字
; setData |= 0x08;
; else //移动光标
; setData &= ~0x08;
;
; if (cDir == 1) //右移
; setData |= 0x04;
; else //左移
; setData &= ~0x04;
; WriteCmd(setData);
; }
; */
; void SetFunction(byte numBus, byte lineDis, byte fDis)
; {
.dbline 147
; byte setData = 0x20;
ldi R20,32
.dbline 149
;
; if (numBus == 1) //4位总线
mov R24,R10
cpi R24,1
brne L31
.dbline 150
; setData |= 0x10;
ori R20,16
xjmp L32
L31:
.dbline 152
; else //8位总线
; setData &= ~0x10;
andi R20,239
L32:
.dbline 154
;
; if (lineDis == 1) //双行显示
cpi R22,1
brne L33
.dbline 155
; setData |= 0x08;
ori R20,8
xjmp L34
L33:
.dbline 157
; else //单行显示
; setData &= ~0x08;
andi R20,247
L34:
.dbline 159
;
; if (fDis == 1) //5*10点阵
ldd R24,y+6
cpi R24,1
brne L35
.dbline 160
; setData |= 0x04;
ori R20,4
xjmp L36
L35:
.dbline 162
; else ///5*7点阵
; setData &= ~0x04;
andi R20,251
L36:
.dbline 163
; WriteCmd(setData);
mov R16,R20
xcall _WriteCmd
.dbline -2
L30:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r setData 20 c
.dbsym l fDis 6 c
.dbsym r lineDis 22 c
.dbsym r numBus 10 c
.dbend
.dbfunc e SetDisAddr _SetDisAddr fV
; ucol -> R20
; urow -> R22
.even
_SetDisAddr::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 174
; }
; /*
; void SetCGRAMAddr(byte ramAddr)
; {
; byte setData = 0x40;
; setData |= (ramAddr &0x3f);
; WriteCmd(setData);
; }
; */
; void SetDisAddr(byte urow, byte ucol)
; {
.dbline 175
; if (ucol >= 20)
cpi R20,20
brlo L38
.dbline 176
; ucol= 20;
ldi R20,20
L38:
.dbline 177
; if (urow == 0)
tst R22
brne L40
.dbline 178
; WriteCmd( 0x80+ucol);
mov R16,R20
subi R16,128 ; addi 128
xcall _WriteCmd
xjmp L41
L40:
.dbline 180
mov R16,R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -