|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #define RowA 2
- #define RowB 3
- #define RowC 4
- #define RowD 5
- //业界所采用的ABCD 08驱动模式
- /* 2 ABCD G1 G2 STB CLK 16 1 N N N EN R1 R2 N N 15*/
- int hc138en=6; //EN口
-
- //使用了硬件SPI,以下脚不能更改
- #define R1 11 //数据出 MOSI
- #define CLK 13 //时钟 SCK
- #define STB 10 //595 刷新显示 SS 锁存 STB(LT)为锁存信号,CLK(CK)为时钟信号
- #define DATAIN 12 //数据入,读FLASH时有用 MISO
-
- char yid,h; //YID为移动计数器,H为行段计数器
- int zimuo; //字模计数器
- byte Zdate[10]; //缓存
- byte zzz[] =
- {/*------------------------------------------------------------------------------
- ; 源文件 / 文字 : 吉祥如意
- ; 宽×高(像素): 64×16
- ------------------------------------------------------------------------------*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x08,0x7F,0xFC,0x00,0x00,
- 0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x00,0x00,/*"吉",0*/
- 0x21,0x04,0x10,0x88,0x10,0x50,0xFD,0xFE,0x04,0x20,0x08,0x20,0x11,0xFC,0x38,0x20,
- 0x54,0x20,0x94,0x20,0x13,0xFE,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,/*"祥",1*/
- 0x10,0x00,0x10,0x00,0x18,0x00,0x10,0x7E,0xFE,0x42,0x22,0x42,0x22,0x42,0x22,0x42,
- 0x22,0x42,0x24,0x42,0x14,0x42,0x08,0x42,0x14,0x7E,0x23,0x42,0x42,0x42,0x80,0x00,/*"如",2*/
- 0x01,0x00,0x3F,0xFC,0x08,0x20,0x04,0x40,0xFF,0xFE,0x00,0x00,0x1F,0xF0,0x12,0x10,
- 0x11,0x10,0x1F,0xF0,0x00,0x00,0x29,0x08,0x28,0x84,0x68,0x14,0x07,0xF0,0x00,0x00,/*"意",3*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- };
- void spi_transfer(volatile char data)
- {
- SPDR = data; // Start the transmission
- while (!(SPSR & (1<<SPIF))) // Wait the end of the transmission
- {
- };
- //return SPDR; // return the received byte
- }
-
-
- void hc138sacn(byte r){ //输出行线状态ABCD (A低,D高)
- digitalWrite(RowA,(r & 0x01));
- digitalWrite(RowB,(r & 0x02));
- digitalWrite(RowC,(r & 0x04));
- digitalWrite(RowD,(r & 0x08));
- }
- /**************************************************************************************
- 左移显示数据生成模块:(功能相当于有返回值的函数 )
- ***************************************************************************************/
- char two_onebyteL(char h1,char h2)
- {
- char temp,tempcol; //输出变量;列移动位数变量。
- if(yid<8)
- tempcol=yid;
- else
- tempcol=yid-8;
- temp=(h1<<tempcol)|(byte(h2)>>(8-tempcol)); //左移显示 // 7楼仁兄的解决方案是将h2强制转换成无符号的byte类型
- temp=255-temp;
- return temp; //将显示数据返回显示输出函数。
- }
- /*************************************************************************************
- 左移待显示数据调取函数
- *************************************************************************************/
- void loadoneline_L(void)
- {
- char s; //此处不要用uchar定义s
- for(s=4;s>=0;s--) //s值为屏数加1(16*16为一屏)
- {
- Zdate[2*s]=zzz[zimuo+32*s+2*h];
- Zdate[2*s+1]=zzz[zimuo+1+32*s+2*h]; //左移显示
- }
- }
- /**********************************************************************************
- 左移显示数据输出函数 : 为显示数据生成模块的h1、h2赋值并且输出合成后的新的h1、h2数据
- ***********************************************************************************/
- void sendoneline_L(void)
- {
- char s;char inc;
- if(yid<8)inc=0;else inc=1;
- for(s=0+inc;s<8+inc;s++)
- { //左移显示:单屏s=1+,4屏s=7+,8屏s=15+;
- spi_transfer(two_onebyteL(Zdate[s],Zdate[s+1]));
- }
- }
- int uiAllData = sizeof(zzz)-128; //定义显示字幕数据的长度 2048/32=64
- void setup ()
- {
- pinMode(RowA, OUTPUT);
- pinMode(RowB, OUTPUT);
- pinMode(RowC, OUTPUT);
- pinMode(RowD, OUTPUT); //138片选
- pinMode(hc138en, OUTPUT); //138 使能
- pinMode(R1, OUTPUT);//595 数据
- pinMode(CLK, OUTPUT); //595 时钟
- pinMode(STB, OUTPUT); //595 使能
- pinMode(DATAIN, INPUT); //595 使能
- //digitalWrite(hc138d, HIGH);
- Serial.begin(19200);
- SPCR = (1<<SPE)|(1<<MSTR);
- delay(10);
- }
-
- void loop ()
- {
- char i,d=10;
- yid=0;
- h=0;
- zimuo=0;
- while(1)
- {
- while(yid<16) //数据移位。
- {
- for(i=0;i<d;i++) //移动速度
- {
- for(h=0;h<16;h++)
- {
- loadoneline_L();
- sendoneline_L();
-
- digitalWrite(hc138en, 1); //关闭显示
- digitalWrite(STB, 0); //595刷新
- digitalWrite(STB, 1);
- hc138sacn(h); //换行
- delayMicroseconds(50) ; //节电用,
- digitalWrite(hc138en, 0); //开启显示
- delayMicroseconds(500) ; //刷新频率调,差不多60HZ,1/16间隔
- }
- }
- yid++; //移动一步
- }
- yid=0;
- zimuo=zimuo+32; //后移一个字,
- if(zimuo>= uiAllData ) //定义显示字幕数据的长度 2048/32=64 即显示完64个16*16大小的字符后 重新循环
- zimuo=0;
- }
- }
复制代码
|
|