我感覺應該不是編程問題,因為num2只在while陳述句和interrupt1那里用了的,而且只要while判斷陳述句的num2值的限定在256以下就沒問題,只要一大于等于256就無法進入while陳述句了,好像是256這個數的問題,我就一直搞不明白。
#include<reg51.h>
#include<absacc.h>
#define KEYPORT P2
#define COM8255 XBYTE[0X0003]
#define PB8255 XBYTE[0X0001]
#define PA8255 XBYTE[0X0000]
#define uchar unsigned char
sbit line0=KEYPORT^0;
sbit line1=KEYPORT^1;
sbit line2=KEYPORT^2;
sbit line3=KEYPORT^3;
led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar money,n,num2;
void inti()
{
COM8255=0x80;
TMOD=0X00;
IE=0X83;
IT0=1;
TH0=(65536-1)/256;
TL0=(65536-1)%256;
TR0=1;
}
bit iskeyinput()
{
KEYPORT=0x0f;
if((KEYPORT&0x0f)==0x0f)
return 0;
else
return 1;
}
uchar key_identify()
{
uchar linecode=0,rowcode=0;
uchar i;
uchar scancode=0xef;
for(i=0;i<4;i++)
{
KEYPORT=scancode;
if((KEYPORT&0x0F)==0x0f)
{
rowcode++;
scancode=scancode<<1|1;
}
else
{
if(line0==0)linecode=0;
if(line1==0)linecode=4;
if(line2==0)linecode=8;
if(line3==0)linecode=12;
break;
}
}
return linecode+rowcode+1;
}
void wait_key()
{
while(1)
{
KEYPORT=0x0f;
if((KEYPORT&0x0f)==0x0f)
break;
}
}
void count(uchar n)
{
if(n%3==0)
money=(n/3)*2;
else if(n%3!=0)
money=(n/3+1)*2;
}
void service_int() interrupt 0
{
PA8255=led[0];
PB8255=led[0];
}
void display(uchar money)
{
if(0<=money&&money<=9)
PA8255=led[money];
if(9<money&&money<=99)
{
PA8255=led[money%10];
PB8255=led[money/10];
}
}
void zd() interrupt 1
{
TH0=(65536-1)/256;
TL0=(65536-1)%256;
num2++;
}
int main()
{
unsigned int i;
num2=0;
inti();
while(1)
{
while(!iskeyinput()) //按鍵若未按下則執行
{
while(num2>=256)
{
PA8255=led[0];
PB8255=led[0];
num2=0;
}
}
for(i=0;i<500;i++);
if(iskeyinput()) //按鍵若按下則執行
{
n=key_identify();
wait_key();
count(n);
display(money);
TH0=(65536-1)/256;
TL0=(65536-1)%256;
}
}
}
uj5u.com熱心網友回復:
uchar不是8bit的么,最多能表示0~255,沒法大于256轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/59070.html
標籤:C語言
