【Proteus仿真】51单片机+16X16点阵显示

【Proteus仿真】51单片机+16X16点阵显示


📖主程序代码

🎉可以根据需求,自行选择显示内容。启用对应的功能函数,具体显示内容可以根据现有的内容,自行取模替换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#include "type\_def.h" 
#include "font.h"

sbit SH_CP = P2^0;
sbit ST_CP = P2^1;
sbit DS = P2^2;

sbit hc138EN = P2^3;

void delay\_ms(u16 t);
void hc595SendByte(u8 dat);
void displaynum(int num,int x);
void displaychar(int num,int x);//单字符显示
void Move\_displaystr(u8 CNT);//字符串移动显示

void clock(int x);//字符串单一连续显示
void InitTimer0(void);
void check(void);

u16 a,c,count,seg,num,n,x,y;

void main()
{
// check();//扫描检查
// clock(5);//倒计时9 - 0,参数为速度

while(1)
{
// displaychar(7,5);//单字符显示 '7'

Move\_displaystr(13);//字符串向左移动显示
hc138EN=1;
}
}


void displaychar(int num,int x)
{
u16 i;
for(i=0;i<x;i++)
{
for(a=0;a<11;a++)
{
count=0;
seg=0;
while(count<16)
{
hc138EN=1;
P1=count++;
hc595SendByte(number[num][seg++]);
hc595SendByte(number[num][seg++]);
hc138EN=0;
delay\_ms(5);
}
}
}
}
void displaynum(int num,int x)
{
u16 i;
for(i=0;i<x;i++)
{
for(a=0;a<11;a++)//这里填写移动字符数量
{
count=0;
seg=0;
while(count<16)
{
hc138EN=1;
P1=count++;
hc595SendByte(number[num][seg++]);
hc595SendByte(number[num][seg++]);
hc138EN=0;
delay\_ms(5);
}
}
}
}
void Move\_displaystr(unsigned char CNT)
{
InitTimer0();
do
{
while(count<16)
{
hc138EN=1;
P1 = count++;
hc595SendByte(chars[0][seg++]);
hc595SendByte(chars[0][seg++]);
hc138EN=0;
delay\_ms(10);
}
count=0;
seg -=32;
}while(seg <(CNT\*32));//13为字符数量
EA=0;
seg =0;//显示完成后清零,等待下一次显示
delay\_ms(1000);
}
void clock(int x)
{
for(num=0;num<10;num++)//倒计时
{
displaynum(9-num,x);
}
}

void hc595SendByte(unsigned char dat)
{
int a;
SH_CP=0;
ST_CP=0;
for(a=0;a<8;a++)
{
DS=dat>>7;
dat<<=1;
SH_CP=1;
\_nop\_();
\_nop\_();
SH_CP=0;
}

ST_CP=1;
\_nop\_();
\_nop\_();
ST_CP=0;
}

void delay\_ms(u16 t)
{
u16 i,j;
for(i=0;i<t;i++)
for(j=0;j<5;j++);
}

void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x00;
TL0 = 0x01;
EA = 1;
ET0 = 1;
TR0 = 1;
}

void check(void)
{
unsigned long led=1;
count=0;
hc138EN=0;
while(led--)
{
for(x=0;x<16;x++)
{
hc595SendByte(~sx[x/2]);
hc595SendByte(~sx[x/2]);
for(y=0;y<5;y++){
for(count=0;count<16;count++)
{
P1=count;
delay\_ms(20);
}
}
}
for(x=0;x<16;x++)
{
hc595SendByte(~sx[6-x/2]);
hc595SendByte(~sx[6-x/2]);
for(y=0;y<5;y++){
for(count=0;count<16;count++)
{
P1=count;
delay\_ms(20);
}
}
}
}
hc138EN=1;
delay\_ms(10000);
}

void Timer0Interrupt(void) interrupt 1 using 1
{
TH0 = 0x00;
TL0 = 0x01;
seg +=2;
}

📚程序源码

