51单片机 带修改错误功能的计算器

发布者:心愿成真最新更新时间:2017-11-15 来源: eefocus关键字:51单片机  修改错误功能  计算器 手机看文章 扫描二维码
随时随地手机看文章

utilities.h


  1. #ifndef UTILITIES_H_INCLUDED  

  2. #define UTILITIES_H_INCLUDED  

  3.   

  4. typedef unsigned char uchar, BYTE, uint8;  

  5. typedef unsigned int uint, WORD, uint16;  

  6. typedef unsigned long ulong, DWORD, uint32;  

  7. typedef char int8;  

  8. typedef int int16;  

  9. typedef long int32;  

  10. typedef unsigned char * uchar_p;  

  11. typedef unsigned int * uint_p;  

  12. typedef unsigned long * ulong_p;  

  13. typedef char * char_p;  

  14. typedef int * int_p;  

  15. typedef long * long_p;  

  16.   

  17. #endif // UTILITIES_H_INCLUDED  


keyBoard.c


  1. #include   

  2. #include "utilities.h"  

  3.   

  4. sbit KEY_OUT_3 = P2^0;  

  5. sbit KEY_OUT_2 = P2^1;  

  6. sbit KEY_OUT_1 = P2^2;  

  7. sbit KEY_OUT_0 = P2^3;  

  8. sbit KEY_IN_0 = P2^4;  

  9. sbit KEY_IN_1 = P2^5;  

  10. sbit KEY_IN_2 = P2^6;  

  11. sbit KEY_IN_3 = P2^7;  

  12.   

  13. uchar code keyCodeMap[4][4] = { //矩阵按键编号到标准键盘键码的映射表  

  14.     {0x31, 0x32, 0x33, 0x26}, //数字键1、数字键2、数字键3、向上键  

  15.     {0x34, 0x35, 0x36, 0x25}, //数字键4、数字键5、数字键6、向左键  

  16.     {0x37, 0x38, 0x39, 0x28}, //数字键7、数字键8、数字键9、向下键  

  17.     {0x30, 0x1B, 0x0D, 0x27}  //数字键0、ESC键、  回车键、 向右键  

  18. };  

  19. uchar pdata keyState[4][4] = {  //全部矩阵按键的当前状态  

  20.     {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1},  {1, 1, 1, 1}  

  21. };  

  22.   

  23. extern void keyAction(uchar keyCode);  

  24.   

  25. void keyDriver() {  

  26.     uchar i, j;  

  27.     static uchar backup[4][4] = {  

  28.         {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}  

  29.     };  

  30.   

  31.     for (i=0; i<4; i++)  

  32.         for (j=0; j<4; j++)  

  33.             if (keyState[i][j] != backup[i][j]) {  

  34.                 if (keyState[i][j] == 0)  

  35.                     keyAction(keyCodeMap[i][j]);  

  36.                 backup[i][j] = keyState[i][j];  

  37.             }  

  38. }  

  39.   

  40. void keyScan() {  

  41.     static uchar i = 0;  

  42.     static uchar keyBuf[4][4] = {  

  43.         {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF},  

  44.         {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}  

  45.     };  

  46.     uchar j;  

  47.   

  48.     keyBuf[i][0] = (keyBuf[i][0] << 1) | KEY_IN_0;  

  49.     keyBuf[i][1] = (keyBuf[i][1] << 1) | KEY_IN_1;  

  50.     keyBuf[i][2] = (keyBuf[i][2] << 1) | KEY_IN_2;  

  51.     keyBuf[i][3] = (keyBuf[i][3] << 1) | KEY_IN_3;  

  52.     for (j=0; j<4; j++) {  

  53.         if (keyBuf[i][j] == 0x00)  

  54.             keyState[i][j] = 0;  

  55.         else if (keyBuf[i][j] == 0xFF)  

  56.             keyState[i][j] = 1;  

  57.     }  

  58.     switch (i) {  

  59.         case 0: KEY_OUT_0 = 1; KEY_OUT_1 = 0; break;  

  60.         case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break;  

  61.         case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break;  

  62.         case 3: KEY_OUT_3 = 1; KEY_OUT_0 = 0; break;  

  63.         default : break;  

  64.     }  

  65.     i = ++i & 0x03;  

  66. }  


digitalTube.c


  1. #include   

  2. #include "utilities.h"  

  3.   

  4. uchar code LEDChar[] = {  //数码管显示字符转换表  

  5.     0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,  

  6.     0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E  

  7. };  

  8. uchar LEDBuff[6] = {  //数码管显示缓冲区  

  9.     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF  

  10. };  

  11.   

  12. void showNumber(ulong num) {  

  13.     char i;  

  14.     uchar buf[6];  

  15.   

  16.     for (i=0; i<6; i++) {  

  17.         buf[i] = num % 10;  

  18.         num /= 10;  

  19.     }  

  20.     for (i=5; i>0; i--) {  

  21.         if (buf[i] == 0)  

  22.             LEDBuff[i] = 0xFF;  

  23.         else  

  24.             break;  

  25.     }  

  26.     for (; i>=0; i--)  

  27.         LEDBuff[i] = LEDChar[buf[i]];  

  28. }  

  29.   

  30. void LEDScan() {  

  31.     static uchar i = 0;  

  32.     P0 = 0xFF;  

  33.     P1 = (P1 & 0xF8) | i;  

  34.     P0 = LEDBuff[i];  

  35.     if (i < 5)  

  36.         i++;  

  37.     else  

  38.         i = 0;  

  39. }  


