#include "defineh"
bit B16ms;
bit B1s;
uchar SomeLines; //行扫描计数器
uchar Timecnt;
ucharay; //停留时间
uchar Speed;
uchar SpeedCnt; //速度计数器
uchar StayCnt; //停留时间计数
uchar Stay;
uchar PingCnt; //屏数计数器
uchar UD_Line; //上滚行计数器
uchar Dots; //左移点计数器
uchar Dismode;
uchar DST;
#include "defineh"
bit B16ms;
bit B1s;
uchar SomeLines; //行扫描计数器
uchar Timecnt;
ucharay; //停留时间
uchar Speed;
uchar SpeedCnt; //速度计数器
uchar StayCnt; //停留时间计数
uchar Stay;
uchar PingCnt; //屏数计数器
uchar UD_Line; //上滚行计数器
uchar Dots; //左移点计数器
uchar Dismode;
uchar DST;
#include "defineh"
CLS()
{
uchar i,temp;
for(i=0;i<Lenth;i++)
{
temp=XBYTE[DISPADR+(uint)PingCntLenthClines+(uint)SomeLinesLenth+i];
SENDCLK
}
EHOFF
STORE
Select_Line
EHON
SomeLines++;
if(SomeLines==16)
{
SomeLines=0;
}
if(B1s)
{
B1s=0;
StayCnt++;
if(Stay==StayCnt)
{
StayCnt=0;
PingCnt++;
if(PingCnt==(Pings-1))
{
PingCnt=0;
Dismode=2;
}
}
}
}
UP()
{
uchar i,temp;
for(i=0;i<Lenth;i++)
{
temp=XBYTE[DISPADR+(SomeLines+UD_Line)(uint)Lenth+i];
SENDCLK
}
EHOFF
STORE
Select_Line
EHON
SomeLines++;
if(SomeLines==16)
{
SomeLines=0;
}
if(B16ms)
{
B16ms=0;
SpeedCnt++;
if(SpeedCnt==Speed)
{
SpeedCnt=0;
UD_Line++;
if(UD_Line==(Clines(Pings-1)))
{
UD_Line=0;
Dismode=1;
}
}
}
}
LEFTSHIFT()
{
uchar i,temp;
while(PingCnt!=(Pings-1))
{
for(i=0;i<(Lenth-Dots/8);i++)
{
temp=XBYTE[DISPADR+(uint)PingCntLenthClines+(uint)SomeLinesLenth+Dots/8+i];
SENDCLK
}
for(i=0;i<(Dots/8);i++)
{
temp=XBYTE[DISPADR+(uint)(PingCnt+1)LenthClines+(uint)SomeLinesLenth+i];
SENDCLK
}
temp=XBYTE[DISPADR+(uint)(PingCnt+1)LenthClines+(uint)SomeLinesLenth+Dots/8];
for(i=0;i<(Dots%8);i++)
{
CLK=0;CLK=1;
}
EHOFF
STORE
Select_Line
EHON
SomeLines++;
if(SomeLines==16)
{
SomeLines=0;
}
if(B16ms)
{
B16ms=0;
SpeedCnt++;
if(SpeedCnt==Speed)
{
SpeedCnt=0;
Dots++;
if(Dots==(Lenth8))
{
Dots=0;
PingCnt++;
}
}
}
}
PingCnt=0;
Dismode=3;
}
Display()
{
switch(Dismode)
{
case 1:CLS();break;
case 2:LEFTSHIFT();break;
case 3:UP();break;
default:break;
}
}
Init()
{
uint i;
P1=0xFF; P3=0xFF;
TMOD=0X01;
SET_HTIME0_PARA(Fosc,10)
TR0=1; ET0=1; PT0=0;
TORAM
for(i=0;i<(uint)LenthClinesPings;i++)
{
XBYTE[DISPADR+i]=~TAB[i];
}
Dismode=1;
Speed=1;
Stay=2;
EA=1;
}
main()
{
Init();
while (1)
{
Display();
}
}
这样接是可以实现的!
没有级联的74HC595,不知道是出于什么样的考虑,不过是可以实现的。
你仔细看一下手册会发现:只有STCP脚上有上升沿时,595的移位寄存器中的数据才会输出到595的IO口上。因此,照现在的情况你要分别编两个595的驱动!
1、先向第一个595内发8位串行数据,然后给第一片595的STCP脚一个上升沿,另一片595STCP脚电平保持不变,此时虽然第二片595移位寄存器内的数据也跟着变化,但是由于STCP脚没有上升沿,所以第二片595的IO口的状态不发生变化;
2、再向第二个595内发8位串行数据,然后给第二片595的STCP脚一个上升沿,另一片595STCP脚电平保持不变,此时虽然第一片595移位寄存器内的数据也跟着变化,但是由于STCP脚没有上升沿,所以第一片595的IO口的状态不发生变化;
如此循环1、2、步骤,当可实现分别控制两片595的目的。
不过这个做板子的大哥还真有才。你这不会是一道面试题吧!!
又不明白的QQ:28361319
我有一个74hc595串入并出控制led程序,你自己改一改就行了。
前提是你还需要一个电机驱动芯片(如l293d,uln2003等)。
/
标题: 试验74HC595驱动8位LED灯(C语言)
连接方法:JP12用条线冒短接 JP1(LED灯接口)和JP2(595接口) 用8PIN排线连接
通过本例程了解 74HC595(串入并出)基本原理和使用
3个I/O扩展8个输出,通过片选可以串接更多74HC595芯片,得到更多的输出数
请学员认真消化本例程,懂74C595在C语言中的 *** 作
此汇编程序留给大家做为课后作业自己完成。关于HC595汇编驱动参考“静态显示(74HC595驱动)”。
/
#include <reg51h>
#include <intrinsh>
#define NOP() _nop_() / 定义空指令 /
//SPI IO
sbit MOSIO =P3^4;
sbit R_CLK =P3^5;
sbit S_CLK =P3^6;
void delay(unsigned int i); //函数声名
void HC595SendData(unsigned char SendVal);
main()
{ unsigned char Led=0xfe; //1111 1110
HC595SendData(0xff); //初始化595使他为高电平 让LED处于熄灭状态
while(1)
{
HC595SendData(Led); //调用595驱动程序 把LED的数据送到595
Led<<=1;
Led = Led| 0x01; //移位后,后面的位为高电平;
if (Led == 0xff ) Led=0xfe; //1111 1110
delay(200);
}
}
/
延时子程序
/
void delay(unsigned int i)
{
unsigned int j;
for(i; i > 0; i--)
for(j = 300; j > 0; j--);
}
/
函数名称: HC595SendData
功能描述: 向SPI总线发送数据
/
void HC595SendData(unsigned char SendVal)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((SendVal<<i)&0x80) MOSIO=1; //set dataline high 0X80 最高位与SendVal左移的最高位 进行逻辑运算
else MOSIO=0; // 如果为真 MOSIO = 1
S_CLK=0;
NOP(); //产生方形波
NOP();
S_CLK=1;
}
R_CLK=0; //set dataline low
NOP(); //产生方形波
NOP();
R_CLK=1; //片选
}
以上就是关于怎么在keil51中写给595发送数据的程序啊用C语言 汇编我不大懂全部的内容,包括:怎么在keil51中写给595发送数据的程序啊用C语言 汇编我不大懂、单片机高手来看看595怎么用、基于51单片机通过74HC595控制四相步进电机的C程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)