代碼如下
#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[10][8] = {
{0xFF,0xC3,0xDB,0xDB,0xDB,0xDB,0xDB,0xC3},//顯示0
{0xFF,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xFF},//顯示1
{0xFF,0xE7,0xDB,0xDF,0xEF,0xF7,0xC3,0xFF},//顯示2
{0xFF,0xE3,0xDF,0xDF,0xC3,0xDF,0xDF,0xE3},//顯示3
{0xFF,0xE7,0xEB,0xED,0x81,0xEF,0xEF,0xEF},//顯示4
{0xFF,0xC3,0xFB,0xFB,0xC3,0xDF,0xDF,0xC3},//顯示5
{0xFF,0xC3,0xFB,0xFB,0xC3,0xDB,0xDB,0xC3},//顯示6
{0xFF,0xC3,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF},//顯示7
{0xFF,0xC3,0xDB,0xDB,0xC3,0xDB,0xDB,0xC3},//顯示8
{0xFF,0xC3,0xDB,0xDB,0xC3,0xDF,0xDF,0xC3},//顯示9
};
void main()
{
EA = 1; //使能總中斷
ENLED = 0;
ADDR3 = 0;
TMOD = 0x01;//設定T0為模式1
TH0 = 0xFC;//為T0賦初值0xFC67,定時1ms
TL0 = 0x67;
ET0 = 1;//使能T0中斷
TR0 = 1;//啟動T0
while(1);
}
void InterruptTimer0() interrupt 1
{
static unsigned char i = 0;//動態掃描的索引
static unsigned char tmr = 0;//1s軟體定時器
static unsigned char index = 9; //圖片重繪索引
TH0 = 0xFC;//重新加載初值
TL0 = 0x67;
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;//顯示9
default:break;
}
//以下代碼完成每秒改變一幀影像
tmr++;
if(tmr >= 1000)//達到1000ms時改變一次圖片索引
{
tmr = 0;
//index++;
if(index == 0)//圖片索引9~0回圈
{
index = 9;
}else
{
index--;
}
}
}
問題出在當我寫成if(tmr >= 1000)的時候,點陣只顯示9,然而改成250的時候點陣能正常顯示倒計時效果。我想的話,既然250ms的時候程式能夠實作(只是圖片重繪速度很快,250ms變化一次數字),那么中斷和圖片的重繪應該是正常實作了的,百思找不到原因,求解答。
uj5u.com熱心網友回復:
case 7:ADDR2=1;ADDR1=1;ADDR0=1;i=0;P0=image[index][7];break;//顯示9這段注釋不對哈,編輯的時候沒注意
uj5u.com熱心網友回復:
tmr定義為unsigned char ,變數最大值才為256。你來個1000肯定不行,溢位!注意一下變數定義型別,改為int可以uj5u.com熱心網友回復:
問題已經解決!非常感謝。以后在編程程序中我會記得這次錯誤!
uj5u.com熱心網友回復:
你好,有沒有大神解釋一下這個,新手小白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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/125481.html
標籤:單片機/工控
