2)51下广告灯数码管和MSP430数码管

这篇博客介绍了如何使用51单片机和MSP430微控制器实现数码管广告灯的左右移动效果,并提供C语言和汇编语言的程序代码。通过开关控制,可以实现单灯开关和显示‘HELLO’或‘12345’。同时,对比了C语言和汇编语言在数码管移位操作上的差异,强调了汇编语言在位操作上的优势。
摘要由CSDN通过智能技术生成

本来只是想的实现一个开关的,但是最近自己拖拉了所以再加上点功能吧,这个功能就是广告灯的左右移动,不过我加了一个可以开关控单灯的输入。本来准备430也是一样的不过今天拿到开发板发现没有那么多LED⊙﹏⊙,所以就直接用数码管了。

#include // unsigned char i;

unsigned char temp;

 unsigned char a,b;

 sbit K1=P3^0; //开关

 sbit L1=P2^0;//小灯

void delay(void) /*延时0.2秒*/

{ unsigned char m,n,s;

for(m=20;m>0;m--)

for(n=20;n>0;n--)

for(s=248;s>0;s--);

}

void main(void)

{

while(1) {

 if(K1==0) //开关闭合

{

 L1=0; //灯亮 ---p1.0输出低电平 ,L1有电势差。

}

else

{

L1=1; //灯灭

}

}

temp=0xfe;

 P1=temp; /*P1赋值feH,这个feH是什么呢,fe就是11111110 ,效果就是P1.7为0 */

 delay();

 for(i=1;i<8;i++) /*L1到L8*/

{

a=temp<<(i); //01111111

b=temp>>(8-i);

P1=a|b; /*按位或,解释一下上面两句由于C语言的移位运算会丢失初始位,因此这个结果第一次就是01111111了*/

delay();

 }

for(i=1;i<8;i++) /*L8到L1*/ {

 a=temp>>i;

 b=temp<<(8-i);

 P1=a|b;

 delay();

}

} 会看到小灯不断变换的效果和一个开关控制了呵呵。 ############################################################## 然后是汇编的程序

ORG 00H

START1: JB P3.0,LIG ; 如果P3.0为高电平,(本例即开关闭合),则执行LIG。

 CLR P2.0

START2: MOV R2,#8

MOV A,#0FEH SETB C ;设定进位C为1

LOOP: MOV P1,A

LCALL DELAY

RLC A ;将累加器含进位C左移一位

DJNZ R2,LOOP

MOV R2,#8

LOOP1: MOV P1,A

LCALL DELAY

RRC A

DJNZ R2,LOOP1

SJMP START 1 ; 转入主程序,跳转的范围不一样,可以说是到达的远近距离不一样。存储空间占用不一样。

;AJMP 的范围是11位地址,也就是2K的空间内,占用存储空间2个字节,执行周期24个时钟周期。

;LJMP 的范围是16位地址,也就是64K的空间内,占用存储空间3个字节,执行周期24个时钟周期。

;SJMP 的范围是8位地址,也就是256BIT的空间内,占用存储空间2个字节,执行周期24个时钟周期。

;JMP一般配合DPTR使用,存储空间1个字节,执行周期24个时钟周期。一般用于多分枝选择的时候使用,比如按键处理。

LIG: SETB P2.0 ;使P2.0变为1。灯灭。

DELAY: MOV R5,#20 ;

;(延时0.2秒的开始)

D1: MOV R6,#20

D2: MOV R7,#248

DJNZ R7,$ ;$是一直执行这条指令,每执行一次R7减一,直到R7为零后,执行下一条指令.

DJNZ R6,D2

DJNZ R5,D1

RET ;(延时0.2秒的结束)

 END 这个程序可以很容易的看出一个问题就是对于移位操作来说,汇编比C语言要简洁好用的多。应为汇编不会丢失位 ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥

然后很悲剧的还是51的C代码,是驱动数码管的,我们直接忽视掉静态扫描采用动态扫描,我们51仿真用的是外接为74LS245

我们的效果是如果开关打开显示HELLO,关闭则显示12345。我手头的仿真源程序就是这么给的呵呵。

#include <AT89X51.H> //reg52.h
unsigned char code table1[]={0x06,0x5b,0x4f,0x66,0x6d}; //HELLO
unsigned char code table2[]={0x76,0x79,0x38,0x38,0x3f}; //12345
unsigned char i,j;
unsigned char a,b;
unsigned char temp; 
void main(void)
{
  while(1)
    {
      temp=0xfe; //11111110
     
      for(i=0;i<5;i++) //动态循环显示        {
          if(P1_7==1) //高电平
            {
              P0=table2[i];
            }
            else
              {
                P0=table1[i];
              }
          P2=temp; //填入com控制 ,我们只用了6个,现在就是全部是1 ~2.0到2.5 
          a=temp<<(1);
          b=temp>>(7);
          temp=a|b; //这个眼熟吧,上面那个程序里就有,就是移位,并且补充丢失位
    for(a=4;a>0;a--)
          for(b=248;b>0;b--) {}
          P2=0xff;//重置P2
        
        }
    }
}

#################################################################

有了上面广告灯的代码后这个很好理解吧,然后是汇编,汇编我就完全复制了,试着解释一下(那个括号写这个资料同志写的)

ORG 00H

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值