第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)源代码讲解如下:
- #include "REG52.H"
- #define const_voice_short40 //蜂鸣器短叫的持续时间
- #define const_voice_long 900 //蜂鸣器长叫的持续时间
- #define const_key_time10 //按键去抖动延时的时间
- #define const_1s 422 //产生一秒钟的时间基准
- void initial_myself();
- void initial_peripheral();
- void delay_short(unsigned int uiDelayShort);
- void delay_long(unsigned int uiDelaylong);
- void T0_time();//定时中断函数
- void key_service();
- void key_scan(); //按键扫描函数 放在定时中断里
- void number_key_input(unsigned long ucWhichKey);//由于数字按键的代码相似度高,因此封装在这个函数里
- void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01);
- void display_drive();//放在定时中断里的数码管驱动函数
- void display_service();
- sbit key_sr1=P0^0; //第一行输入
- sbit key_sr2=P0^1; //第二行输入
- sbit key_sr3=P0^2; //第三行输入
- sbit key_sr4=P0^3; //第四行输入
- sbit key_dr1=P0^4; //第一列输出
- sbit key_dr2=P0^5; //第二列输出
- sbit key_dr3=P0^6; //第三列输出
- sbit key_dr4=P0^7; //第四列输出
- sbit beep_dr=P2^7; //蜂鸣器的驱动IO口
- sbit led_dr=P3^5; //LED指示灯
- sbit dig_hc595_sh_dr=P2^0; //数码管 的74HC595程序
- sbit dig_hc595_st_dr=P2^1;
- sbit dig_hc595_ds_dr=P2^2;
- sbit hc595_sh_dr=P2^3; //LED灯的74HC595程序
- sbit hc595_st_dr=P2^4;
- sbit hc595_ds_dr=P2^5;
- unsigned char ucKeyStep=1;//按键扫描步骤变量
- unsigned char ucKeySec=0; //被触发的按键编号
- unsigned intuiKeyTimeCnt=0; //按键去抖动延时计数器
- unsigned char ucKeyLock=0; //按键触发后自锁的变量标志
- unsigned char ucRowRecord=1; //记录当前扫描到第几列了
- unsigned intuiVoiceCnt=0;//蜂鸣器鸣叫的持续时间计数器
- unsigned char ucDigShow8=0;//第8位数码管要显示的内容
- unsigned char ucDigShow7=0;//第7位数码管要显示的内容
- unsigned char ucDigShow6=0;//第6位数码管要显示的内容
- unsigned char ucDigShow5=0;//第5位数码管要显示的内容
- unsigned char ucDigShow4=0;//第4位数码管要显示的内容
- unsigned char ucDigShow3=0;//第3位数码管要显示的内容
- unsigned char ucDigShow2=0;//第2位数码管要显示的内容
- unsigned char ucDigShow1=0;//第1位数码管要显示的内容
- unsigned char ucDigShowTemp=0; //临时中间变量
- unsigned char ucDisplayDriveStep=1;//动态扫描数码管的步骤变量
- unsigned char ucDisplayUpdate=1; //更新显示标志
- unsigned long ulSource=0;//原始数据 比如在加法运算中的被加数
- unsigned long ulOther=0; //另外一个参与运算的数据比如在加法运算中的加数
- unsigned long ulResult=0; //运算结果
- unsigned char ucOperator=0; //运行符号。0代表当前没有选择运行符号。1代表当前的运算符是加法。
- /* 注释一:
- *ucWd变量是本程序最核心的变量,代表数码管显示哪一个窗口
- *本程序只有两个窗口,他们分别是:
- *第一个窗口:原始数据和运算结果窗口。比如加法运算中的被加数
- *第二个窗口:第二个参与运行的数据窗口。比如加法运算中的加数
- */
- unsigned char ucWd=1;
- code unsigned char dig_table[]=
- {
- 0x3f,//0 序号0
- 0x06,//1 序号1
- 0x5b,//2 序号2
- 0x4f,//3 序号3
- 0x66,/
数码管显示加法简易计算 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)