喜欢研究点阵的朋友可以看下
DIY 16*64双色点阵,采用3.75MM的双色点阵模块设计,模块与模块的距离合适,间隔不大,不会影响显示效果,PCB做工好,长303MM,宽75MM。 提供多种学习程序,足够玩转16*64双色点阵,从初级到中级到高级程序设计学习。从设计到整理完资料,几个人花了一个多月的时间,认真做好教程,绝非网上乱抄袭,都是经过我们测试好,注释好以及说明好接口让每一位爱好者都能轻松学习控制点阵,从中学到知识。
整套材料有: 下面介绍制作过程中的顺序以及常见问题分析: 焊接顺序 一.先焊接PCB背面的输入 输出双列8P排针,不然焊了点阵模块,排针就不好焊接了。背面的1K*4电阻4个无需焊接。如果需要上螺丝也在此时放螺丝。 二.然后放置8*8双色点阵模块,如下图这样放置,有字的朝下,或者看中间的缺口,突出的朝下。这模块不是很容易放置,注意每个管脚都不要弯曲,且管脚的距离要合适,这样放置起来不会这么吃力。 三.焊接PCB正面的芯片了,这个比较容易,虽然是贴片的,但是管脚间距都比较大,容易焊接,初学者都不必担心,另外板上的电容也不需要焊接。焊接上去就是电源滤波 芯片工作稳定一点。芯片的第一脚注意就可以了,芯片上有个点的就是第一个脚,焊盘上也是如此,焊接时看清楚,芯片都朝一个方向,比较容易看出。 四.东西都焊接好后,检查下芯片有无虚焊,点阵管脚有无虚焊,这个错误很容易犯。也可用测试程序看出来。PCB上的元件名称都标的非常清楚,很容易对号入座。 常见问题分析 1.焊接完成后,与控制卡连接,或者用自己的单片机实验板,连接方法见程序说明。每个程序都有接口说明,方便大家学习测试用。 2.如果发现哪行不亮 或者列 不亮 一般是芯片虚焊,芯片焊接正常一般不会有问题。 恭喜制作成功后,好好玩转提供的源程序吧,里面的程序注视比较多,我们花了很多心血去整理调试加注视的,相信对你学习控制点阵有帮助,如果有能力整理出来可以做一个商业化的程序了。 最后祝大家制作成功,享受DIY带来的乐趣。
点阵屏的单片机源程序如下:
- /***************************************************************
- 16*64 双色点阵 移动显示时间+静态切换时间 程序
- /***************************************************************
- 如果有控制卡,下载此程序插上排线即可测试
- 如果没有控制卡,自己根据下面的接口用杜邦线与点阵连接即可测试
- 单片机:STC12C5A32S2 或者其他12系列型号都可以
- 晶振18.432M
- 功能简介:上电显示“精品制”
- 然后切换显示时间 星期 月日 年 再移动显示时间信息
- 4个按键 分别进行调时设置
- 程序用中断扫描法 驱动点阵 程序参考价值较好!
- /*
- 点阵屏管脚定义
- SHCP GND
- STCP GND
- R1 GND
- G1 GND
- VCC GND
- A GND
- B GND
- C D
- */
- /*
- 控制卡
- P0.0~P0.3 A B C D
- P16 SCK
- P17 STR
- R1 P04
- G1 P05
- R2 P06
- G2 P07
- ********************************************************/
- #include "Type.H"
- #define KG 0 //定义空格数
- #define RI 10 //定义日数
- #define JI 25 //定义节数
- #define GT 163 //定! 数
- #define XI 109 //定★ 数
- /*******键盘***********************************************************************/
- sbit KEY1 = P2^0;
- sbit KEY2 = P2^1;
- sbit KEY3 = P2^2;
- sbit KEY4 = P2^3;
- sbit ADCIO =P1^5; //AD
- /*************************************************************************************/
- #define H_PORT P0 //行138信号 scan
- sbit CK =P1^6; //时钟OUT
- sbit STR =P1^7; //锁存上升沿输出锁存
- sbit R1 =P0^4; //屏红数据
- sbit G1 =P0^5; //屏绿数据
- sbit OE =P1^0; //全屏使能
- sbit IA =P0^0; //行控制线A
- sbit IB =P0^1; //行控制线B
- sbit IC =P0^2; //行控制线C
- sbit ID =P0^3; //行控制线D
- /*********************************************************************************/
- #define scan0 {IA=0;IB=0;IC=0;ID=0;}
- #define scan1 {IA=1;IB=0;IC=0;ID=0;}
- #define scan2 {IA=0;IB=1;IC=0;ID=0;}
- #define scan3 {IA=1;IB=1;IC=0;ID=0;}
- #define scan4 {IA=0;IB=0;IC=1;ID=0;}
- #define scan5 {IA=1;IB=0;IC=1;ID=0;}
- #define scan6 {IA=0;IB=1;IC=1;ID=0;}
- #define scan7 {IA=1;IB=1;IC=1;ID=0;}
- #define scan8 {IA=0;IB=0;IC=0;ID=1;}
- #define scan9 {IA=1;IB=0;IC=0;ID=1;}
- #define scan10 {IA=0;IB=1;IC=0;ID=1;}
- #define scan11 {IA=1;IB=1;IC=0;ID=1;}
- #define scan12 {IA=0;IB=0;IC=1;ID=1;}
- #define scan13 {IA=1;IB=0;IC=1;ID=1;}
- #define scan14 {IA=0;IB=1;IC=1;ID=1;}
- #define scan15 {IA=1;IB=1;IC=1;ID=1;}
- /*定义接口****************************************************************************/
- #define HC595_LOCK_H {STR =1;}
- #define HC595_LOCK_L {STR =0;}
- #define HC595_CLK_H {CK =1;}
- #define HC595_CLK_L {CK =0;}
- #define LS138_A_H {IA =1;}
- #define LS138_A_L {IA =0;}
- #define LS138_B_H {IB =1;}
- #define LS138_B_L {IB =0;}
- #define LS138_C_H {IC =1;}
- #define LS138_C_L {IC =0;}
- #define LS138_D_H {ID =1;}
- #define LS138_D_L {ID =0;}
- #define LS138_OE_H {OE =1;}
- #define LS138_OE_L {OE =0;}
- #define HC595_G_H {G1 =1;}
- #define HC595_G_L {G1 =0;}
- #define HC595_R_H {R1 =1;}
- #define HC595_R_L {R1 =0;}
- #define FESTIVAL_MAX 69 //定义阳历节日数(0----68)
- uchar disp_mode=0xFF;
- /************************************************************
- //DS1302时钟定义全局变量
- /**********公历年,月,日,星期,小时,分钟,秒********************************/
- uchar xdata yy, mo, dd, week, hh, mm, ss;
- /*************农历年, 月, 日,*************************************/
- uchar xdata year_moon,month_moon,day_moon;
- /*************************************************************************************/
- /*涵数声明****************************************************************************/
- void LEDinit(); /*************************************清屏*/
- void DELAY_US(int num); /*************************************延时函数*/
- void Beep_key(void); /*************************************喇叭函数*/
- void DS1302_TimeStop(bit flag); /*************************************喇叭函数*/
- void PWM_LIGHT(uint p); /*************************************亮度控制*/
- void intmcu( ); /*************************************中断和定时器初始化*/
- //void Lintmcu(void); /*************************************广告一*/
- //void Lintmcu2(void); /*************************************广告一*/
- void LED16X64_write(uchar *str,uchar yanse,bit color);/*******************直写汉字*/
- void LED_rectangle_erasure(uchar x1,uchar y1,uchar x2,uchar y2,uchar model);/*搽除距形*/
- void Conver_week(void); /***************************************星计算*/
- //void Conversion(void); /******************************************历计算*/
- BYTE ManageButton(BYTE Vale); /**************************************按键处理*/
- uchar xdata LED_RAM[LED_byte]; /**************************************显示缓冲区*/
- //*********************************************************************************
- INxdata naozhongtime; //闹钟记时
- Uxdata MOVingDAT[]= {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,12,12,12}; //(游动的字)时段设置
- Uxdata ShowDAT[6]; //固定显示
- //Uxdata SHENGRI_DATA[18]; //六组生日数据
- Uxdata shengRi; //生日
- //***************************************
- uint xdata HalfCount; //半秒记数
- uint xdata b; //闪烁控制
- uint xdata Light; //亮度
- uchar disrow=0 ; //当前扫描行
- uchar e; //操作变量
- uchar ADJ; //按键变量
- uchar switc; //画面切换变量
- uchar windw; //显示允许变量
- uchar flow; //边框流动变量
- uchar menu; //当前菜单0自动1调年月日2调时分秒星期
- uchar LED_X,LED_Y; //LED横竖坐标变量(用于颠倒显示)
- uchar Menmu; //显示控制
- //***************************************
- BIT LEDup_dow; //LED颠倒显示标记1正显示0倒显示
- BIT twinkle; //调整闪烁标记
- BIT Run_flay; //润年标记
- BIT IR_OK=0; //红外线接收标记
- BIT Set_bit=0; //设置时间标记
- BIT GUn_bit=0; //滚动标记
- BIT CKTIME_1=0; //校时标记
- BIT jieqi_bit=0; //有无节气标记
- BIT NO_flow; // 取消边框
- bit stop_bit=0; // (流动停止标志)
- /**********自定义头文件*****************************/
- #include "LED_drive.h" //加载LED扫描驱动
- #include "ASCII.h" //加载自定义字模
- #include "DS1302.h" //加载DS1302驱动
- //#include "DHT11.h" //温湿度传感器
- //#include "nongli.h" //加载农历计算程序
- #include "LED_display.h" //加载显示控制程序
- #include "NEC+RC5_IR.h" //遥控头文件(HT6621或TC9012)
- #include "key_adjust.h" //加载按键输入调节程序
- //***********************************************************************
- void write_sec(void)
- {
- uchar aa;
- read_clockS();//读出DS1302所有时间数据
- if((Menmu>= 0)&&(Menmu<= 50))
- switc=0; //0-50显示//年月
- if((Menmu>= 50)&&(Menmu<= 60))
- switc=1; //50-60显示月日
- if((Menmu>= 60)&&(Menmu<= 70))
- switc=2; //60-70显示时分秒
- if((Menmu>= 70)&&(Menmu<= 100))
- switc=3; //70-80显示星期
- // if((Menmu>= 80)&&(Menmu<= 90))
- // switc=4; //40-59显示农历
- // if((Menmu>= 90)&&(Menmu<=100))
- // switc=5; //40-59显示生宵
- // if((Menmu>=110)&&(Menmu<=120))
- // switc=6; //40-59显示温度
- // if((Menmu>=120)&&(Menmu<=130))
- // switc=7; //40-59显示湿度
- // if((Menmu>=130)&&(Menmu<=140))
- // switc=8; //40-59显示生日滚动
- // if((Menmu>=140)&&(Menmu<=160))
- // switc=9; //40-59显示//温度
- if((aa!=ss)&&(switc==0))//在时分秒星期界面时每秒显示刷新一次秒值
- {
- aa=ss;
- // if(LEDup_dow) //***************************正向显示
- // {
- LED_8X16_write(17,16,ss/10+48,Red,1);//刷新秒十位显示
- LED_8X16_write( 9,16,ss%10+48,Red,1);//刷新秒个位显示
- LED_write_english_string(47,16,":" ,Red,Noml);//写8X16字符冒号
- LED_write_english_string(24,16,":", Red,Noml);//写8X16字符冒号
- // }
- // else
- // {
- // LED_8X16_write(47,1,ss/10+48,Orgen,1);//刷新秒十位显示
- // LED_8X16_write(55,1,ss%10+48,Orgen,1);//刷新秒个位显示
- // }
- }
- if((ss=59)&&(switc==0))//在时分秒星期界面时每秒显示刷新一次秒值
- {
- // if(LEDup_dow)
- //{
- LED_8X16_write(40,16,mm/10+48, Red,Noml);//写8X16字符分钟十位
- LED_8X16_write(32,16,mm%10+48, Red,Noml);//写8X16字符分钟个位
- LED_8X16_write(63,16,hh/10+48, Red,Noml);//写8X16字符小时十位
- LED_8X16_write(55,16,hh%10+48, Red,Noml);//写8X16字符小时个位
- // }
- // else
- // {
- // LED_8X16_write(24,1,mm/10+48, Green,Noml);//写8X16字符分钟十位
- // LED_8X16_write(32,1,mm%10+48, Green,Noml);//写8X16字符分钟个位
- // LED_8X16_write(1, 1,hh/10+48, Red,Noml);//写8X16字符小时十位
- // LED_8X16_write(9, 1,hh%10+48, Red,Noml);//写8X16字符小时个位
- // }
- }
- }
- /*********************************************************************************************
- 函数名:intmcu()
- 调 用:定时和外中断初始化涵数
- 参 数:无
- 返回值:无
- 结 果:
- 备 注:
- /**********************************************************************************************/
- void intmcu()
- {
- TH1=TH; //16位计数寄存器T1高8位定时器T1初值
- TL1=TL; //16位计数寄存器T1低8位定时器T1初值
- //**************************************
- //IP-x x pt2 ps pt1 px1 pt0 px0*/
- IP =B(00000011); //外中断0优先用于红外遥控
- //**************************************
- //TCON-TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0*/
- TCON=B(01010001);//IT0下降沿触发INT0.(IT0=0为低电平触发)TR1扫描点阵
- //**************************************
- //TMOD-GATE1 C/T M1 M0 GATE0 C/T M1 M0
- TMOD=B(00010010);//定时器01模式1(16位)
- //**************************************
- //IE-EA X ET2 ES ET1 EX1 ET0 EX0
- IE =B(10001011); //总中断定时中断01和外中断0
- //**************************************
- }
- void Play_show(void) {
- switch(switc) {
- case 0:if(windw==0)four_min_sec ();windw=1;break;//时分秒
- case 1:if(windw==1)year_month ();windw=2;break;//年月
- case 2:if(windw==2)month_day ();windw=3;break;//月日
- case 3:if(windw==3){LEDinit ();NYRLoad();Hz_LeftDispla(0);}windw=0;break; //汉字左移动程序w//星期
- // case 4:if(windw==4)nongli_display();windw=5;break;//农历
- }
- write_sec ();//----------------------------------显示切换和秒更新
- //flow_frame();//----------------------------------流水边框
- }
- void Play_INT(void) {
- LED_rectangle_erasure(1,1,64,16,0);//空白填充矩形框
- intmcu ();//初始化单片机中断和定时器中断初始化
- Light=BCD2DEC(read_clock(10,TempCH_NumLIGHT))*13;
- if(Light<80)
- write_1302clock(TempCH_NumLIGHT,15);
- Light=BCD2DEC(read_clock(10,TempCH_NumLIGHT))*13;
- typewrite ();//打字效果"精品制作“
- //任意按键跳过LOGO进入频谱=========================
- /*-----频谱显示--------*/
- // NYRLoad (); //汉字加载今天是2012年01月08日星期三
- //Hz_LeftDispla(1); //汉字左移动程序
- //Picture16X64(Pic64X16Y3IN); //--------------------------图片
-
- LEDinit ();//***************************************内存清屏
- }
- /**********************************************************************************************/
- void main(void)
- {
- DS1302_Initial ();//1302初始化
- //Read_temperature();//读温度
- read_clockS ();//读1302时间
- Beep_set ();//测试喇叭
- Beep_key ();//测试喇叭
- intmcu();
- LEDinit ();//开中断前先清屏防止乱显
- Play_INT ();//初始化数据
- //Lintmcu(); Lintmcu2();
- while(1)
- {
- TimeCHck (); //--------------------------------时间补偿
- KEY_Process (); //--------------------------------按键操作
- KEY_Manage (); //--------------------------------按键执行
- if(menu==0)
- Play_show();
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码 包含以下源码与资料:
16X64点阵屏与控制卡原理图
PC2002取模软件
中级--16x64点阵万年历c
中级--点阵多种移动模式
初级--汇编 点阵16X(16-32-64-128-256)asm
初级--静态显示程序
测试--左移测试程序
测试--逐行点亮测试
高级--16分频与64分频16X64双色点阵频谱程序
高级--点阵上位机软件与下位机程序
高级--点阵多模式显示时间程序
高级-移动显示时间+静态切换显示时间
16X64双色点阵制作说明V1.0.doc
芯片资料
所有资料51hei提供下载:
16X64点阵资料.rar
(7.95 MB, 下载次数: 687)
|