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

📄 main.s

📁 51单片驱动18b20的源代码程序!供设计者参考!
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module main.c
	.area text(rom, con, rel)
	.dbfile D:\DS18B20\main.c
	.dbfile D:\DS18B20\lcd.h
	.dbfunc e LCD_init _LCD_init fV
	.even
_LCD_init::
	.dbline -1
	.dbline 37
; /****************************端口宏定义**************************************/
; //LCD1602端口连接按照下面方式连接,RW接地.																		 
; #define LCD_EN_PORT   PORTA 
; #define LCD_EN_DDR    DDRA 
; #define LCD_EN        (1<<PA3)
; 
; #define LCD_RS_PORT   PORTA 
; #define LCD_RS_DDR    DDRA 
; #define LCD_RS        (1<<PA1)
; 
; #define LCD_RW_PORT   PORTA 
; #define LCD_RW_DDR    DDRA 
; #define LCD_RW        (1<<PA2)
; 
; #define LCD_DATA_PORT PORTA 
; #define LCD_DATA_DDR  DDRA 
; #define LCD_DATA_PIN  PINA 
; #define LCD_DATA ((1<<4)|(1<<5)|(1<<6)|(1<<7))
; /****************************函数申明****************************************/
; void LCD_init(void);
; void LCD_en_write(void);
; void LCD_WriteControl(unsigned char command);
; void LCD_WriteData(unsigned char data);
; void LCD_Clear(void);
; void LCD_Cursor (char row, char column);
; void LCD_DisplayCharacter (char Char);
; void LCD_DisplayString (char row, char column ,unsigned char *string);
; void LCD_DisplayInt (char row, char column ,unsigned int t);
; void LCD_Displayasc (char row, char column,  char asc);
; void LCD_DisplayLong(char row, char column ,unsigned long t);
; void delay_1us(void);
; void delay_nus(unsigned int n);
; void delay_1ms(void);
; void delay_nms(unsigned int n);
; /*******************************液晶初始化***********************************/
; void LCD_init(void) //液晶初始化 
; { 
	.dbline 38
;   LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出 
	in R24,0x1a
	ori R24,240
	out 0x1a,R24
	.dbline 39
;   LCD_EN_DDR|=LCD_EN; //设置EN方向为输出 
	sbi 0x1a,3
	.dbline 40
;   LCD_RS_DDR|=LCD_RS; //设置RS方向为输出 
	sbi 0x1a,1
	.dbline 41
;   LCD_RS_DDR|=LCD_RW; //
	sbi 0x1a,2
	.dbline 42
;   LCD_WriteControl(0x28); 
	ldi R16,40
	xcall _LCD_WriteControl
	.dbline 43
;   LCD_en_write(); 
	xcall _LCD_en_write
	.dbline 44
;   delay_nus(40); 
	ldi R16,40
	ldi R17,0
	xcall _delay_nus
	.dbline 45
;   LCD_WriteControl(0x28); //4位显示 
	ldi R16,40
	xcall _LCD_WriteControl
	.dbline 46
;   LCD_WriteControl(0x0c); //显示开 
	ldi R16,12
	xcall _LCD_WriteControl
	.dbline 47
;   LCD_WriteControl(0x01); //清屏 
	ldi R16,1
	xcall _LCD_WriteControl
	.dbline 48
;   delay_nms(2); 
	ldi R16,2
	ldi R17,0
	xcall _delay_nms
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_en_write _LCD_en_write fV
	.even
_LCD_en_write::
	.dbline -1
	.dbline 52
; } 
; /*******************************液晶使能*************************************/
; void LCD_en_write(void) //液晶使能 
; { 
	.dbline 53
;   LCD_EN_PORT|=LCD_EN; 
	sbi 0x1b,3
	.dbline 54
;   delay_nus(1); 
	ldi R16,1
	ldi R17,0
	xcall _delay_nus
	.dbline 55
;   LCD_EN_PORT&=~LCD_EN; 
	cbi 0x1b,3
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_WriteControl _LCD_WriteControl fV
;        command -> R20
	.even
_LCD_WriteControl::
	st -y,R20
	mov R20,R16
	.dbline -1
	.dbline 59
; } 
; /*******************************写指令***************************************/
; void LCD_WriteControl(unsigned char command) //写指令 
; { 
	.dbline 60
;   delay_nus(16); 
	ldi R16,16
	ldi R17,0
	xcall _delay_nus
	.dbline 61
;   LCD_RS_PORT&=~LCD_RS; //RS=0 
	cbi 0x1b,1
	.dbline 62
;   LCD_RW_PORT&=~LCD_RW; //
	cbi 0x1b,2
	.dbline 63
;   LCD_DATA_PORT&=0X0f; //清高四位 
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 64
;   LCD_DATA_PORT|=command&0xf0; //写高四位 
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 65
;   LCD_en_write(); 
	xcall _LCD_en_write
	.dbline 66
;   command=command<<4; //低四位移到高四位 
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 67
;   LCD_DATA_PORT&=0x0f; //清高四位 
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 68
;   LCD_DATA_PORT|=command&0xf0; //写低四位 
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 69
;   LCD_en_write(); 
	xcall _LCD_en_write
	.dbline -2
L3:
	.dbline 0 ; func end
	ld R20,y+
	ret
	.dbsym r command 20 c
	.dbend
	.dbfunc e LCD_WriteData _LCD_WriteData fV
;           data -> R20
	.even
_LCD_WriteData::
	st -y,R20
	mov R20,R16
	.dbline -1
	.dbline 73
; } 
; /*******************************写数据***************************************/
; void LCD_WriteData(unsigned char data) //写数据 
; { 
	.dbline 74
;   delay_nus(16); 
	ldi R16,16
	ldi R17,0
	xcall _delay_nus
	.dbline 75
;   LCD_RS_PORT|=LCD_RS; //RS=1 
	sbi 0x1b,1
	.dbline 76
;   LCD_RW_PORT&=~LCD_RW; //
	cbi 0x1b,2
	.dbline 77
;   LCD_DATA_PORT&=0X0f; //清高四位 
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 78
;   LCD_DATA_PORT|=data&0xf0; //写高四位 
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 79
;   LCD_en_write(); 
	xcall _LCD_en_write
	.dbline 80
;   data=data<<4; //低四位移到高四位 
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 81
;   LCD_DATA_PORT&=0X0f; //清高四位 
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 82
;   LCD_DATA_PORT|=data&0xf0; //写低四位 
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 83
;   LCD_en_write(); 
	xcall _LCD_en_write
	.dbline -2
L4:
	.dbline 0 ; func end
	ld R20,y+
	ret
	.dbsym r data 20 c
	.dbend
	.dbfunc e LCD_Clear _LCD_Clear fV
	.even
_LCD_Clear::
	.dbline -1
	.dbline 88
; }
; 
; /*******************************清屏*****************************************/
; void LCD_Clear(void)
; {
	.dbline 89
; LCD_WriteControl(0x01);
	ldi R16,1
	xcall _LCD_WriteControl
	.dbline -2
L5:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_Cursor _LCD_Cursor fV
;         column -> R20
;            row -> R10
	.even
_LCD_Cursor::
	xcall push_xgsetF00C
	mov R20,R18
	mov R10,R16
	.dbline -1
	.dbline 93
; }
; 
; void LCD_Cursor (char row, char column)
; {
	.dbline 94
;   switch (row)
	mov R22,R10
	clr R23
	cpi R22,1
	ldi R30,0
	cpc R23,R30
	breq L10
X0:
	cpi R22,2
	ldi R30,0
	cpc R23,R30
	breq L11
X1:
	xjmp L8
L10:
	.dbline 96
;    {
;     case 1: LCD_WriteControl (0x80 + column - 1); break;
	mov R16,R20
	subi R16,128    ; addi 128
	subi R16,1
	xcall _LCD_WriteControl
	.dbline 96
	xjmp L8
L11:
	.dbline 97
;     case 2: LCD_WriteControl (0xc0 + column - 1); break;
	mov R16,R20
	subi R16,64    ; addi 192
	subi R16,1
	xcall _LCD_WriteControl
	.dbline 97
	.dbline 98
;     default: break;
L8:
	.dbline -2
L6:
	.dbline 0 ; func end
	xjmp pop_xgsetF00C
	.dbsym r column 20 c
	.dbsym r row 10 c
	.dbend
	.dbfunc e LCD_DisplayCharacter _LCD_DisplayCharacter fV
;           Char -> R10
	.even
_LCD_DisplayCharacter::
	st -y,R10
	mov R10,R16
	.dbline -1
	.dbline 103
;    }
; }
; 
; void LCD_DisplayCharacter (char Char)
; {
	.dbline 104
;   LCD_WriteData (Char);
	mov R16,R10
	xcall _LCD_WriteData
	.dbline -2
L12:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym r Char 10 c
	.dbend
	.dbfunc e LCD_DisplayString _LCD_DisplayString fV
;         string -> R10,R11
;         column -> R14
;            row -> R12
	.even
_LCD_DisplayString::
	xcall push_xgset00FC
	mov R14,R18
	mov R12,R16
	ldd R10,y+6
	ldd R11,y+7
	.dbline -1
	.dbline 108
; }
; 
; void LCD_DisplayString (char row, char column ,unsigned char *string)
; {
	.dbline 109
;  LCD_Cursor (row, column);
	mov R18,R14
	mov R16,R12
	xcall _LCD_Cursor
	xjmp L15
L14:
	.dbline 111
;  while (*string)
;   LCD_DisplayCharacter (*string++);
	movw R30,R10
	ld R16,Z+
	movw R10,R30
	xcall _LCD_DisplayCharacter
L15:
	.dbline 110
	movw R30,R10
	ldd R2,z+0
	tst R2
	brne L14
X2:
	.dbline -2
L13:
	.dbline 0 ; func end
	xjmp pop_xgset00FC
	.dbsym r string 10 pc
	.dbsym r column 14 c
	.dbsym r row 12 c
	.dbend
	.dbfunc e LCD_DisplayInt _LCD_DisplayInt fV
;              n -> R14
;              j -> R14
;            str -> R20,R21
;              a -> y+2
;              i -> R22
;              t -> R14,R15
;         column -> R12
;            row -> R10
	.even
_LCD_DisplayInt::
	xcall push_xgsetF0FC
	mov R12,R18
	mov R10,R16
	sbiw R28,7
	ldd R14,y+17
	ldd R15,y+18
	.dbline -1
	.dbline 116
; }
; 
; unsigned char ch1[6];                      //用于存放INT转换成字符串后的数据
; void  LCD_DisplayInt (char row, char column ,unsigned int t)
; { 
	.dbline 119
;   unsigned char n;
;   unsigned char a[5]; char i, j;   
;   unsigned char *str=ch1;                             
	ldi R20,<_ch1
	ldi R21,>_ch1
	.dbline 120
;   a[0]=(t/10000)%10;         //取得整数值到数组          
	ldi R18,10000
	ldi R19,39
	movw R16,R14
	xcall div16u
	ldi R18,10
	ldi R19,0
	xcall mod16u
	std y+2,R16
	.dbline 121
;   a[1]=(t/1000)%10;                                      
	ldi R18,1000
	ldi R19,3
	movw R16,R14
	xcall div16u
	ldi R18,10
	ldi R19,0
	xcall mod16u
	std y+3,R16
	.dbline 122
;   a[2]=(t/100)%10;                                       
	ldi R18,100
	ldi R19,0
	movw R16,R14
	xcall div16u
	ldi R18,10
	ldi R19,0
	xcall mod16u
	std y+4,R16
	.dbline 123
;   a[3]=(t/10)%10;                                        
	ldi R18,10
	ldi R19,0
	movw R16,R14
	xcall div16u
	ldi R18,10
	ldi R19,0
	xcall mod16u
	std y+5,R16
	.dbline 124
;   a[4]=(t/1)%10;                                         
	ldi R18,10
	ldi R19,0
	movw R16,R14
	xcall mod16u
	std y+6,R16
	.dbline 126
;                                                       
;   for(i=0; i<5; i++)         //转成ASCII码               
	clr R22
	xjmp L25
L22:
	.dbline 127
;     a[i]=a[i]+'0';                                     
	movw R24,R28
	adiw R24,2
	mov R2,R22
	clr R3
	add R2,R24
	adc R3,R25
	movw R30,R2
	ldd R24,z+0
	subi R24,208    ; addi 48
	std z+0,R24
L23:
	.dbline 126
	inc R22
L25:
	.dbline 126
	cpi R22,5
	brlo L22
X3:
	.dbline 128
;   for(i=0; a[i]=='0' && i<=3; i++);   
	clr R22
	xjmp L29
L26:
	.dbline 128
L27:
	.dbline 128
	inc R22
L29:
	.dbline 128
	movw R24,R28
	adiw R24,2
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	ldd R24,z+0
	cpi R24,48
	brne L30
X4:
	ldi R24,3
	cp R24,R22
	brsh L26
X5:
L30:
	.dbline 129
;     n=5-i;                   
	ldi R24,5
	mov R14,R24
	sub R14,R22
	.dbline 130
;   for(j=5-n; j<i; j++)       //填充空格                  
	sub R24,R14
	mov R14,R24
	xjmp L34
L31:
	.dbline 131
;     { *str=' ';  str++; }                              
	.dbline 131
	ldi R24,32
	movw R30,R20
	std z+0,R24
	.dbline 131
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 131
L32:
	.dbline 130
	inc R14
L34:
	.dbline 130
	cp R14,R22
	brlo L31
X6:
	.dbline 132
;   for(; i<5; i++)                                        
	xjmp L38
L35:
	.dbline 133
;     { *str=(char)a[i]; str++; }  //加入有效的数字            
	.dbline 133
	movw R24,R28
	adiw R24,2
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	movw R30,R20
	std z+0,R2
	.dbline 133
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 133
L36:
	.dbline 132
	inc R22
L38:
	.dbline 132
	cpi R22,5
	brlo L35
X7:
	.dbline 134
;   *str='\0'; 
	clr R2
	movw R30,R20
	std z+0,R2
	.dbline 135
;   LCD_DisplayString(row,column,ch1);
	ldi R24,<_ch1
	ldi R25,>_ch1
	std y+1,R25
	std y+0,R24
	mov R18,R12
	mov R16,R10
	xcall _LCD_DisplayString
	.dbline -2
L17:
	.dbline 0 ; func end
	adiw R28,7
	xjmp pop_xgsetF0FC
	.dbsym r n 14 c
	.dbsym r j 14 c
	.dbsym r str 20 pc
	.dbsym l a 2 A[5:5]c
	.dbsym r i 22 c
	.dbsym r t 14 i
	.dbsym r column 12 c
	.dbsym r row 10 c
	.dbend
	.dbfunc e LCD_Displayasc _LCD_Displayasc fV
;           temp -> R20
;          ascii -> y+2
;            asc -> y+10
;         column -> R12
;            row -> R10
	.even
_LCD_Displayasc::
	xcall push_xgset303C
	mov R12,R18
	mov R10,R16
	sbiw R28,4
	.dbline -1
	.dbline 139
; }
; 
; void LCD_Displayasc (char row, char column,  char asc)
; { 
	.dbline 141
;   unsigned char ascii[2],temp;
;   temp=asc;
	ldd R20,y+10
	.dbline 142
;   ascii[0]=temp+'0';
	mov R24,R20
	subi R24,208    ; addi 48
	std y+2,R24
	.dbline 143
;   ascii[1]='\0';
	clr R2
	std y+3,R2
	.dbline 144
;   LCD_DisplayString(row,column,ascii);
	movw R24,R28
	adiw R24,2
	std y+1,R25
	std y+0,R24
	mov R18,R12
	mov R16,R10
	xcall _LCD_DisplayString
	.dbline -2
L39:
	.dbline 0 ; func end

⌨️ 快捷键说明

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