主要是熟悉74HC595的使用,用来扩展I/O口;
开发板:STC89C51RC板
目的:循环显示 “I ♥ U”图案,当然有对象可以给对象看;没对象好基友也不错!
实验需要知道的知识:
LED显示:正向导通时LED亮,反之灭;
P0端口:当向端口写0时,经过锁存器的非端输出1,此时V2导通,输出低电平,外部电路以灌电流形式流入V2再流向地
74HC595芯片:内部电路图如下所示;RCLK与端口的锁存器相接,端口锁存器数据来源于移位寄存器的值,在RCLK上升沿,移位寄存器所有数据传入端口锁存器; 移位寄存器的值来源于SER串行输入端口,在SRCLK上升沿数据依次传入移位寄存器,并且前一个寄存器的值又作为后一个寄存器的值,所有从SER输入的数据依次后移;所以要正确读取输入数据应该等SER串行数据输入完成再将SRCLK拉高,一次性读取移位寄存器数据到端口。更详细参考:74HC595使用
文字图案的取模:网盘链接: http://链接:https://pan.baidu.com/s/1EyrXcwKhBBNB8sicw59SbQ
提取码:1250
显示图像的思路:行扫描一次列扫描一次,扫描8次即可显示一个图案;然后间隔一定时间扫描下一个图案。
实现代码:
#include<reg52.h>
unsigned short Row[][8]={{0x00,0x81,0x81,0xFF,0xFF,0x81,0x81,0x00},
{0x1C,0x3E,0x7E,0xFC,0xFC,0x7E,0x3E,0x1C},
{0x3E,0x7E,0xE0,0xC0,0xC0,0xE0,0x7E,0x3E}}; //I 爱(LED矩阵太小,用爱心替代) U
sbit SRCL =P3^6;
sbit RCL =P3^5;
sbit Data_In=P3^4;
void delay_10us(unsigned short ten_us)
{
while(ten_us--);
}
void Input_Dat(unsigned short dat) //往74HC595写入数据
{
char i=0;
RCL=0;
for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中
{
SRCL=0;
Data_In=dat&(1<<0);//取末位
dat>>=1;//移位到末位
SRCL=1; //产生上升沿将数据传入移位寄存器
}
RCL=1; //在数据全部传入移位寄存器后,只需要一个RCL上升沿就可将数据全部传入端口
}
void Prin(char i){ //显示出图案
char n=0;
unsigned short Low=0x7f; //01111111,用于从P0最高位循环右移扫描列
for(n=0;n<8;n++){
Input_Dat(Row[i][n]); //行扫描
P0=Low; //列扫描
Low=(Low<<7)|(Low>>1); //循环右移1位
delay_10us(100);//延时一段时间,等待显示稳定
P0=0xff; //消影
}
}
int main(){
char i=0;
unsigned short tep=0;
while(1){
Prin(i);
tep++;
if(tep==150){ //控制显示多少次后更换图案
i++;
tep=0;
}
if(i==3){ //图案循环开始
i=0;
}
}
}
不足之处还请指出,谢谢!