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

📄 lcd.s

📁 用于ATMEGA8单片机调试 包括串口
💻 S
字号:
	.module lcd.c
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\新建文件夹\lcd.c
	.dbfunc e LCD_WIRTE_DELAY _LCD_WIRTE_DELAY fV
;       lcd_time -> R16,R17
	.even
_LCD_WIRTE_DELAY::
	.dbline -1
	.dbline 4
; #include "config.h"
; 
; void LCD_WIRTE_DELAY(unsigned int lcd_time) 
; {
	.dbline 5
; WDR();
	wdr
L2:
	.dbline 7
; while(--lcd_time)
; {;}
	.dbline 7
	.dbline 7
L3:
	.dbline 6
	movw R24,R16
	sbiw R24,1
	movw R16,R24
	cpi R16,0
	cpc R16,R17
	brne L2
X0:
	.dbline 8
; WDR();
	wdr
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r lcd_time 16 i
	.dbend
	.dbfunc e LCD_WRI_ORDER _LCD_WRI_ORDER fV
;           DATA -> <dead>
;          ORDER -> R10
	.even
_LCD_WRI_ORDER::
	st -y,R10
	mov R10,R16
	.dbline -1
	.dbline 14
; }
; 
;  /*--------------------------向LCD写命令---------*/
; ///////////////////////////////////////////////////////////////////////////////////////////////////
; void LCD_WRI_ORDER(unsigned char ORDER)
;  { 
	.dbline 16
;   unsigned char DATA;
;   WDR();
	wdr
	.dbline 18
;  // PORTD=PORTD&0X1F;//PD7,6,5置0
;   PORTA=PORTA&0XF8;
	in R24,0x1b
	andi R24,248
	out 0x1b,R24
	.dbline 28
;  /*
;   PORTD=PORTD|0X40; 
;   DDRB=0X00;
;   DATA=PINB;
;   while(DATA&&0x80)
;   {DATA=PINB;WDR();}
;   PORTD=PORTD&0X1F;
;   DDRB=0Xff;
; */
;   LCD_WIRTE_DELAY(200);
	ldi R16,200
	ldi R17,0
	xcall _LCD_WIRTE_DELAY
	.dbline 30
;   //PORTD=PORTD&0X1F;//PD7,6,5置0
;   PORTA=PORTA&0XF8;
	in R24,0x1b
	andi R24,248
	out 0x1b,R24
	.dbline 31
;   PORTB=ORDER;                                        //
	out 0x18,R10
	.dbline 33
;   //PORTD=PORTD|0X80;//PD7置1
;   PORTA=PORTA |0X04;
	sbi 0x1b,2
	.dbline 34
;   LCD_WIRTE_DELAY(200);
	ldi R16,200
	ldi R17,0
	xcall _LCD_WIRTE_DELAY
	.dbline 36
;   //PORTD=PORTD&0X1F;//PD7,6,5置0
;   PORTA=PORTA&0XF8;
	in R24,0x1b
	andi R24,248
	out 0x1b,R24
	.dbline -2
L5:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym l DATA 1 c
	.dbsym r ORDER 10 c
	.dbend
	.dbfunc e LCD_WRI_DATA _LCD_WRI_DATA fV
;           ords -> <dead>
;           DATA -> R10
	.even
_LCD_WRI_DATA::
	st -y,R10
	mov R10,R16
	.dbline -1
	.dbline 43
;  }
; 
; 
; /*-----------写到lcd中显示数据---------*/
; ////////////////////////////////////////////////////////////////////////////////////
; void LCD_WRI_DATA(unsigned char DATA)
; {
	.dbline 46
; 
;  unsigned char ords;
;   WDR();
	wdr
	.dbline 58
;   
;   /*
;   PORTD=PORTD&0X1F; 
;   PORTD=PORTD|0X40; 
;   DDRB=0X00;
;   ords=PINB;
;   while(ords&&0x80)
;   {ords=PINB;WDR();}
;   DDRB=0Xff;
;   */
;   //PORTD=PORTD&0X7F;//PD7置0
;   PORTA=PORTA&0XFB; 
	in R24,0x1b
	andi R24,251
	out 0x1b,R24
	.dbline 59
;   LCD_WIRTE_DELAY(200);
	ldi R16,200
	ldi R17,0
	xcall _LCD_WIRTE_DELAY
	.dbline 61
;   //PORTD=PORTD|0X20; //PD5置1
;   PORTA=PORTA|0X01;
	sbi 0x1b,0
	.dbline 62
;   PORTB=DATA;
	out 0x18,R10
	.dbline 64
;   //PORTD=PORTD|0X80;//PD7置1
;   PORTA=PORTA |0X04;
	sbi 0x1b,2
	.dbline 65
;   LCD_WIRTE_DELAY(200);
	ldi R16,200
	ldi R17,0
	xcall _LCD_WIRTE_DELAY
	.dbline 67
;   //PORTD=PORTD&0X1F;//PD7,6,5置0
;   PORTA=PORTA & 0XF8;
	in R24,0x1b
	andi R24,248
	out 0x1b,R24
	.dbline -2
L6:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym l ords 1 c
	.dbsym r DATA 10 c
	.dbend
	.dbfunc e LCD_DELAY _LCD_DELAY fV
;           time -> R16,R17
	.even
_LCD_DELAY::
	.dbline -1
	.dbline 75
; }
; 
; 
; 
; 
; /*-------------延时46us----------*/
; void LCD_DELAY()
;  {
	.dbline 76
;   unsigned int time=500;
	ldi R16,500
	ldi R17,1
	.dbline 77
;   WDR();
	wdr
L8:
	.dbline 78
;   while(--time);
L9:
	.dbline 78
	movw R24,R16
	sbiw R24,1
	movw R16,R24
	cpi R16,0
	cpc R16,R17
	brne L8
X1:
	.dbline 79
;   WDR();
	wdr
	.dbline -2
L7:
	.dbline 0 ; func end
	ret
	.dbsym r time 16 i
	.dbend
	.dbfunc e LCD_CLEAR _LCD_CLEAR fV
	.even
_LCD_CLEAR::
	.dbline -1
	.dbline 84
;  }
;  
;  
; void LCD_CLEAR()
; {
	.dbline 85
;   LCD_WRI_ORDER(0X01);
	ldi R16,1
	xcall _LCD_WRI_ORDER
	.dbline 86
;   LCD_DELAY();
	xcall _LCD_DELAY
	.dbline -2
L11:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_WORD_INI _LCD_WORD_INI fV
	.even
_LCD_WORD_INI::
	.dbline -1
	.dbline 101
; }
; 
; 
; //#define EN (DDRD|=BIT(PD7))
; //#define RW (DDRD|=BIT(PD6))
; //#define CR (DDRD|=BIT(PD5))
; //////////////////////////////////////////////////////////////
; #define EN (DDRA|=BIT(PA2))
; #define RW (DDRA|=BIT(PA1))
; #define CR (DDRA|=BIT(PA0))
; /////////////////////////////////////////////////////////////
; 
; 
; void LCD_WORD_INI(void)
;  {
	.dbline 102
;     WDR();
	wdr
	.dbline 103
;     EN;RW;CR;
	sbi 0x1a,2
	.dbline 103
	sbi 0x1a,1
	.dbline 103
	sbi 0x1a,0
	.dbline 104
;    LCD_WRI_ORDER(0X30);			   /*----------------清显示--------------------*/
	ldi R16,48
	xcall _LCD_WRI_ORDER
	.dbline 105
;    LCD_DELAY();
	xcall _LCD_DELAY
	.dbline 106
;    LCD_WRI_ORDER(0X30);			   /*----------------清显示--------------------*/
	ldi R16,48
	xcall _LCD_WRI_ORDER
	.dbline 107
;    LCD_DELAY();
	xcall _LCD_DELAY
	.dbline 108
;    LCD_DELAY();
	xcall _LCD_DELAY
	.dbline 109
;    LCD_WRI_ORDER(0X0C);			   /*------------ 显示右移光标右移 --------------*/
	ldi R16,12
	xcall _LCD_WRI_ORDER
	.dbline 110
;    LCD_DELAY(); 
	xcall _LCD_DELAY
	.dbline 111
;    LCD_WRI_ORDER(0X01);			   /*------------ 显示右移光标右移 --------------*/
	ldi R16,1
	xcall _LCD_WRI_ORDER
	.dbline 112
;    Delay1ms(1);
	ldi R16,1
	ldi R17,0
	xcall _Delay1ms
	.dbline 113
;    LCD_WRI_ORDER(0X06);			   /*-------功能定为基本指令集动作8位------------*/
	ldi R16,6
	xcall _LCD_WRI_ORDER
	.dbline 114
;    LCD_DELAY();
	xcall _LCD_DELAY
	.dbline -2
L12:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_ADD _LCD_ADD fV
;            ADD -> R10
	.even
_LCD_ADD::
	st -y,R10
	mov R10,R16
	.dbline -1
	.dbline 127
;  }
; /*
; void LCD_PIC_INI()
;  {
;    WDR();
;    LCD_WORD_INI();
;    LCD_WRI_ORDER(0X32);			 /*-------功能设定为基本指令集8位显示图形-----------*/
;  /*  LCD_DELAY();
;    LCD_WRI_ORDER(0X36);			 /*-------功能设定为扩充指令集8位显示图形-----------*/
;  //  LCD_DELAY();
;  //}*/
; void LCD_ADD(unsigned char ADD)//写入地址
;  {
	.dbline 128
;    LCD_WRI_ORDER(ADD);
	mov R16,R10
	xcall _LCD_WRI_ORDER
	.dbline 129
;    LCD_DELAY();
	xcall _LCD_DELAY
	.dbline -2
L13:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym r ADD 10 c
	.dbend
	.dbfunc e DISPLAY_LCD _DISPLAY_LCD fV
;              Y -> R10
;           DISP -> R20,R21
;            ADD -> R10
	.even
_DISPLAY_LCD::
	xcall push_xgset300C
	movw R20,R18
	mov R10,R16
	.dbline -1
	.dbline 133
;   } 
;   
; void DISPLAY_LCD(unsigned char ADD,unsigned char *DISP)//显示字符串
; {  
	.dbline 135
;    unsigned char Y;
;    WDR();
	wdr
	.dbline 136
;    LCD_WRI_ORDER(ADD);
	mov R16,R10
	xcall _LCD_WRI_ORDER
	.dbline 137
;    LCD_DELAY();
	xcall _LCD_DELAY
	.dbline 138
;   for(Y=0;*DISP!='\0';Y++)
	clr R10
	xjmp L18
L15:
	.dbline 139
;    {  
	.dbline 140
;      LCD_DELAY();     
	xcall _LCD_DELAY
	.dbline 141
;      LCD_WRI_DATA(*DISP);
	movw R30,R20
	ldd R16,z+0
	xcall _LCD_WRI_DATA
	.dbline 142
;      LCD_DELAY();DISP++;
	xcall _LCD_DELAY
	.dbline 142
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 143
;    }
L16:
	.dbline 138
	inc R10
L18:
	.dbline 138
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L15
X2:
	.dbline -2
L14:
	.dbline 0 ; func end
	xjmp pop_xgset300C
	.dbsym r Y 10 c
	.dbsym r DISP 20 pc
	.dbsym r ADD 10 c
	.dbend
	.area lit(rom, con, rel)
L20:
	.byte 48,49,50,51,52,53,54,55,56,57,'a,'b,'c,'d,'e,'f
	.byte 0
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\新建文件夹\lcd.c
	.dbfunc e shuzi_disp _shuzi_disp fV
;         number -> y+0
;         NUMber -> R10
;            ADD -> R12
	.even
_shuzi_disp::
	st -y,R10
	st -y,R12
	mov R10,R18
	mov R12,R16
	sbiw R28,17
	.dbline -1
	.dbline 147
;  }
; 
; void shuzi_disp(unsigned char ADD,unsigned char NUMber) //一位数字显示
;    {
	.dbline 148
;       unsigned char number[]={"0123456789abcdef"}; 
	ldi R24,<L20
	ldi R25,>L20
	movw R30,R28
	ldi R16,17
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgncblk
	.dbline 149
; 	  WDR();
	wdr
	.dbline 150
; 	  LCD_WRI_ORDER(ADD);    LCD_DELAY(); 
	mov R16,R12
	xcall _LCD_WRI_ORDER
	.dbline 150
	xcall _LCD_DELAY
	.dbline 151
; 	  LCD_WRI_DATA(number[NUMber]);   LCD_DELAY();
	movw R24,R28
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _LCD_WRI_DATA
	.dbline 151
	xcall _LCD_DELAY
	.dbline -2
L19:
	.dbline 0 ; func end
	adiw R28,17
	ld R12,y+
	ld R10,y+
	ret
	.dbsym l number 0 A[17:17]c
	.dbsym r NUMber 10 c
	.dbsym r ADD 12 c
	.dbend
	.area lit(rom, con, rel)
L22:
	.byte 48,49,50,51,52,53,54,55,56,57,32,0
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\新建文件夹\lcd.c
	.dbfunc e NUM_DISPLAY_LCD _NUM_DISPLAY_LCD fV
;             GW -> R10
;             SW -> R12
;            SWS -> R10
;             BW -> R22
;             QW -> R20
;             WW -> R14
;         number -> y+0
;         NUMber -> R10,R11
;            ADD -> R12
	.even
_NUM_DISPLAY_LCD::
	xcall push_xgsetF0FC
	movw R10,R18
	mov R12,R16
	sbiw R28,12
	.dbline -1
	.dbline 154
;    }
; void NUM_DISPLAY_LCD(unsigned char ADD,unsigned int NUMber)//数字显示
; { 
	.dbline 161
;   unsigned char WW;
;   unsigned char QW;
;   unsigned char BW;
;   unsigned char SW;
;   unsigned char SWS;
;   unsigned char GW;
;   unsigned char number[]={"0123456789 "}; 
	ldi R24,<L22
	ldi R25,>L22
	movw R30,R28
	ldi R16,12
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgncblk
	.dbline 162
;   WDR();
	wdr
	.dbline 163
;   LCD_WRI_ORDER(ADD);
	mov R16,R12
	xcall _LCD_WRI_ORDER
	.dbline 164
;   LCD_DELAY();
	xcall _LCD_DELAY
	.dbline 165
;   WW=NUMber/10000;
	ldi R18,10000
	ldi R19,39
	movw R16,R10
	xcall div16u
	mov R14,R16
	.dbline 166
;   QW=(NUMber%10000)/1000;
	ldi R18,10000
	ldi R19,39
	movw R16,R10
	xcall mod16u
	ldi R18,1000
	ldi R19,3
	xcall div16u
	mov R20,R16
	.dbline 167
;   BW=(NUMber%1000)/100;
	ldi R18,1000
	ldi R19,3
	movw R16,R10
	xcall mod16u
	ldi R18,100
	ldi R19,0
	xcall div16u
	mov R22,R16
	.dbline 168
;   SWS=(NUMber%1000)%100;
	ldi R18,1000
	ldi R19,3
	movw R16,R10
	xcall mod16u
	ldi R18,100
	ldi R19,0
	xcall mod16u
	mov R10,R16
	.dbline 169
;   SW=SWS/10;
	ldi R17,10
	xcall div8u
	mov R12,R16
	.dbline 170
;   GW=SWS%10;
	ldi R17,10
	mov R16,R10
	xcall mod8u
	mov R10,R16
	.dbline 171
;   if(WW)
	tst R14
	breq L23
X3:
	.dbline 172
;     LCD_WRI_DATA(number[WW]);
	movw R24,R28
	mov R30,R14
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _LCD_WRI_DATA
	xjmp L24
L23:
	.dbline 174
;   else
;     LCD_WRI_DATA(number[10]);
	ldd R16,y+10
	xcall _LCD_WRI_DATA
L24:
	.dbline 175
;     LCD_DELAY();
	xcall _LCD_DELAY
	.dbline 176
;   if(QW||WW)
	tst R20
	brne L28
X4:
	tst R14
	breq L26
X5:
L28:
	.dbline 177
;     LCD_WRI_DATA(number[QW]);
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _LCD_WRI_DATA
	xjmp L27
L26:
	.dbline 179
;   else 
;     LCD_WRI_DATA(number[10]);
	ldd R16,y+10
	xcall _LCD_WRI_DATA
L27:
	.dbline 180
;     LCD_DELAY();
	xcall _LCD_DELAY
	.dbline 181
;   if(BW||QW||WW)
	tst R22
	brne L33
X6:
	tst R20
	brne L33
X7:
	tst R14
	breq L30
X8:
L33:
	.dbline 182
;     LCD_WRI_DATA(number[BW]);
	movw R24,R28
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _LCD_WRI_DATA
	xjmp L31
L30:
	.dbline 184
;   else 
; 	LCD_WRI_DATA(number[10]);
	ldd R16,y+10
	xcall _LCD_WRI_DATA
L31:
	.dbline 185
;     LCD_DELAY();
	xcall _LCD_DELAY
	.dbline 186
;   if(SW!=0||BW||QW||WW)
	tst R12
	brne L39
X9:
	tst R22
	brne L39
X10:
	tst R20
	brne L39
X11:
	tst R14
	breq L35
X12:
L39:
	.dbline 187
;     LCD_WRI_DATA(number[SW]);
	movw R24,R28
	mov R30,R12
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _LCD_WRI_DATA
	xjmp L36
L35:
	.dbline 189
;   else
;     LCD_WRI_DATA(number[10]);
	ldd R16,y+10
	xcall _LCD_WRI_DATA
L36:
	.dbline 190
;     LCD_DELAY();
	xcall _LCD_DELAY
	.dbline 191
;     LCD_WRI_DATA(number[GW]);
	movw R24,R28
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _LCD_WRI_DATA
	.dbline 192
;     LCD_DELAY();
	xcall _LCD_DELAY
	.dbline -2
L21:
	.dbline 0 ; func end
	adiw R28,12
	xjmp pop_xgsetF0FC
	.dbsym r GW 10 c
	.dbsym r SW 12 c
	.dbsym r SWS 10 c
	.dbsym r BW 22 c
	.dbsym r QW 20 c
	.dbsym r WW 14 c
	.dbsym l number 0 A[12:12]c
	.dbsym r NUMber 10 i
	.dbsym r ADD 12 c
	.dbend
;  }
; 

⌨️ 快捷键说明

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