屏幕截圖 2025-06-20 034130.png (96.89 KB, 下載次數: 0)
下載附件
2025-6-20 04:08 上傳
- #include <reg52.h>
- #include <intrins.h>
- #include <stdio.h>
- #include <math.h>
- // LCD????
- sbit LCD_RS = P2^0;
- sbit LCD_RW = P2^1;
- sbit LCD_EN = P2^2;
- // ????
- float num1 = 0.0, num2 = 0.0, result = 0.0;
- unsigned char operator = 0; // 0:?, 1:+, 2:-, 3:*, 4:/
- unsigned char input_state = 0; // 0:??num1, 1:?????, 2:??num2
- unsigned char decimal_flag = 0; // ?????
- unsigned char decimal_count = 0; // ?????
- unsigned char display_buffer[16];
- // ????
- void delay_ms(unsigned int ms) {
- unsigned int i, j;
- for (i = ms; i > 0; i--)
- for (j = 110; j > 0; j--);
- }
- // LCD???
- void lcd_write_cmd(unsigned char cmd) {
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 1;
- P0 = cmd;
- delay_ms(2);
- LCD_EN = 0;
- }
- // LCD???
- void lcd_write_data(unsigned char dat) {
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 1;
- P0 = dat;
- delay_ms(2);
- LCD_EN = 0;
- }
- // LCD???
- void lcd_init(void) {
- delay_ms(15);
- lcd_write_cmd(0x38); // 8???,2?,5x7??
- delay_ms(5);
- lcd_write_cmd(0x0C); // ???,???
- delay_ms(5);
- lcd_write_cmd(0x06); // ????
- delay_ms(5);
- lcd_write_cmd(0x01); // ??
- delay_ms(5);
- }
- // LCD?????
- void lcd_display(unsigned char *str) {
- unsigned char i = 0;
- lcd_write_cmd(0x01); // ??
- lcd_write_cmd(0x80); // ?????
- while (str[i] != '\0') {
- lcd_write_data(str[i]);
- i++;
- }
- }
- // ??????(??SMALLCALC??)
- unsigned char key_scan(void) {
- unsigned char key_value = 0xFF;
- unsigned char row, col;
- P1 = 0xF0; // ?????
- if (P1 != 0xF0) { // ?????
- delay_ms(10); // ??
- if (P1 != 0xF0) {
- for (row = 0; row < 4; row++) {
- P1 = ~(0x01 << row);
- if ((P1 & 0xF0) != 0xF0) {
- col = P1 & 0xF0;
- switch (row) {
- case 0: // 7 8 9 /
- if (col == 0xE0) key_value = 7;
- else if (col == 0xD0) key_value = 8;
- else if (col == 0xB0) key_value = 9;
- else if (col == 0x70) key_value = 17; // /
- break;
- case 1: // 4 5 6 *
- if (col == 0xE0) key_value = 4;
- else if (col == 0xD0) key_value = 5;
- else if (col == 0xB0) key_value = 6;
- else if (col == 0x70) key_value = 12; // *
- break;
- case 2: // 1 2 3 -
- if (col == 0xE0) key_value = 1;
- else if (col == 0xD0) key_value = 2;
- else if (col == 0xB0) key_value = 3;
- else if (col == 0x70) key_value = 11; // -
- break;
- case 3: // C 0 = +
- if (col == 0xE0) key_value = 13; // C
- else if (col == 0xD0) key_value = 0;
- else if (col == 0xB0) key_value = 15; // =
- else if (col == 0x70) key_value = 10; // +
- break;
- }
- while ((P1 & 0xF0) != 0xF0); // ????
- return key_value;
- }
- }
- }
- }
- return key_value;
- }
- // ????
- void calculate(void) {
- switch (operator) {
- case 1: result = num1 + num2; break;
- case 2: result = num1 - num2; break;
- case 3: result = num1 * num2; break;
- case 4:
- if (num2 != 0) result = num1 / num2;
- else { lcd_display("Error: Div by 0"); return; }
- break;
- default: return;
- }
- sprintf(display_buffer, "Result: %.2f", result);
- lcd_display(display_buffer);
- }
- // ???
- void main(void) {
- unsigned char key;
- lcd_init();
- lcd_display("Calculator Ready");
- delay_ms(1000);
- while (1) {
- key = key_scan();
- if (key != 0xFF) {
- if (key >= 0 && key <= 9) { // ???
- if (input_state == 0) {
- if (decimal_flag == 0) {
- if (num1 < 99999) num1 = num1 * 10 + key;
- } else if (decimal_count < 2) {
- decimal_count++;
- num1 = num1 + key / pow(10, decimal_count);
- }
- sprintf(display_buffer, "Num1: %.2f", num1);
- } else if (input_state == 2) {
- if (decimal_flag == 0) {
- if (num2 < 99999) num2 = num2 * 10 + key;
- } else if (decimal_count < 2) {
- decimal_count++;
- num2 = num2 + key / pow(10, decimal_count);
- }
- sprintf(display_buffer, "Num2: %.2f", num2);
- }
- lcd_display(display_buffer);
- } else if (key >= 10 && key <= 12 || key == 17) { // ???
- operator = (key == 10) ? 1 : (key == 11) ? 2 : (key == 12) ? 3 : 4;
- input_state = 2;
- decimal_flag = 0;
- decimal_count = 0;
- sprintf(display_buffer, "Op: %c", "+-*/"[operator-1]);
- lcd_display(display_buffer);
- } else if (key == 13) { // ??(C)
- num1 = 0; num2 = 0; result = 0; operator = 0;
- input_state = 0; decimal_flag = 0; decimal_count = 0;
- lcd_display("Cleared");
- } else if (key == 14) { // ??(DEL)
- if (input_state == 0) {
- if (decimal_count > 0) {
- decimal_count--;
- num1 = (unsigned long)(num1 * pow(10, decimal_count)) / pow(10, decimal_count);
- } else {
- num1 = num1 / 10;
- }
- sprintf(display_buffer, "Num1: %.2f", num1);
- } else if (input_state == 2) {
- if (decimal_count > 0) {
- decimal_count--;
- num2 = (unsigned long)(num2 * pow(10, decimal_count)) / pow(10, decimal_count);
- } else {
- num2 = num2 / 10;
- }
- sprintf(display_buffer, "Num2: %.2f", num2);
- }
- lcd_display(display_buffer);
- } else if (key == 16) { // ???
- if (decimal_flag == 0 && input_state != 1) {
- decimal_flag = 1;
- decimal_count = 0;
- sprintf(display_buffer, "%.0f.", input_state == 0 ? num1 : num2);
- lcd_display(display_buffer);
- }
- } else if (key == 15) { // ??(=)
- if (input_state == 2 && operator != 0) {
- calculate();
- input_state = 0;
- num1 = result;
- num2 = 0;
- operator = 0;
- decimal_flag = 0;
- decimal_count = 0;
- }
- }
- }
- }
- }
復制代碼 |