?? main.c
字號:
/*********************************************************
程序名稱:LED3216點陣拉幕顯示圖片
簡要說明:可顯示分辨率為32X16的圖片
P0口接上行線,P2口接下行線,P3口接掃描線
P3.0接左屏譯碼器使能端(CS1)
P3.1接右屏譯碼器使能端(CS2)
編 寫:JiangX.net
*********************************************************/
#include<AT89X52.h>
#define uchar unsigned char //宏定義
#define hang1 P0 //上半屏行線
#define hang2 P2 //下半屏行線
#define lie P1 //掃描列線
#define CS1 P3_0 //接左屏譯碼器使能端,低電平使能
#define CS2 P3_1 //接右屏譯碼器使能端,低電平使能
#define num sizeof(pic)/64 //自動計算圖片總數
uchar m=0,n=0; //m為掃描過程中的中間變量,n為顯示指針
uchar a,b; //a、b分別為左半屏、右半屏的掃描變量
/*****參數調整項*****/
#define light 100 //顯示亮度調節,數值不可過大,以不感到屏幕閃爍為準
#define speed 5 //卷動速度調節
/*******************************
圖片取模:縱向取模,字節倒序
圖片大小:32*16
*******************************/
uchar code pic[]={
0x00,0x00,0x08,0xF8,0xF8,0x08,0x00,0x00,0xF0,0xF8,0xFC,0xFC,0xFC,0xFC,0xF8,0xF0,
0xF8,0xFC,0xFC,0xFC,0xFC,0xF8,0xF0,0x00,0xF8,0xF8,0x00,0x00,0x00,0xF8,0xF8,0x00,
0x00,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,
0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x0F,0x1F,0x18,0x18,0x18,0x1F,0x0F,0x00,//I LOVE YOU
0xC0,0x40,0xC0,0x00,0xF0,0x08,0x00,0x00,0xF0,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,
0x00,0x00,0x00,0xF0,0x08,0x08,0x08,0xF0,0x00,0x00,0x08,0xF0,0x00,0xC0,0x40,0xC0,
0x01,0x01,0x01,0x00,0x07,0x08,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x08,0x08,
0x08,0x08,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x08,0x07,0x00,0x01,0x01,0x01,//o(∩_∩)o
0xFC,0x04,0x04,0x04,0xFC,0x02,0xF2,0x12,0x12,0x12,0xF2,0x02,0x02,0xFE,0x02,0x00,
0xFC,0x04,0x04,0x04,0xFC,0x02,0xF2,0x12,0x12,0x12,0xF2,0x02,0x02,0xFE,0x02,0x00,
0x0F,0x02,0x02,0x02,0x07,0x00,0x07,0x02,0x02,0x02,0x27,0x40,0x80,0x7F,0x00,0x00,
0x0F,0x02,0x02,0x02,0x07,0x00,0x07,0x02,0x02,0x02,0x27,0x40,0x80,0x7F,0x00,0x00 //呵呵
};
/*****延時子程序*****/
void delay(void) //專門設置的延時程序用來改變掃描速度以方便調節亮度
{
uchar i;
for(i=0;i<light;i++);
}
/*****初始化子程序*****/
void init(void) //定時器初始化,設置定時器0工作方式1,定時時間5ms
{
TMOD=0x1;
TH0=0xec;
TL0=0x78;
}
/*****計數器中斷程序*****/
void timer0(void) interrupt 1 //中斷處理
{
uchar k; //定義變量k
TH0=0xec;
TL0=0x78;
k++; //定時時間到,初始變量加1
if(k>speed) {m++;k=0;}
if(m<=16) {a=m;b=0;} //掃描左半屏,不掃描右半屏
else {a=16;b=m-16;} //全屏掃描左半屏,掃描右半屏
if(m>32) b=16; //全屏掃描右半屏
//中間這段時間是為了看清楚整屏畫面內容,稍作停頓
if(m==48) {m=0;n++;} //一幅圖片卷動顯示過程結束,載入下一幅圖片
if(n>num-1) n=0; //所有圖片顯示完畢,回到第一幅圖片
}
/*****顯示子程序*****/
void display(void)
{
uchar i,j;
CS2=1; //關右屏
CS1=0; //開左屏
for(i=0;i<a;i++) //變量a決定了一次掃描左半屏列數
{
lie=i; //左屏列掃描信號輸出
hang1=pic[i+64*n];
hang2=pic[i+64*n+32]; //行信號輸出
delay();
hang1=0;
hang2=0;
}
CS1=1; //關左屏
CS2=0; //開右屏
for(j=0;j<b;j++) //變量b決定了一次掃描右半屏列數
{
lie=j<<4; //右屏列掃描信號輸出
hang1=pic[j+64*n+16];
hang2=pic[j+64*n+48]; //行信號輸出
delay();
hang1=0;
hang2=0;
}
}
/*****主程序*****/
void main(void)
{
init();
TR0=1;
ET0=1;
EA=1; //開中斷
while(1)
{
display();
}
}
/*****END*****/
/*****歡迎到作者博客交流:http://www.jiangx.net*****/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -