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

📄 lcd.s

📁 本程序是基于avr单片机的atmega48的控制16*4点阵型液晶。其中main文件调用LCD.c和LCD.h文件。用户可以直接把工程中的LCD.c和LCD.h文件放到自己的程序目录下即可。
💻 S
字号:
	.module lcd.c
	.area text(rom, con, rel)
	.dbfile F:\avrprojs\lcd_block\lcd.c
	.dbfunc e LCD_init _LCD_init fV
	.even
_LCD_init::
	.dbline -1
	.dbline 17
; //ICC-AVR application builder : 2008-8-5 下午 04:30:31
; // Target : M48
; // Crystal: 1.0000Mhz
; 
; #include <iom48v.h>
; #include <macros.h>
; 
; #define LCD_DATA_PORT  PORTB
; #define LCD_DATA_DDR   DDRB
; #define LCD_EN_PORT  PORTD
; #define LCD_RS_PORT  PORTD
; #define LCD_EN  0x10
; #define LCD_RS  0x08
; 
; 
; void LCD_init(void)       //液晶初始化
; {
	.dbline 18
;  delay_nms(2);
	ldi R16,2
	ldi R17,0
	rcall _delay_nms
	.dbline 19
;  LCD_write_char(0x38,0);  //8位显示
	clr R18
	clr R19
	ldi R16,56
	ldi R17,0
	rcall _LCD_write_char
	.dbline 21
; 
;   delay_nms(6);
	ldi R16,6
	ldi R17,0
	rcall _delay_nms
	.dbline 22
;  LCD_write_char(0x38,0);  //8位显示
	clr R18
	clr R19
	ldi R16,56
	ldi R17,0
	rcall _LCD_write_char
	.dbline 24
; 
;   delay_nms(2);
	ldi R16,2
	ldi R17,0
	rcall _delay_nms
	.dbline 25
;  LCD_write_char(0x38,0);  //8位显示
	clr R18
	clr R19
	ldi R16,56
	ldi R17,0
	rcall _LCD_write_char
	.dbline 27
; 
;  LCD_write_char(0x38,0);  //8位显示
	clr R18
	clr R19
	ldi R16,56
	ldi R17,0
	rcall _LCD_write_char
	.dbline 28
;   delay_nms(2);
	ldi R16,2
	ldi R17,0
	rcall _delay_nms
	.dbline 29
;  LCD_write_char(0x01,0);  //8位显示
	clr R18
	clr R19
	ldi R16,1
	ldi R17,0
	rcall _LCD_write_char
	.dbline 30
;   delay_nms(2);
	ldi R16,2
	ldi R17,0
	rcall _delay_nms
	.dbline 31
;  LCD_write_char(0x08,0);  //8位显示
	clr R18
	clr R19
	ldi R16,8
	ldi R17,0
	rcall _LCD_write_char
	.dbline 32
;   delay_nms(1);
	ldi R16,1
	ldi R17,0
	rcall _delay_nms
	.dbline 34
;  
;  LCD_write_char(0x06,0);  //8位显示
	clr R18
	clr R19
	ldi R16,6
	ldi R17,0
	rcall _LCD_write_char
	.dbline 35
;  delay_nms(1);
	ldi R16,1
	ldi R17,0
	rcall _delay_nms
	.dbline 38
;  
;  
;  LCD_write_char(0x0c,0);  //显示开
	clr R18
	clr R19
	ldi R16,12
	ldi R17,0
	rcall _LCD_write_char
	.dbline 40
;  //delay_nms(100);
;  LCD_write_char(0x01,0);  //清屏
	clr R18
	clr R19
	ldi R16,1
	ldi R17,0
	rcall _LCD_write_char
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_write_string _LCD_write_string fV
;              s -> R20,R21
;              Y -> R10,R11
;              X -> R22,R23
	.even
_LCD_write_string::
	rcall push_gset3
	mov R10,R18
	mov R11,R19
	mov R22,R16
	mov R23,R17
	ldd R20,y+6
	ldd R21,y+7
	.dbline -1
	.dbline 45
;  //delay_nms(3);
; }
; 
; void LCD_write_string(int X,int Y,unsigned char *s)
;   {
	.dbline 46
;     LCD_set_xy( X, Y ); //写地址
	mov R18,R10
	mov R19,R11
	mov R16,R22
	mov R17,R23
	rcall _LCD_set_xy
	rjmp L4
L3:
	.dbline 49
	.dbline 50
	mov R30,R20
	mov R31,R21
	ldd R18,z+0
	clr R19
	clr R16
	clr R17
	rcall _LCD_write_char
	.dbline 51
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 52
L4:
	.dbline 48
;     
;     while (*s)  // 写显示字符
	mov R30,R20
	mov R31,R21
	ldd R2,z+0
	tst R2
	brne L3
	.dbline -2
L2:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r s 20 pc
	.dbsym r Y 10 I
	.dbsym r X 22 I
	.dbend
	.dbfunc e LCD_set_xy _LCD_set_xy fV
;        address -> R20
;              y -> R22,R23
;              x -> R20,R21
	.even
_LCD_set_xy::
	rcall push_gset2
	mov R22,R18
	mov R23,R19
	mov R20,R16
	mov R21,R17
	.dbline -1
	.dbline 57
;       {
;         LCD_write_char( 0, *s );
; 	    s ++;
;       }
;   }
; 
; 
; void LCD_set_xy( int x, int y )  //写地址函数
;   {
	.dbline 60
;     
;     unsigned char address;
; 	delay_nus(100);
	ldi R16,100
	ldi R17,0
	rcall _delay_nus
	.dbline 61
; 	address=x&0x0f;
	andi R20,15
	andi R21,0
	.dbline 62
;     switch(y)
	cpi R22,0
	cpc R22,R23
	breq L9
X0:
	cpi R22,1
	ldi R30,0
	cpc R23,R30
	breq L10
	cpi R22,2
	ldi R30,0
	cpc R23,R30
	breq L11
	cpi R22,3
	ldi R30,0
	cpc R23,R30
	breq L12
	rjmp L8
X1:
	.dbline 63
;       {
L9:
	.dbline 65
;       	case 0:
; 			address+= 0x00;          //0x00 - 0x0f
	.dbline 66
; 			break;
	rjmp L8
L10:
	.dbline 68
; 		case 1:
; 			address+= 0x40;          //0x40 - 0x4f
	subi R20,192    ; addi 64
	.dbline 69
; 			break;
	rjmp L8
L11:
	.dbline 71
; 		case 2:
; 			address+= 0x10;          //0x10 - 0x1f
	subi R20,240    ; addi 16
	.dbline 72
; 			break;
	rjmp L8
L12:
	.dbline 74
; 		case 3:
; 			address+= 0x50;          //0x50 - 0x5f
	subi R20,176    ; addi 80
	.dbline 75
; 			break;
	.dbline 77
; 		default :
; 			break;
L8:
	.dbline 79
;       }
; 	address=address|0x80;
	ori R20,128
	.dbline 80
;     LCD_write_char( address, 0 );
	clr R18
	clr R19
	mov R16,R20
	clr R17
	rcall _LCD_write_char
	.dbline -2
L6:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r address 20 c
	.dbsym r y 22 I
	.dbsym r x 20 I
	.dbend
	.dbfunc e LCD_en_write _LCD_en_write fV
	.even
_LCD_en_write::
	.dbline -1
	.dbline 86
; 	//delay_nms(2);
;   }
; 
; 
; void LCD_en_write(void)  //液晶使能
; {
	.dbline 87
;   LCD_EN_PORT|=LCD_EN;
	sbi 0xb,4
	.dbline 88
;   delay_nus(1);
	ldi R16,1
	ldi R17,0
	rcall _delay_nus
	.dbline 89
;   LCD_EN_PORT&=~LCD_EN;
	cbi 0xb,4
	.dbline -2
L13:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_display_char _LCD_display_char fV
;           data -> y+4
;              y -> R22,R23
;              x -> R20,R21
	.even
_LCD_display_char::
	rcall push_gset2
	mov R22,R18
	mov R23,R19
	mov R20,R16
	mov R21,R17
	.dbline -1
	.dbline 92
; }
; void LCD_display_char(int x,int y,unsigned char data)
; {
	.dbline 93
;    LCD_set_xy(x,y);  //写地址函数
	mov R18,R22
	mov R19,R23
	mov R16,R20
	mov R17,R21
	rcall _LCD_set_xy
	.dbline 94
;    LCD_write_char(0,data);
	ldd R18,y+4
	clr R19
	clr R16
	clr R17
	rcall _LCD_write_char
	.dbline -2
L14:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l data 4 c
	.dbsym r y 22 I
	.dbsym r x 20 I
	.dbend
	.dbfunc e LCD_write_char _LCD_write_char fV
;           data -> R22,R23
;        command -> R20,R21
	.even
_LCD_write_char::
	rcall push_gset2
	mov R22,R18
	mov R23,R19
	mov R20,R16
	mov R21,R17
	.dbline -1
	.dbline 98
; }
; 
; void LCD_write_char(unsigned command,unsigned data) // 写数据
; {
	.dbline 100
; 
;  delay_nus(16);
	ldi R16,16
	ldi R17,0
	rcall _delay_nus
	.dbline 101
;  if(command==0)
	cpi R20,0
	cpc R20,R21
	brne L16
X2:
	.dbline 102
;  {
	.dbline 103
;   LCD_RS_PORT|=LCD_RS;  //RS=1
	sbi 0xb,3
	.dbline 104
;   LCD_EN_PORT&=~LCD_EN;
	cbi 0xb,4
	.dbline 105
;   LCD_DATA_PORT=data;
	out 0x5,R22
	.dbline 106
;   LCD_EN_PORT|=LCD_EN;
	sbi 0xb,4
	.dbline 108
;   
;   delay_nus(50);
	ldi R16,50
	ldi R17,0
	rcall _delay_nus
	.dbline 109
;   LCD_EN_PORT&=~LCD_EN;
	cbi 0xb,4
	.dbline 110
;  }
	rjmp L17
L16:
	.dbline 112
	.dbline 113
	cbi 0xb,3
	.dbline 114
	cbi 0xb,4
	.dbline 115
	out 0x5,R20
	.dbline 116
	sbi 0xb,4
	.dbline 118
	ldi R16,50
	ldi R17,0
	rcall _delay_nus
	.dbline 119
	cbi 0xb,4
	.dbline 120
L17:
	.dbline -2
L15:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r data 22 i
	.dbsym r command 20 i
	.dbend
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 124
;  else
;  {
;   LCD_RS_PORT&=~LCD_RS;   //RS=0
;    LCD_EN_PORT&=~LCD_EN;
;   LCD_DATA_PORT=command;
;   LCD_EN_PORT|=LCD_EN;
;   
;   delay_nus(50);
;   LCD_EN_PORT&=~LCD_EN;
;   }
; }
; 
; void port_init(void)
; {
	.dbline 125
;  PORTB = 0x1B;
	ldi R24,27
	out 0x5,R24
	.dbline 126
;  DDRB  = 0xFF;
	ldi R24,255
	out 0x4,R24
	.dbline 127
;  PORTC = 0x03; //m103 output only
	ldi R24,3
	out 0x8,R24
	.dbline 128
;  DDRC  = 0x03;
	out 0x7,R24
	.dbline 129
;  PORTD = 0x00;
	clr R2
	out 0xb,R2
	.dbline 130
;  DDRD  = 0x18;
	ldi R24,24
	out 0xa,R24
	.dbline -2
L18:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e init_devices _init_devices fV
	.even
_init_devices::
	.dbline -1
	.dbline 135
; }
; 
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
	.dbline 137
