5237|12

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

计算器设计 [复制链接]

像计算机器那样的输入显示如何做.
输入654 ,选输入6显示6,再输入5显示65,再输入4显示654,并且得到它值654?
用矩阵键盘,数码管

最新回复

我QQ是645776221,呵呵,我加你  详情 回复 发表于 2010-4-26 14:30
点赞 关注

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
移位吧!
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
既然用到了矩阵键盘,应该要用到MCU来扫描的,既然有了mcu,就简单啦,输进来一个存起来,显示。再输进一个移位,存起来,显示,以此类推。

没有MCU的话,用移位寄存器,也可以。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
我是这样的我是用一个数组来存起来的,然后定时每隔一定时间显示数据中的数据.
可是我输入的跟显示的不一样
这是程序:
不知哪 有问题:
#include
#include  //移位头文件
#include
#define uchar unsigned char
#define uint unsigned int

#define fosc 11.0592  //晶振频率
#define time 2500   //定时2500us 2.5ms

sbit ledk=P2^5;
sbit d0=P1^0;
sbit wela=P2^7;
sbit dula=P2^6;
sbit speakon=P2^3;   //喇叭控制线


uchar displaybufpoint;  //当前显示位
uchar displaybuf []={0x00,0x00,0x00,0x00,0x00,0x00};//显示缓存区

void delay(uint z);
void display_smg(uchar we,uchar du);


void delay(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
   for (y=110;y>0;y--);

}


//判断是否有键按下
uchar key_press()
{
    uchar key;
        P3=0xf0;
        key=P3;
        key=key&0xf0;
        if(key==0xf0)
          {
             return 0;
          }
        else
     {
            return 1;   //有键被按下

           }

}



//键盘扫描
uchar key_scan()
{
    uchar key;
        if(key_press())    //是否有键按下
           {
             P3=0xfe;
                 key=P3;
                 switch (key)
                 {
                                                case 0xee:return 0;
                                                case 0xde:return 1;
                                                case 0xbe:return 2;
                                                case 0x7e:return 3;
                 }

          
         P3=0xfd;
                 key=P3;
                 switch (key)
                 {
                                                case 0xed:return 4;
                                                case 0xdd:return 5;
                                                case 0xbd:return 6;
                                                case 0x7d:return 7;
                 }

          
         P3=0xfb;
                 key=P3;
                 switch (key)
                 {
                                                case 0xeb:return 8;
                                                case 0xdb:return 9;
                                                case 0xbb:return 10;
                                                case 0x7b:return 11;
                 }

          
         P3=0xf7;
                 key=P3;
                 switch (key)
                 {
                                                case 0xe7:return 12;
                                                case 0xd7:return 13;
                                                case 0xb7:return 14;
                                                case 0x77:return 15;
                 }

          

       }  //if end

}




//写显存
void write_displaybuf(uchar x)
{
  if (displaybufpoint==6)  return;  //6个数码管
  
  displaybuf[displaybufpoint]=x;
  displaybufpoint++;
  
}



void display()
{

  uchar du;
  uchar i;
  for(i=0;i<= 5;i++)
  {
       du=displaybuf;
       display_smg(i,du);
           

  }

}




