科学计算机怎么计时,牛人制作的单片机科学型计算器,功能太强大 大家一起欣赏...

没有电路图,系统按键部分电路需要自己根据按键模块程序来进行分析反推 硬件电路应该如何连接。矩阵按键有8行5列,一共是40个按键,按照程序的意思好像是电路图如下图所示:

以下是按键输入部分电路程序:

#include "STC12C5A60S2.h"

#include

#include "keyboard_device.h"

#include "lcd_12864.h"

#include "eeprom_rw.h"

#include "mode.h"

#include "pwm.h"

#define uchar unsigned char

#define uint unsigned int

uchar shift=0;//shift键

void keyboard_cursor_flash(void);

extern bit gb_flag;

extern uchar flash_count;

extern uchar count;

extern uchar hang;

extern uint time_out;

uchar code welcome_pic[]={

/*--  调入了一幅图像:boeing.bmp  --*/

/*--  宽度x高度=128x64  --*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x07,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x7E,0x1F,0xC7,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0xFC,0x0F,0xE1,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x01,0xFC,0x07,0xE0,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF8,0x07,0xF0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF8,0x07,0xF0,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF8,0x07,0xF0,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF8,0x07,0xF0,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF8,0x07,0xF0,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF8,0x07,0xF0,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF8,0x0F,0xE0,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF9,0x9F,0xE0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF9,0xFF,0xFF,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF9,0xFF,0xFF,0xBF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF9,0x1F,0xE0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF8,0x0F,0xF0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF8,0x07,0xF0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF8,0x07,0xF0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF8,0x07,0xF8,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF8,0x07,0xF8,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF8,0x07,0xF8,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF8,0x07,0xF8,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF8,0x07,0xF8,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF8,0x07,0xF0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xF8,0x07,0xF0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xFC,0x07,0xE0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xFE,0x0F,0xC0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x03,0xFF,0xFF,0x80,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

/* ========= 延时20ms11.0592MHz ========= */

void delay_20m(void)                //消抖用延时

{

unsigned char i, j, k;

i = 1;

j = 216;

k = 35;

do

{

do

{

while (--k);

} while (--j);

} while (--i);

}

/* ========= 延时2s11.0592MHz ========= */

void delay_2s(void)                        //退出刷屏用延时

{

unsigned char i, j, k;

i = 64;

j = 9;

k = 179;

do

{

do

{

while (--k);

} while (--j);

} while (--i);

}

/* ========= 键盘扫描 ========= */

uchar keyboard(void)

{

uchar code keyboard_Scan[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};        //键盘扫描库

//11111110,11111101,11111011,11110111,11101111,11011111,10111111,01111111

uchar i, j, pc, flag = 0;

uchar XScan=0;

uchar in = 0;

uchar test;

while(in == 0)

{

#ifdef KEY_X_IS_HIGH

KEY_X &= 0x07;                        //清空高5位         0000 0111

XScan = 0x80;                        //                         1000 0000

//        XScan = 0x08;

#endif

//        #ifdef KEY_X_IS_LOW

//                        KEY_X &= 0xe0;                        //清空低5位         1110 0000

//                        XScan = 0x01;                        //                         0000 0001

//        #endif

for(i=0;i<5;i++)

{

KEY_X &=0x07;

test = XScan;

test = ~test;

KEY_X = test & 0xf8 ;

KEY_X = KEY_X | test;           //KEY_X接高八位

KEY_Y = 0xff;                                //置高

if(0xff != (pc = KEY_Y))        //假如说有按键按下

{

if(0xff != (pc = KEY_Y))        //假如说有按键按下

{

delay_20m();

for(j=0;j<8;j++)

{                                                        //将扫描值与扫描按键值比较

if( pc == keyboard_Scan[j] )

{

in = j * 5 + i +1;

flag = 1;

}

if(flag == 1)

{

while( KEY_Y == keyboard_Scan[j] );                //松手检测

delay_20m();

break;

}

}

}

if(flag == 1)

break;

}

XScan >>= 1;                                //左移一位

}

keyboard_cursor_flash();

}

time_out = 0;                                //清空计时

return in;

}

uchar keyboard_wake(void)

{

uchar i, pc, flag = 0;

uchar XScan=0;

uchar in = 0;

uchar test;

#ifdef KEY_X_IS_HIGH

KEY_X &= 0x07;                        //清空高5位         0000 0111

XScan = 0x80;                        //                         1000 0000

//        XScan = 0x08;

#endif

//        #ifdef KEY_X_IS_LOW

//                        KEY_X &= 0xe0;                        //清空低5位         1110 0000

//                        XScan = 0x01;                        //                         0000 0001

//        #endif

for(i=0;i<5;i++)

{

KEY_X &=0x07;

test = XScan;

test = ~test;

KEY_X = test & 0xf8 ;

KEY_X = KEY_X | test;           //KEY_X接高八位

KEY_Y = 0xff;                                //置高

if(0xff != (pc = KEY_Y))        //假如说有按键按下

{

return 1;

}

XScan >>= 1;                                //左移一位

}

return 0;

}

/* ========= 光标闪烁 ========= */

void keyboard_cursor_flash(void)

{

if(flash_count>=10)

{

if(gb_flag==0)

{

lcd_yline(8*(count-1),16*hang+0,16*hang+15,1);

gb_flag=1;

}

else

{

lcd_yline(8*(count-1),16*hang+0,16*hang+15,0);

gb_flag=0;

}

flash_count=0;

}

//键盘空闲监控

if(byte_read(ADD_TIMEOUT, 0)

{

time_out = 0;

mode_sleep();

}

}

uchar keyboard_output()

{

uchar result = keyboard();

uchar num0=0xff;

switch( result )

{

case 1:

shift=~shift;

num0 = 0 ;

break;

case 4:

//上翻

num0 = 3 ;

break;

case 6:

num0 = '(';

break;

case 7:

num0 = ')';

break;

case 8:

//地址左移一位

num0 = 5 ;

break;

case 9:

//下翻

num0 = 6 ;

break;

case 10:

//地址右移一位

num0 = 7 ;

break;

case 17:

//hyp?

num0 = 14 ;

break;

//数字键

case 36:

num0='0';

break;

case 31:

//lcd_write_str("1");

num0 = '1';

break;

case 32:

//lcd_write_str("2");

num0 = '2';

break;

case 33:

//lcd_write_str("3");

num0 = '3';

break;

case 26:

num0='4';

break;

case 27:

num0='5';

break;

case 28:

num0='6';

break;

case 21:

num0='7';

break;

case 22:

num0='8';

break;

case 23:

num0='9';

break;

case 37:

num0='.';

break;

//+-x/=

case 29:

num0='*';

break;

case 30:

num0='/';

break;

case 34:

num0='+';

break;

case 35:

num0='-';

break;

case 40:

num0='=';

//等于?

break;

case 24:

//删掉上一位,指针指向上一位?

num0 = 18 ;

break;

case 25:

//删掉整个字符串,指针指向该行起点?

num0 = 19 ;

break;

case 38:

//ans?

num0 = 20 ;

break;

case 39:

//copy?

num0 = 21 ;

break;

}

if(shift==0)

{

switch(result)

{

case 2:

//返回菜单?

num0 = 1;

break;

case 3:

num0 = 2;

break;

case 5:

//清屏,打开背光

num0 = 4;

break;

case 11:

//lcd_write_str("abs(");

num0 = 8;  //绝对值

break;

case 12:

//lcd_write_str("^2");

num0 = 9;  //平方

break;

case 13:

//lcd_write_str("^(");

num0 = '^';  //方

break;

case 14:

//lcd_write_str("^(-1)");

num0 = 11;  //倒数

break;

case 15:

//lcd_write_str("exp(");

num0 = 12;

break;

case 16:

//lcd_write_str("10^(");

num0 = 13;

break;

case 18:

//lcd_write_str("sin(");

num0 = 15;

break;

case 19:

//lcd_write_str("cos(");

num0 = 16;

break;

case 20:

//lcd_write_str("tan(");

num0 = 17;

break;

//                case 31:

//                        num0='1';

//                        break;

//                case 32:

//                        num0='2';

//                        break;

//                case 33:

//                        num0='3';

//                        break;

}

}

else

{

switch(result)

{

case 2:

//返回设置?

num0 = 23;

break;

case 3:

num0 = 'e';

break;

case 5:

//清屏,关闭背光

//lcd_clear();

//关闭背光?

num0 = 24;

break;

case 11:

num0 = 'i';

break;

case 12:

//lcd_write_str("^(1/2)");

num0 = 25;

break;

case 13:

//lcd_write_str("^(1/");

num0 = 26;

break;

case 14:

//lcd_write_str("!");

num0 = '!';

break;

case 15:

//lcd_write_str("ln(");

num0 = 27;

break;

case 16:

//lcd_write_str("log(");

num0 = 28;

break;

case 18:

//lcd_write_str("asin(");

num0 = 29;

break;

case 19:

//lcd_write_str("acos(");

num0 = 30;

break;

case 20:

//lcd_write_str("atan(");

num0 = 31;

break;

case 31:

//lcd_write_str("x");

num0 = 'x';

break;

case 32:

//lcd_write_str("y");

num0 = 'y';

break;

case 33:

//lcd_write_str("z");

num0 = 'z';

break;

case 37:

num0 = 32;

break;

}

}

if(result != 1)

shift=0;

if(shift == 0)

bl_bright_change(byte_read(ADD_BRIGHT, 0));        //还原亮度设定

else

bl_bright_change(byte_read(ADD_SHIFTSIGN, 0));        //shift亮度设定

/

/

/

if(num0==24)                              //on和off

{

TR0=0;

lcd_clear();

lcd_write_pic(0, 0, welcome_pic, 128, 64);                /*波音会徽*/

lcd_set_pos(1, 4);

lcd_write_str("计算器");                /*计算器*/

lcd_set_pos(2, 4);

lcd_write_str("开心波音");                /*开心波音*/

delay_2s();

lcd_clear();

lcd_clear_pic();                /*清屏*/

bl_bright_change(0);        //关灯

while(num0!=4)

num0 = keyboard_output();

bl_bright_change(byte_read(ADD_BRIGHT, 0));        //还原亮度设定

reset();                        //复位

}

/

else if(num0==23)                              //set

{

byte_write(ADD_PROG_STATUS, SET ,0);                //写入设置

reset();                        //复位

}

else if(num0==1)                              //mode

{

byte_write(ADD_PROG_STATUS, MODE ,0);                //写入菜单

reset();                        //复位

}

/

/

/

return num0;

}

void about()

{

TR0=0;

lcd_clear();

lcd_write_pic(0, 0, welcome_pic, 128, 64);                /*波音会徽*/

lcd_set_pos(1, 4);

lcd_write_str("计算器");                /*计算器*/

lcd_set_pos(2, 4);

lcd_write_str("开心波音");                /*开心波音*/

while(keyboard_wake());

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值