06_单片机_点阵_显示汉字

1. 显示汉字“朱” ,横向取模

1.1. 原始方法

 1 #include <REG51.H>
 2 
 3 
 4 void HC595SendBytes(unsigned char pos1, unsigned char pos2, unsigned char neg1, unsigned char neg2);
 5 
 6 sbit SER         = P1^0;
 7 sbit RCLK     = P1^1;
 8 sbit SRCLK     = P1^2;
 9 
10 /*--  文字:  朱  (横向取模)--*/
11 /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
12 unsigned char zhu[32] = {
13 0x80,0x00,0x88,0x00,
14 0x88,0x00,0xF8,0x1F,
15 0x84,0x00,0x82,0x00,
16 0x80,0x00,0xFF,0x7F,
17 0xC0,0x01,0xA0,0x02,
18 0x90,0x04,0x88,0x08,
19 0x84,0x10,0x83,0x60,
20 0x80,0x00,0x80,0x00};
21 
22 void main(void)
23 {
24     HC595SendBytes(0x01, 0x00, ~0x80, 0xff);
25     HC595SendBytes(0x02, 0x00, ~0x88, 0xff);
26     HC595SendBytes(0x04, 0x00, ~0x88, 0xff);
27     HC595SendBytes(0x08, 0x00, ~0xF8, ~0x1F);
28     
29     HC595SendBytes(0x10, 0x00, ~0x84, ~0x00);
30     HC595SendBytes(0x20, 0x00, ~0x82, ~0x00);
31     HC595SendBytes(0x40, 0x00, ~0x80, ~0x00);
32     HC595SendBytes(0x80, 0x00, ~0xFF, ~0x7F);
33     
34     HC595SendBytes(0x00, 0x01, ~0xC0, ~0x01);
35     HC595SendBytes(0x00, 0x02, ~0xA0, ~0x02);
36     HC595SendBytes(0x00, 0x04, ~0x90, ~0x04);
37     HC595SendBytes(0x00, 0x08, ~0x88, ~0x08);
38     
39     HC595SendBytes(0x00, 0x10, ~0x84, ~0x10);
40     HC595SendBytes(0x00, 0x20, ~0x83, ~0x60);
41     HC595SendBytes(0x00, 0x40, ~0x80, ~0x00);
42     HC595SendBytes(0x00, 0x80, ~0x80, ~0x00);
43 }
44 
45 void HC595SendBytes(unsigned char pos1, unsigned char pos2, unsigned char neg1, unsigned char neg2)
46 {
47     unsigned char i = 0;
48     
49     RCLK = 0;
50     SRCLK = 0;
51     
52     for(i=0; i<8; i++)
53     {
54         SER = neg2>>7;    // 获取最高位传递给SER
55         SRCLK = 0;
56         SRCLK = 1;
57         neg2 = neg2<<1;
58     }
59     
60     for(i=0; i<8; i++)
61     {
62         SER = neg1>>7;    
63         SRCLK = 0;
64         SRCLK = 1;
65         neg1 = neg1<<1;
66     }
67     
68     for(i=0; i<8; i++)
69     {
70         SER = pos2>>7;    
71         SRCLK = 0;
72         SRCLK = 1;
73         pos2 = pos2<<1;
74     }
75     
76     for(i=0; i<8; i++)
77     {
78         SER = pos1>>7;    
79         SRCLK = 0;
80         SRCLK = 1;
81         pos1 = pos1<<1;
82     }
83     
84     RCLK = 0;
85     RCLK = 1;
86 }
View Code

1.2. 使用For循环,减少代码,中间出现小问题,写row数组时,少写部分数据

 1 #include <REG51.H>
 2 
 3 void HC595SendBytes(unsigned char pos1, unsigned char pos2, unsigned char neg1, unsigned char neg2);
 4 
 5 sbit SER         = P1^0;
 6 sbit RCLK     = P1^1;
 7 sbit SRCLK     = P1^2;
 8 
 9 /*--  文字:  朱  (横向取模)--*/