void display_smg(uchar we,uchar du)
{

  uchar code tablewe []={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位0xfe 第1个数码

  uchar code tabledu []={0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,
                         0x7d , 0x07 , 0x7f , 0x6f , 0x77 ,
                         0x7c , 0x39 , 0x5e , 0x79 , 0x71,0x00 };

                wela=1;
                P0=tablewe[we];  //位选
                wela=0;
            P0=0x00;
                dula=1;       
                P0=tabledu[du];  //字形码
                dula=0;
                delay(2);
                P0=0xff;

         
}




/*
定时/计数器常数计算
1.计数器初值的计算
设计数器的最大数值为M(根据不同工作方式,M可以是2^13,2^16,2^8),
则计算初值X的公式如下:
X=M-要求的计数值

2.定时器初值的计算

X=M-(要求的定时值)/(12/fosc)
式中,M为定时器模值(根据不同工作方式,M可以是2^13,2^16,2^8)


10ms中断一次,中断10次,晶振11.0592MHZ,
IP=0X82  TCON=0X00  TMOD=0X51  IE=00。
TH0=0XEC  TL0=0X78  TH1=0X00 TL1=0X 00
是如何计算出的
10ms=10000us
10000/(12/11.0592)=9216
65536-9216=56320=0XDC00

*/


//设置定时器00x0e66
void settimer0()
{
TMOD=0x01;   //方式1
TH0=0xDC;    //10ms
TL0=0x00;
EA=1;        //总中断允许
TR0=1;       //开启定时器0  
ET0=1;
}




//定时器0 中断
void timer0() interrupt 1
{
  TH0=0xDC;
  TL0=0x00;
  display();
}




void main()
{
  uchar key;
  ledk=0;
  key=0;
  displaybufpoint=0;
  settimer0();
  while(1)
  {
          if( key_press() )
          {
            key=key_scan();
        delay(2);

        write_displaybuf(key);  //写显存

          }

  }


}







/*0x3f  , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,
    0             1              2          3        4         5
0x7d , 0x07 , 0x7f  , 0x6f , 0x77 , 0x7c ,
   6                  7              8          9        A        B
0x39 , 0x5e , 0x79 , 0x71 , 0x00
   C        D        E         F             无显示*/
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
就你的项目而言,CPU资源不缺,其实根本就必须要定时器来显示,显示就做在main()中,当有按键按下,你用write_displaybuf(uchar x)保存后,就可以立刻显示,也就是说,输进来一个数据,显示就立刻变化,显示更实时了。

当然,你要用定时器来显示也可以,10ms的定时器,速度足够快,人眼是反应不过来的。

言归正传,你的代码问题是在 void write_displaybuf(uchar x)函数里:if (displaybufpoint==6) return; 假设displaybufpoint到了6的的时候,那么下次再按键,处理这个函数,就退出了,就退出了,这样就丢了一个数据,再按又丢,因为displaybufpoint没清零。更改如下:

//写显存
void write_displaybuf(uchar x)
{
//  if (displaybufpoint==6) return; //6个数码管
  if(displaybufpoint<6)
  {
       displaybuf[displaybufpoint]=x;
       displaybufpoint++;
  }
  else
  {
      //  注意,这里开始另外一次输入,假如你需要多次输入数据的话,最好定义多一个变量加以辨识,以免刷新盖之前的输入的数据。
        displaybufpoint=0;
  }
//显示可以直接就在这里做。
  
   
}
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

6
 
上面讲错,更改:
就你的项目而言,CPU资源不缺,其实根本就没必要用定时器来显示,显示就做在main()中,。。。。。。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(中级)

7
 
丢了一个数据,没关系,只在存的有输入的就行了,按了6次以内的它显示也有问题,
比如:我输入212512

他可能显示101111 或者是211510
反正每次者可能不一样
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 
有仿真器吗?假如有,可以跟跟输入的key,和displaybuf[],和输出到led上的值是否一致。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
不知道你现在显示的东西,是不是有比较大的几率是显示相同的字符,比如11 ,22 ,33,之类的,因为看到你的按键扫描根本就没有消抖。这就会误扫。

更改:

  while(1)
  {
if( key_press() )
{
key=key_scan();
  delay(2);

  write_displaybuf(key); //写显存

}

  }

将delay(10)放到 key=key_scan();上面,delay(2);可去掉。
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

10
 
我有开发板
Peasant_Lee,QQ多少呀?

我的QQ:258041655
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

11
 
假如有,可以跟跟输入的key,和displaybuf[],和输出到led上的值是否一致,这个怎么试?
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用楼主 computerzzz 的回复:
像计算机器那样的输入显示如何做.
输入654 ,选输入6显示6,再输入5显示65,再输入4显示654,并且得到它值654?
用矩阵键盘,数码管

典型的“队列”
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

13
 
我QQ是645776221,呵呵,我加你
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表