欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5226|回復: 4
收起左側

請教關于LED8*8點陣的問題,請大神們幫幫忙!

[復制鏈接]
ID:126834 發表于 2016-6-15 21:53 | 顯示全部樓層 |閱讀模式
就是在這個程序上添加獨立按鍵控制LED點陣的不同顯示(例如靜止、閃爍、平移)
就是可以讓它被獨立按鍵控制,我這個程序是向左平移顯示0~9,怎么才能讓按鍵控制它讓它靜止

程序如下:


#include<reg52.h>
void delay();
unsigned char code digittab[88]={ //行選通
0x00,0x00,0x00,0x00,//緩沖下,0從右端出來啦!!!
0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,//0
0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00,/*1*/
0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00,/*2*/
0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00,/*3*/
0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,/*4*/
0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00,/*5*/
0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00,/*6*/
0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00,/*7*/
0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00,/*8*/
0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00,/*9*/
0x00,0x00,0x00,0x00//讓9繼續滾動完
};
unsigned char code tab[]={0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe,}; //列選通
void main()
{
unsigned char i=1,x=0,j=0,tcount=0;
unsigned int ledroll[8];
for(j=0;j<8;j++)
ledroll[j]=digittab[j];
while(1)
{
for(x=0;x<8;x++)//掃描顯示出當前字樣
{
P1=tab[x];
P0=ledroll[x];
delay();//暫留一下下
}
/*將行選通后移一個*/
if(++tcount>30)//掃描30次
{
tcount=0;
for(j=0;j<8;j++)
ledroll[j]=digittab[j+i];//此處重點
if(++i>=80)//88減8當然等于80啦
i=0;
}
}
}
void delay()//制造視覺暫留效應
{
unsigned int x,y;
for(x=2;x>0;x--)
for(y=123;y>0;y--);
}


回復

使用道具 舉報

ID:123289 發表于 2016-6-16 00:54 | 顯示全部樓層
設置8個顯示緩沖單元,作為8個LED的顯示對應位,每次從其中取字節顯示.設為X0-X7.(現行方法)
再設置8個顯示緩沖備用單元,Y0-Y7.(需要增加)
X0-X7參與動態顯示
Y0-Y7不參與動態顯示
當按鍵要求動態顯示時,顯示取自X0-X7(就是你現在使用的方法)
當按鍵要求靜止顯示時,將X0-X7的值(靜止時顯示的值)送到Y0-Y7,顯示取自Y0-Y7,而Y0-Y7是不變化的,就實現靜止了.
回復

使用道具 舉報

ID:123289 發表于 2016-6-16 19:56 | 顯示全部樓層
初學者:總是把數據(現場處理過的),拿去直接顯示,就是不好的做法,機會性很差.
正確的做法是:把數據(現場處理過的),先送到顯示緩沖區(如XS1,XS2...),而后再從顯示緩沖區取出數據去顯示.
這樣顯示的機動性就強了,要怎么做就怎么做?
對于你來說.只是修改XS1,或XSn中的數據而矣.
而XS1,或XSn,只是幾個字節的內存而矣,隨便定義一下即可.
比如,XS1放的是動態數據(隨顯示內容更改變動),而XS2,只是在需要的時候,從XS1中復制一下,那么:
當你將XS1送去顯示時,顯示的內容就是不斷變化的(如時間)
當你將XS2送去顯示時,顯示的內容就是不變的(如永遠是"13:57",因為你在13:57將XS1復制到了XS2中,而XS2已后就不變了)
所以你只要選擇從哪個緩沖區取數據顯示,就會得到不同的顯示效果.
回復

使用道具 舉報

ID:123289 發表于 2016-6-16 20:32 | 顯示全部樓層
本帖最后由 yzwzfyz 于 2016-6-16 20:35 編輯

LED各個位閃爍的方法:
1、做一個標記S03,S03每0.3秒求反一次。(在時間中斷中實現,你可以不用0.3秒,改用其它值)
2、用一個字節BX其8個位叫:BX7-BX0(其中的一個叫BXN),分別對應指出哪個LED位正在閃爍。
   例如當BX=10000000(即BX7=1,BX6-0=0)表示只有LED7閃動顯示,其它不閃。
3、定義一個字節ID,指示顯示哪一個LED,每次時間中斷將ID+1,且ID=0-7。比如ID=4,則顯示LED4,其它的不顯示。
4、定義8個字節RXS7-RXS0,用于存放LED的顯示內容(當然需要你事先做好譯碼工作)。
5、每次中斷只顯示的一個LED(先關全部,再顯示一個),由顯示位由ID指出。
6、是否將RXSN(RXS7-RXS0中的一個)送到LED進行顯示,由下列計算決定:BXS=/BXN+BXN*S03
   當BXS=1時,表示顯示,則將RXSN送至LED顯示;當BXS=0時,則將不顯示(實際是將黑字送到LED,能常是FFH或00H)。
例如:ID=2,RXS2=“3”(譯碼后的3),BX2=1(閃動),S03=0。則:BXS=/BX2+BX2*S03=/1+1*0=0,所以不顯示,將FFH送至LED2(無顯)。
         如果送“_”則形成“_”與“3”互閃。
例如:ID=2,RXS2=“3”(譯碼后的3),BX2=1(閃動),S03=1。則:BXS=/BX2+BX2*S03=/1+1*1=1,所以顯示,將“3”送至LED2。
例如:ID=2,RXS2=“3”(譯碼后的3),BX2=0(不閃動),S03=x。則:BXS=/BX2+BX2*S03=/0+1*S03=1,所以顯示,將“3”送至LED2。

如此閃動就操作簡單了:需要哪位閃動,就將哪位對應的BXn置1,即可。不閃就清0。
回復

使用道具 舉報

ID:123289 發表于 2016-6-16 20:43 | 顯示全部樓層
LED移位的方式:
繼承上面。
假設每秒右移一次,8秒后移完變黑,黑顯示值為“FFH”。
則每秒做一個事,即可達成目的:
"FFH"→RXS7→RXS6→RXS5→RXS4→RXS3→RXS2→RXS1→RXS0。
當然應先做RXS1→RXS0,最后做"FFH"→RXS7。
如是移完后顯示“--------”,則:
"-"→RXS7→RXS6→RXS5→RXS4→RXS3→RXS2→RXS1→RXS0。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表