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

📄 mian.s

📁 通过单片机实现计算器的功能
💻 S
📖 第 1 页 / 共 3 页
字号:
	.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 + -