LED點陣屏(上移)C51程序
先來張效果,圖比較酷吧
電路原路圖
以下程序有部分刪減,請從以下地址下載.單片機(jī)型號是at89s52,晶振為11.0592.本人測試成功.
完整程序下載:http://www.51hei.com/ziliao/file/dianzhen2.rar
//*****************************************************
//程序功能:
// LED點陣顯示屏,每行顯示字?jǐn)?shù)為 LED_NUM個,
// 總共可顯示字?jǐn)?shù)為DISP_NUM個,
// 最大可顯示字?jǐn)?shù)為65536/32=2048個。
// 行數(shù)最多可為65536/16=4096行。
// 循環(huán)時間參數(shù)為DISP_TIME_MOVE
//MCU:AT89S52
//
//程序編寫:Bunagi
//修改時間:2008/11/11
//********************************************************
#include reg51.h>
//********************************************************
#define LED_NUM 2 //LED顯示屏字?jǐn)?shù)
#define DISP_NUM 12 //顯示內(nèi)容字?jǐn)?shù)
#define DISP_TIME_MOVE 3 //循環(huán)時間參數(shù)
//**********************************************************
#define uchar unsigned char
#define uint unsigned int
//*******************************************************
sbit LED1_SH=P2^0; //595數(shù)據(jù)傳遞控制,上升沿有效
sbit LED1_DS=P2^1; //595數(shù)據(jù)傳遞輸入
sbit LED1_ST=P2^2; //595數(shù)據(jù)輸出控制,上升沿有效
sbit LED1_OE=P2^3; //595片選
sbit LED2_SH=P2^4; //595數(shù)據(jù)傳遞控制,上升沿有效
sbit LED2_DS=P2^5; //595數(shù)據(jù)傳遞輸入
sbit LED2_ST=P2^6; //595數(shù)據(jù)輸出控制,上升沿有效
sbit LED2_OE=P2^7; //595片選
//***********************************************************
uint disp_up_move; //上下移動控制
uchar disp_move_time;
code uchar disp_code[]={
0x20,0x08,0x17,0xFC,0x10,0x00,0x03,0xF8, //福
0xFA,0x08,0x0A,0x08,0x13,0xF8,0x38,0x04,
0x57,0xFE,0x94,0x44,0x14,0x44,0x17,0xFC,
0x14,0x44,0x14,0x44,0x17,0xFC,0x14,0x04,
0x10,0x04,0x10,0x84,0x10,0x84,0x10,0x84, //州
};
//*********************************************************
void disp();
void sent(uchar sent_dat);
void delay(uchar temp);
//****************************************************
void main()
{
P2=0X00;
TR0=0;
TL0=0; //20MS
TH0=0;
TMOD=0X01; //方式1
EA=1;
ET0=1;
TR0=1;
while(1)
{
disp();
}
}
//**************************************************
//LED掃描顯示程序。
//顯示方式為逐字掃描
//*************************************************
void disp()
{
uchar i,j;
uint move_ctrl;
LED1_DS=0;
LED1_SH=0;
LED1_ST=0;
LED1_OE=0;
LED2_DS=0;
LED2_SH=0;
LED2_ST=0;
LED2_OE=0;
for(j=0;j8;j++)
{
for(i=LED_NUM;i>=1;i--)
{
//**************************************字符下半部分***************************************************
if((disp_up_move+9+j)>((DISP_NUM/LED_NUM)*16)) //判斷要顯示的字符是否已超出字庫
{
sent(0x00);
sent(0x00);
}
else
{
if((disp_up_move+8+j)>15) //判斷當(dāng)前行顯示內(nèi)容是否為下一屏內(nèi)容
{
move_ctrl=32*(i-1)+(32*LED_NUM)*((disp_up_move+8+j)/16); //判斷顯示字符的下半部第一個字節(jié)位置
// 第N個字符 一屏字符大小*當(dāng)前顯示行為第幾屏
sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j+8)%16)+1]);
sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j+8)%16)]);
/*
如果有多于一行的LED點陣條,則程序在此添加:
move_ctrl=32*(i-1)+(32*LED_NUM)*((disp_up_move+8+j)/16)+LED_NUM*32*第幾行;
sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j+8)%16)+1]);
sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j+8)%16)]);
......
*/
}
else
{
move_ctrl=32*(i-1)+2*(disp_up_move%16);
sent(disp_code[move_ctrl+16+j*2+1]);
sent(disp_code[move_ctrl+16+j*2]);
/*
如果有多于一行的LED點陣條,則程序在此添加:
move_ctrl=32*(i-1)+2*(disp_up_move%16)+LED_NUM*32*第幾行;
sent(disp_code[move_ctrl+16+j*2+1]);
sent(disp_code[move_ctrl+16+j*2]);
......
*/
}
}
//***********************************字符上半部分***************************************************
if((disp_up_move+j+1)>(DISP_NUM/LED_NUM)*16)
{
sent(0x00);
sent(0x00);
}
else
{
if((disp_up_move+j)>15)
{
move_ctrl=32*(i-1)+(32*LED_NUM)*((disp_up_move+j)/16);
sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j)%16)+1]);
sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j)%16)]);
/*
如果有多于一行的LED點陣條,則程序在此添加:
move_ctrl=32*(i-1)+(32*LED_NUM)*((disp_up_move+j)/16)+LED_NUM*32*第幾行;
sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j)%16)+1]);
sent(disp_code[move_ctrl+2*(((disp_up_move%16)+j)%16)]);
......
*/
}
else
{
move_ctrl=32*(i-1)+2*(disp_up_move%16);
sent(disp_code[move_ctrl+j*2+1]);
sent(disp_code[move_ctrl+j*2]);
/*
如果有多于一行的LED點陣條,則程序在此添加:
move_ctrl=32*(i-1)+2*(disp_up_move%16)+LED_NUM*32*第幾行;
sent(disp_code[move_ctrl+j*2+1]);
sent(disp_code[move_ctrl+j*2]);
......
*/
}
}
}
LED1_SH=1;
LED1_SH=0;
LED1_DS=1;
LED1_ST=1;
LED1_ST=0;
LED2_ST=1;
LED2_ST=0;
delay(1);
}
LED1_OE=1;
LED2_OE=1;
}
//***************************************************
void sent(uchar sent_dat)
{
uchar i;
for(i=0;i8;i++)
{
LED2_DS=sent_dat0x01;
sent_dat=sent_dat>>1;
LED2_SH=1;
LED2_SH=0;
}
}
//************************************************
void delay(uchar temp)
{
uchar i,j;
for(i=0;itemp;i++)
for(j=0;j100;j++);
}
//********************************************
void t0() interrupt 1
{
TR0=0;
TL0=0;
TH0=0;
if(disp_move_time++>DISP_TIME_MOVE)
{
disp_move_time=0;
if(disp_up_move++ >((DISP_NUM/LED_NUM)*16)-1)disp_up_move=0;
}
TR0=1;
}
評論