timer.c


  1. #include   

  2. #include "utilities.h"  

  3. #define TIMER0  

  4. #define TIMER0_MOD1  

  5.   

  6. #if defined (TIMER0)  

  7. uchar T0RH = 0;  

  8. uchar T0RL = 0;  

  9.   

  10. #if defined (TIMER0_MOD1)  

  11. void setTmr0(uint ms) {  

  12.     ulong tmp;  

  13.     tmp = 11059326 / 12;  

  14.     tmp = tmp * ms / 1000;  

  15.     tmp = 65536 - tmp;  

  16.     tmp += 28;  

  17.     T0RL = tmp;  

  18.     T0RH = tmp>>8;  

  19. }  

  20. #endif // defined  

  21. #endif // defined  


calculator.c


  1. /********************************************************** 

  2.     加减乘除计算器,能实现连续的运算,并且提供修改功能: 

  3.     对于算符来说,以最后输入的算符为准。 

  4.     测试样例: 

  5.     12 + 256 * 9 - 53 / 2 

  6.     3 + - * 5 

  7.     6 + - 2 / * 7 

  8.  

  9. ***********************************************************/  

  10. #include   

  11. #include "utilities.h"  

  12.   

  13. sbit ADDR0 = P1^0;  

  14. sbit ADDR1 = P1^1;  

  15. sbit ADDR2 = P1^2;  

  16. sbit ADDR3 = P1^3;  

  17. sbit ENLED = P1^4;  

  18.   

  19. extern uchar T0RH;  

  20. extern uchar T0RL;  

  21. extern uchar LEDBuff[6];  

  22. extern uchar code LEDChar[];  

  23. extern void showNumber(ulong num);  

  24. extern void LEDScan();  

  25. extern void keyScan();  

  26. extern void keyDriver();  

  27. extern void setTmr0(uint ms);  

  28.   

  29. void keyAction(uchar keyCode) {  

  30.     static ulong result = 0Lu;  

  31.     static ulong number = 0Lu;  

  32.     static uchar opPre = 0x26;  

  33.     static bit preIsOp = 0;  

  34.   

  35.     if (keyCode >= 0x30 && keyCode <= 0x39) {           //数字键  

  36.         number = number * 10 + keyCode - 0x30;  

  37.         showNumber(number);  

  38.         preIsOp = 0;  

  39.     }  

  40.     else if ((keyCode >= 0x25 && keyCode <= 0x28) || keyCode == 0x0D) {      //上下左右,加减乘除;回车键,相当于等于键  

  41.         if (!preIsOp) {  

  42.             switch (opPre) {  

  43.                 case 0x26: result += number; break;  

  44.                 case 0x28: result -= number; break;  

  45.                 case 0x25: result /= number; break;  

  46.                 case 0x27: result *= number; break;  

  47.                 case 0x0D: result = number; break;  

  48.                 default: break;  

  49.             }  

  50.             number = 0;  

  51.             showNumber(result);  

  52.         }  

  53.         opPre = keyCode;  

  54.         preIsOp = 1;  

  55.     }  

  56.     else if (keyCode == 0x1B) {     //ESC键  

  57.         number = 0Lu;  

  58.         result = 0Lu;  

  59.         showNumber(0Lu);  

  60.         preIsOp = 0;  

  61.     }  

  62.     else {  

  63.         preIsOp = 0;  

  64.     }  

  65. }  

  66.   

  67. void interruptTmr0() interrupt 1 {  

  68.     TH0 = T0RH;  

  69.     TL0 = T0RL;  

  70.     LEDScan();  

  71.     keyScan();  

  72. }  

  73.   

  74. void main() {  

  75.     EA = 1;  

  76.     ENLED = 0;  

  77.     ADDR3 = 1;  

  78.     TMOD = 0x01;  

  79.     setTmr0(1);  

  80.     TH0 = T0RH;  

  81.     TL0 = T0RL;  

  82.     ET0 = 1;  

  83.     TR0 = 1;  

  84.     LEDBuff[0] = LEDChar[0];  

  85.     while (1) {  

  86.         keyDriver();  

  87.     }  

  88. }  


关键字:51单片机  修改错误功能  计算器 引用地址:51单片机 带修改错误功能的计算器

上一篇:ds18b20温度传感器应用实例
下一篇:51单片机 1602液晶显示静态字符

推荐阅读最新更新时间:2024-03-16 15:45

