久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

基于單片機的數碼管按鍵計算器程序

作者:胡琴   來源:本站原創   點擊數:  更新時間:2013年11月16日   【字體:

這是一個51hei論壇版主測試成功的程序。用的是stc單片機,電路比較簡單就不畫出來了 按鍵接在P2口
數碼管的位選口是:
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
數碼管的段選口是P0
還有一個led燈p1.4 一個喇叭P1.6
/*
 * Easy calculator
 *
 * K4:+ K8:- K12:* K16:/ K14:Clear K15:=
 *數碼管按鍵計算器程序
*/
#include <reg52.h>
typedef   unsigned char  uint8;
typedef   unsigned int   uint16;
typedef   unsigned long  uint32;
typedef   char  int8;
typedef   int   int16;
typedef   long  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;
/*
 * 延時
*/
void delay(uint16 n)
{
 while (n--);
}
/*
 * 蜂鳴器發聲
*/
void buzzer_sound(void)
{
 uint16 i;
 for (i=0; i<BUZ_DELAY; 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;
}
/*
 * 驗證數據有效性
*/
bit check_num(float f_num)
{
 if (f_num >= 100000)
  return 1;
 return 0;
}
/*
 * 制作數碼管錯誤標志
*/
void make_led_error(void)
{
 int8 i;
 for (i=0; i<5; i++)
  Led_buf[i] = Ledcode[10];
 Led_buf[5] = Ledcode[12];
}
/*
 * 制作數碼管整數數據
*/
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;
}
/*
 * 制作數碼管浮點數據
*/
void make_led_fnumber(float f_num)
{
 bit s_flag=0;
 int32 num;
 int16 sit;
 int8 i, decimal, dot_sit=0;

 if (f_num < 0)
 {
  s_flag = 1;
  f_num = -f_num;
 }
 
 num = (int32)(f_num*10000+0.5);
 for (decimal=4; decimal>0; decimal--)
 {
  if (num % 10 != 0)
   break;
  num /= 10;
 }
 
 dot_sit = decimal;
 if (f_num >= 10000)
  dot_sit = 0;
 else if (f_num >= 1000)
  if (decimal >= 1)
   dot_sit = 1;
 else if (f_num >= 100)
  if (decimal >= 2)
   dot_sit = 2;
 else if (f_num >= 10)
  if (decimal >= 3)
   dot_sit = 3;
 for (i=0; i<dot_sit; i++)
  f_num *= 10;
 num = (int32)(f_num+0.5);
 ET0 = 0;
 for (i=4, sit=10000; i>=1; i--, sit/=10)
 {
  if (num >= sit)
   break;
  if (i == dot_sit)
   break;
  Led_buf[i] = Ledcode[10];
  num -= num/sit*sit;
 }
 for (;i>=1; i--, sit/=10)
 {
  Led_buf[i] = Ledcode[num/sit];
  num -= num/sit*sit;
 }
 Led_buf[0] = Ledcode[num];
 Led_buf[dot_sit] &= 0x7F;
 if (s_flag)
  Led_buf[5] = Ledcode[11];
 else
  Led_buf[5] = Ledcode[10];
 ET0 = 1;
}
/*
 * 數碼管顯示
*/
void show_num(uint8 *buf)
{
 ENLED = 1;
 switch (Led_n)
 {
  case 0:
   ADDR0 = 0;
   ADDR1 = 0;
   ADDR2 = 0;
   P0 = buf[0];
   break;
  case 1:
   ADDR0 = 1;
   ADDR1 = 0;
   ADDR2 = 0;
   P0 = buf[1];
   break;
  case 2:
   ADDR0 = 0;
   ADDR1 = 1;
   ADDR2 = 0;
   P0 = buf[2];
   break;
  case 3:
   ADDR0 = 1;
   ADDR1 = 1;
   ADDR2 = 0;
   P0 = buf[3];
   break;
  case 4:
   ADDR0 = 0;
   ADDR1 = 0;
   ADDR2 = 1;
   P0 = buf[4];
   break;
  case 5:
   ADDR0 = 1;
   ADDR1 = 0;
   ADDR2 = 1;
   P0 = buf[5];
   break;
 }
 ENLED = 0;
 if (Led_n >= 5)
  Led_n = 0;
 else
  Led_n++;
}
/*
 * 計算程序
*/
void calculate(int8 key_val)
{
 float ans;
 bit err=0;
 if ((key_val >= FADD) && (key_val <= FDIV))
 {
  C_flag = key_val;
 }
 else if (key_val == FEQU)
 {
  switch (C_flag)
  {
   case FADD:  ans = Tmp1+Tmp2; break;
   case FSUB:  ans = Tmp1-Tmp2; break;
   case FMUL:  ans = Tmp1*Tmp2; break;
   case FDIV:  if (Tmp2 == 0)
      {
       err = 1;
       break;
      }
      else
      {
       ans = Tmp1/Tmp2;
       break;
      }
  }
  if (check_num(ans))
   err = 1;
  if (err)
   make_led_error();
  else
   make_led_fnumber(ans);
  C_flag = 0;
  Tmp1 = 0;
  Tmp2 = 0;
 }
 else if (key_val == FRES)
 {
  make_led_fnumber(0);
  C_flag = 0;
  Tmp1 = 0;
  Tmp2 = 0;
 }
 else
 {
  if (C_flag == 0)
  {
   ans = Tmp1;
   ans *= 10;
   ans += key_val;
   if (check_num(ans))
    return;
   else
    Tmp1 = ans;
   make_led_inumber(Tmp1);
  }
  else
  {
   ans = Tmp2;
   ans *= 10;
   ans += key_val;
   if (check_num(ans))
    return;
   else
    Tmp2 = ans;
   make_led_inumber(Tmp2);
  }
 }
}
 
main()
{
 int8 key_val;
 ADDR3 = 1;
 ENLED = 0;
 make_led_inumber(0);
    TMOD = 0x01;
    TH0 = 0xF8;     
    TL0 = 0xCC;
    TR0 = 1;
 ET0 = 1;
 EA = 1;
 while (1)
 {
  key_val = scan_key();
  if (key_val == -1)
   continue;
  calculate(key_val);
 }
}

void time0() interrupt 1
{
 TR0 = 0;
 TH0 = 0xF8;
 TL0 = 0xCC;
 show_num(Led_buf);
 TR0 = 1;
}

關閉窗口

相關文章

主站蜘蛛池模板: 91小视频在线 | 中文字幕第二区 | 性色视频 | 91正在播放 | 特黄毛片 | 久久大陆 | 国产电影一区二区 | 成年女人免费v片 | 手机在线观看av | 国产美女精品视频 | 国产一区二区三区在线观看免费 | 日韩在线精品视频 | 日本三级在线视频 | 欧美一区二区在线免费观看 | 免费一区| 久久精品国产一区二区电影 | 欧美一区二区三区四区五区无卡码 | 成人欧美一区二区 | 99国产精品99久久久久久 | 国产精品免费一区二区三区 | 久久这里只有精品首页 | 国产黄色在线观看 | 久久久毛片| 一区二区三区精品视频 | 日韩精品一区二区三区中文在线 | 久久这里有精品 | 青草久久免费视频 | 国产精品69久久久久水密桃 | 91成人免费看 | 国产91av视频 | 亚洲免费大片 | 九九在线视频 | 九九热精品视频 | 精品免费视频一区二区 | 久久久久免费精品国产小说色大师 | 精品欧美激情精品一区 | 波多野结衣中文字幕一区二区三区 | av激情影院 | 欧美一区不卡 | 国产伦精品一区二区三毛 | 精品亚洲国产成av人片传媒 |