⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.s

📁 ATmega16休眠模式的应用:使用程序关闭没有使用的模块
💻 S
字号:
	.module lcd.c
	.area text(rom, con, rel)
	.dbfile F:\radio\第十二篇\sleep\lcd.c
	.dbfunc e ClearLcd _ClearLcd fV
	.even
_ClearLcd::
	.dbline -1
	.dbline 40
; #include <iom16v.h>
; #include <macros.h>
; #include "delay.h"
; #define delay125ns NOP()
; #define delay250ns NOP();NOP()
; #define delay500ns NOP();NOP();NOP();NOP()
; //;NOP()
; 
; #define delay1us NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP()
; #define delay2us delay1us;delay1us
; #define RS PD4
; #define RW PD5
; #define EN PD7
; #define DataLcd PORTB
; #define DataLcdIn PINB
; #define DataOut DDRB = 0XFF
; #define DataIn DDRB = 0
; 
; #define RS_0 PORTD &=~ (1<<RS)
; #define RS_1 PORTD |=  (1<<RS)
; #define RW_0 PORTD &=~ (1<<RW)
; #define RW_1 PORTD |=  (1<<RW)
; #define EN_0 PORTD &=~ (1<<EN)
; #define EN_1 PORTD |=  (1<<EN)
; /*时钟为8MHZ* /
; void delay_1us(void)
; {
;    asm("nop");
; }
; void delay_us(unsigned int itimes)
; {
;    unsigned int itemp;
;    for (itemp=0;itemp<itimes;itemp++)
;       {
; 	     delay_1us();
; 	  }
; }
; /**/
; void ClearLcd(void) 
; {
	.dbline 41
;    EN_0;
	cbi 0x12,7
	.dbline 42
;    RS_0;
	cbi 0x12,4
	.dbline 43
;    RW_0;
	cbi 0x12,5
	.dbline 44
;    DataOut;
	ldi R24,255
	out 0x17,R24
	.dbline 45
;    DataLcd = 1;
	ldi R24,1
	out 0x18,R24
	.dbline 46
;    delay250ns;
	nop
	.dbline 46
	nop
	.dbline 47
;    EN_1;
	sbi 0x12,7
	.dbline 48
;    delay500ns;
	nop
	.dbline 48
	nop
	.dbline 48
	nop
	.dbline 48
	nop
	.dbline 49
;    EN_0;
	cbi 0x12,7
	.dbline 50
;    delay125ns;
	nop
	.dbline 51
;    RS_1;
	sbi 0x12,4
	.dbline 52
;    RW_1;
	sbi 0x12,5
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e home _home fV
	.even
_home::
	.dbline -1
	.dbline 56
; }   
; /**/
; void home(void)
; {
	.dbline 57
;    RS_0;
	cbi 0x12,4
	.dbline 58
;    RW_0;
	cbi 0x12,5
	.dbline 59
;    DataLcd = 2;
	ldi R24,2
	out 0x18,R24
	.dbline 60
;    delay250ns;
	nop
	.dbline 60
	nop
	.dbline 61
;    EN_1;
	sbi 0x12,7
	.dbline 62
;    delay500ns;
	nop
	.dbline 62
	nop
	.dbline 62
	nop
	.dbline 62
	nop
	.dbline 63
;    EN_0;
	cbi 0x12,7
	.dbline 64
;    delay125ns;
	nop
	.dbline 65
;    RS_1;
	sbi 0x12,4
	.dbline 66
;    RW_1;
	sbi 0x12,5
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e InputSet _InputSet fV
	.even
_InputSet::
	.dbline -1
	.dbline 69
; }
; void InputSet(void)
; {
	.dbline 70
;    RS_0;
	cbi 0x12,4
	.dbline 71
;    RW_0;
	cbi 0x12,5
	.dbline 72
;    DataLcd = 6;   //
	ldi R24,6
	out 0x18,R24
	.dbline 73
;    delay250ns;
	nop
	.dbline 73
	nop
	.dbline 74
;    EN_1;
	sbi 0x12,7
	.dbline 75
;    delay500ns;
	nop
	.dbline 75
	nop
	.dbline 75
	nop
	.dbline 75
	nop
	.dbline 76
;    EN_0;
	cbi 0x12,7
	.dbline 77
;    delay125ns;
	nop
	.dbline 78
;    RS_1;
	sbi 0x12,4
	.dbline 79
;    RW_1;
	sbi 0x12,5
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e VisionSet _VisionSet fV
	.even
_VisionSet::
	.dbline -1
	.dbline 82
; }
; void VisionSet(void)
; {
	.dbline 83
;    EN_0;
	cbi 0x12,7
	.dbline 84
;    RS_0;
	cbi 0x12,4
	.dbline 85
;    RW_0;
	cbi 0x12,5
	.dbline 86
;    DataLcd = 0x0f;   //设置D=1,C=1,B=1
	ldi R24,15
	out 0x18,R24
	.dbline 87
;    delay250ns;
	nop
	.dbline 87
	nop
	.dbline 88
;    EN_1;
	sbi 0x12,7
	.dbline 89
;    delay500ns;
	nop
	.dbline 89
	nop
	.dbline 89
	nop
	.dbline 89
	nop
	.dbline 90
;    EN_0;
	cbi 0x12,7
	.dbline 91
;    delay125ns;
	nop
	.dbline 92
;    RS_1;
	sbi 0x12,4
	.dbline 93
;    RW_1;
	sbi 0x12,5
	.dbline -2
L4:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e FunctionSet _FunctionSet fV
	.even
_FunctionSet::
	.dbline -1
	.dbline 96
; }
; void FunctionSet(void)
; {
	.dbline 97
;    DataOut;
	ldi R24,255
	out 0x17,R24
	.dbline 98
;    EN_0;
	cbi 0x12,7
	.dbline 99
;    RS_0;
	cbi 0x12,4
	.dbline 100
;    RW_0;
	cbi 0x12,5
	.dbline 101
;    DataLcd = 0x38;   //设置DL=1,N=1,F=0
	ldi R24,56
	out 0x18,R24
	.dbline 102
;    delay250ns;       //地址建立时间,最小140ns
	nop
	.dbline 102
	nop
	.dbline 103
;    EN_1;
	sbi 0x12,7
	.dbline 104
;    delay500ns;      //脉冲宽度,最小450ns
	nop
	.dbline 104
	nop
	.dbline 104
	nop
	.dbline 104
	nop
	.dbline 105
;    EN_0;
	cbi 0x12,7
	.dbline 106
;    delay125ns;     //地址保持时间,最小10ns
	nop
	.dbline 107
;    RS_1;
	sbi 0x12,4
	.dbline 108
;    RW_1;
	sbi 0x12,5
	.dbline -2
L5:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e CgramSet _CgramSet fV
	.even
_CgramSet::
	.dbline -1
	.dbline 111
; }
; void CgramSet(void)
; {
	.dbline -2
L6:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e DdramSet _DdramSet fV
;           addr -> R16
	.even
_DdramSet::
	.dbline -1
	.dbline 115
;    
; }
; void DdramSet(unsigned char addr)
; {
	.dbline 116
;    EN_0;
	cbi 0x12,7
	.dbline 117
;    RS_0;
	cbi 0x12,4
	.dbline 118
;    RW_0;
	cbi 0x12,5
	.dbline 119
;    DataLcd = (0x80+addr);   //
	mov R24,R16
	subi R24,128    ; addi 128
	out 0x18,R24
	.dbline 120
;    delay250ns;
	nop
	.dbline 120
	nop
	.dbline 121
;    EN_1;
	sbi 0x12,7
	.dbline 122
;    delay500ns;
	nop
	.dbline 122
	nop
	.dbline 122
	nop
	.dbline 122
	nop
	.dbline 123
;    EN_0;
	cbi 0x12,7
	.dbline 124
;    delay125ns; 
	nop
	.dbline 125
;    RS_1;
	sbi 0x12,4
	.dbline 126
;    RW_1;
	sbi 0x12,5
	.dbline -2
L7:
	.dbline 0 ; func end
	ret
	.dbsym r addr 16 c
	.dbend
	.dbfunc e BFRead _BFRead fc
;             bf -> R16
	.even
_BFRead::
	.dbline -1
	.dbline 129
; }
; unsigned char BFRead(void)
; {
	.dbline 131
;    unsigned char bf;
;    RS_0;
	cbi 0x12,4
	.dbline 132
;    RW_1;  
	sbi 0x12,5
	.dbline 133
;    delay250ns;
	nop
	.dbline 133
	nop
	.dbline 134
;    EN_1;
	sbi 0x12,7
	.dbline 135
;    delay500ns;
	nop
	.dbline 135
	nop
	.dbline 135
	nop
	.dbline 135
	nop
	.dbline 136
;    DataIn;
	clr R2
	out 0x17,R2
	.dbline 137
;    bf = DataLcdIn;
	in R16,0x16
	.dbline 138
;    EN_0;
	cbi 0x12,7
	.dbline 139
;    delay125ns; 
	nop
	.dbline 140
;    RS_1;
	sbi 0x12,4
	.dbline 141
;    RW_0;
	cbi 0x12,5
	.dbline 143
;    
;    return bf;
	.dbline -2
L8:
	.dbline 0 ; func end
	ret
	.dbsym r bf 16 c
	.dbend
	.dbfunc e LCDReady _LCDReady fV
;             bf -> R20
	.even
_LCDReady::
	xcall push_gset1
	.dbline -1
	.dbline 146
; }
; void LCDReady(void)
; {
L10:
	.dbline 149
;    unsigned char bf;
;    do
;       {bf = BFRead();
	.dbline 149
	xcall _BFRead
	mov R20,R16
	.dbline 151
; 	  //PORTA = bf;       //just for debug
; 	  }
L11:
	.dbline 152
;    while((bf&0x80)==0x80);
	mov R2,R20
	clr R3
	sbrc R2,7
	rjmp L10
	.dbline 153
;    DataOut;
	ldi R24,255
	out 0x17,R24
	.dbline -2
L9:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r bf 20 c
	.dbend
	.dbfunc e CharWrite _CharWrite fV
;           data -> R20
	.even
_CharWrite::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 156
; }
; void CharWrite(unsigned char data)
; {
	.dbline 157
;    LCDReady();
	xcall _LCDReady
	.dbline 158
;    RS_1;
	sbi 0x12,4
	.dbline 159
;    RW_0;
	cbi 0x12,5
	.dbline 160
;    DataLcd = data;   //
	out 0x18,R20
	.dbline 161
;    delay250ns;
	nop
	.dbline 161
	nop
	.dbline 162
;    EN_1;
	sbi 0x12,7
	.dbline 163
;    delay500ns;
	nop
	.dbline 163
	nop
	.dbline 163
	nop
	.dbline 163
	nop
	.dbline 164
;    EN_0;
	cbi 0x12,7
	.dbline 165
;    delay125ns; 
	nop
	.dbline 166
;    RS_0;
	cbi 0x12,4
	.dbline 167
;    RW_1;
	sbi 0x12,5
	.dbline -2
L13:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbend
	.dbfunc e LcdInit _LcdInit fV
	.even
_LcdInit::
	.dbline -1
	.dbline 170
; }
; void LcdInit(void)
; {
	.dbline 171
;    LCDReady();
	xcall _LCDReady
	.dbline 172
;    FunctionSet();
	xcall _FunctionSet
	.dbline 173
;    LCDReady();
	xcall _LCDReady
	.dbline 174
;    DdramSet(0);
	clr R16
	xcall _DdramSet
	.dbline 175
;    LCDReady();
	xcall _LCDReady
	.dbline 176
;    VisionSet();
	xcall _VisionSet
	.dbline 177
;    LCDReady();
	xcall _LCDReady
	.dbline 178
;    InputSet();
	xcall _InputSet
	.dbline 179
;    LCDReady();
	xcall _LCDReady
	.dbline 180
;    ClearLcd();
	xcall _ClearLcd
	.dbline 181
;    LCDReady();
	xcall _LCDReady
	.dbline 182
;    home();
	xcall _home
	.dbline 183
;    delay_us(10);
	ldi R16,10
	ldi R17,0
	xcall _delay_us
	.dbline -2
L14:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e CharsWrite _CharsWrite fV
;           addr -> R22
;              s -> R20,R21
;          addry -> R12
;          addrx -> R10
	.even
_CharsWrite::
	xcall push_gset4
	mov R12,R18
	mov R10,R16
	ldd R20,y+8
	ldd R21,y+9
	.dbline -1
	.dbline 186
; }
; void CharsWrite(unsigned char addrx,unsigned char addry,unsigned char *s)
; {
	.dbline 188
;    unsigned char addr;
;    if (addry==1)
	mov R24,R12
	cpi R24,1
	brne L16
	.dbline 189
;    {
	.dbline 190
;       addr = addrx;
	mov R22,R10
	.dbline 191
;    }
	xjmp L17
L16:
	.dbline 192
;    else if (addry==2)
	mov R24,R12
	cpi R24,2
	brne L18
	.dbline 193
;    {
	.dbline 194
;       addr = (addrx+0x40);
	mov R22,R10
	subi R22,192    ; addi 64
	.dbline 195
;    }
	xjmp L19
L18:
	.dbline 197
;    else
;    {
	.dbline 198
;       addr = 0;
	clr R22
	.dbline 199
;    }
L19:
L17:
	.dbline 200
;    DdramSet(0);     //初始化ddram地址
	clr R16
	xcall _DdramSet
	.dbline 201
;    LCDReady();
	xcall _LCDReady
	.dbline 202
;    DdramSet(addr);  //设定ddram地址
	mov R16,R22
	xcall _DdramSet
	.dbline 203
;    delay_us(80);
	ldi R16,80
	ldi R17,0
	xcall _delay_us
	xjmp L21
L20:
	.dbline 205
	.dbline 206
	movw R30,R20
	ldd R16,z+0
	xcall _CharWrite
	.dbline 207
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 208
	ldi R16,80
	ldi R17,0
	xcall _delay_us
	.dbline 209
L21:
	.dbline 204
;    while(*s)
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L20
	.dbline -2
L15:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r addr 22 c
	.dbsym r s 20 pc
	.dbsym r addry 12 c
	.dbsym r addrx 10 c
	.dbend
	.dbfunc e DataWrite _DataWrite fV
;           addr -> R22
;              s -> R20,R21
;          addry -> R12
;          addrx -> R10
	.even
_DataWrite::
	xcall push_gset4
	mov R12,R18
	mov R10,R16
	ldd R20,y+8
	ldd R21,y+9
	.dbline -1
	.dbline 212
;    {
;      CharWrite(*s);
; 	 s++;
; 	 delay_us(80);   //等待写入操作完成
;    }
; }
; void DataWrite(unsigned char addrx,unsigned char addry,unsigned char *s)
; {
	.dbline 214
;    unsigned char addr;
;    if (addry==1)
	mov R24,R12
	cpi R24,1
	brne L24
	.dbline 215
;    {
	.dbline 216
;       addr = addrx;
	mov R22,R10
	.dbline 217
;    }
	xjmp L25
L24:
	.dbline 218
;    else if (addry==2)
	mov R24,R12
	cpi R24,2
	brne L26
	.dbline 219
;    {
	.dbline 220
;       addr = (addrx+0x40);
	mov R22,R10
	subi R22,192    ; addi 64
	.dbline 221
;    }
	xjmp L27
L26:
	.dbline 223
;    else
;    {
	.dbline 224
;       addr = 0;
	clr R22
	.dbline 225
;    }
L27:
L25:
	.dbline 226
;    DdramSet(0);     //初始化ddram地址
	clr R16
	xcall _DdramSet
	.dbline 227
;    LCDReady();
	xcall _LCDReady
	.dbline 228
;    DdramSet(addr);  //设定ddram地址
	mov R16,R22
	xcall _DdramSet
	.dbline 229
;    delay_us(80);
	ldi R16,80
	ldi R17,0
	xcall _delay_us
	xjmp L29
L28:
	.dbline 231
	.dbline 232
	movw R30,R20
	ldd R16,z+0
	subi R16,208    ; addi 48
	xcall _CharWrite
	.dbline 233
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 234
	ldi R16,80
	ldi R17,0
	xcall _delay_us
	.dbline 235
L29:
	.dbline 230
;    while(*s!=0XFF)
	movw R30,R20
	ldd R24,z+0
	cpi R24,255
	brne L28
	.dbline -2
L23:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r addr 22 c
	.dbsym r s 20 pc
	.dbsym r addry 12 c
	.dbsym r addrx 10 c
	.dbend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -