欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
為什么就是不顯示呢
[打印本頁]
作者:
jklovezy
時間:
2025-6-20 04:08
標題:
為什么就是不顯示呢
屏幕截圖 2025-06-20 034130.png
(96.89 KB, 下載次數(shù): 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;
}
}
}
}
}
復(fù)制代碼
作者:
zhuls
時間:
2025-6-20 11:29
論壇的基本功能:“搜索功能”,你可以學(xué)習(xí)一下
作者:
cy009
時間:
2025-6-20 17:36
程序卡在按鍵掃描程序里,檢查一下按鍵函數(shù)
作者:
hhdsdy
時間:
2025-6-20 18:20
復(fù)位腳接錯了,把R1和C3的位置對換一下。
作者:
zhuapa
時間:
2025-6-20 20:43
試一下?lián)Q下輸出引腳
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1