標題: 16*16的點陣 我想讓它閃爍隔一秒顯示一下,用的是4個595和2個138驅動 [打印本頁]
作者: 51hei小林 時間: 2016-10-20 18:49
標題: 16*16的點陣 我想讓它閃爍隔一秒顯示一下,用的是4個595和2個138驅動
各位大神些,本人小白一個,請教一個問題。我買了一塊16*16的點陣,用的是4個595和2個138驅動。現在的程序能正確顯示圖形。但我想讓它閃爍隔一秒顯示一下。要怎么才能閃爍呢?
- /*-----------------------------------------------
- 名稱:595控制4漢字點陣屏
- 內容:屏+5V、GND連接電源5V
- P0.0-P0.3分別連接A、B、C、D,用于控制16行,通過2路HC138控制
- SCK時鐘連接P2.5
- LATCH鎖存連接P2.6
- R1紅色數據信號連接至P0.4
- G1綠色數據信號連接至P2.4,如果使用單紅色屏此信號無需連接
- OE使能端一般接GND,可以用IO引腳PWM控制亮度
- 或者使用此引腳控制拖尾現象。
- 現象:使用普通速度51系列單片機。屏幕出現笑臉圖標
- ------------------------------------------------*/
- #include<reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit Key1=P1^0; //定義單片機P1口的第0位(即P1.0)為輸入
- sbit Key2=P1^1; //定義單片機P1口的第0位(即P1.1)為輸入
- sbit Key3=P1^2; //定義單片機P1口的第0位(即P1.2)為輸入
- sbit T_STR = P2^6; //鎖存引腳,屏上標識位STR
- sbit R1 = P0^4; //數據引腳,屏上標識R1
- sbit G1 = P2^4; //數據引腳,屏上標識G1
- sbit T_CLK = P2^5; //時鐘引腳,屏上標識位CLK
- sbit OE = P2^1; //使能引腳,屏上標識EN/OE
- unsigned char tab[8];
- unsigned char DIS[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//行數據
- /*-----------------------------------------------
- 16x16漢字取模數據
- ------------------------------------------------*/
- unsigned char code hztest[][32]= //二維數組,目的是減少運算,可以用最基本的一維數組,每個漢字有32個字節(jié)數據
- {
- /*-- 調入了一幅圖像:K:\C51\漢字 取模程序\前行16.bmp --*/
- /*-- 寬度x高度=16x16 --*/
- 0x80,0x01,0xC0,0x03,0xE0,0x07,0xF0,0x0F,0xF8,0x1F,0xFC,0x3F,0xDE,0x7B,0xCF,0xF3,
- 0xC7,0xE3,0xC3,0xC3,0xC1,0x83,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,
- /*-- 調入了一幅圖像:K:\C51\漢字 取模程序\左轉16.bmp --*/
- /*-- 寬度x高度=16x16 --*/
- 0x80,0x07,0xC0,0x03,0xE0,0x01,0xF0,0x00,0x78,0x00,0x3C,0x00,0xFE,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFE,0xFF,0x3C,0x00,0x78,0x00,0xF0,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,
- /*-- 調入了一幅圖像:K:\C51\漢字 取模程序\右轉16.bmp --*/
- /*-- 寬度x高度=16x16 --*/
- 0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0F,0x00,0x1E,0x00,0x3C,0xFF,0x7F,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0x7F,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x80,0x07,0xC0,0x03,0xE0,0x01,
- };
- /*-----------------------------------------------
- 向595寫入一個字節(jié) 單紅色
- ------------------------------------------------*/
- void InputByte( uchar DataR1) //寫一個字節(jié)
- {
- uchar i;
- for(i=8; i>0; i--)
- {
- R1 = !(DataR1&0x01);
- T_CLK = 0;
- T_CLK = 1;
- DataR1 = DataR1 >> 1;
- }
- }
- /*-----------------------------------------------
- 向595寫入兩個字節(jié) 雙色
- ------------------------------------------------*/
- void Input2Byte( uchar DataR1,uchar DataG1) //寫一個字節(jié)
- {
- uchar i;
- for(i=8; i>0; i--)
- {
- R1 = !(DataR1&0x01);
- G1 = !(DataG1&0x01);
- T_CLK = 0;
- T_CLK = 1;
- DataR1 = DataR1 >> 1;
- DataG1 = DataG1 >> 1;
- }
- }
- void Write_A(uint k) //寫一個字符
- {
- static uchar count,j;
- uchar i;
- T_STR=0; //鎖存釋放
-
- for(j=0;j<1;j++) //取每個漢字的前2個字節(jié),數據傳輸完成后鎖存輸出即可 j表示漢字個數,如果是3個漢字屏就可以修改成3
- {
- InputByte(hztest[j][k]);
- InputByte(hztest[j][k+1]);
- }
- OE=1; //暫時關閉屏幕,防止出現鬼影,如果沒有使用該引腳控制則會出現拖影現象。
- T_STR=1; //鎖存有效,此時一行的數據顯示到屏上
- P0=DIS[15-count]|0xf0;//用P0口的前4位控制16行,屏內部通過4-16譯碼器工作,循環(huán)掃描其他15行
- OE=0;//使能
- count++;
- i+=2; //累加調用下一行數據
- if(count==16)
- count=0;
- if(i==32)
- i=0;
- }
- //--------------------------------------------
- /*n毫秒的延時程序*/
- void Delay_xms(uint x)
- {
- uint i,j;
- for(i=0;i<x;i++)
- for(j=0;j<112;j++);
- }
- /*-----------------------------------------------
- 主程序
- ------------------------------------------------*/
- main()
- {
-
- while(1)
- {
- Write_A(1);
- Delay_xms(2000);//這名出錯,一加上就不能正確顯示;
- }
- }
復制代碼
作者: zl2168 時間: 2016-10-20 21:42
本帖最后由 zl2168 于 2016-10-21 09:09 編輯
實例66 LED 16×16點陣掃描顯示漢字
⒈ 電路設計
16×16點陣顯示電路.jpg (108.44 KB, 下載次數: 84)
下載附件
2016-10-20 21:45 上傳
該案例技術要求與你的完全相同,且比你的更簡潔有效。
595與164同屬串入并出移位寄存器,區(qū)別是595有輸出控制,移位完畢再輸出;164是邊移邊輸出。因此用2片164有16機器周期的顯示混亂期,而595沒有。不過對于顯示來講,人眼根本不能察覺。若晶振為12MHz,16機器周期只有16us,人眼能察覺的至少20ms以上,20ms=20000us>>16us。而且,595輸出控制要多花費一個I/O引腳。你要用4片595?怎么用?
154可頂2片138。154是4-16譯碼器,138是3-8譯碼器,控制列掃描一片154就夠了。
至于秒閃爍,只需在每次顯示0.5s后,164置CLR=0或595置OE=0,停顯示0.5s,就行。
⒉ 漢字編碼
⑴ 漢字編碼概述 …
⑵ 漢字點陣顯示代碼 …
⑶ 漢字點陣取模軟件 …
⒊ 程序設計 …
⒋ Keil調試 …
⒌ Proteus仿真
先Proteus仿真一下,確認有效。
實例66a LED 16×16點陣漢字顯示.rar
(48.21 KB, 下載次數: 17)
2016-10-20 21:53 上傳
點擊文件名下載附件
LED 16×16點陣顯示漢字.jpg (76.57 KB, 下載次數: 104)
下載附件
2016-10-20 21:53 上傳
16×16點陣顯示“單片機”.jpg (67.06 KB, 下載次數: 95)
下載附件
2016-10-20 21:53 上傳
以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1
書中電路和程序設計有詳細說明,程序語句條條有注解
作者: yzwzfyz 時間: 2016-10-20 22:06
做一個標記位(如:B_FLASH),
做一個0.5秒定時器(可利用中斷,每0.5秒置標記,如:B_05S)
當0.5秒到時(如:B_05S=1時),將B_FLASH求反(B_FLASH=~B_FLASH,當然記得復位B_05S)。
在你現有的輸出數據動作前,增加“插入”一個動作,就是將輸出數據與B_FLASH“與”一下再輸出。
作者: yzwzfyz 時間: 2016-10-20 22:08
凡是需要閃的數據位,就與B_FLASH“與”一下再送出,不需要閃的,不與。
作者: zl2168 時間: 2016-10-21 09:20
實例66 LED 16×16點陣掃描顯示漢字
該案例技術要求與你的完全相同,且比你的更簡潔有效。
595與164同屬串入并出移位寄存器,區(qū)別是595有輸出控制,移位完畢再輸出;164是邊移邊輸出。因此用2片164有16機器周期的顯示混亂期,而595沒有。不過對于顯示來講,人眼根本不能察覺。若晶振為12MHz,16機器周期只有16us,人眼能察覺的至少20ms以上,20ms=20000us>>16us。而且,595輸出控制要多花費一個I/O引腳。你要用4片595?怎么用?
154可頂2片138。154是4-16譯碼器,138是3-8譯碼器,控制列掃描一片154就夠了。
至于秒閃爍,只需在每次顯示0.5s后,164置CLR=0或595置OE=0,停顯示0.5s,就行。
16×16點陣顯示電路.jpg (108.44 KB, 下載次數: 94)
下載附件
2016-10-21 09:21 上傳
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |