取字模時是8*40的點陣,為什么我將index改成40運行到最后會出現一行亂碼
#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[] = { //圖片的字模表
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x99,0x99,0x99,0x99,0x99,0x81,0xC3,0xFF,
0x99,0x00,0x00,0x00,0x81,0xC3,0xE7,0xFF,
0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
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 char tmr = 0; //250ms軟件定時器
static unsigned char index = 39;
TH0 = 0xFC; //重新加載初值
TL0 = 0x67;
//以下代碼完成LED點陣動態掃描刷新
P0 = 0xFF; //顯示消隱
switch (i)
{
case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=image[index-7]; break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=image[index-6]; break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=image[index-5]; break;
case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=image[index-4]; break;
case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=image[index-3]; break;
case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=image[index-2]; break;
case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=image[index-1]; break;
case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=image[index-0]; break;
default: break;
}
//以下代碼完成每250ms改變一幀圖像
tmr++;
if (tmr >= 250) //達到250ms時改變一次圖片索引
{
tmr = 0;
if (index <= 8)
index = 39;
else
index--;
}
}
|