实验目标:在8x8的点阵屏上显示数字0。
点阵屏的原理图如下图所示,点阵屏的列接在P0端口,行接在74HC595扩展的DP端口上。
扩展口的使用详见:51单片机开发:IO扩展(串转并)实验-CSDN博客
要让点阵屏显示数字,得利用二极管的余辉和人眼暂留效应,实际上点阵屏从左往右一列一列依次点亮,由于间隔时间短(1ms),人眼看起来仿佛一直显示。
DPh | DPg | DPf | DPe | DPd | DPc | DPb | DPa |
0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 |
0x7c,表示数字0最左边的竖。 |
P07 | P06 | P05 | P04 | P03 | P02 | P01 | P00 |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
0xbf,表示数字0最左边的竖对应的那一列为低电平,即第2列(从1开始) |
取模软件:
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit SRCLK = P3^6;
sbit RCLK_2 = P3^5;
sbit SER = P3^4;
#define LEDDZ_COL_PORT P0
u8 ghc595_buf[] = {0x00,0x7C,0x82,0x82,0x82,0x7C,0x00,0x00};//行,高电平点亮
u8 gcol_buf[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//对应某一列为低电平
void delay_10us(u16 ten_us){
while(ten_us--);
}
void delay_ms(u16 ms){
delay_10us(ms*100);
}
//扩展IO,先传高位再传低位
void hc595_write_data(u8 dat){
u8 i=0;
for(i=0;i<8;i++){
SER = dat>>7;
dat <<= 1;
SRCLK=0;
delay_10us(1);
SRCLK=1;
delay_10us(1);
}
RCLK_2=0;
delay_10us(1);
RCLK_2=1;
}
void main(){
u8 i=0;
while(1){
for(i=0;i<8;i++){
LEDDZ_COL_PORT = gcol_buf[i]; //列
hc595_write_data(ghc595_buf[i]); //行
delay_10us(100);
hc595_write_data(0x00);//消除影
}
}
}