本来只是想的实现一个开关的,但是最近自己拖拉了所以再加上点功能吧,这个功能就是广告灯的左右移动,不过我加了一个可以开关控单灯的输入。本来准备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