打印

新手求助!!哪位路过的大侠帮忙看一下这个程序?

[复制链接]
3097|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 leaoking 于 2009-8-13 12:25 编辑

这是一个简单的单片机程序,希望能够用4*4矩阵键盘来控制在数码管上显示出所按键的平方,比如,按第1个键,数码管显示1,按第6个键数码管显示36。
程序没有语法错误,但是程序功能实现不了,个人感觉好像逻辑上有问题。
主要是函数返回值,和函数参数调用这块儿,总感觉有点儿不对劲,但是不知道怎么改过来才对。
#include<reg52.h>
#define uchar unsigned char
uchar shu,temp,num;
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};
sbit dx=P2^6;
sbit wx=P2^7;
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
   for(y=110;y>0;y--);
}//延时函数
void display(uchar);
uchar keyscan();
void main()
{
wx=1;
P0=0xf8;
wx=0;
dx=1;
P0=0;
dx=0;//完成初始化
while(1)
{
  display(keyscan());//感觉这里好像有问题,但是不知道是不是出在这里,也不知道改怎么改。。。。。
}
}
void display(uchar a)//数码管动态扫描显示函数
{  
     
uchar bai,shi,ge;
bai=a/100;
shi=a%100/10;
ge=a%10;//分离百十个
wx=1;
P0=0xfe;
wx=0;
dx=1;
P0=table[bai];
dx=0;
delay(5);//打开第一个数码管并送百位数
wx=1;
P0=0xfd;
wx=0;
dx=1;
P0=table[shi];
dx=0;
delay(5);//打开第一个数码管并送十位数
wx=1;
P0=0xfb;
wx=0;
dx=1;
P0=table[ge];
dx=0;
delay(5);//打开第一个数码管并送个位数
}
uchar keyscan()//键盘扫描函数,判断那个键被按下,并返回一个数值到显示函数中
{
P3=0xfe;//第一行键盘给低电平
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//判断有没有键被按下
{
  delay(5);
  if(temp!=0xf0)//延时消抖
  {
   temp=P3;//重新读取P3值
   switch(temp)
   {
    case 0xee:shu=1;break;
    case 0xde:shu=4;break;
    case 0xbe:shu=9;break;
    case 0x7e:shu=16;break;//判断是第一行哪一个键被按下
   }
   while(temp!=0);
   delay(5);
   while(temp!=0);//延时消抖,等待松手
  }
}
P3=0xfd;//以下分别先给第二行第三行第四行给低电平,依此判断16个键盘,哪个被按下
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
  delay(5);
  if(temp!=0xf0)
  {
   temp=P3;
   switch(temp)
   {
    case 0xed:shu=25;break;
    case 0xdd:shu=36;break;
    case 0xbd:shu=49;break;
    case 0x7d:shu=64;break;
   }
   while(temp!=0);
   delay(5);
   while(temp!=0);
  }
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
  delay(5);
  if(temp!=0xf0)
  {
   temp=P3;
   switch(temp)
   {
    case 0xeb:shu=81;break;
    case 0xdb:shu=100;break;
    case 0xbb:shu=121;break;
    case 0x7b:shu=144;break;
   }
   while(temp!=0);
   delay(5);
   while(temp!=0);
  }
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
  delay(5);
  if(temp!=0xf0)
  {
   temp=P3;
   switch(temp)
   {
    case 0xe7:shu=169;break;
    case 0xd7:shu=196; break;
    case 0xb7:shu=225;break;
    case 0x77:shu=256;break;
   }
   while(temp!=0);
   delay(5);
   while(temp!=0);
  }
}
return shu;
}
程序复制过来之后有点儿乱,朋友们将就着看吧!
还有之前我定义的数是uchar型变量,16的平方256不超出它的范围吧,不过程序主要问题应该不是出在这儿。
哪位大侠帮忙看一下,不胜感激!!
另注:数码管八位共阴的,接两个573锁存器,然后接单片机P0口。键盘接法不用发了吧,第一行串联之后接P3^0,第二行串联之后接P3^1,第三行串联之后接P3^2,第四行串联之后接P3^3,第一列串联之后接P3^4,第二列串联之后接P3^5,第三列串联之后接P3^6,第四列串联之后接P3^7。

锁存器接法.jpg (40.7 KB )

锁存器接法.jpg

单片机接法.jpg (24.44 KB )

单片机接法.jpg

键盘接法.jpg (26.47 KB )

键盘接法.jpg

数码管接法.jpg (33.66 KB )

数码管接法.jpg

相关帖子

沙发
leaoking|  楼主 | 2009-8-13 10:20 | 只看该作者
浏览12了,回复还是0。都说21ic很强大,强人多,热心的人也多,怎么没人来帮忙呢?达人去打酱油去了吗?
各位路过的,如果您也不清楚答案,那么帮忙把帖子顶上去,等达人打完酱油回来能够方便的找到帖子,好吗?
:dizzy:

使用特权

评论回复
板凳
Neoo| | 2009-8-13 10:25 | 只看该作者
谁能告诉我单片机是什么东西?我只知道ST7,uPSD,STR7,STR9、STM32和STM8S