10 /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
11 unsigned char zhu[32] = {
12 0x80,0x00,0x88,0x00,
13 0x88,0x00,0xF8,0x1F,
14 0x84,0x00,0x82,0x00,
15 0x80,0x00,0xFF,0x7F,
16 0xC0,0x01,0xA0,0x02,
17 0x90,0x04,0x88,0x08,
18 0x84,0x10,0x83,0x60,
19 0x80,0x00,0x80,0x00};
20 
21 unsigned char row[32] = {
22 0x01, 0x00, 0x02, 0x00,
23 0x04, 0x00, 0x08, 0x00,
24 0x10, 0x00, 0x20, 0x00,
25 0x40, 0x00, 0x80, 0x00,
26 0x00, 0x01, 0x00, 0x02,
27 0x00, 0x04, 0x00, 0x08,
28 0x00, 0x10, 0x00, 0x20,
29 0x00, 0x40, 0x00, 0x80};
30 
31 void main(void)
32 {
33     unsigned char i;
34     
35     for(i=0; i<16; i++)
36     {
37         HC595SendBytes(row[2*i], row[2*i+1], ~zhu[2*i], ~zhu[2*i+1]);
38     }
39 }
40 
41 void HC595SendBytes(unsigned char pos1, unsigned char pos2, unsigned char neg1, unsigned char neg2)
42 {
43     unsigned char i = 0;
44     
45     RCLK = 0;
46     SRCLK = 0;
47     
48     for(i=0; i<8; i++)
49     {
50         SER = neg2>>7;    // 获取最高位传递给SER
51         SRCLK = 0;
52         SRCLK = 1;
53         neg2 = neg2<<1;
54     }
55     
56     for(i=0; i<8; i++)
57     {
58         SER = neg1>>7;    
59         SRCLK = 0;
60         SRCLK = 1;
61         neg1 = neg1<<1;
62     }
63     
64     for(i=0; i<8; i++)
65     {
66         SER = pos2>>7;    
67         SRCLK = 0;
68         SRCLK = 1;
69         pos2 = pos2<<1;
70     }
71     
72     for(i=0; i<8; i++)
73     {
74         SER = pos1>>7;    
75         SRCLK = 0;
76         SRCLK = 1;
77         pos1 = pos1<<1;
78     }
79     
80     RCLK = 0;
81     RCLK = 1;
82 }
View Code

1.3. 显示倒计时(1->Go),由于硬件空间大小,无法实现从9开始倒计时

 1 /*
 2 u8 num9[] = 
 3 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x1C,0x24,0x22,0x42,0x42,0x42,0x42,0x42,0x42,
 4 0x42,0x62,0x42,0x5C,0x42,0x40,0x42,0x40,0x24,0x24,0x18,0x18,0x00,0x00,0x00,0x00};
 5 
 6 u8 num8[] =
 7 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x24,
 8 0x42,0x18,0x42,0x24,0x42,0x42,0x42,0x42,0x24,0x42,0x18,0x3C,0x00,0x00,0x00,0x00};
 9 
10 u8 num7[] =
11 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x7E,0x24,0x42,0x42,0x20,0x42,0x20,0x42,0x10,
12 0x42,0x10,0x42,0x08,0x42,0x08,0x42,0x08,0x24,0x08,0x18,0x08,0x00,0x00,0x00,0x00};
13 
14 u8 num6[] =
15 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x24,0x24,0x42,0x02,0x42,0x02,0x42,0x3A,
16 0x42,0x46,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x44,0x18,0x38,0x00,0x00,0x00,0x00};
17 
18 u8 num5[] =
19 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x7E,0x24,0x02,0x42,0x02,0x42,0x02,0x42,0x1E,
20 0x42,0x22,0x42,0x40,0x42,0x40,0x42,0x42,0x24,0x22,0x18,0x1C,0x00,0x00,0x00,0x00};
21 
22 u8 num4[] =
23 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x24,0x30,0x42,0x30,0x42,0x28,0x42,0x24,
24 0x42,0x24,0x42,0x22,0x42,0xFE,0x42,0x20,0x24,0x20,0x18,0xF8,0x00,0x00,0x00,0x00};
25 
26 u8 num3[] = 
27 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x24,0x42,0x42,0x42,0x42,0x40,0x42,0x20,
28 0x42,0x18,0x42,0x20,0x42,0x40,0x42,0x42,0x24,0x42,0x18,0x3C,0x00,0x00,0x00,0x00};
29 
30 u8 num2[] =
31 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x40,
32 0x42,0x20,0x42,0x10,0x42,0x08,0x42,0x04,0x24,0x42,0x18,0x7E,0x00,0x00,0x00,0x00};
33 
34 u8 num1[] =
35 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x10,0x24,0x1C,0x42,0x10,0x42,0x10,0x42,0x10,
36 0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x24,0x10,0x18,0x7C,0x00,0x00,0x00,0x00};
37 
38 u8 go[] =
39 {0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x1C,0x22,0x22,0x22,0x41,0x01,0x41,0x01,0x41,
40 0x01,0x41,0x71,0x41,0x21,0x41,0x22,0x41,0x22,0x22,0x1C,0x1C,0x00,0x00,0x00,0x00};
41 */
View Code

