源码和电路图都在压缩包中,滚动显示最关键的就在于不同8*8点阵块中如何衔接与字模数据如何传入到595芯片当中。
一、点阵测试说明
一、单组点阵原理图
电路采用H1~H16用2个138组成4译16电路驱动,L1~L16用2个74HC595的串并转换驱动
ABCDG 为16行 译码控制信号。
ABCD 为H0~H16的4-16(两个138组成)的译码输入信号。G为两个138译码控制脚,低电平有效。
CLK 为列信号控制的时钟信号
DATA 为串行数据信号
LATCH 为信号锁定,上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。(通常将LATCH置为低电平,)当移位结束后,在LATCH端产生一个正脉冲(5V时,大于几十纳秒就行了。通常都选微秒级),更新显示数据
DATAOUT 为级联时数据串出信号。
IN针定义(从上到下)依次为LATCH、CLK、DATA、G、A、B、C、D
OUT针定义(从上到下)依次为LATCH、CLK、DATAOUT、G、A、B、C、D
级联使用时OUT针和IN针用短路片连接。
二、实验方式:
可单个点阵显示,也通过短路片连接可接联控制。
三、实验接线:
P1.0接D
P1.1接C
P1.2接B
P1.3接A
P1.4接G
P1.5接DATA
P1.6接CLK
P1.7接LATCH
四、实验程序
程序1 LED3J.C 三字静态显示
程序2 LED3D.C 二屏(左边二屏)六字左移显示。(如三屏接联,最右屏同最左屏的字,且字向下偏移一个位)
调试时,按调试按钮传送结束后,在反汇编窗口点击0000起始地址,让程序从0000开始运行。或直接在键盘上运行起始地址为0000。
字模设置选项
仿真图:
单片机源程序如下:
- #include "main.h"
- #include <intrins.h>
- //char code STT516[3] _at_ 0x003b;
- #define Display_Num_Word 2 //液晶能显示的汉字个数
- unsigned char Display_Buffer[4];
- unsigned char Display_Swap_Buffer[Display_Num_Word][32]={0}; //显示缓冲区
- bit Shift_Bit = 0;
- bit Flag_Shift = 0;
- #define Shift_Speed 5 //移动速度
- unsigned char Timer0_Count = 0;
- unsigned char temp = 0x80;
- unsigned char Shift_Count = 0;
- unsigned char Display_Word_Count = 0;
- #define Num_Of_Word 6
- unsigned char code Word[Num_Of_Word][32] =
- {
- 0xFE,0xFE,0xFE,0xFE,0xFE,0xE0,0xEF,0xEF,0xEF,0xE0,0xEF,0xFE,0xD7,0xDB,0xBB,0xFF,
- 0xFF,0xFF,0x07,0xFF,0xEF,0x07,0xEF,0xEF,0xEF,0x0F,0xEF,0xEF,0x77,0xBB,0xBB,0xFF,/*"点",0*/
- 0xFF,0x07,0x77,0x68,0x5E,0x6E,0x75,0x70,0x77,0x57,0x68,0x7F,0x7F,0x7F,0x7F,0x7F,
- 0x7F,0x7F,0x7F,0x03,0xFF,0xBF,0xBF,0x03,0xBF,0xBF,0x01,0xBF,0xBF,0xBF,0xBF,0xBF,/*"阵",1*/
- 0xBF,0xD8,0xDB,0x7B,0xBA,0xAA,0xEA,0xDA,0xDA,0xDA,0x3A,0xBE,0xBD,0xBD,0xBB,0xB7,
- 0xFD,0x3D,0xBD,0xAD,0xAD,0xAD,0xAD,0xAD,0xAD,0xAD,0xAD,0xFD,0x7D,0xBD,0xB5,0xFB,/*"测",2*/
- 0xFF,0xBF,0xDF,0xCF,0xD8,0xFF,0x1F,0xD8,0xDE,0xDE,0xDE,0xDE,0xD6,0xC9,0xDF,0xFF,
- 0xDF,0xD7,0xDB,0xDB,0x01,0xDF,0xDF,0x1F,0xDF,0xEF,0xEF,0xF5,0x35,0xF9,0xFD,0xFF,/*"试",3*/
- 0xBF,0xDE,0xCE,0xDE,0xFE,0xFE,0x1D,0xDA,0xDE,0xDE,0xDF,0xDF,0xD7,0xCF,0xDC,0xF3,
- 0xFF,0x0F,0xEF,0xEF,0xEF,0xEF,0xF1,0x07,0xF7,0xF7,0x6F,0x6F,0x9F,0x6F,0xF1,0xFB,/*"设",4*/
- 0xBF,0xDF,0xCF,0xDF,0xFF,0x0C,0xEF,0xEF,0xEF,0xEF,0xEF,0xED,0xEB,0xE7,0xEF,0xFF,
- 0xDF,0xDF,0xDF,0xDF,0xDF,0x01,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,/*"计",5*/
- };
- //************************************************************
- //主函数
- //************************************************************
- void main()
- {
- Init_Timer0();
- Clear_Display();
- while(1)
- {
- Display(Display_Swap_Buffer);
- if(Flag_Shift == 1)
- {
- Flag_Shift = 0;
- Display_Word_Count = Shift_Count/16; //计算当前显示第几个字
- Calc_Shift();
-
- Shift_Count++;
-
- if(Shift_Count == (Num_Of_Word+Display_Num_Word)*16 ) //移动次数
- {
- Shift_Count = 0;
- }
- }
- }
- }
- //****************************************************
- //初始化定时器0
- //****************************************************
- void Init_Timer0()
- {
- TMOD = 0X01; //T0, 工作模式1
- TH0 = (65536 - 50000)/256;
- TL0 = (65536 - 50000)%256;
- TR0 = 1; //开启定时器
- ET0 = 1; //开启定时器中断
- EA = 1; //开启总中断
- }
- //****************************************************
- //中断函数
- //****************************************************
- void Timer0() interrupt 1
- {
- TH0 = (65536 - 50000)/256;
- TL0 = (65536 - 50000)%256;
-
- TF0 = 0;
- Timer0_Count++;
- if(Timer0_Count >= Shift_Speed)
- {
- Timer0_Count = 0;
- Flag_Shift = 1;
- }
- }
- //************************************************************
- //计算移动数据,存在在缓冲器
- //************************************************************
- void Calc_Shift()
- {
- unsigned char i;
- for(i = 0;i < 16;i++)
- {
- if((Display_Swap_Buffer[0][16+i]&0x80) == 0) //每行第一个字节移位
- {
- Display_Swap_Buffer[0][i] = (Display_Swap_Buffer[0][i] << 1)&0xfe; //最低位清零
- }
- else
- {
- Display_Swap_Buffer[0][i] = (Display_Swap_Buffer[0][i] << 1)|0x01; //最低位置一
- }
- if((Display_Swap_Buffer[1][i]&0x80) == 0) //每行第二个字节移位
- {
- Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)&0xfe; //最低位清零
- }
- else
- {
- Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)|0x01; //最低位置一
- }
- if((Display_Swap_Buffer[1][16+i]&0x80) == 0) //每行第三个字节移位
- {
- Display_Swap_Buffer[1][i] = (Display_Swap_Buffer[1][i] << 1)&0xfe; //最低位清零
- }
- else
- {
- Display_Swap_Buffer[1][i] = (Display_Swap_Buffer[1][i] << 1)|0x01; //最低位置一
- }
- if(Shift_Count%16 < 8 && Display_Word_Count < Num_Of_Word)
- {
- Shift_Bit = Word[Display_Word_Count][i]&temp;
- }
- else if(Shift_Count%16 < 16 && Display_Word_Count < Num_Of_Word)
- {
- Shift_Bit = Word[Display_Word_Count][16+i]&temp;
- }
- else
- {
- Shift_Bit = 1; //把字移出缓冲区
- }
- if( Shift_Bit == 0) //后8位移位
- {
- Display_Swap_Buffer[1][16+i] = (Display_Swap_Buffer[1][16+i] << 1)&0xfe; //最低位清零
- }
- else
- {
- Shift_Bit = 1;
- Display_Swap_Buffer[1][16+i] = (Display_Swap_Buffer[1][16+i] << 1)|0x01; //最低位置一
- }
-
- }
- temp = (temp>>1)&0x7f;
- if(temp == 0x00)
- {
- temp = 0x80;
- }
- }
- //************************************************************
- //清空缓冲区
- //************************************************************
- void Clear_Display()
- {
- unsigned char i,j;
- for(j = 0 ; j < Display_Num_Word; j++)
- {
- for(i = 0 ; i < 32 ;i++)
- {
- Display_Swap_Buffer[j][i] = 0xff; //0=显示 1=不显示
- }
- }
- }
- //************************************************************
- //num为字数 dat[][32]为字模的名称
- //*************************************************************
- void Display(unsigned char dat[][32])
- {
- unsigned char i,j;
- for( i = 0 ; i < 16 ; i++ )
- {
- LEDARRAY_G = 1; //更新数据时候关闭显示。等更新完数据,打开138显示行。防止重影。
- Display_Buffer[0] = dat[0][i];
- Display_Buffer[1] = dat[0][i+16];
- Display_Buffer[2] = dat[1][i];
- Display_Buffer[3] = dat[1][i+16];
- Send(Display_Buffer[3]);
- Send(Display_Buffer[2]);
- Send(Display_Buffer[1]);
- Send(Display_Buffer[0]);
- LEDARRAY_LAT = 1; //锁存数据
- _nop_();
-
- LEDARRAY_LAT = 0;
- _nop_();
- Scan_Line(i); //选择第i行
- LEDARRAY_G = 0;
-
- for( j = 0 ; j < 30 ; j++); //延时一段时间,让LED亮起来。
- }
- }
- //****************************************************
- //扫描某一行
- //****************************************************
- void Scan_Line( unsigned char m)
- {
- switch(m)
- {
- case 0:
- LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 0;
- break;
- case 1:
- LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 1;
- break;
- case 2:
- LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 0;
- break;
- case 3:
- LEDARRAY_D = 0;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 1;
- break;
- case 4:
- LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 0;
- break;
- case 5:
- LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 1;
- break;
- case 6:
- LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 0;
- break;
- case 7:
- LEDARRAY_D = 0;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 1;
- break;
- case 8:
- LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 0;
- break;
- case 9:
- LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 0;LEDARRAY_A = 1;
- break;
- case 10:
- LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 0;
- break;
- case 11:
- LEDARRAY_D = 1;LEDARRAY_C = 0;LEDARRAY_B = 1;LEDARRAY_A = 1;
- break;
- case 12:
- LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 0;
- break;
- case 13:
- LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 0;LEDARRAY_A = 1;
- break;
- case 14:
- LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 0;
- break;
- case 15:
- LEDARRAY_D = 1;LEDARRAY_C = 1;LEDARRAY_B = 1;LEDARRAY_A = 1;
- break;
- default : break;
- }
- }
- //****************************************************
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
汉字点阵滚动.zip
(1.13 MB, 下载次数: 58)
|