使用特权

评论回复
地板
leaoking|  楼主 | 2009-8-13 10:30 | 只看该作者
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
单片机内部也用和电脑功能类似的模块,比如CPU,内存,并行总线,还有和硬盘作用相同的存储器件,不同的是它的这些部件性能都相对我们的家用电脑弱很多,不过价钱也是低的,一般不超过10元即可......用它来做一些控制电器一类不是很复杂的工作足矣了。我们现在用的全自动滚筒洗衣机、排烟罩、VCD等等的家电里面都可以看到它的身影!......它主要是作为控制部分的核心部件。
3楼的,谢谢你帮顶,我也是初学者,把我查到的资料告诉你。

使用特权

评论回复
5
zcw9911| | 2009-8-13 10:51 | 只看该作者
3楼的就不要逗小朋友了,这种问题原因可能很简单又是很基础的功能,应该是自己锻炼提高
不要总想着问别人,因为就算是匠人,春阳这种级别的,给他几百行代码,除非是简单的语法错误
否则的话我相信他们也不能马上给出答案。

使用特权

评论回复
6
john_light| | 2009-8-13 10:56 | 只看该作者
不调试,无代码。

不尝试掌握某些调试程序的方法,编程学习将寸步难行。

使用特权

评论回复
7
leaoking|  楼主 | 2009-8-13 11:04 | 只看该作者
六楼的,什么意思,怎么看不懂呢?
调试程序的方法?我用keil调试,还有什么好的东西吗?
我又一个单片机开发板,写,下载,差错,再改,这样不行吗?

使用特权

评论回复
8
vigia| | 2009-8-13 11:09 | 只看该作者
汗,你弄这么长个代码,什么芯片什么板子什么电路都不说。。。

你不如还是说说什么地方你感觉不对劲了,什么错误现象。

另外,这种代码,用单步走走看不出哪里错了吗?

使用特权

评论回复
9
vigia| | 2009-8-13 11:09 | 只看该作者
...

使用特权

评论回复
10
john_light| | 2009-8-13 11:16 | 只看该作者
很多人用的是Keil环境

既然会用Keil调试,那你缩小问题产生的范围了吗?

比如,你读回的键值对了吗?

使用特权

评论回复
11
leaoking|  楼主 | 2009-8-13 12:28 | 只看该作者
电路图我已上传,请大侠帮忙看一下,怪我粗心大意。
我是在单片机开发板上下载调试的。
另外,我用keil调试的时候,单片机输出我会调试,但是像这种输入的我就真不知道怎么调试了,用仿真芯片可以进行这种输入型的调试吗?

使用特权

评论回复
12
香水城| | 2009-8-13 12:38 | 只看该作者
谁知道楼主用的什么单片机?

使用特权

评论回复
13
Neoo| | 2009-8-13 12:47 | 只看该作者
楼主用的不是单片机,他用的是寂寞

使用特权

评论回复
14
john_light| | 2009-8-13 13:00 | 只看该作者
STC89C52,这个是传说中宏晶推的51内核单片机。

脱离了Keil也有调试的方法,比如利用指示灯,利用串口等等。很多人这样玩过。
不过真要详细说起来可能有一匹布那么长。

这里是ST的分舵,楼主你考虑发到侃单片机版吧。

使用特权

评论回复
15
leaoking|  楼主 | 2009-8-13 17:15 | 只看该作者
13楼,谢谢,我真的很寂寞·····一个程序搞了这么长时间都没有整出来。
刚刚查资料才知道ST是半导体啊,我还以为ST就是我用的STC单片机的简称呢,寒自己一个。:Q
我发到别的地方问吧·····

使用特权

评论回复
16
香水城| | 2009-8-13 17:24 | 只看该作者
给你转到匠人的地盘去(侃单片机),那里有好多大虾哦~~~~~

使用特权

评论回复
17
leaoking|  楼主 | 2009-8-13 18:57 | 只看该作者
谢香水城把我帖子转过来,我之前自己有发了一个同样的帖子,之后才发现,这里两个我的帖子都是一样的,只好把那个帖子删了,扣了我威望3,冤枉啊。。。。。
继续顶自己的帖子,望达人路过,帮忙看看。

使用特权

评论回复
18
leaoking|  楼主 | 2009-8-14 10:16 | 只看该作者
今日上线,依旧没有答案,继续顶自己一下。别沉了。

使用特权

评论回复
19
auzxj| | 2009-8-14 10:22 | 只看该作者
我来打酱油,帮你顶一下
但是这么长的代码别人很难看完的

我预见,LZ将在这几天之内将自己解决bug,并高呼低级错误。。。。这样的案例二姨家屡见不鲜。。。。

使用特权

评论回复
20
程序匠人| | 2009-8-14 10:50 | 只看该作者
看代码确实很辛苦。你的故障现象是什么?

推荐你去参观一个帖子:程序调试(除错)过程中的一些雕虫小技(连载)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

56

帖子

0

粉丝