📄 计算器.lst
字号:
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 + -