?? mian.s
字號:
.module mian.c
.area text(rom, con, rel)
.dbfile D:\avr\+++精華+++\計算器/delay.h
.dbfunc e delay_1us _delay_1us fV
.even
_delay_1us::
.dbline -1
.dbline 15
; /*****************************************
; * 計算器程序設計 *
; * 功 能:計算器 *
; * 時鐘頻率:內部1M *
; * 設 計:莫錦攀 *
; * 修改日期:2007年07月16日 *
; * 編譯環境:ICC-AVR6.31 *
; * 實驗環境:M16學習板 *
; * 使用端口:1602: PC6,PC7,PA4~PA7, *
; 44KEY: PB0~PB7 *
; *****************************************/
;
; #include <iom16v.h>
; #include "1602.h"
; #include "key.h"
.dbline 16
; unsigned char a1[5]={32,32,32,32,0};//第一個數的顯示數組
nop
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay_nus _delay_nus fV
; i -> R20,R21
; n -> R22,R23
.even
_delay_nus::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 20
; unsigned char a2[5]={32,32,32,32,0};//第二個數的顯示數組
; unsigned char result_dp[7]={32,32,32,32,32,32,0};//結果的顯示數組
; int data1,data2;//兩個要運算的數
; long int result;//結果
.dbline 21
; unsigned char flag_a1=1,flag_a2=1;//兩個數的輸入完成標志位
clr R20
clr R21
.dbline 22
; unsigned char key=0x00;//按鍵值
xjmp L6
L3:
.dbline 23
xcall _delay_1us
L4:
.dbline 22
subi R20,255 ; offset = 1
sbci R21,255
L6:
.dbline 22
cp R20,R22
cpc R21,R23
brlo L3
.dbline -2
L2:
xcall 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 27
; unsigned char flag_count=32;//符號存放變量
; unsigned char ok=32;//等號的顯示符
; unsigned char error=0;//錯誤標志位
; //----------函數聲明-------------------
; void key_display(void);//按鍵顯示函數
.dbline 29
clr R16
clr R17
xjmp L11
L8:
.dbline 29
L9:
.dbline 29
subi R16,255 ; offset = 1
sbci R17,255
L11:
.dbline 29
; void process_key(void);//輸入接收函數
; void process_data(void);//數字處理函數
cpi R16,116
ldi R30,4
cpc R17,R30
brlo L8
.dbline -2
L7:
.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::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 33
; void process_count(void);//運算函數
; void process_count(void);//運算函數
; void display_result(void);//結果處理函數
; //--------------------------------------
.dbline 34
;
clr R20
clr R21
.dbline 35
; void process_key(void)//輸入接收函數
xjmp L16
L13:
.dbline 36
xcall _delay_1ms
L14:
.dbline 35
subi R20,255 ; offset = 1
sbci R21,255
L16:
.dbline 35
cp R20,R22
cpc R21,R23
brlo L13
.dbline -2
L12:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.dbfile D:\avr\+++精華+++\計算器/1602.h
.dbfunc e LCD_init _LCD_init fV
.even
_LCD_init::
.dbline -1
.dbline 44
; {static unsigned char i=0;
; if(key>='0'&&key<='9')//如果按下的是數字鍵著存放到a1或a2數組中
; {if(flag_a1==1)
; {
; if(a1[i]==32)a1[i]=key;//限制輸入的數字不能超過4位
; i++;//i用來確定存放的位,應為輸入是連續的所以需要靜態局部變量
; if(a1[3]!=32){flag_a1=0;i=0;}
; }
; else if(flag_a2==1&&flag_count!=32)
.dbline 45
; {
in R24,0x1a
ori R24,240
out 0x1a,R24
.dbline 46
; if(a2[i]==32)a2[i]=key;
sbi 0x14,7
.dbline 47
; i++;
sbi 0x14,6
.dbline 48
; if(a2[3]!=32){flag_a2=0;i=0;}
ldi R16,40
xcall _LCD_write_command
.dbline 49
; }
xcall _LCD_en_write
.dbline 50
; }
ldi R16,40
ldi R17,0
xcall _delay_nus
.dbline 51
; else if(key=='+'||key=='-'||key=='*'||key=='/'){flag_a1=0;flag_count=key;i=0;}
ldi R16,40
xcall _LCD_write_command
.dbline 52
; //運算符號記錄,按下運算符號表示第一個數輸入完成
ldi R16,12
xcall _LCD_write_command
.dbline 53
; else if(key=='=')
ldi R16,1
xcall _LCD_write_command
.dbline 54
; {
ldi R16,2
ldi R17,0
xcall _delay_nms
.dbline -2
L17:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD_en_write _LCD_en_write fV
.even
_LCD_en_write::
.dbline -1
.dbline 61
;
; ok='=';
; if(flag_a2==1&&a2[0]==32)
; {error=1;
;
; LCD_write_string(10,1,"ERROR");
; }//如果第二個數沒有輸入著輸入有錯
.dbline 62
; else
sbi 0x15,7
.dbline 63
; {process_data();
ldi R16,1
ldi R17,0
xcall _delay_nus
.dbline 64
; flag_a2=0;}//按下等于號表示第二個數輸入完成
cbi 0x15,7
.dbline -2
L18:
.dbline 0 ; func end
ret
.dbend
.dbfunc e LCD_write_command _LCD_write_command fV
; command -> R20
.even
_LCD_write_command::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 68
; }
;
; else if(key=='R')i=0;//如果復位著數字位標志也要復位
; key_display();//輸入接受完畢,調用顯示函數顯示輸入值
.dbline 70
; }
;
ldi R16,16
ldi R17,0
xcall _delay_nus
.dbline 71
; void key_display(void)//按鍵顯示函數
cbi 0x15,6
.dbline 72
; {unsigned char i;
in R24,0x1b
andi R24,15
out 0x1b,R24
.dbline 73
;
mov R24,R20
andi R24,240
in R2,0x1b
or R2,R24
out 0x1b,R2
.dbline 74
; if(key!=0x00&&key!='R')//如果不是按下復位按鍵著顯示,沒有輸入到的地方都是空格(ASCII=32)
xcall _LCD_en_write
.dbline 75
; {LCD_write_char(0,1,a1[0]);
mov R24,R20
andi R24,#0x0F
swap R24
mov R20,R24
.dbline 76
; LCD_write_char(1,1,a1[1]);
in R24,0x1b
andi R24,15
out 0x1b,R24
.dbline 77
; LCD_write_char(2,1,a1[2]);
mov R24,R20
andi R24,240
in R2,0x1b
or R2,R24
out 0x1b,R2
.dbline 78
; LCD_write_char(3,1,a1[3]);
xcall _LCD_en_write
.dbline -2
L19:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r command 20 c
.dbend
.dbfunc e LCD_write_data _LCD_write_data fV
; data -> R20
.even
_LCD_write_data::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 95
; LCD_write_char(4,1,flag_count);
; LCD_write_char(5,1,a2[0]);
; LCD_write_char(6,1,a2[1]);
; LCD_write_char(7,1,a2[2]);
; LCD_write_char(8,1,a2[3]);
; LCD_write_char(9,1,ok);
;
; key=0x00;
; }
; if(key!=0x00&&key=='R')//復位按鍵
; {
; LCD_write_string(0,1," ");
; for(i=0;i<5;i++)a1[i]=32;
; for(i=0;i<5;i++)a2[i]=32;
; for(i=0;i<7;i++)result_dp[i]=32;
; flag_a1=1;
; flag_a2=1;
.dbline 97
; key=0x00;
; flag_count=32;
ldi R16,16
ldi R17,0
xcall _delay_nus
.dbline 98
; ok=32;
sbi 0x15,6
.dbline 99
; error=0;
in R24,0x1b
andi R24,15
out 0x1b,R24
.dbline 100
; }
mov R24,R20
andi R24,240
in R2,0x1b
or R2,R24
out 0x1b,R2
.dbline 101
; }
xcall _LCD_en_write
.dbline 102
;
mov R24,R20
andi R24,#0x0F
swap R24
mov R20,R24
.dbline 103
;
in R24,0x1b
andi R24,15
out 0x1b,R24
.dbline 104
;
mov R24,R20
andi R24,240
in R2,0x1b
or R2,R24
out 0x1b,R2
.dbline 105
; void process_data(void)//數字處理函數
xcall _LCD_en_write
.dbline -2
L20:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r data 20 c
.dbend
.dbfunc e LCD_set_xy _LCD_set_xy fV
; address -> R20
; y -> R20
; x -> R22
.even
_LCD_set_xy::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 124
; {if(a1[3]!=32){data1=(a1[0]-48)*1000+(a1[1]-48)*100+(a1[2]-48)*10+(a1[3]-48);}
; else if(a1[2]!=32){data1=(a1[0]-48)*100+(a1[1]-48)*10+(a1[2]-48);}
; else if(a1[1]!=32){data1=(a1[0]-48)*10+(a1[1]-48);}
; else if(a1[0]!=32){data1=a1[0]-48;}
; else data1=0;//ASCII-48才是對應的數字
;
; if(a2[3]!=32){data2=(a2[0]-48)*1000+(a2[1]-48)*100+(a2[2]-48)*10+(a2[3]-48);}
; else if(a2[2]!=32){data2=(a2[0]-48)*100+(a2[1]-48)*10+(a2[2]-48);}
; else if(a2[1]!=32){data2=(a2[0]-48)*10+(a2[1]-48);}
; else if(a2[0]!=32){data2=a2[0]-48;}
; else data2=0;
;
; process_count();//數據處理完畢調用運算函數
; }
;
; void process_count(void)//運算函數
; {if(flag_count=='+')result=data1+data2;
; if(flag_count=='-')result=data1-data2;
; if(flag_count=='*')result=data1*data2;
.dbline 126
; if(flag_count=='/')result=data1/data2;
; display_result();//運算完畢調用結果處理函數
tst R20
brne L22
.dbline 126
mov R20,R22
subi R20,128 ; addi 128
xjmp L23
L22:
.dbline 127
; }
mov R20,R22
subi R20,64 ; addi 192
L23:
.dbline 128
;
mov R16,R20
xcall _LCD_write_command
.dbline -2
L21:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r address 20 c
.dbsym r y 20 c
.dbsym r x 22 c
.dbend
.dbfunc e LCD_write_string _LCD_write_string fV
; s -> R20,R21
; Y -> R10
; X -> R22
.even
_LCD_write_string::
xcall push_gset3
mov R10,R18
mov R22,R16
ldd R20,y+6
ldd R21,y+7
.dbline -1
.dbline 132
; void display_result(void)//結果處理函數
; {if(result>9999)error=1;//溢出
; if(result<0&&flag_count=='-'){result_dp[0]='-';result=result*(-1);}//符號處理
; if(result<0&&flag_count!='-')error=1; //只有減法有可能出現負數
.dbline 133
; if(flag_count=='/'&&data2==0)error=1;//除法時除數不能為0
mov R18,R10
mov R16,R22
xcall _LCD_set_xy
xjmp L26
L25:
.dbline 135
.dbline 136
movw R30,R20
ldd R16,z+0
xcall _LCD_write_data
.dbline 137
subi R20,255 ; offset = 1
sbci R21,255
.dbline 138
L26:
.dbline 134
;
movw R30,R20
ldd R2,z+0
tst R2
brne L25
.dbline -2
L24:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r s 20 pc
.dbsym r Y 10 c
.dbsym r X 22 c
.dbend
.dbfunc e LCD_write_char _LCD_write_char fV
; data -> y+4
; Y -> R22
; X -> R20
.even
_LCD_write_char::
xcall push_gset2
mov R22,R18
mov R20,R16
.dbline -1
.dbline 143
;
; result_dp[1]=result/10000+48;//顯示處理
; result_dp[2]=result/1000%10+48;
; result_dp[3]=result/100%10+48;
; result_dp[4]=result/10%10+48;
; result_dp[5]=result%10+48;
; if(result_dp[1]==48)//顯示修正,首位不能顯示0
; {result_dp[1]=32;
; if(result_dp[2]==48)
.dbline 144
; {result_dp[2]=32;
mov R18,R22
mov R16,R20
xcall _LCD_set_xy
.dbline 145
; if(result_dp[3]==48)
ldd R16,y+4
xcall _LCD_write_data
.dbline -2
L28:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l data 4 c
.dbsym r Y 22 c
.dbsym r X 20 c
.dbend
.dbfile D:\avr\+++精華+++\計算器/key.h
.dbfunc e key_read _key_read fc
; i -> R20
.even
_key_read::
xcall push_gset1
.dbline -1
.dbline 7
.dbline 10
ldi R24,240
out 0x17,R24
.dbline 11
ldi R24,15
out 0x18,R24
.dbline 12
ldi R16,1
ldi R17,0
xcall _delay_nms
.dbline 14
in R20,0x16
andi R20,15
.dbline 17
ldi R24,15
out 0x17,R24
.dbline 18
ldi R24,240
out 0x18,R24
.dbline 19
ldi R16,1
ldi R17,0
xcall _delay_nms
.dbline 21
in R24,0x16
andi R24,240
or R20,R24
.dbline 23
clr R21
cpi R20,215
ldi R30,0
cpc R21,R30
brne X1
xjmp L47
X1:
cpi R20,219
ldi R30,0
cpc R21,R30
brne X2
xjmp L43
X2:
cpi R20,221
ldi R30,0
cpc R21,R30
brne X3
xjmp L39
X3:
cpi R20,222
ldi R30,0
cpc R21,R30
brne X4
xjmp L35
X4:
ldi R24,222
ldi R25,0
cp R24,R20
cpc R25,R21
brlt L51
L50:
cpi R20,119
ldi R30,0
cpc R21,R30
brne X5
xjmp L49
X5:
cpi R20,123
ldi R30,0
cpc R21,R30
brne X6
xjmp L45
X6:
cpi R20,125
ldi R30,0
cpc R21,R30
brne X7
xjmp L41
X7:
cpi R20,126
ldi R30,0
cpc R21,R30
brne X8
xjmp L37
X8:
cpi R20,119
ldi R30,0
cpc R21,R30
brge X9
xjmp L30
X9:
L52:
cpi R20,183
ldi R30,0
cpc R21,R30
brne X10
xjmp L48
X10:
cpi R20,187
ldi R30,0
cpc R21,R30
brne X11
xjmp L44
X11:
cpi R20,189
ldi R30,0
cpc R21,R30
breq L40
cpi R20,190
ldi R30,0
cpc R21,R30
breq L36
xjmp L30
L51:
cpi R20,231
ldi R30,0
cpc R21,R30
breq L46
cpi R20,235
ldi R30,0
cpc R21,R30
breq L42
cpi R20,237
ldi R30,0
cpc R21,R30
breq L38
cpi R20,238
ldi R30,0
cpc R21,R30
breq L34
cpi R20,231
ldi R30,0
cpc R21,R30
brlt L30
L53:
cpi R20,255
ldi R30,0
cpc R21,R30
breq L33
xjmp L30
X0:
.dbline 24
L33:
.dbline 25
clr R16
xjmp L29
L34:
.dbline 26
ldi R16,47
xjmp L29
L35:
.dbline 27
ldi R16,61
xjmp L29
L36:
.dbline 28
ldi R16,48
xjmp L29
L37:
.dbline 29
ldi R16,82
xjmp L29
L38:
.dbline 30
ldi R16,42
xjmp L29
L39:
.dbline 31
ldi R16,57
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -