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

📄 计算器.lst

📁 通过单片机实现计算器的功能
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0117 2F62      MOV	R22,R18
    0118 2F40      MOV	R20,R16
(0138)     }
(0139)       
(0140) }
(0141) 
(0142) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
(0143) {
(0144)   LCD_set_xy( X, Y ); //写地址
    0119 2F26      MOV	R18,R22
    011A 2F04      MOV	R16,R20
    011B DFD3      RCALL	_LCD_set_xy
(0145)   LCD_write_data( data);
    011C 810C      LDD	R16,Y+4
    011D DFB1      RCALL	_LCD_write_data
    011E 940E06C0  CALL	pop_gset2
    0120 9508      RET
_key_read:
  i                    --> R20
    0121 940E06CE  CALL	push_gset1
FILE: D:\avr\+++精华+++\计算器\key.h
(0001) //函数说明
(0002) //--------------------------------
(0003)   unsigned char get_key(void);
(0004) //--------------------------------
(0005) #include "delay.h"
(0006) unsigned char key_read(void)
(0007) {
(0008)  	 unsigned char i;
(0009) 	/*获取列地址*/
(0010) 	DDRB=0xf0; //高4位输出,低4位输入
    0123 EF80      LDI	R24,0xF0
    0124 BB87      OUT	0x17,R24
(0011) 	PORTB=0x0f;//高4位输出0,低4位带上拉输入
    0125 E08F      LDI	R24,0xF
    0126 BB88      OUT	0x18,R24
(0012) 	delay_nms(1);
    0127 E001      LDI	R16,1
    0128 E010      LDI	R17,0
    0129 DF5B      RCALL	_delay_nms
(0013) 
(0014) 	i=PINB&0x0f;
    012A B346      IN	R20,0x16
    012B 704F      ANDI	R20,0xF
(0015) 	
(0016) 	/*获取行地址*/
(0017) 	DDRB=0x0f;//高4位输入,低4位输出
    012C E08F      LDI	R24,0xF
    012D BB87      OUT	0x17,R24
(0018) 	PORTB=0xf0;//低4位输出0,高4位带上拉输入
    012E EF80      LDI	R24,0xF0
    012F BB88      OUT	0x18,R24
(0019) 	delay_nms(1);
    0130 E001      LDI	R16,1
    0131 E010      LDI	R17,0
    0132 DF52      RCALL	_delay_nms
(0020) 
(0021) 	i|=PINB&0xf0;
    0133 B386      IN	R24,0x16
    0134 7F80      ANDI	R24,0xF0
    0135 2B48      OR	R20,R24
(0022) 	
(0023) 	switch(i)
    0136 2755      CLR	R21
    0137 3D47      CPI	R20,0xD7
    0138 E0E0      LDI	R30,0
    0139 075E      CPC	R21,R30
    013A F409      BNE	0x013C
    013B C075      RJMP	0x01B1
    013C 3D4B      CPI	R20,0xDB
    013D E0E0      LDI	R30,0
    013E 075E      CPC	R21,R30
    013F F409      BNE	0x0141
    0140 C068      RJMP	0x01A9
    0141 3D4D      CPI	R20,0xDD
    0142 E0E0      LDI	R30,0
    0143 075E      CPC	R21,R30
    0144 F409      BNE	0x0146
    0145 C05B      RJMP	0x01A1
    0146 3D4E      CPI	R20,0xDE
    0147 E0E0      LDI	R30,0
    0148 075E      CPC	R21,R30
    0149 F409      BNE	0x014B
    014A C04E      RJMP	0x0199
    014B ED8E      LDI	R24,0xDE
    014C E090      LDI	R25,0
    014D 1784      CP	R24,R20
    014E 0795      CPC	R25,R21
    014F F164      BLT	0x017C
    0150 3747      CPI	R20,0x77
    0151 E0E0      LDI	R30,0
    0152 075E      CPC	R21,R30
    0153 F409      BNE	0x0155
    0154 C060      RJMP	0x01B5
    0155 374B      CPI	R20,0x7B
    0156 E0E0      LDI	R30,0
    0157 075E      CPC	R21,R30
    0158 F409      BNE	0x015A
    0159 C053      RJMP	0x01AD
    015A 374D      CPI	R20,0x7D
    015B E0E0      LDI	R30,0
    015C 075E      CPC	R21,R30
    015D F409      BNE	0x015F
    015E C046      RJMP	0x01A5
    015F 374E      CPI	R20,0x7E
    0160 E0E0      LDI	R30,0
    0161 075E      CPC	R21,R30
    0162 F409      BNE	0x0164
    0163 C039      RJMP	0x019D
    0164 3747      CPI	R20,0x77
    0165 E0E0      LDI	R30,0
    0166 075E      CPC	R21,R30
    0167 F40C      BGE	0x0169
    0168 C04E      RJMP	0x01B7
    0169 3B47      CPI	R20,0xB7
    016A E0E0      LDI	R30,0
    016B 075E      CPC	R21,R30
    016C F409      BNE	0x016E
    016D C045      RJMP	0x01B3
    016E 3B4B      CPI	R20,0xBB
    016F E0E0      LDI	R30,0
    0170 075E      CPC	R21,R30
    0171 F409      BNE	0x0173
    0172 C038      RJMP	0x01AB
    0173 3B4D      CPI	R20,0xBD
    0174 E0E0      LDI	R30,0
    0175 075E      CPC	R21,R30
    0176 F161      BEQ	0x01A3
    0177 3B4E      CPI	R20,0xBE
    0178 E0E0      LDI	R30,0
    0179 075E      CPC	R21,R30
    017A F101      BEQ	0x019B
    017B C03B      RJMP	0x01B7
    017C 3E47      CPI	R20,0xE7
    017D E0E0      LDI	R30,0
    017E 075E      CPC	R21,R30
    017F F179      BEQ	0x01AF
    0180 3E4B      CPI	R20,0xEB
    0181 E0E0      LDI	R30,0
    0182 075E      CPC	R21,R30
    0183 F119      BEQ	0x01A7
    0184 3E4D      CPI	R20,0xED
    0185 E0E0      LDI	R30,0
    0186 075E      CPC	R21,R30
    0187 F0B9      BEQ	0x019F
    0188 3E4E      CPI	R20,0xEE
    0189 E0E0      LDI	R30,0
    018A 075E      CPC	R21,R30
    018B F059      BEQ	0x0197
    018C 3E47      CPI	R20,0xE7
    018D E0E0      LDI	R30,0
    018E 075E      CPC	R21,R30
    018F F13C      BLT	0x01B7
    0190 3F4F      CPI	R20,0xFF
    0191 E0E0      LDI	R30,0
    0192 075E      CPC	R21,R30
    0193 F009      BEQ	0x0195
    0194 C022      RJMP	0x01B7
(0024) 	{
(0025) 		case 0xff:return 0x00;
    0195 2700      CLR	R16
    0196 C021      RJMP	0x01B8
(0026) 		case 0xee:return '/';
    0197 E20F      LDI	R16,0x2F
    0198 C01F      RJMP	0x01B8
(0027) 		case 0xde:return '=';
    0199 E30D      LDI	R16,0x3D
    019A C01D      RJMP	0x01B8
(0028) 		case 0xbe:return '0';
    019B E300      LDI	R16,0x30
    019C C01B      RJMP	0x01B8
(0029) 		case 0x7e:return 'R';
    019D E502      LDI	R16,0x52
    019E C019      RJMP	0x01B8
(0030) 		case 0xed:return '*';
    019F E20A      LDI	R16,0x2A
    01A0 C017      RJMP	0x01B8
(0031) 		case 0xdd:return '9';
    01A1 E309      LDI	R16,0x39
    01A2 C015      RJMP	0x01B8
(0032) 		case 0xbd:return '8';
    01A3 E308      LDI	R16,0x38
    01A4 C013      RJMP	0x01B8
(0033) 		case 0x7d:return '7';
    01A5 E307      LDI	R16,0x37
    01A6 C011      RJMP	0x01B8
(0034) 		case 0xeb:return '-';
    01A7 E20D      LDI	R16,0x2D
    01A8 C00F      RJMP	0x01B8
(0035) 		case 0xdb:return '6';
    01A9 E306      LDI	R16,0x36
    01AA C00D      RJMP	0x01B8
(0036) 		case 0xbb:return '5';
    01AB E305      LDI	R16,0x35
    01AC C00B      RJMP	0x01B8
(0037) 		case 0x7b:return '4';
    01AD E304      LDI	R16,0x34
    01AE C009      RJMP	0x01B8
(0038) 		case 0xe7:return '+';
    01AF E20B      LDI	R16,0x2B
    01B0 C007      RJMP	0x01B8
(0039) 		case 0xd7:return '3';
    01B1 E303      LDI	R16,0x33
    01B2 C005      RJMP	0x01B8
(0040) 		case 0xb7:return '2';
    01B3 E302      LDI	R16,0x32
    01B4 C003      RJMP	0x01B8
(0041) 		case 0x77:return '1';
    01B5 E301      LDI	R16,0x31
    01B6 C001      RJMP	0x01B8
(0042) 		default:return 0x00;
    01B7 2700      CLR	R16
    01B8 940E06D1  CALL	pop_gset1
    01BA 9508      RET
_get_key:
  i                    --> R20
    01BB 940E06CE  CALL	push_gset1
(0043) 	}
(0044) }
(0045) 
(0046) unsigned char get_key(void)
(0047) {unsigned char i;
(0048)  static unsigned char j;//按键记录 
(0049)  i = key_read();
    01BD DF63      RCALL	_key_read
    01BE 2F40      MOV	R20,R16
(0050)  if (i == 0x00)//无有效按键按下
    01BF 2300      TST	R16
    01C0 F429      BNE	0x01C6
(0051)  {
(0052)   j = 0x00;//清除按键记录
    01C1 2422      CLR	R2
    01C2 9220009E  STS	j,R2
(0053)   return 0x00;//程序退出
    01C4 2700      CLR	R16
    01C5 C011      RJMP	0x01D7
(0054)   }
(0055)  if (j == 0x00) //为新按键
    01C6 9020009E  LDS	R2,j
    01C8 2022      TST	R2
    01C9 F461      BNE	0x01D6
(0056)   {j = i;//保存本次采样结果
    01CA 9340009E  STS	j,R20
(0057)   delay_nms(10);//去按键颤抖
    01CC E00A      LDI	R16,0xA
    01CD E010      LDI	R17,0
    01CE DEB6      RCALL	_delay_nms
(0058)   i = key_read();
    01CF DF51      RCALL	_key_read
    01D0 2F40      MOV	R20,R16
(0059)   if(i == j) {return i;}
    01D1 9020009E  LDS	R2,j
    01D3 1502      CP	R16,R2
    01D4 F409      BNE	0x01D6
    01D5 C001      RJMP	0x01D7
(0060)   }
(0061) return 0x00;
    01D6 2700      CLR	R16
    01D7 940E06D1  CALL	pop_gset1
    01D9 9508      RET
_process_key:
    01DA 9722      SBIW	R28,2
FILE: D:\avr\+++精华+++\计算器\mian.c
(0001) /*****************************************
(0002) *      计算器程序设计 			   	     *
(0003) * 功    能:计算器          			 *
(0004) * 时钟频率:内部1M 						 *
(0005) * 设    计:莫锦攀						 *
(0006) * 修改日期:2007年07月16日				 *
(0007) * 编译环境:ICC-AVR6.31					 *
(0008) * 实验环境:M16学习板					 *
(0009) * 使用端口:1602:	PC6,PC7,PA4~PA7,	 *
(0010)   			44KEY:	PB0~PB7 	 		 *
(0011) *****************************************/
(0012) 
(0013) #include <iom16v.h>
(0014) #include "1602.h"
(0015) #include "key.h"
(0016) unsigned char a1[5]={32,32,32,32,0};//第一个数的显示数组
(0017) unsigned char a2[5]={32,32,32,32,0};//第二个数的显示数组
(0018) unsigned char result_dp[7]={32,32,32,32,32,32,0};//结果的显示数组
(0019) int data1,data2;//两个要运算的数
(0020) long int result;//结果
(0021) unsigned char flag_a1=1,flag_a2=1;//两个数的输入完成标志位
(0022) unsigned char key=0x00;//按键值
(0023) unsigned char flag_count=32;//符号存放变量
(0024) unsigned char ok=32;//等号的显示符
(0025) unsigned char error=0;//错误标志位
(0026) //----------函数声明-------------------
(0027) void key_display(void);//按键显示函数
(0028) void process_key(void);//输入接收函数
(0029) void process_data(void);//数字处理函数
(0030) void process_count(void);//运算函数
(0031) void process_count(void);//运算函数
(0032) void display_result(void);//结果处理函数
(0033) //--------------------------------------
(0034) 
(0035) void process_key(void)//输入接收函数
(0036) {static unsigned char i=0;
(0037) if(key>='0'&&key<='9')//如果按下的是数字键着存放到a1或a2数组中
    01DB 91800073  LDS	R24,key
    01DD 3380      CPI	R24,0x30
    01DE F408      BCC	0x01E0
    01DF C05A      RJMP	0x023A
    01E0 E389      LDI	R24,0x39
    01E1 90200073  LDS	R2,key
    01E3 1582      CP	R24,R2
    01E4 F408      BCC	0x01E6
    01E5 C054      RJMP	0x023A
(0038)   {if(flag_a1==1)
    01E6 91800071  LDS	R24,flag_a1
    01E8 3081      CPI	R24,1
    01E9 F511      BNE	0x020C
(0039) 	{
(0040) 	if(a1[i]==32)a1[i]=key;//限制输入的数字不能超过4位
    01EA E680      LDI	R24,0x60
    01EB E090      LDI	R25,0
    01EC 91E00077  LDS	R30,i
    01EE 27FF      CLR	R31
    01EF 0FE8      ADD	R30,R24
    01F0 1FF9      ADC	R31,R25
    01F1 8180      LDD	R24,Z+0
    01F2 3280      CPI	R24,0x20
    01F3 F441      BNE	0x01FC
    01F4 E680      LDI	R24,0x60
    01F5 E090      LDI	R25,0
    01F6 91E00077  LDS	R30,i
    01F8 27FF      CLR	R31
    01F9 0FE8      ADD	R30,R24
    01FA 1FF9      ADC	R31,R25
    01FB 8220      STD	Z+0,R2
(0041) 	i++;//i用来确定存放的位,应为输入是连续的所以需要静态局部变量
    01FC 91800077  LDS	R24,i
    01FE 5F8F      SUBI	R24,0xFF
    01FF 93800077  STS	i,R24
(0042) 	if(a1[3]!=32){flag_a1=0;i=0;}
    0201 91800063  LDS	R24,a1+3
    0203 3280      CPI	R24,0x20
    0204 F409      BNE	0x0206
    0205 C06F      RJMP	0x0275
    0206 2422      CLR	R2
    0207 92200071  STS	flag_a1,R2
    0209 92200077  STS	i,R2
(0043) 	}
    020B C069      RJMP	0x0275
(0044)    else if(flag_a2==1&&flag_count!=32)
    020C 91800072  LDS	R24,flag_a2
    020E 3081      CPI	R24,1
    020F F009      BEQ	0x0211
    0210 C064      RJMP	0x0275
    0211 91800074  LDS	R24,flag_count
    0213 3280      CPI	R24,0x20
    0214 F409      BNE	0x0216
    0215 C05F      RJMP	0x0275
(0045) 	{
(0046) 	if(a2[i]==32)a2[i]=key;
    0216 E685      LDI	R24,0x65
    0217 E090      LDI	R25,0
    0218 91E00077  LDS	R30,i
    021A 27FF      CLR	R31
    021B 0FE8      ADD	R30,R24
    021C 1FF9      ADC	R31,R25
    021D 8180      LDD	R24,Z+0
    021E 3280      CPI	R24,0x20
    021F F451      BNE	0x022A
    0220 E685      LDI	R24,0x65
    0221 E090      LDI	R25,0
    0222 91E00077  LDS	R30,i
    0224 27FF      CLR	R31
    0225 0FE8      ADD	R30,R24
    0226 1FF9      ADC	R31,R25
    0227 90200073  LDS	R2,key
    0229 8220      STD	Z+0,R2
(0047) 	i++;
    022A 91800077  LDS	R24,i
    022C 5F8F      SUBI	R24,0xFF
    022D 93800077  STS	i,R24
(0048) 	if(a2[3]!=32){flag_a2=0;i=0;}
    022F 91800068  LDS	R24,a2+3
    0231 3280      CPI	R24,0x20
    0232 F409      BNE	0x0234
    0233 C041      RJMP	0x0275
    0234 2422      CLR	R2
    0235 92200072  STS	flag_a2,R2
    0237 92200077  STS	i,R2
(0049) 	}
(0050)   }
    0239 C03B      RJMP	0x0275
(0051) else if(key=='+'||key=='-'||key=='*'||key=='/'){flag_a1=0;flag_count=key;i=0;}
    023A 91800073  LDS	R24,key
    023C 328B      CPI	R24,0x2B
    023D F031      BEQ	0x0244
    023E 328D      CPI	R24,0x2D
    023F F021      BEQ	0x0244
    0240 328A      CPI	R24,0x2A
    0241 F011      BEQ	0x0244
    0242 328F      CPI	R24,0x2F

⌨️ 快捷键说明

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