最近用6块8*8全彩点阵做了一个16*24的全彩屏,每个点可以显示7种颜色,这个可以实现一些好玩的功能,比如俄罗斯方块。
一、原理
1. 点阵屏的16行使用2个74hc138组成4-16译码,之后用三极管9012驱动,用100的限流电阻
2. 点阵屏的24列使用9个74hc595驱动,第一个595驱动第一列8*8点阵的红led,第二个595驱动第一列8*8点阵的绿led,第三个595驱动第一列8*8点阵的蓝led,以此类推,使用100的限流电阻
3. GND与VCC之间接入104瓷片电容与470uF 16V电解电容,增加抗干扰能力
4. 使用74hc245驱动595,提高驱动能力,这样单片机的IO口通过245就可以一次驱动一行的9个595了
5. 点阵的行用高电位,列用低电位
二、接口
1. A、B、C、D为行选线
2. G为屏使能线,接在74hc138上
3. CLK、LATCH、DATA为595驱动线,分别为输入触发、输出触发、串行数据输入
4. GND、VCC
三、实物图
四、代码
1. 头文件
#define BLOCK_ROW_COUNT 2 #define BLOCK_COL_COUNT 3 #define PIXEL_ROW_COUNT (BLOCK_ROW_COUNT*8) #define PIXEL_COL_COUNT (BLOCK_COL_COUNT*8) #define YELLOW (RED|GREEN) #define PURPLE (RED|BLUE) #define LBLUE (GREEN|BLUE) #define WHITE (RED|GREEN|BLUE) void Lcd_SetPixel( unsigned char x, unsigned char y, unsigned char color); unsigned char Lcd_GetPixel( unsigned char x, unsigned char y);
2. 源文件
#define COLOR_BASE_COUNT 3 #define CACHE_DATA_SIZE (PIXEL_ROW_COUNT*BLOCK_COL_COUNT*COLOR_BASE_COUNT) static unsigned char xdata cache_data[CACHE_DATA_SIZE]; static unsigned char xdata cur_row = 0; static unsigned char xdata cur_block = 0; for( i = 0; i < CACHE_DATA_SIZE; i ++) for( i = BLOCK_COL_COUNT * COLOR_BASE_COUNT - 1; i >= 0; i --) unsigned char buff = cache_data[BLOCK_COL_COUNT * COLOR_BASE_COUNT * cur_row + i]; if( i / COLOR_BASE_COUNT != cur_block) if(( buff & 0x01) == 0x01) B_Port = ( cur_row >> 1) & 0x01; C_Port = ( cur_row >> 2) & 0x01; D_Port = ( cur_row >> 3) & 0x01; if( cur_block >= BLOCK_COL_COUNT) if( cur_row >= PIXEL_ROW_COUNT) void Lcd_SetPixel( unsigned char x, unsigned char y, unsigned char color) if( x >= PIXEL_COL_COUNT || y >= PIXEL_ROW_COUNT) offset = BLOCK_COL_COUNT * COLOR_BASE_COUNT * y + x / 8 * COLOR_BASE_COUNT; mask = 0x01 << ( 7 - x % 8); cache_data[offset] |= mask; cache_data[offset] &= ~mask; cache_data[offset + 1] |= mask; cache_data[offset + 1] &= ~mask; cache_data[offset + 2] |= mask; cache_data[offset + 2] &= ~mask; unsigned char Lcd_GetPixel( unsigned char x, unsigned char y) if( x >= PIXEL_COL_COUNT || y >= PIXEL_ROW_COUNT) offset = BLOCK_COL_COUNT * COLOR_BASE_COUNT * y + x / 8 * COLOR_BASE_COUNT; mask = 0x01 << ( 7 - x % 8); if(( cache_data[offset] & mask) == 0x00) if(( cache_data[offset + 1] & mask) == 0x00) if(( cache_data[offset + 2] & mask) == 0x00)
五、测试代码
unsigned char colors[7] = { RED, GREEN, BLUE, YELLOW, PURPLE, LBLUE, WHITE}; for( i = 0; i < 16 * 24; i ++) Lcd_SetPixel( i % 24, i / 24, colors[index++]); void disp() interrupt 1 using 3
请移步www.yintju03.com/blog
|