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

📄 lcd_1602_driver.s

📁 LCD1602四线接口应用范例(AVR_GCC)
💻 S
📖 第 1 页 / 共 3 页
字号:
	.module LCD_1602_Driver.c
	.area data(ram, con, rel)
_new::
	.blkb 1
	.area idata
	.byte 32
	.area data(ram, con, rel)
	.dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
	.dbsym e new _new c
_num::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
	.dbsym e num _num i
	.area text(rom, con, rel)
	.dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
	.dbfunc e LCD_init _LCD_init fV
	.even
_LCD_init::
	.dbline -1
	.dbline 21
; #include <iom8v.h>
; #include <macros.h>
; #include "LCD_1602.h"
; void delay_nms(unsigned int n);
; void delay_nus(unsigned int n);
; unsigned char lcd_data[32];//32字节显存,记录LCD上显示的数据
; unsigned char data[32];//32字节缓存,保存将要写入LCD的数据
; unsigned char add;//显存地址标号
; unsigned char new=32;//显存标号 
; unsigned int num=0;
; /**********************************************************
; TC1602B LCD DISPLAY
; 建立时间:2005年12月12号
; 修改日期:2005年12月12号
; LCD_write函数功能:当command=0时,向LCD写入数据,否则向LCD写
;                    入命令
; LCD第一行显示寄存器地址:0X80-0X8F
; LCD第二行显示寄存器地址:0XC0-0XCF
; **********************************************************/
; void LCD_init(void)
;   { 
	.dbline 22
;      LCD_EN_DDR|=LCD_EN;//设定该引脚方向为输出
	sbi 0x11,6
	.dbline 23
; 	 LCD_RS_DDR|=LCD_RS;//设定该引脚方向为输出
	sbi 0x11,7
	.dbline 24
; 	 LCD_D4_DDR|=LCD_D4;//设定数据口为输出 
	sbi 0x11,5
	.dbline 25
; 	 LCD_D5_DDR|=LCD_D5;//设定数据口为输出  
	sbi 0x11,4
	.dbline 26
; 	 LCD_D6_DDR|=LCD_D6;//设定数据口为输出  
	sbi 0x11,3
	.dbline 27
; 	 LCD_D7_DDR|=LCD_D7;//设定数据口为输出
	sbi 0x11,2
	.dbline 29
; 	 
; 	  LCD_EN_PORT&=~LCD_EN;//EN设为低电平
	cbi 0x12,6
	.dbline 30
; 	  LCD_RS_PORT&=~LCD_RS;//RS设为低电平
	cbi 0x12,7
	.dbline 31
; 	  LCD_D4_PORT&=~LCD_D4;//数据口置低电平
	cbi 0x12,5
	.dbline 32
; 	  LCD_D5_PORT&=~LCD_D5;//数据口置低电平
	cbi 0x12,4
	.dbline 33
; 	  LCD_D6_PORT&=~LCD_D6;//数据口置低电平
	cbi 0x12,3
	.dbline 34
; 	  LCD_D7_PORT&=~LCD_D7;//数据口置低电平
	cbi 0x12,2
	.dbline 36
; 	  
;     LCD_write_char(0,0x33);      //4bit test
	ldi R18,51
	ldi R19,0
	clr R16
	clr R17
	rcall _LCD_write_char
	.dbline 37
; 	delay_nms(25);
	ldi R16,25
	ldi R17,0
	rcall _delay_nms
	.dbline 38
; 	LCD_write_char(0,0x32);
	ldi R18,50
	ldi R19,0
	clr R16
	clr R17
	rcall _LCD_write_char
	.dbline 39
; 	delay_nms(15);
	ldi R16,15
	ldi R17,0
	rcall _delay_nms
	.dbline 40
; 	LCD_write_char(0,0x28);
	ldi R18,40
	ldi R19,0
	clr R16
	clr R17
	rcall _LCD_write_char
	.dbline 41
; 	delay_nms(15);
	ldi R16,15
	ldi R17,0
	rcall _delay_nms
	.dbline 42
;     LCD_write_char(0,0x0C);      //显示开
	ldi R18,12
	ldi R19,0
	clr R16
	clr R17
	rcall _LCD_write_char
	.dbline 43
; 	delay_nms(15);
	ldi R16,15
	ldi R17,0
	rcall _delay_nms
	.dbline 44
;     LCD_write_char(0,0x01);      //显示清屏
	ldi R18,1
	ldi R19,0
	clr R16
	clr R17
	rcall _LCD_write_char
	.dbline 45
; 	delay_nms(15);
	ldi R16,15
	ldi R17,0
	rcall _delay_nms
	.dbline 46
;     LCD_write_char(0,0x06);      //显示光标移动设置	
	ldi R18,6
	ldi R19,0
	clr R16
	clr R17
	rcall _LCD_write_char
	.dbline 47
; 	LCD_clear();
	rcall _LCD_clear
	.dbline 48
; 	delay_nms(10);
	ldi R16,10
	ldi R17,0
	rcall _delay_nms
	.dbline 49
; 	LCD_init_CGRAM(); 
	rcall _LCD_init_CGRAM
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_write_char _LCD_write_char fV
;           data -> R20,R21
;        command -> R22,R23
	.even
_LCD_write_char::
	rcall push_gset2
	movw R20,R18
	movw R22,R16
	.dbline -1
	.dbline 57
;   }
; /*-----------------------------------------------------------------------
; LCD_write_char    : 写一个字节到LCD的函数
; 编写日期             :2005-12-12 
; 最后修改日期      :2005-12-12 		
; -----------------------------------------------------------------------*/
; void LCD_write_char(unsigned command,unsigned data)
;   { 
	.dbline 58
;     if (command == 0)
	cpi R22,0
	cpc R22,R23
	brne L3
X0:
	.dbline 59
;    	LCD_RS_PORT &= ~LCD_RS;   //RS=0  写地址
	cbi 0x12,7
	rjmp L4
L3:
	.dbline 61
; 	else
;     LCD_RS_PORT |= LCD_RS;    //RS=1 写数据
	sbi 0x12,7
L4:
	.dbline 63
; 	
;     LCD_write_DATA_PORT(data);//写高4位
	mov R16,R20
	rcall _LCD_write_DATA_PORT
	.dbline 64
;     LCD_write_DATA_PORT(data<<4);//写低4位
	mov R16,R20
	lsl R16
	rol R17
	lsl R16
	rol R17
	lsl R16
	rol R17
	lsl R16
	rol R17
	rcall _LCD_write_DATA_PORT
	.dbline 65
; 	delay_nus(250);
	ldi R16,250
	ldi R17,0
	rcall _delay_nus
	.dbline 66
; 	num++;//统计向LCD发送的字节数
	lds R24,_num
	lds R25,_num+1
	adiw R24,1
	sts _num+1,R25
	sts _num,R24
	.dbline -2
L2:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r data 20 i
	.dbsym r command 22 i
	.dbend
	.dbfunc e LCD_write_DATA_PORT _LCD_write_DATA_PORT fV
;           data -> R20
	.even
_LCD_write_DATA_PORT::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 76
;   }
; /*-----------------------------------------------------------------------
; LCD_write_DATA_PORT : 写数据到LCD数据口函数
; 
; 输入参数data   :要写入的数据(仅高4位)
; 编写日期          :2005-12-12
; 最后修改日期   :2005-12-12 		
; -----------------------------------------------------------------------*/
; void LCD_write_DATA_PORT(unsigned char data)
; {   
	.dbline 77
;     if((data>>4)%2)
	ldi R17,2
	mov R16,R20
	swap R16
	andi R16,#0x0F
	rcall mod8u
	tst R16
	breq L6
	.dbline 78
; 	  LCD_D4_PORT |=LCD_D4;
	sbi 0x12,5
	rjmp L7
L6:
	.dbline 80
; 	else
; 	  LCD_D4_PORT &=~LCD_D4;
	cbi 0x12,5
L7:
	.dbline 82
; 	
; 	if((data>>5)%2)
	ldi R17,2
	mov R16,R20
	lsr R16
	lsr R16
	lsr R16
	lsr R16
	lsr R16
	rcall mod8u
	tst R16
	breq L8
	.dbline 83
; 	  LCD_D5_PORT |=LCD_D5;
	sbi 0x12,4
	rjmp L9
L8:
	.dbline 85
; 	else
; 	  LCD_D5_PORT &=~LCD_D5;
	cbi 0x12,4
L9:
	.dbline 87
; 	  
; 	if((data>>6)%2)
	ldi R17,2
	mov R16,R20
	lsr R16
	lsr R16
	lsr R16
	lsr R16
	lsr R16
	lsr R16
	rcall mod8u
	tst R16
	breq L10
	.dbline 88
; 	  LCD_D6_PORT |=LCD_D6;
	sbi 0x12,3
	rjmp L11
L10:
	.dbline 90
; 	else
; 	  LCD_D6_PORT &=~LCD_D6;
	cbi 0x12,3
L11:
	.dbline 92
; 	  
; 	if((data>>7)%2)
	ldi R17,2
	mov R16,R20
	lsr R16
	lsr R16
	lsr R16
	lsr R16
	lsr R16
	lsr R16
	lsr R16
	rcall mod8u
	tst R16
	breq L12
	.dbline 93
; 	  LCD_D7_PORT |=LCD_D7;
	sbi 0x12,2
	rjmp L13
L12:
	.dbline 95
; 	else
; 	  LCD_D7_PORT &=~LCD_D7;
	cbi 0x12,2
L13:
	.dbline 97
; 	  
; 	  LCD_EN_PORT |= LCD_EN; //EN端产生一个由低电平变高电平,写LCD
	sbi 0x12,6
	.dbline 98
; 	  delay_nus(25);
	ldi R16,25
	ldi R17,0
	rcall _delay_nus
	.dbline 99
;       LCD_EN_PORT &= ~LCD_EN; //EN端产生一个由高电平变低电平,写LCD
	cbi 0x12,6
	.dbline 100
; 	  delay_nus(25);
	ldi R16,25
	ldi R17,0
	rcall _delay_nus
	.dbline -2
L5:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbend
	.dbfunc e LCD_clear _LCD_clear fV
;              i -> R20
	.even
_LCD_clear::
	rcall push_gset1
	.dbline -1
	.dbline 110
; }
; /*-----------------------------------------------------------------------
; LCD_clear    : 清除屏幕的函数
; 
; 输入参数      :无
; 编写日期      :2005/10/18	
;        说明      :	lcd_data[]也会被清0
; -----------------------------------------------------------------------*/
; void LCD_clear(void)
;   {  
	.dbline 112
;      unsigned char i;
;      LCD_write_char(0,0x01);//显示清屏
	ldi R18,1
	ldi R19,0
	clr R16
	clr R17
	rcall _LCD_write_char
	.dbline 113
; 	 for(i=0;i<32;i++)
	clr R20
	rjmp L18
L15:
	.dbline 114
	.dbline 115
	ldi R24,<_lcd_data
	ldi R25,>_lcd_data
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	clr R2
	std z+0,R2
	.dbline 116
L16:
	.dbline 113
	inc R20
L18:
	.dbline 113
	cpi R20,32
	brlo L15
	.dbline 117
; 	   {
; 	      lcd_data[i]=0;
; 	   }
; 	   delay_nus(500);
	ldi R16,500
	ldi R17,1
	rcall _delay_nus
	.dbline -2
L14:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.area lit(rom, con, rel)
L20:
	.byte 0
	.byte 0
	.area text(rom, con, rel)
	.dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
	.dbfunc e LCD_check _LCD_check fV
;            lcd -> y+0
;              i -> R20
;              y -> R22
;              x -> R20
	.even
_LCD_check::
	rcall push_gset2
	mov R22,R18
	mov R20,R16
	sbiw R28,2
	.dbline -1
	.dbline 128
;   }
; /*-----------------------------------------------------------------------
; LCD_check   : 统计发送数据到LCD次数的函数
; 
; 输入参数      :x,y 显示结果的座标
; 编写日期      :2005/10/18	
;        说明      :如果每秒调用一次,就是统计每秒的次数
; -----------------------------------------------------------------------*/ 
; void LCD_check(unsigned char x,unsigned char y) //检测每秒钟写LCD
;                                                                       //次数的函数
;   {  
	.dbline 130
;     unsigned char  i;
; 	unsigned char  lcd[2]={0};
	ldi R24,<L20
	ldi R25,>L20
	movw R30,R28
	ldi R16,2
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 131
; 	add=y*16+x;//设置起始座标
	ldi R24,16
	mul R24,R22
	mov R2,R0
	add R2,R20
	sts _add,R2
	.dbline 132
;         lcd[0]=num/10+48;
	ldi R18,10
	ldi R19,0
	lds R16,_num
	lds R17,_num+1
	rcall div16u
	movw R24,R16
	adiw R24,48
	std y+0,R24
	.dbline 133
; 		lcd[1]=num%10+48;
	ldi R18,10
	ldi R19,0
	lds R16,_num
	lds R17,_num+1
	rcall mod16u
	movw R24,R16
	adiw R24,48
	std y+1,R24
	.dbline 134
; 	num=0;  
	clr R2
	clr R3
	sts _num+1,R3
	sts _num,R2
	.dbline 135
;    for (i=0;i<2;i++) 
	clr R20
	rjmp L25
L22:
	.dbline 136
;       {
	.dbline 137
;               if(lcd_data[add]==lcd[i]){}
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_lcd_data
	ldi R25,>_lcd_data
	lds R30,_add
	clr R31
	add R30,R24
	adc R31,R25
	ldd R3,z+0
	cp R3,R2
	brne L26
	.dbline 137
	.dbline 137
	rjmp L27
L26:
	.dbline 139
; 			  else
; 			     {data[add]=lcd[i];}
	.dbline 139
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_data
	ldi R25,>_data
	lds R30,_add
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 139
L27:
	.dbline 140
	lds R24,_add
	subi R24,255    ; addi 1
	sts _add,R24
	.dbline 141
L23:
	.dbline 135
	inc R20
L25:
	.dbline 135
	cpi R20,2
	brlo L22
	.dbline 142
; 		          add++;
;       }
; 	LCD_updata;
	clr R2
	sts _new,R2
	.dbline -2
L19:
	adiw R28,2
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l lcd 0 A[2:2]c
	.dbsym r i 20 c
	.dbsym r y 22 c
	.dbsym r x 20 c
	.dbend
	.dbfunc e LCD_write_string _LCD_write_string fV
;              e -> R20
;              s -> R22,R23
;              y -> R18
;              x -> R16
	.even
_LCD_write_string::
	rcall push_gset2
	ldd R22,y+4
	ldd R23,y+5

⌨️ 快捷键说明

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