实验目标:在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 P0u8 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);//消除影}}
}