📄 calculator.lst
字号:
C51 COMPILER V7.50 CALCULATOR 04/09/2007 18:39:43 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE CALCULATOR
OBJECT MODULE PLACED IN calculator.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE calculator.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /**************************************************************************
2
3
4
5 File Name: calculator.c
6 Author: liao xu ming
7 Created: 2007/3/23
8 Modified: 2007/4/8 增加到 运算的最大数据为 65535 整形数据 int
9 Revision: 1.0
10
11 ***************************************************************************/
12
13 #include"clock.h"
14 #include"calculator.h"
15 #include"lcd1602.h"
16 #include"keyboard.h"
17 #include"main.h"
18
19 #define operator_Emputy 0xfe //没有运算符按下的值
20 /***************************************************************************/
21
22 /**要在LCD上显示的字符******/
23 unsigned char code string_calcultor[]="calcultor:";
24 unsigned char code string_error_tomanybit[]="error many bit ";
25 unsigned char code string_Result[]="The Result: ";
26 unsigned char code string_clear_line2[]=" ";
27 /**************************************************************************/
28
29 unsigned char operand_A[5]={0,0,0,0,0}; //操作数 A .B
30 unsigned char operand_B[5]={0,0,0,0,0};
31
32 unsigned int Frist,Second,Result; //Result=Frist operator Second ;
33
34 unsigned char operator; //运算符
35
36 unsigned char Bit_Number; //运算的位计数,判断是否大于5位数,最大运算数为5位数
37 //extern unsigned char State_ADJ;
38 extern bit Calculator_To_DS18B20; //功能切换时的标示位————从计算器功能切换到温度计
39 bit State_Switch_Flag; //功能切换时的标示位
40 bit Flag_operand_B_NoEmpty; //操作数 B 不为空时置1
41 bit Flag_operand_A_NoEmpty; //操作数 A 不为空时置1
42 bit Flag_operator_FristTime; //运算符第一次按下时置1
43 bit Flag_Number_FristTime; //第一个操作数按下时
44
45 /*****************************************************************************
46 计算器程序,主要完成以下功能
47 1 完成 小于 65535数的 加减乘除
48
49 ******************************************************************************/
50 void Calculator(unsigned char Key_temp)
51 {
52 1 unsigned char idata Display_Ram[5]; //显示缓冲单元 一共5位
53 1 unsigned char data *p_Display_Ram; //指向显示缓冲单元的指针
54 1 unsigned char code* p_string_code; //指向显示字符串代码的指针
55 1 //unsigned char Key_temp;
C51 COMPILER V7.50 CALCULATOR 04/09/2007 18:39:43 PAGE 2
56 1 if(State_Switch_Flag==0) //功能切换时(从时钟切换到计算器时)要处理的一些初始化
57 1 {State_ADJ=0; //时钟
58 2 Bell_Flag=0; //关打玲
59 2 Bell=1; //关打玲
60 2 State_Switch_Flag=1; //功能切换成功后的标志位
61 2 Calculator_To_DS18B20=1; //计算器切换到温度计
62 2 LCD_send_command(LCD_CLEAR_SCREEN); //LCD 清屏
63 2 p_string_code=string_calcultor; //第一行显示字符” Caclcultor"
64 2 LCD_disp_string_code(0,0,p_string_code);//显示字符串
65 2 LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_OFF);//不显示光标
66 2 LCD_write_char(15,1,'0'); // clear 清零
67 2
68 2 /*****************************************************************
69 2 clear all flag
70 2 *****************************************************************/
71 2 Clear_All_Flag_Init();
72 2 /* operator=operator_Emputy; //运算符初始化
73 2 Flag_operand_B_NoEmpty=0; //操作数B 为空
74 2 Flag_operand_A_NoEmpty=0; //操作数A 为空
75 2 Flag_operator_FristTime=0; //无运算符按下
76 2 Flag_Number_FristTime=0; //无操作数
77 2 operand_A[0]=0;operand_A[1]=0;operand_A[2]=0;operand_A[3]=0;operand_A[4]=0;
78 2 operand_B[0]=0;operand_B[1]=0;operand_B[2]=0;operand_B[3]=0;operand_B[4]=0;
79 2 Bit_Number=0; //位计算清零*/
80 2 EA=0; //关中断
81 2 }
82 1
83 1 /************************/
84 1 //p_string_code=string_calcultor;
85 1 //LCD_disp_string_code(0,0,p_string_code);
86 1 /************************/
87 1 //Key_temp=Keyboard();
88 1 if((Key_temp!=KEY_NOTHING)&&(Key_temp!=KEY_FUNCTION))
89 1 { //如果是没有按键按下,或者是功能键按下 退出程序不执行
90 2 switch(Key_temp) //根据按键选择相应的操作
91 2 {
92 3 case EQUAL: //如果是等于号按下
93 3 if(Flag_operand_B_NoEmpty==1)
94 3 {
95 4 switch(operator) //根据运算符选择相应的操作
96 4 {
97 5 case ADD: Result=Frist+Second;break;
98 5 //加
99 5 case DEC: if(Frist>=Second) //减
100 5 {
101 6 Result=Frist-Second;
102 6 }
103 5 else
104 5 {
105 6 LCD_write_char(10,1,'-');
106 6 Result=Second-Frist;
107 6 }
108 5 break;
109 5 case MUL: Result=Frist*Second;break;
110 5 //乘
111 5 case DIV: Result=Frist/Second;break;
112 5 //除
113 5
114 5 default:break;
115 5 }
116 4 //clear all flag
117 4 Clear_All_Flag_Init();
C51 COMPILER V7.50 CALCULATOR 04/09/2007 18:39:43 PAGE 3
118 4 /*operator=operator_Emputy; //去处符初始化
119 4 Flag_operand_B_NoEmpty=0; //操作数B 为空
120 4 Flag_operand_A_NoEmpty=0; //操作数A 为空
121 4 Flag_operator_FristTime=0; //无运算符按下
122 4 Flag_Number_FristTime=0; //无操作数
123 4 operand_A[0]=0;operand_A[1]=0;operand_A[2]=0;operand_A[3]=0;operand_A[4]=0;
124 4 operand_B[0]=0;operand_B[1]=0;operand_B[2]=0;operand_B[3]=0;operand_B[4]=0;
125 4 Bit_Number=0; //位计算清零*/
126 4 Frist=Result; //结果
127 4 //display(); code
128 4 if(Frist>=65535)
129 4 {
130 5 The_Number_Too_Large();
131 5 }
132 4 else
133 4 {
134 5 if(Frist>0) //分解 把运算结果分解,然后送LCD显示
135 5 { Display_Ram[4]=(Frist%10)+0x30;
136 6 if(Frist>=10)
137 6 {
138 7 Display_Ram[3]=(Frist%100)/10+0x30;
139 7 if(Frist>=100)
140 7 {
141 8 Display_Ram[2]=(Frist%1000)/100+0x30;
142 8 if(Frist>=1000)
143 8 {
144 9 Display_Ram[1]=(Frist%10000)/1000+0x30;
145 9 if(Frist>=10000)
146 9 {
147 10 Display_Ram[0]=(Frist/10000)+0x30;
148 10 }
149 9 else
150 9 {
151 10 Display_Ram[0]=' ';
152 10 }
153 9 }
154 8 else
155 8 {
156 9 Display_Ram[0]=' ';Display_Ram[1]=' ';
157 9 }
158 8 }
159 7 else
160 7 {
161 8 Display_Ram[0]=' ';Display_Ram[1]=' ';Display_Ram[2]=' ';
162 8 }
163 7 }
164 6 else
165 6 {
166 7 Display_Ram[0]=' ';Display_Ram[1]=' ';Display_Ram[2]=' ';Display_Ram[3]=' ';
167 7 }
168 6 }
169 5 else{
170 6 Display_Ram[0]=' ';Display_Ram[1]=' ';Display_Ram[2]=' ';Display_Ram[3]=' ';Display_Ram[4]='0
-';
171 6
172 6 }
173 5 p_string_code=string_Result; //显示字符串 :The Result: "
174 5 LCD_disp_string_code(0,1,p_string_code);
175 5 p_Display_Ram=Display_Ram; //指向显示缓冲单元
176 5 LCD_disp_string(11,1,p_Display_Ram);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -