基于mini2440简单计算器的实现(裸机代码)
基于mini2440简易计算器使用的是数组实现,并非逆波兰式,因此功能不够强大,仅供驱动学习,以及C语言基础编程学习之用.有时间读者可以用逆波兰式来实现强大功能计算器,原理也很简单,建议读《c程序设计第二版》里面有算法的代码.读者自行研究.此程序基于电子相册的改进,触摸屏,LCD,字符现实,数字输入等等.
主函数部分:
[cpp]
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "profile.h"
extern U32 X,Y;
extern void BMP_display(int x0,int y0,int x1,int y1,const U8 *bmp);
extern void CLK_init(void);
extern void LCD_IO_init(void);
extern void LCD_POWER(void);
extern void LCD_init(void);
extern void LCD_on(void);
extern void LCD_off(void);
extern void Tc_calibrate(void);
extern void input(void);
extern void Touch_Init(void);
extern void word(int x,int y,char* string);
extern unsigned char gImage[]; //extern声明引用外部数组
void Main(void)
{
rGPBCON=(1<<0);
rGPBDAT=(0<<0);//关闭蜂鸣器
CLK_init();
LCD_POWER();
LCD_IO_init();
LCD_init();
LCD_on();
Touch_Init();
MMU_Init(); //初始化MMU,解决中断向量表入口地址与内存地址之间不一致问题,进行地址的重映射
BMP_display(0, 0, 320,240, gImage); //显示图片
while(1)
{
Tc_calibrate();
input();
}
}
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "profile.h"
extern U32 X,Y;
extern void BMP_display(int x0,int y0,int x1,int y1,const U8 *bmp);
extern void CLK_init(void);
extern void LCD_IO_init(void);
extern void LCD_POWER(void);
extern void LCD_init(void);
extern void LCD_on(void);
extern void LCD_off(void);
extern void Tc_calibrate(void);
extern void input(void);
extern void Touch_Init(void);
extern void word(int x,int y,char* string);
extern unsigned char gImage[]; //extern声明引用外部数组
void Main(void)
{
rGPBCON=(1<<0);
rGPBDAT=(0<<0);//关闭蜂鸣器
CLK_init();
LCD_POWER();
LCD_IO_init();
LCD_init();
LCD_on();
Touch_Init();
MMU_Init(); //初始化MMU,解决中断向量表入口地址与内存地址之间不一致问题,进行地址的重映射
BMP_display(0, 0, 320,240, gImage); //显示图片
while(1)
{
Tc_calibrate();
input();
}
}计算器的输入及其计算部分,结合触摸屏,利用数组实现字符和数字的存储等:
[cpp] view plaincopyprint?#include "def.h"
#include "2440addr.h"
#define touch_p (X>0&&X<80&&Y>198&&Y<240)
#define touch_0 (X>80&&X<160&&Y>198&&Y<240)
#define touch_e (X>160&&X<240&&Y>198&&Y<240)
#define touch_a (X>240&&X<320&&Y>198&&Y<240)
#define touch_1 (X>0&&X<80&&Y>156&&Y<198)
#define touch_2 (X>80&&X<160&&Y>156&&Y<198)
#define touch_3 (X>160&&X<240&&Y>156&&Y<198)
#define touch_s (X>240&&X<320&&Y>156&&Y<198)
#define touch_4 (X>0&&X<80&&Y>113&&Y<156)
#define touch_5 (X>80&&X<160&&Y>113&&Y<156)
#define touch_6 (X>160&&X<240&&Y>113&&Y<156)
#define touch_m (X>240&&X<320&&Y>113&&Y<156)
#define touch_7 (X>0&&X<80&&Y>72&&Y<113)
#define touch_8 (X>80&&X<160&&Y>72&&Y<113)
#define touch_9 (X>160&&X<240&&Y>72&&Y<113)
#define touch_d (X>240&&X<320&&Y>72&&Y<113)
#define touch_c (X>241&&X<320&&Y>44&&Y<73)
#define white 0xffffff
#define B_off rGPBDAT=(0<<0) //关闭蜂鸣器
#define B_on rGPBDAT=(1<<0) //开启蜂鸣器
extern U32 X,Y;
extern unsigned char gImage[]; //extern声明引用外部数组
extern Draw_REC(int x,int y,int x1,int y1,U32 color);
extern void BMP_display(int x0,int y0,int x1,int y1,const U8 *bmp);
extern void Draw_ASCII(U32 x,U32 y,U32 color,const unsigned char ch[]);
extern void word(int x,int y,char* string);
extern void Main(void);
char op,opf;//用于何种元算的分拣操作符
int Num1,Num2;//参与运算两个数
int F1,F2;//答案
char num[10000];//用于显示的字符数组
int num1[100],num2[100];//保存输入数字的数组
int n[100],t[100]; //提取答案的各个位
int n1=0,n2=0;//用于输入数字分拣操作符
int len=0,len1=0;//用于计算答案的位数
int i=0,j=0,k=0,a=0;
/**********************************
*清除各个标志函数
**********************************/
void Clear_f(void)
{
int b=0,c=0;
for(c=0;c<10000;c++)
{
num[c]=' ';
}
for(b=0;b<100;b++)
{
num1[b]=0;
num2[b]=0;
n[b]=0;
t[b]=0;
}
op=0;opf=0;
Num1=0;Num2=0;
F1=0;F2=0;
n1=0;n2=0;
len=0;len1=0;
i=0;j=0;k=0;a=0;
}
/**********************************
*四则运算函数
******************
补充:软件开发 , C++ ,