本帖最后由 芯圣电子官方QQ 于 2023-7-24 14:58 编辑
使用HC89S001P芯片来驱动74HC595串口转并口输出。
一、电路图
P02 --- 595-RCLK
P03 --- 595-DAT
P04 --- 595-SRCLK
二、程序
2.1、程序代码
//main.c
#define ALLOCATE_EXTERN
#include "config.h"
//系统初始化
void SystemInit(void)
{
/************************************系统初始化****************************************/
WDTCCR = 0x00; //关闭看门狗
while((CLKCON&0x20)!=0x20); //等待内部高频RC起振
CLKSWR = 0x51; //选择内部高频时钟为主时钟,内部高频RC2分频,Fosc=16MHz
while((CLKSWR&0xC0)!=0x40); //等待内部高频切换完成
CLKDIV = 0x01; //Fosc1分频得到Fcpu,Fcpu=16MHz
}
void main(void)
{
uint i;
uchar j=0x01;
uchar k=0;
SystemInit(); //系统初始化
Init_Port(); //端口初始化
//EintInit(); //外部中断初始化
//INT2_7_Init(); //外部中断2-7初始化
//CCO_Init(); //CCO输出
Init_Timer0(); //初始化定时器0
Init_595();
while(1)
{
test_595();
}
}
//74hc595.c
#include "config.h"
//595初始化
void Init_595(void)
{
//PORT初始化
P0M1 = P0M1&0xF0|0x08; //P02设置为推挽输出
P0M1 = P0M1&0x0F|0x80; //P03设置为推挽输出
P0M2 = P0M2&0xF0|0x08; //P04设置为推挽输出
}
//595发送数据
void SendDat_595(uchar dat)
{
uchar i=0;
RCLK_595=0;
SRCLK_595=0;
for(i=0;i<8;i++)
{
SRCLK_595=0;
if((dat&0x01)==0x01)
{
DAT_595=1;
}
else
{
DAT_595=0;
}
SRCLK_595=1;
_nop_();
_nop_();
dat=dat>>1;
}
RCLK_595=1;
}
void test_595(void)
{
uchar j;
uchar k;
uint i;
j=0x01;
for(k=0;k<8;k++)
{
SendDat_595(~j);
for(i=0;i<30000;i++);
j=j<<1;
}
j=0x80;
for(k=0;k<8;k++)
{
SendDat_595(~j);
for(i=0;i<30000;i++);
j=j>>1;
}
}
2.2、源代码
HC89S001P_TEST _595.rar
(102.74 KB)
三、执行结果
|