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 }
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 }
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 */
若是将上述代码,加入如下中,会报错“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 }
数组之前增加关键字 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 }
浙公网安备 33010602011771号