代码已修改,并仿真通过。
#includereg51.h //包含单片机寄存器的头文件
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit CLK=P1^0;
sbit IN =P1^1;
//uchar code a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uint code w[]={0xfffe,0xfffd,0xfffb,0xfff7,0xffef,0xffdf,0xffbf,0xff7f,0xfeff,0xfdff,0xfbff,0xf7ff,0xefff,0xdfff,0xbfff,0x7fff};//【新建了一个流水表】
void delay(uint i)
{
uint j;
uchar k;
for(j=i;j0;j--)
for(k=125;k0;k--);
}
//【发送1字节给74LS164】
void send_byte(uchar temp)
{
uchar i;
for(i=0;i8;i++)
{
if(temp 0x80)
{
IN =1;
}
else
{
IN =0;
}
CLK = 0;
_nop_(); //if Keil,require use intrins.h
CLK = 1;
temp=temp1;// temp左移1位
}
}
//【发送2字节给74LS164】
void send_word(uint temp)
{
send_byte((uchar)(temp8));//先发送高字节
send_byte((uchar)(temp0x00FF));//再发送低字节
}
void main(void)
{
uint i;
while(1)
{
for(i=0;i16;i++)
{
//send_byte(a[i]);
send_word(w[i]);//【发送2字节】
delay(4000);
}
}
}
只能用2个P口来实现或者你用4094试试看
ORG 00H 这是用2个P口实现的 你试试看吧
JMP MAIN P2高8位,P0低8位
ORG 30H 不知道对不对 没环境进行调式
MAIN:CLR C
MOV 30H,#10H
MOV 31H,#01H
JJ1:MOV A,30H
MOV P2,A
MOV A,31H
MOV P0,A
CALL YS
MOV A,30H
RR A
MOV 30H,A
MOV A,31H
RL A
MOV 31H,A
MOV A,30H
CJNE A,#01H,JJ
JJ:MOV A,31H
JNC JJ1
MOV 30H,#01H
MOV 31H,#10H
JJ3:MOV A,30H
MOV P2,A
MOV A,31H
MOV P0,A
CALL YS
MOV A,30H
RL A
MOV 30H,A
MOV A,31H
RR A
MOV 31H,A
MOV A,30H
JNC JJ2
JJ2:MOV A,31H
CJNE A,#01H,JJ3
JMP MAIN
YS:MOV R5,#150
YS1:DJNE R5,YS1
RET
END
#includereg52.h
#include intrins.h
void delayms(unsigned char ms) // 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i 120; i++);
}
}
main()
{
unsigned char LED;
LED = 0xff;
P0 = LED;
while(1)
{
delayms(1000);
LED = LED1; //循环右移1位,点亮下一个LED
if(LED==0x00)
{
LED=0xff;
}
P0 = LED;
}
}
我给你个简单的例子:
#include AT89X51.H //预处理文件里面定义了特殊寄存器的名称如P1 口定义为P1
void main(void)
{
//定义花样数据
const unsigned char design[32]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,
0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,
0xE7,0xDB,0xBD,0x7E,0xFF};
unsigned int a; //定义循环用的变量
unsigned char b; //在C51 编程中因内存有限尽可能注意变量类型的使用
//尽可能使用少字节的类型,在大型的程序中很
受用
do{
for (b=0; b32; b++)
{
for(a=0; a30000; a++); //延时一段时间
P1 = design[b]; //读已定义的花样数据并写花样数据到P1 口
}
}while(1);
}
程序中的花样数据可以自以去定义,因这里我们的LED 要AT89C51 的P1 引脚为低电平才
会点亮,所以我们要向P1 口的各引脚写数据O 对应连接的LED 才会被点亮,P1 口的八个引
脚刚好对应P1 口特殊寄存器的八个二进位,如向P1 口定数据0xFE,转成二进制就是
11111110,最低位D0 为0 这里P1.0 引脚输出低电平,LED1 被点亮。如此类推,大家不难算
出自己想要做的效果了。
留个邮箱给你发个入门文档
单片机16流水灯的介绍就聊到这里吧,感谢您花时间阅读,谢谢。
本文标签:单片机16流水灯