4621|9

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

单片机8051缓存显示 [复制链接]

功能:把键盘输入的数据存入显示缓存区 displaybuf ,然后显示缓存区的内容,
调试的结果不对,显示很乱~

不知道什么原因?


#include
#define uchar unsigned char
#define uint unsigned int

sbit ledk=P2^5;  //锁存口
sbit d0=P1^0;    //锁存口
sbit wela=P2^7;  //使能口
sbit dula=P2^6; //使能口
uchar count;
uchar displaybufpoint;  //当前显示位
uchar displaybuf []={0xff,0xff,0xff,0xff,0xff,0xff};//显示缓存区


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;break;
                                                case 0xde:return 1;break;
                                                case 0xbe:return 2;break;
                                                case 0x7e:return 3;break;
                 }

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

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

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

          

       }  //if end

}



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



void display()
{
  uint i;
  uchar du;
  for(i=1;i<= displaybufpoint;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 };
                wela=1;
                P0=tablewe[we];
                wela=0;
            P0=0x00;
                dula=1;       
                P0=tabledu[du];
                dula=0;
                delay(2);
                P0=0xff;

         
}

void main()
{
  uchar key;
  ledk=0;
  displaybufpoint=0;
  while(1)
  {
          if( key_press() )
          {
            key=key_scan();
             write_dispalybuf(key);  //写显存
             display();
          }
  }
}

最新回复

呵呵 是啊 不过你那个小东西不还是要用个门电路芯片么,我说的也就是外接一块芯片。。。。。  详情 回复 发表于 2010-4-26 14:43
点赞 关注

回复
举报

84

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
额。。。。洋洋洒洒写了这么多看起来还真麻烦,你这种显示方式我感觉就挺麻烦的,大体了解了你的硬件电路是怎么连的,我仔细看了下,你的问题可能是:

1、你用的P3做键盘的扫描行和接受列,但是你没有把key_press()函数中的P3口设置为输入端 也就是函数开头缺了一句 P3=0xff;
2.你那个displaybufpoint在函数中有点小问题 ,具体修改如下
//写显存
void write_dispalybuf(uchar x)
{

  if (displaybufpoint==6) return; //6个数码管
   
//顺序应该这样,否则第0个数码管没法显示,直接跳到第1个了,数组是从第0位开始的,下面的显示也要进行相应的修改,否则
//是 displaybufpoint++的值
   
  displaybuf[displaybufpoint]=x;
   displaybufpoint++;
   
}



void display()
{
  uint i;
  uchar du;
//这里进行了修改
  for(i=0;i<=(displaybufpoint-1);i++)
  {
  du=displaybuf;
  display_smg(i,du);   

  }
}
3.
switch (key)
{
case 0xee:return 0;break;
case 0xde:return 1;break;
case 0xbe:return 2;break;
case 0x7e:return 3;break;
}
这里的break 是没有必要的,因为执行return后函数uchar key_scan()就已经返回了,因此break可以不写

以前建议仅供参考,希望有所帮助。O(∩_∩)O~
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
而且你这句sbit d0=P1^0; //锁存口   不知道硬件是连在哪里了。。。下面没用到。。。
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

4
 
在罗嗦一下,我感觉键盘中断扫描行和接受列最好不要用同一个寄存器为好。。。。。(在端口够用的情况下)
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
有什么好的输入与显示的方法呢,你们?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 

2iPwf02Dj83PokWJVim



YTCdgNFGDWW62cV54JW
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

7
 
如果可以的话,用一个外围可编程芯片,来控制键盘中断和数码管显示,这样lz可以省去自己扫描键盘的过程,当然这里用的是中断方式,lz用的是扫描方式,扫描方式占用cpu,效率低,单片机外连接一个外围芯片如:CH451或者8279芯片,程序会简单很多很多。。。。。。你这个真够长的。。。。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

8
 

yTrXqn1uy4z3lMAFv8T7YtJsOJ



P6nvxUlBCqf8oSa0alPlmPHJmN
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

9
 
就一个小应用,不必要用很多东西


 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

10
 
呵呵 是啊 不过你那个小东西不还是要用个门电路芯片么,我说的也就是外接一块芯片。。。。。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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