mouse.h头文件下载( 51单片机ps2 鼠标 驱动)
/****************************************************** 演示鼠标引脚定义 CLK : 白色 SDA : 绿色 GND: 橙色 VCC: 蓝色 *******************************************************/ #include delay52.h #ifndef MOUSE_H #define MOUSE_H sbit mouse_SDA=P3^4;//数据线P3_5 sbit mouse_CLK=P3^3;//时钟线P3_3 unsigned char bdata mouse_
[单片机]
基于AT89C51单片机设计的简易智能机器人
引言 随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数器、并行和串行接口、看门狗、前置放大器、A/D转换器、D/A转换器等多种电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。这种技术促使机器人技术也有了突飞猛进的发展,目前人们已经完全可以设计并制造出具有某些特殊功能的简易智能机器人。 1 设计思想与总体方案 1.1 简易智能机器人的设计思想 本机器人能在任意区域内沿引导线行走,自动绕障,在有光源引导的条件下能沿光源行走。同时,能检测埋在地下的金属片,发出声光指示信息,并能实时存储、显示检测到的断点数目以及各断点至起跑线
[单片机]
51单片机程序——按键控制数码管程序0-999递增
#include reg52.h #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换 #define CtrlPort P1 //定义控制端口 #define uint unsigned int unsigned char code DuanMa ={0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值0~9 unsigned char code WeiMa ={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//分别对应相
[单片机]
关于51单片机晶振详解
晶振是什么?全称是石英晶体振荡器,是一种高精度和高稳定度的振荡器。通过一定的外接电路来,可以生成频率和峰值稳定的正弦波。而单片机在运行的时候,需要一个脉冲信号,做为自己执行指令的触发信号,可以简单的想象为:单片机收到一个脉冲,就执行一次或多次指令。 在初学51单片机的时候,总是伴随很多有关与晶振的问题,其实晶振就是如同人的心脏,是血液的是脉搏,把单片机的晶振问题搞明白了,51单片机的其他问题迎刃而解。 一、为什么51单片机爱用11.0592MHZ晶振? 其一:因为它能够准确地划分成时钟频率,与UART(通用异步接收器/发送器)量常见的波特率相关。特别是较高的波特率(19600,19200),不管多么古怪的值,这些晶振都是准确,
[单片机]
51单片机设计的电子密码锁
该程序是基于51单片机设计的电子密码锁,功能较为简单,目前仅有修改密码和检测这一功能,以下是操作过程 运行仿真的初始界面 左边矩阵按键从左边第一行第一列起为0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 按下按键后界面如下,当四位数码管都显示后,按下矩阵键盘上任意按键确认密码 密码错误D1红灯亮起,密码正确D2绿灯亮起 当按下独立按键时,中断触发,进入密码修改,此时界面如同初始界面,输入原始密码,原始密码正确,绿灯亮起,等待输入新密码,此时界面显示原始密码。原始密码错误红灯亮起,退出修改,返回初始状态。 新密码输入会将原始密码覆盖,输入完成红绿灯同时亮起。 1s后返回初始界面,
[单片机]
<font color='red'>51单片机</font>设计的电子密码锁
单片机中断问题
简介:51单片机中断不就是中间发生什么事情,跳转到另外一处,执行完在返回么?为什么还要中断专门拿出来用啊,直接跳转指令不就行了么? 首先要搞清中断,就要先说一说单片机P3口的几个引脚;P30到P35是中断的输入引脚。包括串行口、定时器(计数器)、外部中断等等。这些中断的特点是当中断的条件满足时,会执行相应的中断程序。注意中断程序的执行和汇编语言的子程序有一个重要区别:(多数教科书都没提这一点)子程序必须有调用语句ACALL之类的调用它,它才能执行;而中断不是!它是满足中断条件后,自动执行的。比如:定时器计数满;外部中断引脚低电平触发;串行口接受到数据....,此时程序自动跳到中断入口:03H,0BH,....23H。进入中断入
[单片机]
STC51单片机流水灯+外部中断蜂鸣器
闲暇之余做了一个简单的流水灯,设计思路先将LED灯从0-7逐个显示,然后再从7-0逐个显示。如果产生外部中断(即按钮按下),则8个LED灯全亮,之后又恢复流水灯状态。 #include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int sbit K=P3^2;//启动按钮,外部中断 uchar led; void delay(uint x) { while(x--); } void XX()//中断设置 { EA=1; EX0=1; } void DD
[单片机]
51单片机与FPGA接口的逻辑设计
0 引言 FPGA是一种新兴的可编程逻辑器件,可以取代现有的全部微机接口芯片,实现微机系统中的存储器、地址译码等多种功能,具有更高的密度、更快的工作速度和更大的编程灵活性,被广泛应用于各种电子类产品中。在功能上,单片机具有性价比高、功能灵活、易于人机对话、强大的数据处理能力等特点;而FPGA则具有高速、高可靠性以及开发便捷、规范等特点,因此两类器件相结合的电路结构将在许多高性能仪器仪表和电子产品中被广泛应用。基于这种需求,本文设计了MCS-51单片机与FPGA的总线接口逻辑电路,实现了单片机与FPGA数据与控制信息的可靠通信,使FP—GA与单片机优势互补,组成灵活的、软硬件都可现场编程的控制系统。 1 单片机与FPGA的接口方
[单片机]
<font color='red'>51单片机</font>与FPGA接口的逻辑设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved