❶ 51單片機做點陣屏的問題,64行 16列,採用行掃,但顯示的時候,畫面總是跳動閃爍,我是在Proteus 7上模擬
^_^,我以前做個一個類似的項目,經驗認為一般每一行使用1~2ms就可以了,也就是說實際應用中20ms內完成一個周期一般是沒有問題的,頻率太高,顯示會變暗,頻率太低就會閃爍,下面是部分代碼,原程序還有一個紅外遙控輸入程序的:
/********************show****************************************************/
void trasmit(unsigned char byte,unsigned char bit_count){
unsigned char tmp;
tmp=bit_count;
byte<<=3;
clock=0;
for(;tmp>0;tmp--) {
// while(tmp--){
if (byte&0x80)wdata=1;
else wdata=0;
clock=1;_nop_();clock=0;
byte<<=1;
}
rdata=0;
rdata=1;_nop_();rdata=0;
}
/*****************************************************************************/
void show0(unsigned char y){
unsigned char i;
wdata=1;
for(i=0;i<y;i++){
clock=1;
clock=0;
}
rdata=1;
rdata=0;
}
/***************************************************************/
void display(void){
unsigned char k,row,bit_cnt;
iout=0x01;
for(row=0;row<7;row++)
{
bit_cnt=5;
for(k=0;k<9;k++){
if(show_letter[k]>127)show_letter[k]=_NUL;//
temp_data[k]=letter[show_letter[k]][row];
}
SCAN_PORT=0xff;
for(k=0;k<9;k++)
{
if(!int_f){
if(k==8)bit_cnt=bit_step_temp;
trasmit(temp_data[k],bit_cnt);
}
else if(k==8 && !brake_f){
if(right_flag|left_flag)trasmit(temp_data[k],bit_cnt);
}
else {
if(brake_f)show0(40);
else trasmit(temp_data[k],bit_cnt);
}
if((brake_f1|right_flag|left_flag| k==8) && REVERSE_S);
else show0(1);
}
if(right_flag|left_flag){
show0(2);
}
//if(brake_f1)show0(5);
SCAN_PORT=~iout;
//if(brake_f)SCAN_PORT=0xff;
// if(brake_f)
DelayMs(4);
iout=iout<<1;
SCAN_PORT=0xff;
}
}
/***************************************************************************/
❷ 我用51單片機串列通信方式去控制一塊8×8LED點陣屏,顯示的時候,文字閃爍厲害……
按照人的常規的視覺停留的頻率計算就行了,一般地,掃描頻率要50HZ以上肉眼看起來就不閃爍,就拿50HZ閥值,那麼一個點陣顯示的時間為1S/50=20mS,即需要20mS後知薯再對它進行掃描;
但是你每行是5mS,那麼一共有8行,重復掃描時間為5mS*8=40mS>>20mS,所以當然看起來閃爍。
把掃描時間跳到2.5到枯凱2mS就差不多了,太小的話,沒猛喚通電時間過短,顯示亮度不足。
❸ 怎麼控制單片機8*8點陣每個點亮或不亮,每個點對應的十六進制是多少
用單片機控制8×8點陣的每個LED的亮滅,要採用掃描方式實現。如下圖的8×8點陣,用8系列線和8線條行線控制。在8條列線加高電平,逐條行線加低電平,就會逐行點亮。
❹ 51單片機點陣問題,總是亂碼
好象是滾動顯示中間的8個代碼看看陰碼陽碼是否搞錯,行列是否搞錯
delay(1000);不知你是多大的延時,要是1000ms可有點大,100ms以下還差不多
掃描一次才花費16ms,中間你敢停1000ms嗎?
個人認為,這個延時太小了會無滾動效果,太大了會造成其它行很暗、而只有最後一行很亮的情況
所以,乾脆去掉這個延時,而將每一次掃描重復5-7次,也就是80-110ms,然後再i++,將圖像向上推進
就是在for(z=0;z<8;z++)外面再加一層for循環
for(m=0;m<10;m++)//m值由實驗確定
{
for(z=0;z<8;z++)
{
c=i+z;
DULA=1;
P1=HANG[z];
DULA=0;
delay(1);
WELA=1;
P1=LIE_2[c];
WELA=0;
delay(1);
}
}
另外8*8點陣顯示效果不會很好,特別是點與點之間的空隙太大,有時不仔細看,還真看不出顯的是什麼東東
❺ 51單片機中,點陣8X8點陣取字模軟體有 陰碼、陽碼、逐列式、逐行式、逆向、順向,能幫做一個簡單的介紹嗎
8X8點陣 分為行和列,當以低電平進行行掃描,那麼列所送的就是陽碼,相反就是陰碼。。。。如:陽碼::第一個20Us內給第一行送低電平0,給列八位送待顯示的高電平,第二個20Us內給第二行送低電平0,給列八位送待顯示的高電平,如此進行八次,,剛好掃完一個屏幕,用時不到1Ms人眼是無法分辨出來的,就這樣我們看到的就是整平數碼。。。
❻ 用51單片機以及8*8點陣顯示英文字母或者數字(最好是全部數字和字母都說說哈),靜態顯示就可以 謝謝啊
8*8點陣是動態掃描的 靜態顯示也是動態掃描的結果。
比如說下面這個程序:
#include <AT89X52.H>
#include "74HC595.H"
unsigned char code a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code b[]={0x00,0x7F,0x40,0x40,0x40,0x00,0x00,0x00};/*"L",0*/
void main(void)
{
unsigned char i;
while (1) //如果沒有while循環,將出現閃爍現象
{
for(i=0;i<8;i++)
{
Ser_IN(a[i]);//8X8點陣列掃描
Ser_IN(b[i]);//8X8點陣行掃描
Par_OUT();//74HC595輸出顯示
}
i=0;
}
}
程序裡面還要包含"74HC595.H"
把它放在工程文件夾裡面就可以了。"74HC595.H"具體程序如下:
#ifndef __74HC595_H__
#define __74HC595_H__
sbit SD = P1^4; //串列數據輸入
sbit ST_CK = P1^5; //存儲寄存器時鍾輸入
sbit SH_CK = P1^6; //移位寄存器時鍾輸入
void Ser_IN(unsigned char Data); //串列數據輸入
void Par_OUT(void); //串列數據輸出
//void Ser_Par(unsigned char Data); //串列輸入,並行輸出
//串列數據輸入
void Ser_IN(unsigned char Data)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
SH_CK = 0; //CLOCK_MAX=100MHz
SD = Data & 0x80;
Data <<= 1;
SH_CK = 1;
}
}
//並行數據輸出
void Par_OUT(void)
{
ST_CK = 0;
ST_CK = 1;
}
//串列輸入,並行輸出
void Ser_Par(unsigned char Data)
{
Ser_IN(Data);
Par_OUT();
}
當然,由於不同的單片機引腳不同,可能編譯沒錯,但是實際是顯示不了的。
就是那麼多,望採納。