?? main.s
字號:
.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 + -