想问一下为什么动态扫描点阵显示汉字的时候,为什么会整个点阵都亮了?而且闪烁的没有规律
单片机源程序如下:
- #include <reg51.h>
- #include "intrins.h"
- typedef unsigned int uint;
- typedef unsigned char uchar;
- sbit SRCLK = P3^6; // 移位寄存器时钟
- sbit RCLK = P3^5; // 控制存储寄存器的时钟
- sbit SER = P3^4; //串行数据输入
- uchar code ledduan[] = {
- /*-- 文字: 普 --*/
- /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
- 0x40,0x44,0x54,0x64,0x45,0x7E,0x44,0x44,0x44,0x7E,0x45,0x64,0x54,0x44,0x40,0x00, //从左往右从上往下依次扫描
- 0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,
- };
- uchar code ledwei[] = {
- 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
- };
- void delay(uint z){
- while (z--);
- }
- void hc595SendByte(uchar dat1,uchar dat2,uchar dat3,uchar dat4){
- uint i;
- SRCLK = 1;
- RCLK = 1;
- for (i = 0; i < 8; i++){
- SER = dat1 >> 7;
- dat1 <<= 1;
- SRCLK = 0;
- _nop_();
- // _nop_();
- SRCLK = 1;
- }
- for (i = 0; i < 8; i++){
- SER = dat2 >> 7;
- dat2 <<= 1;
- SRCLK = 0;
- _nop_();
- // _nop_();
- SRCLK = 1;
- }
- for (i = 0; i < 8; i++){
- SER = dat3 >> 7;
- dat3 <<= 1;
- SRCLK = 0;
- _nop_();
- // _nop_();
- SRCLK = 1;
- }
- for (i = 0; i < 8; i++){
- SER = dat4 >> 7;
- dat4 <<= 1;
- SRCLK = 0;
- _nop_();
- // _nop_();
- SRCLK = 1;
- }
- RCLK = 0;
- _nop_();
- //_nop_();
- RCLK = 1;
- }
- void main() {
- uchar i;
- while(1){
- for (i = 0; i < 16; i++){
- hc595SendByte(~ledwei[i+16],~ledwei[i],ledduan[i + 16],ledduan[i]); //前两个控制列 后两个控制行 从右下角的点往左往上读 行连接了三极管的入口 列连接了三极管的出口
- delay(100); //例i=0;表示选中第一列,通过ledduan来选择哪几行亮
- }
- }
- }
复制代码
|