剛學習51單片機一段時間,寫了一個計算器,請問該怎么實現計算器的連續計算功能呢,現在只能進行正常的正整數運算。
單片機源程序如下:
- #include <reg52.h>
- typedef unsigned int u16;
- typedef unsigned char u8;
- unsigned long int count = 0, sum = 0;
- unsigned char symbol; //加減乘除
- unsigned char KeyValue;//按下鍵的序號
- unsigned char KeyState;//按鍵按下標志位,按下為1,松開為0
- #define GPIO_KEY P1
- sbit LSA = P2 ^ 2;
- sbit LSB = P2 ^ 3;
- sbit LSC = P2 ^ 4;
- u16 a, point;
- u8 DisplayData[8];
- u8 code smgduan[11] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x00 };
- void delay(); //延時
- void KeyDown(); //按鍵掃描
- void DigDisplay(); //數碼管顯示
- void conversion(); //計算過程
- void main()
- {
- while (1)
- {
- KeyDown();
- if (KeyState == 1)
- {
- DisplayData[7] = DisplayData[6];
- DisplayData[6] = DisplayData[5];
- DisplayData[5] = DisplayData[4];
- DisplayData[4] = DisplayData[3];
- DisplayData[3] = DisplayData[2];
- DisplayData[2] = DisplayData[1];
- DisplayData[1] = DisplayData[0];
- DisplayData[0] = smgduan[KeyValue];
- KeyState = 0;
- }
- DigDisplay();
- }
- }
- void KeyDown() //按鍵掃描
- {
- GPIO_KEY = 0x0f;
- if (GPIO_KEY != 0x0f)
- {
- delay();
- if (GPIO_KEY != 0x0f)
- {
- KeyState = 1; //有按鍵按下
- GPIO_KEY = 0x0F; //測試列
- switch (GPIO_KEY)
- {
- case(0X07):
- KeyValue = 1;
- break;
- case(0X0b):
- KeyValue = 2;
- break;
- case(0X0d):
- KeyValue = 3;
- break;
- case(0X0e):
- KeyValue = 4;
- break;
- }
- GPIO_KEY = 0XF0; //測試行
- delay();
- switch (GPIO_KEY)
- {
- case(0X70):
- KeyValue = KeyValue;
- break;
- case(0Xb0):
- KeyValue = KeyValue + 4;
- break;
- case(0Xd0):
- KeyValue = KeyValue + 8;
- break;
- case(0Xe0):
- KeyValue = KeyValue + 12;
- break;
- }
- while ((a < 500) && (GPIO_KEY != 0xf0))//按鍵松手檢測
- {
- delay();
- a++;
- }
- a = 0;
- conversion();
- }
- }
- }
- void conversion()
- {
- unsigned char KeyValue_count;
- if (KeyValue % 4 != 0) //else進入加減乘除
- {
- if (KeyValue != 15) // 15是等于號
- {
- switch (KeyValue)
- {
- case 1:
- case 2:
- case 3:
- KeyValue_count = KeyValue;
- break;
- case 5:
- case 6:
- case 7:
- KeyValue_count = KeyValue - 1;
- break;
- case 9:
- case 10:
- case 11:
- KeyValue_count = KeyValue - 2;
- break;
- case 13:
- {
- count = 0; //count = 0; sum = 0;KeyValue_count = 0; 清零
- sum = 0;
- KeyValue_count = 0;
- break;
- }
- case 14:
- KeyValue_count = 0;
- break;
- default:
- break;
- }
- count = count * 10 + KeyValue_count; //往前進一位
- }
- else //等于結果
- {
- if (symbol == '+')
- sum = sum + count;
- if (symbol == '-')
- sum = sum - count;
- if (symbol == '*')
- sum = sum * count;
- if (symbol == '/')
- sum = sum / count;
- count = sum;
- }
- }
- else
- {
- switch (KeyValue)
- {
- case 4:
- symbol = '+';
- break;
- case 8:
- symbol = '-';
- break;
- case 12:
- symbol = '*';
- break;
- case 16:
- symbol = '/';
- break;
- }
- sum = count;
- count = 0;
- }
- }
- void DigDisplay()
- {
- unsigned char j;
- unsigned int i;
- for (j = 0; j < 8; j++)
- {
- switch (j)
- {
- case(0):
- LSA = 0;
- LSB = 0;
- LSC = 0;
- P0 = smgduan[count % 10];
- break;
- case(1):
- LSA = 1;
- LSB = 0;
- LSC = 0;
- if (count >= 10)
- P0 = smgduan[count % 100 / 10];
- else
- P0 = 0x00;
- break;
- case(2):
- LSA = 0;
- LSB = 1;
- LSC = 0;
- if (count >= 100)
- P0 = smgduan[count % 1000 / 100];
- else
- P0 = 0x00;
- break;
- case(3):
- LSA = 1;
- LSB = 1;
- LSC = 0;
- if (count >= 1000)
- P0 = smgduan[count % 10000 / 1000];
- else
- P0 = 0x00;
- break;
- case(4):
- LSA = 0;
- LSB = 0;
- LSC = 1;
- if (count >= 10000)
- P0 = smgduan[count % 100000 / 10000];
- else
- P0 = 0x00;
- break;
- case(5):
- LSA = 1;
- LSB = 0;
- LSC = 1;
- if (count >= 100000)
- P0 = smgduan[count % 1000000 / 100000];
- else
- P0 = 0x00;
- break;
- case(6):
- LSA = 0;
- LSB = 1;
- LSC = 1;
- if (count >= 1000000)
- P0 = smgduan[count % 10000000 / 1000000];
- else
- P0 = 0x00;
- break;
- case(7):
- LSA = 1;
- LSB = 1;
- LSC = 1;
- if (count >= 10000000)
- P0 = smgduan[count % 100000000 / 10000000];
- else
- P0 = 0x00;
- break;
- }
- i = 10;
- while (i--);
- P0 = 0x00;
- }
- }
- void delay() //延時10ms
- {
- unsigned char a, b, c;
- for (c = 1; c > 0; c--)
- for (b = 38; b > 0; b--)
- for (a = 130; a > 0; a--);
- }
復制代碼
|