;  //stop errant interrupts until set up
;  port_init();
	rcall _port_init
	.dbline -2
L19:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e delay_1us _delay_1us fV
	.even
_delay_1us::
	.dbline -1
	.dbline 146
;  //all peripherals are now initialized
; }
; 
;    /*-----------------------------------------------------------------------
; 延时函数
; 系统时钟:8M
; -----------------------------------------------------------------------*/
; void delay_1us(void)                 //1us延时函数
;   {
	.dbline 147
;    asm("nop");
	nop
	.dbline -2
L20:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e delay_nus _delay_nus fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delay_nus::
	rcall push_gset2
	mov R22,R16
	mov R23,R17
	.dbline -1
	.dbline 151
;   }
; 
; void delay_nus(unsigned int n)       //N us延时函数
;   {
	.dbline 152
;    unsigned int i=0;
	clr R20
	clr R21
	.dbline 153
;    for (i=0;i<n;i++)
	rjmp L25
L22:
	.dbline 154
	rcall _delay_1us
L23:
	.dbline 153
	subi R20,255  ; offset = 1
	sbci R21,255
L25:
	.dbline 153
	cp R20,R22
	cpc R21,R23
	brlo L22
	.dbline -2
L21:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.dbfunc e delay_1ms _delay_1ms fV
;              i -> R16,R17
	.even
_delay_1ms::
	.dbline -1
	.dbline 158
;    delay_1us();
;   }
;   
; void delay_1ms(void)                 //1ms延时函数
;   {
	.dbline 160
	clr R16
	clr R17
	rjmp L30
L27:
	.dbline 160
L28:
	.dbline 160
	subi R16,255  ; offset = 1
	sbci R17,255
L30:
	.dbline 160
;    unsigned int i;
;    for (i=0;i<114;i++);
	cpi R16,114
	ldi R30,0
	cpc R17,R30
	brlo L27
	.dbline -2
L26:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delay_nms _delay_nms fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delay_nms::
	rcall push_gset2
	mov R22,R16
	mov R23,R17
	.dbline -1
	.dbline 164
;   }
;   
; void delay_nms(unsigned int n)       //N ms延时函数
;   {
	.dbline 165
;    unsigned int i=0;
	clr R20
	clr R21
	.dbline 166
;    for (i=0;i<n;i++)
	rjmp L35
L32:
	.dbline 167
	rcall _delay_1ms
L33:
	.dbline 166
	subi R20,255  ; offset = 1
	sbci R21,255
L35:
	.dbline 166
	cp R20,R22
	cpc R21,R23
	brlo L32
	.dbline -2
L31:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend

⌨️ 快捷键说明

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