单片机程序代码
时间: 2023-07-24 21:18:46 浏览: 57
单片机编程代码
以下是一个简单的单片机计算器的示例代码,使用C语言编写,可供参考:
```c
#include <reg52.h>
#include <stdio.h>
#include <stdlib.h>
// 数字按键对应的端口和位
sbit key_0=P3^0;
sbit key_1=P3^1;
sbit key_2=P3^2;
sbit key_3=P3^3;
sbit key_4=P3^4;
sbit key_5=P3^5;
sbit key_6=P3^6;
sbit key_7=P3^7;
// 运算符按键对应的端口和位
sbit key_add=P2^0;
sbit key_sub=P2^1;
sbit key_mul=P2^2;
sbit key_div=P2^3;
sbit key_equal=P2^4;
sbit key_clear=P2^5;
// 数码管显示对应的端口和位
sbit display_digit_0=P1^0;
sbit display_digit_1=P1^1;
sbit display_digit_2=P1^2;
sbit display_digit_3=P1^3;
sbit display_segment=P1^4;
// 计算器状态
int num1=0;
int num2=0;
int result=0;
int operator=0; // 1: add, 2: sub, 3: mul, 4: div
int input_mode=1; // 1: input num1, 2: input num2
// 数码管显示的数字表
char digit_table[]={
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f, // 9
};
// 数码管显示函数
void display(int number) {
int digit[4];
digit[0]=number%10;
digit[1]=(number/10)%10;
digit[2]=(number/100)%10;
digit[3]=(number/1000)%10;
display_digit_0=1;
display_segment=digit_table[digit[0]];
display_digit_0=0;
display_digit_1=1;
display_segment=digit_table[digit[1]];
display_digit_1=0;
display_digit_2=1;
display_segment=digit_table[digit[2]];
display_digit_2=0;
display_digit_3=1;
display_segment=digit_table[digit[3]];
display_digit_3=0;
}
// 按键扫描函数
int scan_key() {
if (key_0==0) return 0;
if (key_1==0) return 1;
if (key_2==0) return 2;
if (key_3==0) return 3;
if (key_4==0) return 4;
if (key_5==0) return 5;
if (key_6==0) return 6;
if (key_7==0) return 7;
return -1;
}
// 主函数
void main() {
while (1) {
int key=scan_key();
if (key>=0) {
int digit=key;
if (input_mode==1) {
num1=num1*10+digit;
display(num1);
} else {
num2=num2*10+digit;
display(num2);
}
}
if (key_add==0) {
operator=1;
input_mode=2;
display(0);
while (key_add==0); // 等待按键释放
}
if (key_sub==0) {
operator=2;
input_mode=2;
display(0);
while (key_sub==0); // 等待按键释放
}
if (key_mul==0) {
operator=3;
input_mode=2;
display(0);
while (key_mul==0); // 等待按键释放
}
if (key_div==0) {
operator=4;
input_mode=2;
display(0);
while (key_div==0); // 等待按键释放
}
if (key_equal==0) {
if (operator==1) result=num1+num2;
if (operator==2) result=num1-num2;
if (operator==3) result=num1*num2;
if (operator==4) result=num1/num2;
display(result);
while (key_equal==0); // 等待按键释放
}
if (key_clear==0) {
num1=0;
num2=0;
result=0;
operator=0;
input_mode=1;
display(0);
while (key_clear==0); // 等待按键释放
}
}
}
```
这个程序使用了单片机的定时器和中断机制,每隔一段时间更新一次数码管的显示内容。同时,它也实现了简单的按键扫描和处理功能,可以处理数字输入、运算符输入、运算和结果显示等功能。程序中使用了多个变量来保存计算器的状态,可以在不同的状态之间切换,以实现不同的功能。
阅读全文