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

📄 lcd7920.s

📁 网卡驱动程序
💻 S
字号:
	.module Lcd7920.c
	.area text(rom, con, rel)
	.dbfile E:\__test\_RTL8019_M128_struct_Test\Lcd7920.c
	.dbfunc e LCD_Init _LCD_Init fV
	.even
_LCD_Init::
	.dbline -1
	.dbline 16
; //本程序测试通过     --2007.11.27
; 
; //本程序是7920的LM3037的液晶驱动程序
; //汉字2x9
; //可显示图形
; //ATMEGA16, 内部晶振8M  (也可用于外部7.3728MHz晶振)
; //使用串行传输 (2线)
; 
; #include "Lcd7920.h"
; 
; #define LINEWIDTH 18  //行宽
; #define LINES 2       //行数
; 
; //LCD初始化
; void LCD_Init(void)
; {
	.dbline 17
; 	Delay_nms(100);
	ldi R16,100
	ldi R17,0
	xcall _Delay_nms
	.dbline 20
; 
;  	//端口初始化
; 	LCD_CONTROL_DDR=0xFF; 
	ldi R24,255
	out 0x14,R24
	.dbline 22
; 
; 	CLRBIT(LCD_CONTROL_PORT,E);
	cbi 0x15,3
	.dbline 23
; 	CLRBIT(LCD_CONTROL_PORT,RW);
	cbi 0x15,2
	.dbline 24
; 	Delay_nms(1);
	ldi R16,1
	ldi R17,0
	xcall _Delay_nms
	.dbline 26
; 	
; 	LCD_WriteCmd(0x20);    // 8bit I/F, basic command, graphic off
	ldi R16,32
	xcall _LCD_WriteCmd
	.dbline 27
; 	LCD_WriteCmd(0x20);    // 8bit I/F, basic command, graphic off
	ldi R16,32
	xcall _LCD_WriteCmd
	.dbline 28
; 	LCD_WriteCmd(0x0C);    // display on
	ldi R16,12
	xcall _LCD_WriteCmd
	.dbline 29
; 	LCD_WriteCmd(0x06);    // cursor right shift
	ldi R16,6
	xcall _LCD_WriteCmd
	.dbline 31
; 	
; 	LCD_Clear();    // cursor right shift	
	xcall _LCD_Clear
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_Clear _LCD_Clear fV
	.even
_LCD_Clear::
	.dbline -1
	.dbline 37
; }
; 
; 
; //LCD清屏
; void  LCD_Clear(void)
; {
	.dbline 38
;    LCD_WriteCmd(0x01);
	ldi R16,1
	xcall _LCD_WriteCmd
	.dbline 39
;    Delay_nms(1);        //发清屏命令后,一定要加这个延时,不然后面马上写字符串到LCD会出现错误
	ldi R16,1
	ldi R17,0
	xcall _Delay_nms
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_CheckState _LCD_CheckState fV
	.even
_LCD_CheckState::
	.dbline -1
	.dbline 45
; }
; 
; 
; //状态检查函数,判断是否处于忙状态   //--保留
; void  LCD_CheckState(void)      
; {
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_Send _LCD_Send fV
;              i -> R20
;       senddata -> R16
	.even
_LCD_Send::
	st -y,R20
	.dbline -1
	.dbline 63
; /*   unsigned char dat;
;    CLRBIT(LCD_CONTROL_PORT,RS);  //RS=0
;    //SETBIT(LCD_CONTROL_PORT,RW);  //RW=1
;    LCD_DATA_DDR=0x00;			// portA as input
;    do
;    {
;       SETBIT(LCD_CONTROL_PORT,E);
;       NOP();
;       CLRBIT(LCD_CONTROL_PORT,E);
;    }
;    while (LCD_DATA_PIN&0x80);
;    */
; }
; 
; 
; //对LCD写入数据的时序协议处理
; void LCD_Send(unsigned char senddata)   
; {
	.dbline 66
;    unsigned char i;
; 
;    for(i=0;i<8;i++)
	clr R20
	xjmp L8
L5:
	.dbline 67
;    {
	.dbline 68
;       if((senddata)&0x80)
	sbrs R16,7
	rjmp L9
X0:
	.dbline 69
;       {
	.dbline 71
;          //D_OUT=1	   ;	
;          SETBIT(LCD_CONTROL_PORT,RW);	
	sbi 0x15,2
	.dbline 72
;       }
	xjmp L10
L9:
	.dbline 74
;       else
;       {
	.dbline 76
;          //D_OUT=0;	
;          CLRBIT(LCD_CONTROL_PORT,RW);		
	cbi 0x15,2
	.dbline 77
;       }
L10:
	.dbline 80
; 		
;       //SCK=1;
;       SETBIT(LCD_CONTROL_PORT,E);	
	sbi 0x15,3
	.dbline 81
;       NOP();
	nop
	.dbline 83
;       //SCK=0;
;       CLRBIT(LCD_CONTROL_PORT,E);	
	cbi 0x15,3
	.dbline 85
; 		
;       senddata<<=1;
	lsl R16
	.dbline 86
;    }
L6:
	.dbline 66
	inc R20
L8:
	.dbline 66
	cpi R20,8
	brlo L5
X1:
	.dbline -2
L4:
	.dbline 0 ; func end
	ld R20,y+
	ret
	.dbsym r i 20 c
	.dbsym r senddata 16 c
	.dbend
	.dbfunc e LCD_WriteCmd _LCD_WriteCmd fV
;           scmd -> R20
	.even
_LCD_WriteCmd::
	st -y,R20
	mov R20,R16
	.dbline -1
	.dbline 91
; }
; 
; //写一个命令到LCD
; void LCD_WriteCmd(unsigned char scmd)  
; {
	.dbline 92
;    LCD_Send(0xf8);
	ldi R16,248
	xcall _LCD_Send
	.dbline 93
;    LCD_Send(scmd&0xf0);
	mov R16,R20
	andi R16,240
	xcall _LCD_Send
	.dbline 94
;    LCD_Send(scmd<<4);	
	mov R16,R20
	andi R16,#0x0F
	swap R16
	xcall _LCD_Send
	.dbline 95
;    Delay_nus(20);
	ldi R16,20
	ldi R17,0
	xcall _Delay_nus
	.dbline -2
L11:
	.dbline 0 ; func end
	ld R20,y+
	ret
	.dbsym r scmd 20 c
	.dbend
	.dbfunc e LCD_WriteData _LCD_WriteData fV
;          DData -> R20
	.even
_LCD_WriteData::
	st -y,R20
	mov R20,R16
	.dbline -1
	.dbline 100
; }
; 
; ////写一个数据到LCD
; void LCD_WriteData(unsigned char DData)  
; {
	.dbline 101
;    LCD_Send(0xfa);
	ldi R16,250
	xcall _LCD_Send
	.dbline 102
;    LCD_Send(DData&0xf0);
	mov R16,R20
	andi R16,240
	xcall _LCD_Send
	.dbline 103
;    LCD_Send(DData<<4);	
	mov R16,R20
	andi R16,#0x0F
	swap R16
	xcall _LCD_Send
	.dbline 104
;    Delay_nus(20);
	ldi R16,20
	ldi R17,0
	xcall _Delay_nus
	.dbline -2
L12:
	.dbline 0 ; func end
	ld R20,y+
	ret
	.dbsym r DData 20 c
	.dbend
	.dbfunc e LCD_Set_xy _LCD_Set_xy fV
;              i -> R20
;              X -> R22
;              Y -> R10
	.even
_LCD_Set_xy::
	xcall push_xgsetF00C
	mov R22,R18
	mov R10,R16
	.dbline -1
	.dbline 109
; }
; 
; //设置光标位置,先Y坐标后X坐标
; void LCD_Set_xy(unsigned char Y, unsigned char X)
; {
	.dbline 110
;     unsigned char i=0x00;
	clr R20
	.dbline 111
;     switch(Y & 0x0f)   //确定行号
	mov R24,R10
	clr R25
	andi R24,15
	andi R25,0
	movw R10,R24
	cpi R24,0
	cpc R24,R25
	breq L17
X2:
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	breq L18
X3:
	cpi R24,2
	ldi R30,0
	cpc R25,R30
	breq L19
X4:
	cpi R24,3
	ldi R30,0
	cpc R25,R30
	breq L20
X5:
	xjmp L15
L17:
	.dbline 114
;     {
; 	case 0x00:
; 		i=0x80;
	ldi R20,128
	.dbline 115
; 		break;
	xjmp L15
L18:
	.dbline 117
; 	case 0x01: 
; 		i=0x90; 
	ldi R20,144
	.dbline 118
; 		break;
	xjmp L15
L19:
	.dbline 120
; 	case 0x02: 
; 		i=0x88;
	ldi R20,136
	.dbline 121
; 		break;
	xjmp L15
L20:
	.dbline 123
; 	case 0x03:
; 		i=0x98;
	ldi R20,152
	.dbline 124
; 		break;
	.dbline 126
; 	default : 
; 		break;
L15:
	.dbline 128
;     }
;     i = (X & 0x0f)|i; //确定列号
	mov R24,R22
	andi R24,15
	or R20,R24
	.dbline 129
;    LCD_WriteCmd(i);
	mov R16,R20
	xcall _LCD_WriteCmd
	.dbline -2
L13:
	.dbline 0 ; func end
	xjmp pop_xgsetF00C
	.dbsym r i 20 c
	.dbsym r X 22 c
	.dbsym r Y 10 c
	.dbend
	.dbfunc e LCD_WriteChar _LCD_WriteChar fV
;             c1 -> y+2
;              Y -> R12
;              X -> R10
	.even
_LCD_WriteChar::
	st -y,R10
	st -y,R12
	mov R12,R18
	mov R10,R16
	.dbline -1
	.dbline 135
; 	
; }
; 
; //写一个字符到LCD
; void LCD_WriteChar(unsigned char X,unsigned char Y,unsigned char c1)
; {
	.dbline 138
; //从显示屏指定的行(Y),列(X)的位置写入字符
; 
;    LCD_WriteCmd(0x34);        // 8bit I/F, basic command
	ldi R16,52
	xcall _LCD_WriteCmd
	.dbline 139
;    LCD_WriteCmd(0x30);        // 8bit I/F, basic command, graphic off
	ldi R16,48
	xcall _LCD_WriteCmd
	.dbline 141
;    
;    LCD_Set_xy(X,Y);   
	mov R18,R12
	mov R16,R10
	xcall _LCD_Set_xy
	.dbline 142
;    LCD_WriteData(c1);
	ldd R16,y+2
	xcall _LCD_WriteData
	.dbline 144
;    
;    Delay_nms(1); //2006.11.19
	ldi R16,1
	ldi R17,0
	xcall _Delay_nms
	.dbline -2
L21:
	.dbline 0 ; func end
	ld R12,y+
	ld R10,y+
	ret
	.dbsym l c1 2 c
	.dbsym r Y 12 c
	.dbsym r X 10 c
	.dbend
	.dbfunc e LCD_WriteStr _LCD_WriteStr fV
;           pstr -> R22,R23
;              j -> R20
;          pstr1 -> y+8
;              Y -> R12
;              X -> R10
	.even
_LCD_WriteStr::
	xcall push_xgsetF03C
	mov R12,R18
	mov R10,R16
	.dbline -1
	.dbline 149
; }
; 
; //指定光标位置,写字符串到LCD显示
; void LCD_WriteStr(unsigned char X,unsigned char Y,unsigned char *pstr1)
; {
	.dbline 152
; //从显示屏指定的行(Y),列(X)的位置写入字符串
; unsigned char j;
; unsigned char *pstr = pstr1;
	ldd R22,y+8
	ldd R23,y+9
	.dbline 154
; 
;    LCD_WriteCmd(0x34);        // 8bit I/F, basic command
	ldi R16,52
	xcall _LCD_WriteCmd
	.dbline 155
;    LCD_WriteCmd(0x30);        // 8bit I/F, basic command, graphic off
	ldi R16,48
	xcall _LCD_WriteCmd
	.dbline 157
; 
;    LCD_Set_xy(Y,X);
	mov R18,R10
	mov R16,R12
	xcall _LCD_Set_xy
	.dbline 159
; 	 
;    j=Y * LINEWIDTH + X;
	ldi R24,18
	mul R24,R12
	mov R20,R0
	add R20,R10
	xjmp L24
L23:
	.dbline 161
;    while (*pstr && j< (LINEWIDTH * LINES))
;    {
	.dbline 162
;       if (j%LINEWIDTH==0)         //判断是否换行
	ldi R17,18
	mov R16,R20
	xcall mod8u
	tst R16
	brne L26
X6:
	.dbline 163
;       {
	.dbline 164
;          LCD_Set_xy(j/LINEWIDTH,0);   //如换行, 则光标移动到行首
	clr R18
	ldi R17,18
	mov R16,R20
	xcall div8u
	xcall _LCD_Set_xy
	.dbline 165
;       }
L26:
	.dbline 168
; 		 
;       //避免最后一格写半个汉字, 把汉字写到下一行
;       if (((j+1)%2==0) && *pstr>127 && *(pstr-1)<128) 
	ldi R17,2
	mov R16,R20
	subi R16,255    ; addi 1
	xcall mod8u
	tst R16
	brne L28
X7:
	ldi R24,127
	movw R30,R22
	ldd R2,z+0
	cp R24,R2
	brsh L28
X8:
	sbiw R30,1
	ldd R24,z+0
	cpi R24,128
	brsh L28
X9:
	.dbline 169
;       {
	.dbline 170
;          LCD_WriteData(' '); 
	ldi R16,32
	xcall _LCD_WriteData
	.dbline 171
;          j++;
	inc R20
	.dbline 172
;       }
	xjmp L29
L28:
	.dbline 174
;       else
;       {	
	.dbline 175
;          LCD_WriteData(*pstr++);
	movw R30,R22
	ld R16,Z+
	movw R22,R30
	xcall _LCD_WriteData
	.dbline 176
;          j++;
	inc R20
	.dbline 177
;       }
L29:
	.dbline 178
;    }
L24:
	.dbline 160
	movw R30,R22
	ldd R2,z+0
	tst R2
	breq L30
X10:
	cpi R20,36
	brsh X12
	xjmp L23
X12:
X11:
L30:
	.dbline 180
; 	 
;    Delay_nms(1); //2006.11.19
	ldi R16,1
	ldi R17,0
	xcall _Delay_nms
	.dbline -2
L22:
	.dbline 0 ; func end
	xjmp pop_xgsetF03C
	.dbsym r pstr 22 pc
	.dbsym r j 20 c
	.dbsym l pstr1 8 pc
	.dbsym r Y 12 c
	.dbsym r X 10 c
	.dbend
	.dbfunc e LCD_WriteStrAuto _LCD_WriteStrAuto fV
;           pstr -> R22,R23
;              i -> R20
;              j -> R20
;          pstr1 -> R10,R11
	.even
_LCD_WriteStrAuto::
	xcall push_xgsetF00C
	movw R10,R16
	.dbline -1
	.dbline 185
; }
; 
; //从显示屏的初始位置写入字符串,自动换行
; void LCD_WriteStrAuto(unsigned char *pstr1)
; {
	.dbline 188
; unsigned char i;
; unsigned char j;
; unsigned char *pstr = pstr1;
	movw R22,R10
	.dbline 190
; 
;    LCD_WriteCmd(0x34);        // 8bit I/F, basic command
	ldi R16,52
	xcall _LCD_WriteCmd
	.dbline 191
;    LCD_WriteCmd(0x30);        // 8bit I/F, basic command, graphic off
	ldi R16,48
	xcall _LCD_WriteCmd
	.dbline 193
; 
;    for(i=0;i<36;i++)       //清空屏幕
	clr R20
	xjmp L35
L32:
	.dbline 194
;    {
	.dbline 195
;       if (i%18==0)         //判断是否换行
	ldi R17,18
	mov R16,R20
	xcall mod8u
	tst R16
	brne L36
X13:
	.dbline 196
;       {
	.dbline 197
;          LCD_Set_xy(i/18,0);   //如换行, 则光标移动到行首
	clr R18
	ldi R17,18
	mov R16,R20
	xcall div8u
	xcall _LCD_Set_xy
	.dbline 198
;       }
L36:
	.dbline 200
; 
;       LCD_WriteData(' '); //
	ldi R16,32
	xcall _LCD_WriteData
	.dbline 201
;    }
L33:
	.dbline 193
	inc R20
L35:
	.dbline 193
	cpi R20,36
	brlo L32
X14:
	.dbline 203
; 		
;    j=0;
	clr R20
	xjmp L39
L38:
	.dbline 205
;    while (*pstr && j<36)
;    {
	.dbline 206
;       if (j%18==0)         //判断是否换行
	ldi R17,18
	mov R16,R20
	xcall mod8u
	tst R16
	brne L41
X15:
	.dbline 207
;       {
	.dbline 208
;          LCD_Set_xy(j/18,0);   //如换行, 则光标移动到行首
	clr R18
	ldi R17,18
	mov R16,R20
	xcall div8u
	xcall _LCD_Set_xy
	.dbline 209
;       }
L41:
	.dbline 212
; 		 
;       //避免最后一格写半个汉字, 把汉字写到下一行
;       if (((j+1)%2==0) && *pstr>127 && *(pstr-1)<128) 
	ldi R17,2
	mov R16,R20
	subi R16,255    ; addi 1
	xcall mod8u
	tst R16
	brne L43
X16:
	ldi R24,127
	movw R30,R22
	ldd R2,z+0
	cp R24,R2
	brsh L43
X17:
	sbiw R30,1
	ldd R24,z+0
	cpi R24,128
	brsh L43
X18:
	.dbline 213
;       {
	.dbline 214
;          LCD_WriteData(' '); //
	ldi R16,32
	xcall _LCD_WriteData
	.dbline 215
;          j++;
	inc R20
	.dbline 216
;       }
	xjmp L44
L43:
	.dbline 218
;       else
;       {	
	.dbline 219
;          LCD_WriteData(*pstr++);
	movw R30,R22
	ld R16,Z+
	movw R22,R30
	xcall _LCD_WriteData
	.dbline 220
;          j++;
	inc R20
	.dbline 221
;       }
L44:
	.dbline 222
;    }
L39:
	.dbline 204
	movw R30,R22
	ldd R2,z+0
	tst R2
	breq L45
X19:
	cpi R20,36
	brsh X21
	xjmp L38
X21:
X20:
L45:
	.dbline 224
; 	 
;    Delay_nms(1); //11.19
	ldi R16,1
	ldi R17,0
	xcall _Delay_nms
	.dbline -2
L31:
	.dbline 0 ; func end
	xjmp pop_xgsetF00C
	.dbsym r pstr 22 pc
	.dbsym r i 20 c
	.dbsym r j 20 c
	.dbsym r pstr1 10 pc
	.dbend
; }
; 

⌨️ 快捷键说明

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