打印

51单片机74hc595汇编问题

[复制链接]
1541|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
wh6ic| | 2021-5-19 13:59 | 只看该作者
你只设定了一次 0x43,它怎么可能显示其它数值?

使用特权

评论回复
评论
玫瑰少年 2021-5-19 14:05 回复TA
那为是么他会重复显示43,我明明只让两个数码管显示43 
板凳
tyw| | 2021-5-19 14:48 | 只看该作者
本帖最后由 tyw 于 2021-5-19 15:16 编辑

既然是串入并出级联,那6字节数据就得首尾衔接,排队左移到串口才行,先弄个16进转10进子程序,把待显数据准备好.

HC595.pdf (303.53 KB)
MCS-51单片机应用系统设计-系统配置与接口技术 508页 高清书签版.pdf (15.65 MB)
51单片机自学笔记 387页 13.8M 高清书签版.pdf (13.53 MB)
8051单片机实践与应用 414页 4.2M (书签版).pdf (4.68 MB)
51单片机实用汇编子程序库(中文资料)(1).pdf (1.08 MB)

使用特权

评论回复
地板
gx_huang| | 2021-5-19 15:17 | 只看该作者
1、基本的软件知识
2、基本的逻辑电路知识,也就是数字电路,总要知道595的原理

使用特权

评论回复
5
henangongda123| | 2021-5-19 18:16 | 只看该作者
移位+锁存,八层是你的软件没写好,没有控制好移位的次数

使用特权

评论回复
6
玫瑰少年|  楼主 | 2021-5-19 19:05 | 只看该作者
henangongda123 发表于 2021-5-19 18:16
移位+锁存,八层是你的软件没写好,没有控制好移位的次数

大哥,这是我重新写的,直接准备显示6位,但是错码,如果显示两位不循环的话就没问题,急救

4.png (330.44 KB )

4.png

3.png (40.34 KB )

3.png

QQ截图20210519190224.png (263.25 KB )

QQ截图20210519190224.png

使用特权

评论回复
7
henangongda123| | 2021-5-20 08:40 | 只看该作者
玫瑰少年 发表于 2021-5-19 19:05
大哥,这是我重新写的,直接准备显示6位,但是错码,如果显示两位不循环的话就没问题,急救 ...

汇编语言N年没用了,基本看不懂。。。
写程序要搞懂原理先,595是典型的串行操作,要按时序来,你数码管是7段显示,而595串行是8位数据,所以你要先搞明白数码管显示的0-9对应的595数据字库,然后按时序写数据再锁存就行了。乱码一般是你的字库跟实际显示数据对应不上。参考一下我之前写的C语言吧

使用特权

评论回复
评论
tyw 2021-5-20 08:50 回复TA
LZ说只显示2位是对的,估计七段译码没问题,6位显示乱码,估计是环移时出的毛病,多移或少移了.可根据显示的内容,倒译码,还原成2进码,再把数据2进码并排在下面,看看有什么差异. 
8
henangongda123| | 2021-5-20 08:41 | 只看该作者
//数码管显示字库
[url=home.php?mod=space&uid=592560]@near[/url] uchar table[]=
{0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09};
/****** 74HC595驱动 ******/
/***********************************************************
函数名:Write_Byte()
功  能:向74HC595芯片数据寄存器写入一字节数据
参  数:byte --- 欲写入的一字节数据内容
返回值:无
/**********************************************************/
void  Write_Byte(uchar byte)
{
  uchar  i;
  for(i=0;i<8;i++)
  {
   if(byte & 0x01)            //若数据目前位为1
          {
            PA_ODR |= 0x08;         //写入1(14管脚)
          }
   else                       //若数据目前位为0
          {
                        PA_ODR &= (~0x08);      //写入0(14管脚)
          }
   PC_ODR &= (~0x08);         //拉低SCK(11管脚)
   PC_ODR |= 0x08;     //拉高SCK(11管脚),595上升沿读入数据位
   byte>>=1;                                  //数据右移1位,为送出新数据位做准备
  }
}
/***********************************************************
函数名:Latch_595()
功  能:锁存并输出595读入的数据
参  数:无
返回值:无
/**********************************************************/
void  Latch_595(void)
{
  PC_ODR &= (~0x10);      //拉低RCK(12管脚),准备锁存脉冲信号
  PC_ODR |= 0x10;     //拉高RCK,送出锁存脉冲信号(上升沿有效)
  PD_ODR &= (~0x10);      //拉低RCK(12管脚),结束锁存脉冲信号
}
/***********************************************************
函数名:Disp_Light_Number()
功  能:数码管显示一个3位DMX512地址
参  数:number --- 欲显示的数内容
返回值:无
/**********************************************************/
void Disp_Light_Number(uchar number)
{
        uchar bai,shi,ge;           //定义百十个位
//取得各位数字
        bai = number/100;           //百位
        shi = (number/10)%10;       //十位
        ge = number%10;             //个位
//动态显示
        Write_Byte(0x20);
        Write_Byte(table[ge]);      //显示个位
        Latch_595();
        Write_Byte(0x40);
        Write_Byte(table[shi]);     //显示十位
        Latch_595();
        Write_Byte(0x80);
        Write_Byte(table[bai]);     //显示百位
        Latch_595();
}


使用特权

评论回复
9
chineseboyzxy| | 2021-5-20 14:03 | 只看该作者
YIWEI:
MOV R1,#8
YW1:
RLC A
MOV DSA,C
CLR CLK
SETB CLK
DJNZ R1,YW1
RET
74164的移位程序,做的简易电子钟。应该跟595类似。

使用特权

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

本版积分规则

3

主题

6

帖子

0

粉丝