微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第36节:带数码管显示的加法简易计算器

第36节:带数码管显示的加法简易计算器

时间:11-22 来源:互联网 点击:
开场白:

这一节要做一个简单的计算器。这个计算器不带小数点,只能进行不超过8位数据的加法运算,它麻雀虽小但是五脏俱全,它能清晰地勾勒出商业计算器的程序框架和思路。读者只要看懂本节程序框架的规律,以后自己想做一个复杂一点的计算器应该是没问题的。复杂的计算器在算法上要用数组进行特殊处理,不能简单地直接用C语言的+,-,*,/运算符,这方面的内容我会在以后的章节中跟大家分享。

这一节要教会大家两个知识点:

第一个:数字按键的输入和十进制数值的移位方法。

第二个:继续加深理解按键与数码管的关联程序框架。

具体内容,请看源代码讲解。

(1)硬件平台:

基于朱兆祺51单片机学习板。数字1键对应S1键,数字2键对应S2键,数字3键对应S3键…. 数字9键对应S9键, 数字0键对应S10键。加号键对应S13,等于号键对应S14,清除复位按键对应S16。其它按键不用。

(2)实现功能:

常用的加法计算器功能。有连加功能。
本程序有2个窗口。

第1个窗口:原始数据和运算结果窗口。比如加法运算中的被加数

第2个窗口:第二个参与运行的数据窗口。比如加法运算中的加数

(3)源代码讲解如下:

  1. #include "REG52.H"
  2. #define const_voice_short40 //蜂鸣器短叫的持续时间
  3. #define const_voice_long 900 //蜂鸣器长叫的持续时间
  4. #define const_key_time10 //按键去抖动延时的时间
  5. #define const_1s 422 //产生一秒钟的时间基准
  6. void initial_myself();
  7. void initial_peripheral();
  8. void delay_short(unsigned int uiDelayShort);
  9. void delay_long(unsigned int uiDelaylong);
  10. void T0_time();//定时中断函数
  11. void key_service();
  12. void key_scan(); //按键扫描函数 放在定时中断里
  13. void number_key_input(unsigned long ucWhichKey);//由于数字按键的代码相似度高,因此封装在这个函数里
  14. void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01);
  15. void display_drive();//放在定时中断里的数码管驱动函数
  16. void display_service();
  17. sbit key_sr1=P0^0; //第一行输入
  18. sbit key_sr2=P0^1; //第二行输入
  19. sbit key_sr3=P0^2; //第三行输入
  20. sbit key_sr4=P0^3; //第四行输入
  21. sbit key_dr1=P0^4; //第一列输出
  22. sbit key_dr2=P0^5; //第二列输出
  23. sbit key_dr3=P0^6; //第三列输出
  24. sbit key_dr4=P0^7; //第四列输出
  25. sbit beep_dr=P2^7; //蜂鸣器的驱动IO口
  26. sbit led_dr=P3^5; //LED指示灯
  27. sbit dig_hc595_sh_dr=P2^0; //数码管 的74HC595程序
  28. sbit dig_hc595_st_dr=P2^1;
  29. sbit dig_hc595_ds_dr=P2^2;
  30. sbit hc595_sh_dr=P2^3; //LED灯的74HC595程序
  31. sbit hc595_st_dr=P2^4;
  32. sbit hc595_ds_dr=P2^5;
  33. unsigned char ucKeyStep=1;//按键扫描步骤变量
  34. unsigned char ucKeySec=0; //被触发的按键编号
  35. unsigned intuiKeyTimeCnt=0; //按键去抖动延时计数器
  36. unsigned char ucKeyLock=0; //按键触发后自锁的变量标志
  37. unsigned char ucRowRecord=1; //记录当前扫描到第几列了
  38. unsigned intuiVoiceCnt=0;//蜂鸣器鸣叫的持续时间计数器
  39. unsigned char ucDigShow8=0;//第8位数码管要显示的内容
  40. unsigned char ucDigShow7=0;//第7位数码管要显示的内容
  41. unsigned char ucDigShow6=0;//第6位数码管要显示的内容
  42. unsigned char ucDigShow5=0;//第5位数码管要显示的内容
  43. unsigned char ucDigShow4=0;//第4位数码管要显示的内容
  44. unsigned char ucDigShow3=0;//第3位数码管要显示的内容
  45. unsigned char ucDigShow2=0;//第2位数码管要显示的内容
  46. unsigned char ucDigShow1=0;//第1位数码管要显示的内容
  47. unsigned char ucDigShowTemp=0; //临时中间变量
  48. unsigned char ucDisplayDriveStep=1;//动态扫描数码管的步骤变量
  49. unsigned char ucDisplayUpdate=1; //更新显示标志
  50. unsigned long ulSource=0;//原始数据 比如在加法运算中的被加数
  51. unsigned long ulOther=0; //另外一个参与运算的数据比如在加法运算中的加数
  52. unsigned long ulResult=0; //运算结果
  53. unsigned char ucOperator=0; //运行符号。0代表当前没有选择运行符号。1代表当前的运算符是加法。
  54. /* 注释一:
  55. *ucWd变量是本程序最核心的变量,代表数码管显示哪一个窗口
  56. *本程序只有两个窗口,他们分别是:
  57. *第一个窗口:原始数据和运算结果窗口。比如加法运算中的被加数
  58. *第二个窗口:第二个参与运行的数据窗口。比如加法运算中的加数
  59. */
  60. unsigned char ucWd=1;
  61. code unsigned char dig_table[]=
  62. {
  63. 0x3f,//0 序号0
  64. 0x06,//1 序号1
  65. 0x5b,//2 序号2
  66. 0x4f,//3 序号3
  67. 0x66,/

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top