若是将上述代码,加入如下中,会报错“SEGMENT Too Large”

 1 #include <REG51.H>
 2 
 3 typedef unsigned char u8;
 4 
 5 /*********************定义*************************/
 6 sbit SER = P1^0;
 7 sbit RCLK = P1^1;
 8 sbit SCLK = P1^2;
 9 
10 /*********************函数声明*********************/
11 void Hc595SendByte(u8 dat_pos1, u8 dat_pos2, u8 dat_neg1, u8 dat_neg2);
12 
13 /*********************数组声明*********************/
14 
15 u8 num1[] =
16 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x10,0x24,0x1C,0x42,0x10,0x42,0x10,0x42,0x10,
17 0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x24,0x10,0x18,0x7C,0x00,0x00,0x00,0x00};
18 
19 u8 go[] =
20 {0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x1C,0x22,0x22,0x22,0x41,0x01,0x41,0x01,0x41,
21 0x01,0x41,0x71,0x41,0x21,0x41,0x22,0x41,0x22,0x22,0x1C,0x1C,0x00,0x00,0x00,0x00};
22 
23 u8 rows[] =
24 {0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,
25 0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80};
26 
27 void main(void)
28 {
29     u8 i=0, j;
30     while(1)
31     {
32         for(j=60; j>0; j--)
33         {
34             for(i=0; i<16; i++)
35             {
36                 Hc595SendByte(rows[2*i], rows[2*i+1], ~num1[2*i], ~num1[2*i+1]);
37             }
38         }
39         Hc595SendByte(0x00, 0x00, 0x00, 0x00);
40         
41         while(1)
42         {
43             for(j=60; j>0; j--)
44             {
45                 for(i=0; i<16; i++)
46                 {
47                     Hc595SendByte(rows[2*i], rows[2*i+1], ~go[2*i], ~go[2*i+1]);
48                 }
49             Hc595SendByte(0x00, 0x00, 0x00, 0x00);
50             }
51         }
52     }
53 }
54 
55 void Hc595SendByte(u8 dat_pos1, u8 dat_pos2, u8 dat_neg1, u8 dat_neg2)
56 {
57     u8 i=0;
58     
59     RCLK = 0;
60     SCLK = 0;
61     
62     for(i=0; i<8; i++)
63     {
64         SER = dat_neg2>>7;
65         SCLK = 0;
66         SCLK = 1;
67         dat_neg2 = dat_neg2<<1;
68     }
69     
70     for(i=0; i<8; i++)
71     {
72         SER = dat_neg1>>7;
73         SCLK = 0;
74         SCLK = 1;
75         dat_neg1 = dat_neg1<<1;
76     }
77     
78     for(i=0; i<8; i++)
79     {
80         SER = dat_pos2>>7;
81         SCLK = 0;
82         SCLK = 1;
83         dat_pos2 = dat_pos2<<1;
84     }
85     
86     for(i=0; i<8; i++)
87     {
88         SER = dat_pos1>>7;
89         SCLK = 0;
90         SCLK = 1;
91         dat_pos1 = dat_pos1<<1;
92     }
93     
94     RCLK = 0;
95     RCLK = 1;
96 }
View Code

