我用主機的點陣弄了個9-0秒的倒計時,從機給主機發送按鍵值(主機倒計時是用定時器0,串口用了定時器一,串口的通信是ok的)。我是用Proteus仿真的
我要實作的功能是:從機掃描按下按鍵,主機開始顯示倒計時。
我現在的問題是:
我的點陣只能顯示9(不會變成8),我顯示是放在串口中斷里面,定時器0只用來計時(50ms一次溢位),串口波特率4800
請問:1.顯示的函式應該在哪個地方,中斷還是while回圈
2.中斷的優先級需不需要改
請大神們幫幫忙。
看看哪里需要修改。
這是代碼
u8 Time=0,second=0;
u8 Val=0;
void zhongduan_Init(void)
{
TMOD = 0x21; //開啟定時器0、1
TH0 = 0x3C; //設定初始值,定時50ms
TL0 = 0xB0;
TH1=0xF3; //計數器初始值設定,注意波特率是4800
TL1=0xF3;
ET0 = 1; //打開定時器0中斷
TR0 = 0; //不啟動定時器0
TR1=1; //打開定時器1
SM0=0;//設定串口作業方式
SM1=1;
REN=1; //打開串口接收中斷
IP=0x10;
EA=1; //打開總中斷
ES=1;//打開串口中斷
}
void main()
{
zhongduan_Init();
while(1)
{
}
}
void Timer0() interrupt 1 //中斷服務函式
{
TH0 = 0x3C;
TL0 = 0xB0;
Time++;
if(Time==20)
{
Time=0;
second++; //一秒時間
//if(second>=1)convert(); //心形移位
}
}
void Usart() interrupt 4
{
Val=SBUF;
switch(Val)
{
case 1:
display(Val);//顯示
break;
}
RI=0;
}
void display(u8 DATa)//點陣顯示函式
{
u8 j;
P0=0x7f;
switch(DATa)
{
case 0: //初始畫面
for(j=0;j<8;j++)
{
P0=bubian[j];
Senddata(ten[j]);
delay(10);
Senddata(0x00);//消隱
}
break;
case 1:
show_1();
break;
}
}
void show_1(void)//倒計時顯示
{
u8 j;
TR0=1;//開啟定時器
while(second<10)//時間一到回到初始頁面
{
for(j=0;j<8;j++)
{
P0=bubian[j];
Senddata(count[second][j]);
delay(5);
Senddata(0x00);//消隱
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/45692.html
標籤:單片機/工控
上一篇:求空心杯電機震動導致的MPU9250資料波動的解決方法
下一篇:運維面試題(每日一題)
