|
源碼和電路圖都在壓縮包中,滾動顯示最關鍵的就在于不同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)
2018-2-3 07:34 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|