数组之前增加关键字 code,因为单片机RAM空间小,Flash会大,若定义的数组的数据不会变化,关键字code,编译器会将数组存储到Flash中

  1 #include <REG51.H>
  2 
  3 typedef unsigned char u8;
  4 
  5 /*********************定义*************************/
  6 sbit SER = P1^0;
  7 sbit RCLK = P1^1;
  8 sbit SCLK = P1^2;
  9 
 10 /*********************函数声明*********************/
 11 void Hc595SendByte(u8 dat_pos1, u8 dat_pos2, u8 dat_neg1, u8 dat_neg2);
 12 
 13 /*********************数组声明*********************/
 14 
 15 u8 code num9[] = 
 16 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x1C,0x24,0x22,0x42,0x42,0x42,0x42,0x42,0x42,
 17 0x42,0x62,0x42,0x5C,0x42,0x40,0x42,0x40,0x24,0x24,0x18,0x18,0x00,0x00,0x00,0x00};
 18 
 19 u8 code num8[] =
 20 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x24,
 21 0x42,0x18,0x42,0x24,0x42,0x42,0x42,0x42,0x24,0x42,0x18,0x3C,0x00,0x00,0x00,0x00};
 22 
 23 u8 code num7[] =
 24 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x7E,0x24,0x42,0x42,0x20,0x42,0x20,0x42,0x10,
 25 0x42,0x10,0x42,0x08,0x42,0x08,0x42,0x08,0x24,0x08,0x18,0x08,0x00,0x00,0x00,0x00};
 26 
 27 u8 code num6[] =
 28 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x24,0x24,0x42,0x02,0x42,0x02,0x42,0x3A,
 29 0x42,0x46,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x44,0x18,0x38,0x00,0x00,0x00,0x00};
 30 
 31 u8 code num5[] =
 32 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x7E,0x24,0x02,0x42,0x02,0x42,0x02,0x42,0x1E,
 33 0x42,0x22,0x42,0x40,0x42,0x40,0x42,0x42,0x24,0x22,0x18,0x1C,0x00,0x00,0x00,0x00};
 34 
 35 u8 code num4[] =
 36 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x24,0x30,0x42,0x30,0x42,0x28,0x42,0x24,
 37 0x42,0x24,0x42,0x22,0x42,0xFE,0x42,0x20,0x24,0x20,0x18,0xF8,0x00,0x00,0x00,0x00};
 38 
 39 u8 code num3[] = 
 40 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x24,0x42,0x42,0x42,0x42,0x40,0x42,0x20,
 41 0x42,0x18,0x42,0x20,0x42,0x40,0x42,0x42,0x24,0x42,0x18,0x3C,0x00,0x00,0x00,0x00};
 42 
 43 u8 code num2[] =
 44 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x40,
 45 0x42,0x20,0x42,0x10,0x42,0x08,0x42,0x04,0x24,0x42,0x18,0x7E,0x00,0x00,0x00,0x00};
 46 
 47 u8 code num1[] =
 48 {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x10,0x24,0x1C,0x42,0x10,0x42,0x10,0x42,0x10,
 49 0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x24,0x10,0x18,0x7C,0x00,0x00,0x00,0x00};
 50 
 51 u8 code go[] =
 52 {0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x1C,0x22,0x22,0x22,0x41,0x01,0x41,0x01,0x41,
 53 0x01,0x41,0x71,0x41,0x21,0x41,0x22,0x41,0x22,0x22,0x1C,0x1C,0x00,0x00,0x00,0x00};
 54 
 55 u8 code rows[] =
 56 {0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,
 57 0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80};
 58 
 59 void main(void)
 60 {
 61     u8 i=0, j;
 62     while(1)
 63     {
 64         for(j=60; j>0; j--)
 65         {
 66             for(i=0; i<16; i++)
 67             {
 68                 Hc595SendByte(rows[2*i], rows[2*i+1], ~num9[2*i], ~num9[2*i+1]);
 69             }
 70         }
 71         Hc595SendByte(0x00, 0x00, 0x00, 0x00);
 72         
 73         for(j=60; j>0; j--)
 74         {
 75             for(i=0; i<16; i++)
 76             {
 77                 Hc595SendByte(rows[2*i], rows[2*i+1], ~num8[2*i], ~num8[2*i+1]);
 78             }
 79         }
 80         Hc595SendByte(0x00, 0x00, 0x00, 0x00);
 81         
 82         for(j=60; j>0; j--)
 83         {
 84             for(i=0; i<16; i++)
 85             {
 86                 Hc595SendByte(rows[2*i], rows[2*i+1], ~num7[2*i], ~num7[2*i+1]);
 87             }
 88         }
 89         Hc595SendByte(0x00, 0x00, 0x00, 0x00);
 90         
 91         for(j=60; j>0; j--)
 92         {
 93             for(i=0; i<16; i++)
 94             {
 95                 Hc595SendByte(rows[2*i], rows[2*i+1], ~num6[2*i], ~num6[2*i+1]);
 96             }
 97         }
 98         Hc595SendByte(0x00, 0x00, 0x00, 0x00);
 99         
100         for(j=60; j>0; j--)
101         {
102             for(i=0; i<16; i++)
103             {
104                 Hc595SendByte(rows[2*i], rows[2*i+1], ~num5[2*i], ~num5[2*i+1]);
105             }
106         }
107         Hc595SendByte(0x00, 0x00, 0x00, 0x00);
108         
109         for(j=60; j>0; j--)
110         {
111             for(i=0; i<16; i++)
112             {
113                 Hc595SendByte(rows[2*i], rows[2*i+1], ~num4[2*i], ~num4[2*i+1]);
114             }
115         }
116         Hc595SendByte(0x00, 0x00, 0x00, 0x00);
117         
118         for(j=60; j>0; j--)
119         {
120             for(i=0; i<16; i++)
121             {
122                 Hc595SendByte(rows[2*i], rows[2*i+1], ~num3[2*i], ~num3[2*i+1]);
123             }
124         }
125         Hc595SendByte(0x00, 0x00, 0x00, 0x00);
126         
127         for(j=60; j>0; j--)
128         {
129             for(i=0; i<16; i++)
130             {
131                 Hc595SendByte(rows[2*i], rows[2*i+1], ~num2[2*i], ~num2[2*i+1]);
132             }
133         }
134         Hc595SendByte(0x00, 0x00, 0x00, 0x00);
135         
136         for(j=60; j>0; j--)
137         {
138             for(i=0; i<16; i++)
139             {
140                 Hc595SendByte(rows[2*i], rows[2*i+1], ~num1[2*i], ~num1[2*i+1]);
141             }
142         }
143         Hc595SendByte(0x00, 0x00, 0x00, 0x00);
144         
145         while(1)
146         {
147             for(j=60; j>0; j--)
148             {
149                 for(i=0; i<16; i++)
150                 {
151                     Hc595SendByte(rows[2*i], rows[2*i+1], ~go[2*i], ~go[2*i+1]);
152                 }
153             Hc595SendByte(0x00, 0x00, 0x00, 0x00);
154             }
155         }
156     }
157 }
158 
159 void Hc595SendByte(u8 dat_pos1, u8 dat_pos2, u8 dat_neg1, u8 dat_neg2)
160 {
161     u8 i=0;
162     
163     RCLK = 0;
164     SCLK = 0;
165     
166     for(i=0; i<8; i++)
167     {
168         SER = dat_neg2>>7;
169         SCLK = 0;
170         SCLK = 1;
171         dat_neg2 = dat_neg2<<1;
172     }
173     
174     for(i=0; i<8; i++)
175     {
176         SER = dat_neg1>>7;
177         SCLK = 0;
178         SCLK = 1;
179         dat_neg1 = dat_neg1<<1;
180     }
181     
182     for(i=0; i<8; i++)
183     {
184         SER = dat_pos2>>7;
185         SCLK = 0;
186         SCLK = 1;
187         dat_pos2 = dat_pos2<<1;
188     }
189     
190     for(i=0; i<8; i++)
191     {
192         SER = dat_pos1>>7;
193         SCLK = 0;
194         SCLK = 1;
195         dat_pos1 = dat_pos1<<1;
196     }
197     
198     RCLK = 0;
199     RCLK = 1;
200 }
View Code

 

posted on 2023-04-08 14:50  Ivan2023  阅读(102)  评论(0)    收藏  举报