搜索
bottom↓
回复: 11

使用HC595时,mega16数码管显示出现奇怪的问题,请帮我思考下。

[复制链接]

出0入0汤圆

发表于 2012-1-28 14:35:40 | 显示全部楼层 |阅读模式
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#pragma data:code
flash uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90};

void delay(uchar ms)          //延时函数
{
         uchar i;
         while(ms--)
         for(i=0;i<12;i++);
}
void HC_595out(uchar data)
{         
         PORTB&=~(1<<4);   //等待数据传输,595存储寄存器数据不变
         SPDR=data;             //传输数据
         while(!(SPSR&(1<<SPIF)))
         PORTB|=(1<<4);       //595移位寄存器的数据进入数据存储寄存器,并在数码管上显示
}
void show(uint num)
{
         uchar temp;
        if(num>9)
         {
                    PORTD=0XBF;
                  temp=num/10;
                  HC_595out(table[temp]);                 
                  delay(5);
                  PORTD=0X7F;
                  temp=num%10;
                  HC_595out(table[temp]);
                  delay(5);
         }
         else
         {
         PORTD=0X7F;
         temp=num;
         HC_595out(table[temp]);
         delay(5);
         }
}
void main()
{
         uint i=71;
         DDRB=0XFF;PORTB=0XF0;
         DDRD=0Xff;PORTD=0X0F;     //输出低电平,启用数码管
         DDRB|=(1<<5)|(1<<7);      //数据放入SPI寄存器中
         SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);     //等待数据传输完毕
         while(1)
         show(i);
}
主函数里,我用i等于0到9时数码管都可以正常显示,而等于两位数的时候也即是上述的程序,数码管却都显示两个7,这到底错在哪里?难道是HC_595out( )函数不支持短时间内显示不同的数?
关键是void show()部分,因为我i等于1到9是数码管都可以正常显示出1到9,所以其他部分应该没问题,而i等于两位数却出问题,这是怎么回事,要如何改正(我是用的是mega16)?
ps:   SPI控制寄存器介绍
SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
SPIE:中断使能  
SPE :SPI使能
DORD:数据次序 1为LSB首先发送,0为MSB首先发送
MSTR:主从选择 1为主,0为从MSTR置位时选择主机模式,否则为从机.如果MSTR为"1",
      SS配置为输入,且被拉低,则MSTR 被清零,寄存器SPSR 的SPIF 置位.用户必须重新
          设置MSTR 进入主机模式。
CPOL: 时钟极性见ATMEGA16L(中文)P130
CPHA: 时钟相位
SPR1, SPR0: SPI 时钟速率选择1 与0  SPR1 和SPR0 对从机没有影响。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2012-1-29 10:45:15 | 显示全部楼层
尽管是简单的问题,大家帮忙回下帖啦,拜托!

出0入0汤圆

 楼主| 发表于 2012-2-8 21:01:35 | 显示全部楼层
自己含泪顶自己

出0入0汤圆

发表于 2012-2-8 22:55:58 | 显示全部楼层
有仿真器吗,看看tmep=num/10和temp=num%10后temp是否正确?

出0入13汤圆

发表于 2012-2-9 00:28:09 | 显示全部楼层
大概看了下,发现个问题,就是每发一个数据,然后就显示下,这就使得当程序中i=71时,应该显示1的位置,分时显示了1和7,也就是说1和7重叠了,看到的结果当然是77啦

出0入0汤圆

发表于 2012-2-9 05:58:43 | 显示全部楼层
"PORTB|=(1<<4);       //595移位寄存器的数据进入数据存储寄存器,并在数码管上显示 "

that type of coding style is simply terrible.

出0入0汤圆

 楼主| 发表于 2012-2-9 11:59:39 | 显示全部楼层
回复【4楼】weiwei4
-----------------------------------------------------------------------

怎么会分时呢?显示1和7的前面,我都用了port端口高低电平进行限制, HC_595out()显示是没错的,怎么会分时,这与595寄存器有关吗?

出0入0汤圆

 楼主| 发表于 2012-2-9 12:05:40 | 显示全部楼层
回复【3楼】sf49ers
-----------------------------------------------------------------------

但是num不改变,temp数值是不会受到影响

出0入0汤圆

发表于 2012-2-11 04:14:16 | 显示全部楼层
"while(!(SPSR&(1<<SPIF)))
PORTB|=(1<<4);       //595移位寄存器的数据进入数据存储寄存器,并在数码管上显示 "

that's a nice piece of code, :)

出0入0汤圆

 楼主| 发表于 2012-2-14 10:25:46 | 显示全部楼层
回复【8楼】millwood0
-----------------------------------------------------------------------

什么意思啊,这个应该不影响吧,这个端口高低电平是用来控制数据是否进入数据寄存器的

出0入0汤圆

发表于 2012-2-14 13:40:23 | 显示全部楼层
回复【9楼】yidehui
-----------------------------------------------------------------------
你在函数HC_595out()中写了下面这两条语句
while(!(SPSR&(1<<SPIF)))
PORTB|=(1<<4);       //595移位寄存器的数据进入数据存储寄存器,并在数码管上显示

其实”while(!(SPSR&(1<<SPIF)))“ 这条语句后面应该要有分号。
另外,你的编程风格有待加强,像“PORTB|=(1<<4);”这样的语句应该用宏定义来做会更直观。
像if、while、for这样的语句带{},该有的不要图省略,必须加{}。

出0入0汤圆

发表于 2012-2-16 18:56:21 | 显示全部楼层
1.先上个硬件电路
2.参考我的教材,把多位数码管动态扫描显示的方法搞清楚。拜托。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 16:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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