✨本示例基于Proteus8.12平台运行。

1
2
3
链接:https://pan.baidu.com/s/1ucjQHQehKlBdgBrXN6BKhA 
提取码:sdbt

8x8点阵合成16点阵显示

✨默认安装的Proteus是不带16点阵的,需要自己制作的。如果没有制作的话,通过8x8点阵,4块拼接一块16点阵。
在这里插入图片描述

  • 取模方式:
    在这里插入图片描述
  • 取模后将char数据类型换成int类型,将相邻两个数据合并到一块;
1
2
3
4
{0x02,0x00,0x02,0x00,0x02,0x00,0x03,0xFC,0x02,0x00,0x02,0x00,0x3F,0xF0,0x20,0x10,
0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,0x24,0x88,0x22,0x44,0x42,0x44,0x80,0x04},/\*"点",0\*/


  • 合成后:
1
2
0x0200,0x0200,0x0200,0x03FC,0x0200,0x0200,0x3FF0,0x2010,0x2010,0x2010,0x3FF0,0x0000,0x2488,0x2244,0x4244,0x8004,//点

🌼示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "reg51.h"
unsigned int row[]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};
code unsigned int column[]=
{

0x0200,0x0200,0x0200,0x03FC,0x0200,0x0200,0x3FF0,0x2010,0x2010,0x2010,0x3FF0,0x0000,0x2488,0x2244,0x4244,0x8004,//点
0x0040,0x7C40,0x4440,0x4BFE,0x4880,0x50A0,0x4920,0x49FC,0x4420,0x4420,0x4420,0x6BFE,0x5020,0x4020,0x4020,0x4020,/\*"阵",1\*/
0x0000,0x1FF0,0x1010,0x1010,0x1FF0,0x1010,0x1010,0x1FF0,0x0440,0x4444,0x2444,0x1448,0x1450,0x0440,0xFFFE,0x0000,/\*"显",2\*/
0x0000,0x3FF8,0x0000,0x0000,0x0000,0x0000,0xFFFE,0x0100,0x0100,0x1110,0x1108,0x2104,0x4102,0x8102,0x0500,0x0200,/\*"示",3\*/
0x0000,0x2088,0x1108,0x13C8,0x0248,0x03DC,0x7248,0x13C8,0x1268,0x17D8,0x10C8,0x1148,0x1A48,0x1448,0x00D8,0x0000,//谢
0x0000,0x2088,0x1108,0x13C8,0x0248,0x03DC,0x7248,0x13C8,0x1268,0x17D8,0x10C8,0x1148,0x1A48,0x1448,0x00D8,0x0000,//谢
0x0000,0x0100,0x0100,0x7FFC,0x0100,0x0100,0x3FF0,0x0810,0x0820,0x0440,0x0280,0x0100,0x0280,0x0C60,0x701C,0x0000,//支
0x0000,0x1040,0x1040,0x11F8,0x7C40,0x1040,0x13FC,0x1410,0x1810,0x73FC,0x1010,0x1110,0x1090,0x1010,0x7070,0x0000,//持
};
unsigned char num=0,count=0;
unsigned char row_num=16,column_num=16;
unsigned int temp=0;

void delay(unsigned int t)
{
unsigned int i=0,j=0;
for(i=0;i<t;i++)
{
for(j=0;j<120;j++);
}
}

void matrix()
{
unsigned char i=0;

for(i=0;i<row_num;i++)
{
P1=row[i]/256;
P0=row[i]%256;
temp=(column[i+column_num\*count])>>num;
P3=~(temp/256);
P2=~(temp%256);
delay(1);
}
num++;
delay(40);
if(num==16)//num移动次数
{
num=0;
count++;
}
if(count==8)//count汉字的个数
{
count=0;
}
}

void main()
{
while(1)
{
matrix();
}
}

⛳程序源码和仿真资源二

1
2
3
链接:https://pan.baidu.com/s/1v\_AmDqIlCXRTiFhWm82-ng 
提取码:lwcm