参考完全使用单片机3个IO口+74HC595驱动LCD1602液晶的源程序http://www.51hei.com/bbs/dpj-114268-1.html
使用RTX51 改进了一个版本。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
主要区别的核心代码:
#include "HS595.h"
unsigned char HS595_data; //HS595的输出数据
/*
0位 RS
1位 RW
2位 E
3位 D4
4位 D5
5位 D6
6位 D7
*/
//向HC595发送串行数据
void HC595SendData(unsigned char SendVal)
{
unsigned char i;
HS595_ST_CP=0; //停止输出
for(i=0; i<8; i++)
{
if((SendVal<<i)&0x80) //0X80 最高位与SendVal左移的最高位 进行逻辑运算
HS595_DS=1; //如果为真 HS595_DS= 1
else
HS595_DS=0; //如果为假 HS595_DS= 0
//产生数据移位信号
HS595_SH_CP=0;
_nop_(); //短暂延时产生一定宽度的脉冲信号
_nop_(); //短暂延时
HS595_SH_CP=1;
}
//产生数据输出信号
_nop_(); //短暂延时
_nop_(); //短暂延时
_nop_();
HS595_ST_CP=1; //总体输出
}
void SetRS(bit state)
{
if(state)
{
HS595_data|=0x01; //置1
} else
{
HS595_data&=0xFE; //置0
}
}
void SetRW(bit state)
{
if(state)
{
HS595_data|=0x02; //置1
} else
{
HS595_data&=0xFD; //置0
}
}
void SetE(bit state)
{
if(state)
{
HS595_data|=0x04; //置1
} else
{
HS595_data&=0xFB; //置0
}
}
//发送低四位
void SetDataL(unsigned char in_data)
{
volatile unsigned char r3;
r3=(in_data<<3); //左移3位
HS595_data&= 0x07; //清除其他位,保留0~2位
HS595_data|=r3&0x78; //写入数据到3~6位
}
//发送高四位
void SetDataH(unsigned char in_data)
{
volatile unsigned char l4;
l4=(in_data>>4); //右移4位
l4=l4<<3; //左移3位
HS595_data&= 0x07; //清除其他位,保留0~2位
HS595_data|=l4&0x78; //写入数据到3~6位
}
void SendData(void)
{
HC595SendData(HS595_data);
}
全部资料51hei下载地址:
RTX51 LCD1602 74HC595 V1.0.rar
(133.96 KB, 下载次数: 33)
|