点阵显示
程序员文章站
2024-03-15 14:05:47
...
点阵显示
最终效果:
51点阵显示
硬件连接:
(软件为Proteus)
-
经测试:
-
P0口 控制行(从左往右为76543210,高电平有效)
-
P1口 控制每一行上的点 (从上往下为01234567,低电平有效)
-
按键SW2/SW3按下后读取为低电平
-
-
-
点阵显示 25:
二进制 | 十六进制 | |
---|---|---|
第0列 | 1100 0101 | 0xc5 |
第1列 | 1101 0101 | 0xd5 |
第2列 | 1101 0001 | 0xd1 |
第3列 | 1111 1111 | 0xff |
第4列 | 1101 0001 | 0xd1 |
第5列 | 1101 0101 | 0xd5 |
第6列 | 1100 0101 | 0xc5 |
第7列 | 1111 1111 | 0xff |
uchar code rowpoint[]={0xc5,0xd5,0xd1,0xff,0xd1,0xd5,0xc5,0xff};
通过一个数组储存每一列的输出。
-
动态显示:
通过每一行的后移实现,但单纯的后移会使最后的一个索引溢出,可以通过取余实现循环;
程序编写:
- 程序整体:
/*点阵*/
#include<reg51.h>
#define uchar unsigned char
uchar code column[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar code rowpoint[]={0xc5,0xd5,0xd1,0xff,0xd1,0xd5,0xc5,0xff};
sbit key1=P1^0;
sbit key2=P1^1;
void delayms(uchar x) //延时 x (ms)
{ uchar y;
for (;x>0;x--)
{ for(y=0;y<128;y++);
}
}
void static_display() //静态显示
{ unsigned int i;
unsigned int k;
for(k=0;k<100;k++)
{ for(i=0;i<8;i++)
{ P0 = column[i];
P2 = rowpoint[i];
delayms(6);
}
}
}
void dynamic_display() //动态显示
{ unsigned int j;
unsigned int i;
unsigned int k;
for(j=0;j<8;j++)
{ for(k=0;k<100;k++)
{ for(i=0;i<8;i++)
{ P0 = column[(i+j)%8];
P2 = rowpoint[i];
delayms(6);
}
}
}
}
void main()
{ while(1)
{ if(key1 == 0)
{ static_display();
}
if(key2 == 0)
{ dynamic_display();
}
P0 = 0x00; //熄屏
}
}
- 通过k循环控制每个状态显示时长
上一篇: AD/DA模块使用说明及原理分析