找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5500|回复: 6
打印 上一主题 下一主题
收起左侧

按下矩阵键盘中的16个按键,依次在数码管上显示1~16的平方, 如按下第一个按键显示1...

[复制链接]
跳转到指定楼层
楼主

请各位大佬帮忙看看,为什么这个程序在proteus中不能显示256

#include<reg52.h>
#define uint unsigned int//宏定义
#define uchar unsigned char//宏定义
sbit wela=P2^7;//数码管位选锁存端
sbit dula=P2^6;//数码管段选锁存端
uchar disnum,temp,key,num;
uchar keyscan();  //键盘扫描函数声明
display(uchar);
delay (uchar);  //延时函数声明
uchar code table_du[]={0x3f,0x06,0x5b,0x4f,
                       0x66,0x6d,0x7d,0x07,
                       0x7f,0x6f,0x77,0x7c,
                       0x39,0x5e,0x79,0x71,0};
void main()
{
disnum=256;
while(1)
{
   num=keyscan();  //用num读取矩阵键盘扫描函数的返回值
   display(num);  //数码管显示
   
}
}
uchar keyscan()  //矩阵键盘扫描函数
{
  P3=0xf0;//让P3.0,P3.1,P3.2,P3.3等于0,P3.4,P3.5,P3.6,P3.7等于1
  temp=P3;//用temp读取P3口当前的值
  temp=temp&0xf0;//把temp的值和0xf0作与运算,即保持高4位变,低4位为0
  if(temp!=0xf0)//如果此时的temp不等于0xf0,说明有按键被按下了
  {
   delay(10);//延时约10ms
   if(temp!=0xf0)//再次判断是否真的有按键按下(即消除前沿抖动)
   {
    temp=P3;//如果有按键按下,temp重新读取P3口的值
    temp=temp|0x0f;//作按位或,即保持高4位不变,低4位为1
    P3=temp;//把temp的值赋给P3口
    key=P3;//然后用key读取P3口的值,作为按键的键值
    switch(key)//让每一个键值和数码管显示的数对应起来
    {
     case 0xee:disnum=1;//当key的值为0xee时,disnum的值为1
      break;
     case 0xde:disnum=4;//当key的值为0xde时,disnum的值为4
      break;
     case 0xbe:disnum=9;
      break;
     case 0x7e:disnum=16;
      break;
     case 0xed:disnum=25;
      break;
     case 0xdd:disnum=36;
      break;
     case 0xbd:disnum=49;
      break;
     case 0x7d:disnum=64;
      break;
     case 0xeb:disnum=81;
      break;
     case 0xdb:disnum=100;
      break;
     case 0xbb:disnum=121;
      break;
     case 0x7b:disnum=144;
      break;
     case 0xe7:disnum=169;
      break;
     case 0xd7:disnum=196;
      break;
     case 0xb7:disnum=225;
      break;
     case 0x77:disnum=256;
      break;
    }
   }
  }
return disnum;
}
display(uchar disnum)  //数码管显示函数
{
wela=1;
P0=0xfe;  //第1个数码管位选
wela=0;
dula=1;
P0=table_du[disnum/100];  //百位上的数
dula=0;
P0=0xff;
delay(10);
wela=1;
P0=0xfd;  //第2个数码管位选
wela=0;
dula=1;
P0=table_du[disnum%100/10];  //十位上的数
dula=0;
P0=0xff;
delay(10);
wela=1;
P0=0xfb;  //第3个数码管位选
wela=0;
dula=1;
P0=table_du[disnum%100%10];  //个位上的数
dula=0;
P0=0xff;
delay(10);
}
delay(uchar x)
{
uchar a,b;
  for(a=x;a>0;a--)
      for(b=200;b>0;b--);
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2020-6-4 21:46 | 只看该作者
定义uchar disnum,temp,key,num;  赋值 disnum=256; uchar型数据最大255,256就是0。
http://www.51hei.com/bbs/dpj-189135-1.html
回复

使用道具 举报

板凳
ID:332444 发表于 2020-6-5 11:06 | 只看该作者
回复

使用道具 举报

地板
ID:332444 发表于 2020-6-5 11:18 | 只看该作者
4*4=32按键键盘扫描,实现键值平方,使用一片锁存器实现8位数码管驱动。

回复

使用道具 举报

5#
ID:332444 发表于 2020-6-5 13:25 | 只看该作者
本帖最后由 xianfajushi 于 2020-6-5 16:26 编辑

由于程序的选择分支,可复用P1口,同时使用独立键盘的高电平部分。硬件与程序配合,由于键盘不常使用,可以作为锁存器的使能控制,从而节约IO口的占用。


回复

使用道具 举报

6#
ID:729260 发表于 2020-6-5 13:42 | 只看该作者
wulin 发表于 2020-6-4 21:46
定义uchar disnum,temp,key,num;  赋值 disnum=256; uchar型数据最大255,256就是0。
http://www.51hei.co ...

好的,谢谢
回复

使用道具 举报

7#
ID:744327 发表于 2020-6-5 15:50 | 只看该作者
使用uint的变量,定义uchar disnum,temp,key,num;就可以了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表