Ⅰ 單片機 8*8點陣C51程序
一.基於51的點陣屏顯示:(1)點亮第一個8*8點陣:
1.首先在Proteus下選擇我們需要的元件,AT89C51、74LS138、MATRIX-8*8-GREEN(在這里使用綠色的點陣)。在Proteus
6.9中8*8的點陣總共有四種顏色,分別為MATRIX-8*8-GREEN,MATRIX-8*8-BLUE,MATRIX-8*8-ORANGE
,MATRIX-8*8-RED。
在這里請牢記:紅色的為上列選下行選;其它顏色的為上行選下列選!而所有的點陣都是高電平選中列,低電平選中行!也就是說如果某一個點所處的行信號為低,列信號為高,則該點被點亮!此結論是我們編程的基礎。
2.在選擇完以上三個元件後,我們開始布線,具體如下圖:
這里P2是列選,P3連接38解碼器後作為行選。
選擇38解碼器的原因:38解碼器每次可輸出相應一個I/O口的低電平,正好與點陣屏的低電平選中行相對,並且節省了I/O口,大大方便了我們的編程和以後的擴展。
3.下面讓我們把它點亮,先看一個簡單的程序:
(將奇數行偶數列的點點亮,效果如下圖)
下面是源代碼:
/************8*8LED點陣屏顯示*****************/
#include<reg51.h>
void
delay(int
z)
//延時函數
{
int
x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}
void
main()
{
while(1)
{
P3=0;
//行選,選擇第一行
P2=0x55;
//列選,即該行顯示的數據
delay(5);
//延時
/*****下同*****/
P3=2;
//第三行
P2=0x55;
delay(5);
P3=4;
//第五行
P2=0x55;
delay(5);
P3=6;
//第七行
P2=0x55;
delay(5);
}
}
上面的程序實現了將此8*8點陣的奇數行偶數列的點點亮的功能。重點讓我們看while循環內,首先是行選P3=0,此時38解碼器的輸入端為000,則輸出端為01111111,即B0端為低電平,此時選中了點陣屏的第一行,接著列選我們給P2口賦0x55,即01010101,此時又選中了偶數列,緊接著延時。然後分別對第三、五、七行進行相同的列選。這樣就點亮了此點陣屏奇數行偶數列交叉的點。
完成這個程序,我們會發現其實點陣屏的原理是如此簡單,和數碼管的動態顯示非常相似,只不過換了一種方式而已。
對不起啦,我傳了三次圖片都沒傳上,郁悶哪!希望你能理解哈!
不過我有傳一份WORD文檔在我的空間裡面
Ⅱ 單片機控制8×8 LED點陣屏顯示數字
你好!這里有一個不是顯示數寬枝字慎銀敏的搏櫻,修改字模就能完成顯示
Ⅲ 怎麼控制單片機8*8點陣每個點亮或不亮,每個點對應的十六進制是多少
用單片機控制8×8點陣的每個LED的亮滅,要採用掃描方式實現。如下圖的8×8點陣,用8系列線和8線條行線控制。在8條列線加高電平,逐條行線加低電平,就會逐行點亮。
Ⅳ 利用單片機,在一個8*8的點陣顯示屏上顯示一個「大」字,怎樣編程啊幫幫忙啊,我作業,不用太精煉的語
由於是8x8,行與列數一樣,可以行驅動或列驅動(當然行列硬體上不一樣除外)。
以行驅動為例:
1.首先用字模提取軟體提取「大」字的字模。軟體網上很多,用「字模提取」關鍵字可以搜到。也可以用EXCEL在8x8上方框上自己寫畢手一個「大字」,然後有標記的為1,沒標記的為0,那麼一行下來有8位既一個節,總共8行,共8個位元組。
2.把這8個位元組做成數組。放在FLASH里比較好。
3.使用時,數組第一個元手敏嫌素送第一行,然後選通第一行,延時一下,關第一行,重復第二行,八行送完後再重新開始。
4.每秒最少掃描拿孝屏幕50次,否則會閃爍。
Ⅳ 用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();
}
當然,由於不同的單片機引腳不同,可能編譯沒錯,但是實際是顯示不了的。
就是那麼多,望採納。
Ⅵ 51單片機中,點陣8X8點陣取字模軟體有 陰碼、陽碼、逐列式、逐行式、逆向、順向,能幫做一個簡單的介紹嗎
8X8點陣 分為行和列,當以低電平進行行掃描,那麼列所送的就是陽碼,相反就是陰碼。。。。如:陽碼::第一個20Us內給第一行送低電平0,給列八位送待顯示的高電平,第二個20Us內給第二行送低電平0,給列八位送待顯示的高電平,如此進行八次,,剛好掃完一個屏幕,用時不到1Ms人眼是無法分辨出來的,就這樣我們看到的就是整平數碼。。。
Ⅶ 單片機中8*8點陣中漢字的編碼是怎麼獲得的
8*8造漢字很困難的,你可以找一段纖個8*8的漢字型檔跡賣(如果握州仿有的話),用字模提取軟體(網上很多的)獲取點陣字型檔數據,之後寫入這個8*8點陣就OK了。
Ⅷ 單片機漢字8x8點陣LED動態顯示程序
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char code image[11][8] = {
{0xC3, 0x81, 0x99, 0x99, 0x99, 0x99, 0x81, 0xC3}, //數字0
{0xEF, 0xE7, 0xE3, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3}, //數字1
{0xC3, 0x81, 0x9D, 0x87, 0xC3, 0xF9, 0xC1, 0x81}, //數字2
{0xC3, 0x81, 0x9D, 0xC7, 0xC7, 0x9D, 0x81, 0xC3}, //數字3
{0xCF, 0xC7, 0xC3, 0xC9, 0xC9, 0x81, 0xCF, 0xCF}, //數字4
{0x81, 0xC1, 0xF9, 0xC3, 0x87, 0x9D, 0x81, 0xC3}, //數字5
{0xC3, 0x81, 0xF9, 0xC1, 0x81, 0x99, 0x81, 0xC3}, //數字6
{0x81, 0x81, 0x9F, 0xCF, 0xCF, 0xE7, 0xE7, 0xE7}, //數字7
{0xC3, 0x81, 0x99, 0xC3, 0xC3, 0x99, 0x81, 0xC3}, //數字8
{0xC3, 0x81, 0x99, 0x81, 0x83, 0x9F, 0x83, 0xC1}, //數字9
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //全亮
};
void main()
{
EA = 1; //使能總中斷
ENLED = 0; //使能U4,選擇LED點陣
ADDR3 = 0;
TMOD = 0x01; //設置T0為模式1
TH0 = 0xFC; //為T0賦初值0xFC67,定時1ms
TL0 = 0x67;
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動T0
while (1);
}
/* 定時器0中斷服務函數 */
void InterruptTimer0() interrupt 1
{
static unsigned char i = 0; //動態掃描的索引
static unsigned int tmr = 0; //1s軟體定時器
static unsigned char index = 9; //圖片刷新索引
TH0 = 0xFC; //重新載入初值
TL0 = 0x67;
//以下代碼完成LED點陣動態掃描刷新
P0 = 0xFF; //顯示消隱
switch (i)
{
case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=image[index][0]; break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=image[index][1]; break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=image[index][2]; break;
case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=image[index][3]; break;
case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=image[index][4]; break;
case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=image[index][5]; break;
case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=image[index][6]; break;
case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=image[index][7]; break;
default: break;
}
//以下代碼完成每秒改變一幀圖像
tmr++;
if (tmr >= 1000) //達到1000ms時改變一次圖片索引
{
tmr = 0;
if (index == 0) //圖片索引10~0循環
index = 10;
else
index--;
}
}
Ⅸ 51單片機Led點陣8*8顯示一個字的程序是什麼 請講講程序內容里的原理!謝謝
在8X8點陣LED上顯示柱含卜形,讓其先從左到右平滑移動三次,其次從右到左平滑移動三次,再次從上到下平滑移動三次,最後從下到上平滑移動三次,如此循環下去。
1. 程序設計內容
8X8點陣LED工作原理說明 :8X8點陣共需要64個發光二極體組成,且每個發光二極體是放置在行線和列線的交叉點上,當對應的某一列置1電平,某一行置0電平,則相應的二極體就亮;因此要實現一根柱形的亮法,如圖49所示,對陸老鎮應的一列為一根豎柱,或者對應的一行為一根橫柱,因此實現柱的亮的方法如下所述:早粗
一根豎柱:對應的列置1,而行則採用掃描的方法來實現。
一根橫柱:對應的行置0,而列則採用掃描的方法來實現。
Ⅹ 單片機8x 8點陣程序,hc6800——es v2.0,顯示字母和漢字
//這里顯示數字,字母的話,定義每個字母的代碼就可以了,漢字夠嗆,16*16點陣還可以,8*8不是很好。
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code Table_of_Digits[]=
{
0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, //0
0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00, //1
0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, //2
0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00, //3
0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00, //4
0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00, //5
0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, //6
0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00, //7
0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, //8
0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00, //9
0xff,0x81,0x81,0x81,0x81,0x81,0x81,0xff
};
uchar code xdat[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
uchar code ydat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar i=0,j=0,t=0,Num_Index,key,xi,yi;
//主程序
void main()
{
P1=0x80;
Num_Index=0; //從0 開始顯示
TMOD=0x01; //T0 方式0
TH0=(65536-2000)/256; //2ms 定時
TL0=(65536-2000)%256;
IE=0x82;
key=0;
xi=0;
yi=0;
EX0=1;
IT0=1;
TR0=1; //啟動T0
while(1);
}
//T0 中斷函數
void ext_int0() interrupt 0
{
key++;
key&=0x03;
}
void LED_Screen_Display() interrupt 1
{
TH0=(65536-2000)/256; //2ms 定時
TL0=(65536-2000)%256;
switch(key)
{
case 0:
P0=0xff; //輸出位碼猜碼和段碼
P0=~Table_of_Digits[Num_Index*8+i];
P1=_crol_(P1,1);
if(++i==8) i=0; //每屏一個數字由8 個位元組構成
if(++t==250) //每個數字刷新戚乎顯示一段時間
{
t=0;
if(++Num_Index==10) Num_Index=0; //顯示下一個數字
}
break;
case 1:
P0=~xdat[xi];
P1=0xff;
P1=ydat[yi];
if(++t==250) //每個數字刷新顯示高兆悉一段時間
{
t=0;
yi++;
if(yi>7){yi=0;xi++;}
if(xi>7)xi=0;
}
break;
case 2:
P0=0xff; //輸出位碼和段碼
P0=~Table_of_Digits[80+j];
if(j==0)P1=0x80;
P1=_crol_(P1,1);
if(++j==8) j=0; //每屏一個數字由8 個位元組構成
break;
default:
key=0;
i=0;
j=0;#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code Table_of_Digits[]=
{
0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, //0
0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00, //1
0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, //2
0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00, //3
0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00, //4
0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00, //5
0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, //6
0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00, //7
0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, //8
0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00, //9
0xff,0x81,0x81,0x81,0x81,0x81,0x81,0xff
};
uchar code xdat[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
uchar code ydat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar i=0,j=0,t=0,Num_Index,key,xi,yi;
//主程序
void main()
{
P1=0x80;
Num_Index=0; //從0 開始顯示
TMOD=0x01; //T0 方式0
TH0=(65536-2000)/256; //2ms 定時
TL0=(65536-2000)%256;
IE=0x82;
key=0;
xi=0;
yi=0;
EX0=1;
IT0=1;
TR0=1; //啟動T0
while(1);
}
//T0 中斷函數
void ext_int0() interrupt 0
{
key++;
key&=0x03;
}
void LED_Screen_Display() interrupt 1
{
TH0=(65536-2000)/256; //2ms 定時
TL0=(65536-2000)%256;
switch(key)
{
case 0:
P0=0xff; //輸出位碼和段碼
P0=~Table_of_Digits[Num_Index*8+i];
P1=_crol_(P1,1);
if(++i==8) i=0; //每屏一個數字由8 個位元組構成
if(++t==250) //每個數字刷新顯示一段時間
{
t=0;
if(++Num_Index==10) Num_Index=0; //顯示下一個數字
}
break;
case 1:
P0=~xdat[xi];
P1=0xff;
P1=ydat[yi];
if(++t==250) //每個數字刷新顯示一段時間
{
t=0;
yi++;
if(yi>7){yi=0;xi++;}
if(xi>7)xi=0;
}
break;
case 2:
P0=0xff; //輸出位碼和段碼
P0=~Table_of_Digits[80+j];
if(j==0)P1=0x80;
P1=_crol_(P1,1);
if(++j==8) j=0; //每屏一個數字由8 個位元組構成
break;
default:
key=0;
i=0;
j=0;
t=0;
xi=0;
yi=0;
Num_Index=0;
P0=0xff;
P1=0x80;
break;
}
}
t=0;
xi=0;
yi=0;
Num_Index=0;
P0=0xff;
P1=0x80;
break;
}
}