一、背景
半年前某宝上购得LED点阵驱动板:
模块显示面板由16个8*8点阵屏拼为16x64点阵,主控芯片为STC89C52,行扫描为1个74HC154(4-16译码器),列扫描为8个74HC595(8位串行输入、并行输出的位移缓存器)。板上还有1块flash存储芯片sst29ee020(256k*8,感觉是字库),配合它工作的是74hc573锁存器(隔离sst29ee020输入输出,复用MCU IO);另外还有1个DS1302时钟芯片。
二、源码
- #include <STC89C5xRC.H>
-
- sbit SH_CP = P1^5;
- sbit DS = P2^7;
- sbit ST_CP = P1^6;
-
-
- //PCtoLCD2002
- //
- unsigned char code Table_row[] = {
-
-
- //这个调了好久,现在贴的不知道是不是实际跑的字模了
- //阳码,顺向,逐行式,C51,左右反转
- 0xFE,0xFF,0xFE,0xFF,0xFE,0xC0,0xC0,0xDF,0xDF,0x5F,0xEF,0x6D,0xFD,0xAB,0xFD,0xD7,
- 0xFD,0xF7,0xFA,0xEB,0xFA,0xDB,0xF7,0x5D,0xF7,0x7E,0xEF,0xBF,0xDF,0xDF,0xBF,0xEF,/*"欢",0*/
- 0xFF,0xFF,0xFE,0xFB,0xC3,0x37,0xDB,0xB7,0xDB,0xBF,0xDB,0xBF,0xDB,0xB0,0xDB,0xB7,
- 0xDB,0xB7,0xD2,0xB7,0xEB,0x37,0xFB,0xB7,0xFB,0xF7,0xFB,0xEB,0x80,0x1D,0xFF,0xFF,/*"迎",1*/
- 0xFF,0x7F,0xEF,0x7B,0xEF,0x77,0xF7,0x6F,0xFB,0x6F,0xFF,0x7F,0x80,0x00,0xFD,0xDF,
- 0xFD,0xDF,0xFD,0xDF,0xFD,0xDF,0xBD,0xEF,0xBD,0xEF,0xBD,0xF7,0x83,0xFB,0xFF,0xFC,/*"光",2*/
- 0xFE,0xEF,0xFE,0xEF,0xFE,0xEF,0x80,0x6D,0xFD,0x6D,0xFB,0xAD,0xFB,0xCD,0xFF,0xED,
- 0xC0,0x6D,0xDB,0x6D,0xDB,0x6D,0xDB,0x6D,0xDB,0x6D,0xC0,0x6F,0xDF,0x6F,0xFF,0xEF,/*"临",3*/
-
- };
-
- /*
- void delayms(unsigned int m)
- {
- int i,j;
- for(i=0; i<m; i++)
- for(j=0; j<120; j++);
- }
- */
-
- void HC595(unsigned char dat)
- {
- unsigned char j;
- for(j=0;j<8;j++)
- {
- SH_CP = 0; //为移位准备
- DS = dat & 0x01; //先低位
- dat=dat>>1;
- SH_CP =1; //上升沿,移位
- }
- }
-
-
- void Matrix16x16(unsigned char num)
- {
- unsigned char k,i;
- unsigned int m,n;
- unsigned char Char_num=num*32;
-
- for(m=0;m<Char_num;m++) //为移动预留
- {
- for(n=0;n<16;n++)//控制显示速度,防止闪烁
- {
- for(k=0;k<16;k++) //行扫描
- {
- for(i=0;i<num;i++) //控制第几个字
- {
- HC595(Table_row[(32*i+2*k+1)]); //
- HC595(Table_row[(32*i+2*k+0)]); //
- }
- ST_CP = 0;
- ST_CP = 1; //并行输出
- //P1=k; //P1低4位为74HC154输入,高4位未使用
- P1=16-k; //从左往右显示
- //delayms(2);
- }
- }
- }
- }
-
- void main(){
- while(1){
- Matrix16x16(4);
- }
- }
复制代码
文章内容成文于半年前,先发于个人blog。
听说发文可以得芯愿,换MCU,^-^ 。
|