新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于單片機(jī)的數(shù)碼管按鍵計(jì)算器程序

基于單片機(jī)的數(shù)碼管按鍵計(jì)算器程序

作者: 時(shí)間:2016-11-30 來(lái)源:網(wǎng)絡(luò) 收藏
這是一個(gè)51hei論壇版主測(cè)試成功的程序。用的是stc單片機(jī),電路比較簡(jiǎn)單就不畫(huà)出來(lái)了按鍵接在P2口

數(shù)碼管的位選口是:
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
數(shù)碼管的段選口是P0
還有一個(gè)led燈p1.4 一個(gè)喇叭P1.6
/*
* Easy calculator
*
* K4:+ K8:- K12:* K16:/ K14:Clear K15:=
*數(shù)碼管按鍵計(jì)算器程序
*/
#include
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
typedef char int8;
typedef int int16;
typedeflong int32;
sbit KeyIn1 = P2^4;
sbit KeyIn2 = P2^5;
sbit KeyIn3 = P2^6;
sbit KeyIn4 = P2^7;
sbit KeyOut1 = P2^3;
sbit KeyOut2 = P2^2;
sbit KeyOut3 = P2^1;
sbit KeyOut4 = P2^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit BUZZ = P1^6;
#define FADD 10
#define FSUB 11
#define FMUL 12
#define FDIV 13
#define FRES 14
#define FEQU 15
#define KEY_DELAY 300
#define BUZ_DELAY 80
code uint8 Ledcode[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x86};
uint8 Led_n=0;
uint8 Led_buf[6];
float Tmp1=0, Tmp2=0;
int8 C_flag=0;
/*
* 延時(shí)
*/
void delay(uint16 n)
{
while (n--);
}
/*
*蜂鳴器發(fā)聲
*/
void buzzer_sound(void)
{
uint16 i;
for (i=0; i{
BUZZ = ~BUZZ;
delay(100);
}
BUZZ = 1;
}
/*
*按鍵掃描
*/
int8 scan_key(void)
{
int8 val=-1;
KeyOut1 = 0;
KeyOut2 = 1;
KeyOut3 = 1;
KeyOut4 = 1;
if (KeyIn1 == 0)
{
delay(KEY_DELAY);
if (KeyIn1 == 0)
val = 1;
}
if (KeyIn2 == 0)
{
delay(KEY_DELAY);
if (KeyIn2 == 0)
val = 2;
}
if (KeyIn3 == 0)
{
delay(KEY_DELAY);
if (KeyIn3 == 0)
val = 3;
}
if (KeyIn4 == 0)
{
delay(KEY_DELAY);
if (KeyIn4 == 0)
val = FADD;
}
while ((KeyIn1 == 0)||(KeyIn2 == 0)||(KeyIn3 == 0)||(KeyIn4 == 0));
KeyOut1 = 1;
KeyOut2 = 0;
KeyOut3 = 1;
KeyOut4 = 1;
if (KeyIn1 == 0)
{
delay(KEY_DELAY);
if (KeyIn1 == 0)
val = 4;
}
if (KeyIn2 == 0)
{
delay(KEY_DELAY);
if (KeyIn2 == 0)
val = 5;
}
if (KeyIn3 == 0)
{
delay(KEY_DELAY);
if (KeyIn3 == 0)
val = 6;
}
if (KeyIn4 == 0)
{
delay(KEY_DELAY);
if (KeyIn4 == 0)
val = FSUB;
}
while ((KeyIn1 == 0)||(KeyIn2 == 0)||(KeyIn3 == 0)||(KeyIn4 == 0));
KeyOut1 = 1;
KeyOut2 = 1;
KeyOut3 = 0;
KeyOut4 = 1;
if (KeyIn1 == 0)
{
delay(KEY_DELAY);
if (KeyIn1 == 0)
val = 7;
}
if (KeyIn2 == 0)
{
delay(KEY_DELAY);
if (KeyIn2 == 0)
val = 8;
}
if (KeyIn3 == 0)
{
delay(KEY_DELAY);
if (KeyIn3 == 0)
val = 9;
}
if (KeyIn4 == 0)
{
delay(KEY_DELAY);
if (KeyIn4 == 0)
val = FMUL;
}
while ((KeyIn1 == 0)||(KeyIn2 == 0)||(KeyIn3 == 0)||(KeyIn4 == 0));
KeyOut1 = 1;
KeyOut2 = 1;
KeyOut3 = 1;
KeyOut4 = 0;
if (KeyIn1 == 0)
{
delay(KEY_DELAY);
if (KeyIn1 == 0)
val = 0;
}
if (KeyIn2 == 0)
{
delay(KEY_DELAY);
if (KeyIn2 == 0)
val = FRES;
}
if (KeyIn3 == 0)
{
delay(KEY_DELAY);
if (KeyIn3 == 0)
val = FEQU;
}
if (KeyIn4 == 0)
{
delay(KEY_DELAY);
if (KeyIn4 == 0)
val = FDIV;
}
while ((KeyIn1 == 0)||(KeyIn2 == 0)||(KeyIn3 == 0)||(KeyIn4 == 0));
if (val > 0)
buzzer_sound();
return val;
}
/*
* 驗(yàn)證數(shù)據(jù)有效性
*/
bit check_num(float f_num)
{
if (f_num >= 100000)
return 1;
return 0;
}
/*
* 制作數(shù)碼管錯(cuò)誤標(biāo)志
*/
void make_led_error(void)
{
int8 i;
for (i=0; i<5; i++)
Led_buf[i] = Ledcode[10];
Led_buf[5] = Ledcode[12];
}
/*
*制作數(shù)碼管整數(shù)數(shù)據(jù)
*/
void make_led_inumber(int32 i_num)
{
bit s_flag=0;
int16 sit;
int8 i;
if (i_num < 0)
{
s_flag = 1;
i_num = -i_num;
}

ET0 = 0;
for (i=4, sit=10000; i>=1; i--, sit/=10)
{
if (i_num >= sit)
break;
Led_buf[i] = Ledcode[10];
i_num -= i_num/sit*sit;
}
for (;i>=1; i--, sit/=10)
{
Led_buf[i] = Ledcode[i_num/sit];
i_num -= i_num/sit*sit;
}
Led_buf[0] = Ledcode[i_num] & 0x7F;
if (s_flag)
Led_buf[5] = Ledcode[11];
else
Led_buf[5] = Ledcode[10];
ET0 = 1;
}


上一頁(yè) 1 2 下一頁(yè)

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