|
我是这样的我是用一个数组来存起来的,然后定时每隔一定时间显示数据中的数据.
可是我输入的跟显示的不一样
这是程序:
不知哪 有问题:
#include
#include //移位头文件
#include
#define uchar unsigned char
#define uint unsigned int
#define fosc 11.0592 //晶振频率
#define time 2500 //定时2500us 2.5ms
sbit ledk=P2^5;
sbit d0=P1^0;
sbit wela=P2^7;
sbit dula=P2^6;
sbit speakon=P2^3; //喇叭控制线
uchar displaybufpoint; //当前显示位
uchar displaybuf []={0x00,0x00,0x00,0x00,0x00,0x00};//显示缓存区
void delay(uint z);
void display_smg(uchar we,uchar du);
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for (y=110;y>0;y--);
}
//判断是否有键按下
uchar key_press()
{
uchar key;
P3=0xf0;
key=P3;
key=key&0xf0;
if(key==0xf0)
{
return 0;
}
else
{
return 1; //有键被按下
}
}
//键盘扫描
uchar key_scan()
{
uchar key;
if(key_press()) //是否有键按下
{
P3=0xfe;
key=P3;
switch (key)
{
case 0xee:return 0;
case 0xde:return 1;
case 0xbe:return 2;
case 0x7e:return 3;
}
P3=0xfd;
key=P3;
switch (key)
{
case 0xed:return 4;
case 0xdd:return 5;
case 0xbd:return 6;
case 0x7d:return 7;
}
P3=0xfb;
key=P3;
switch (key)
{
case 0xeb:return 8;
case 0xdb:return 9;
case 0xbb:return 10;
case 0x7b:return 11;
}
P3=0xf7;
key=P3;
switch (key)
{
case 0xe7:return 12;
case 0xd7:return 13;
case 0xb7:return 14;
case 0x77:return 15;
}
} //if end
}
//写显存
void write_displaybuf(uchar x)
{
if (displaybufpoint==6) return; //6个数码管
displaybuf[displaybufpoint]=x;
displaybufpoint++;
}
void display()
{
uchar du;
uchar i;
for(i=0;i<= 5;i++)
{
du=displaybuf;
display_smg(i,du);
}
}
void display_smg(uchar we,uchar du)
{
uchar code tablewe []={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位0xfe 第1个数码
uchar code tabledu []={0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,
0x7d , 0x07 , 0x7f , 0x6f , 0x77 ,
0x7c , 0x39 , 0x5e , 0x79 , 0x71,0x00 };
wela=1;
P0=tablewe[we]; //位选
wela=0;
P0=0x00;
dula=1;
P0=tabledu[du]; //字形码
dula=0;
delay(2);
P0=0xff;
}
/*
定时/计数器常数计算
1.计数器初值的计算
设计数器的最大数值为M(根据不同工作方式,M可以是2^13,2^16,2^8),
则计算初值X的公式如下:
X=M-要求的计数值
2.定时器初值的计算
X=M-(要求的定时值)/(12/fosc)
式中,M为定时器模值(根据不同工作方式,M可以是2^13,2^16,2^8)
10ms中断一次,中断10次,晶振11.0592MHZ,
IP=0X82 TCON=0X00 TMOD=0X51 IE=00。
TH0=0XEC TL0=0X78 TH1=0X00 TL1=0X 00
是如何计算出的
10ms=10000us
10000/(12/11.0592)=9216
65536-9216=56320=0XDC00
*/
//设置定时器00x0e66
void settimer0()
{
TMOD=0x01; //方式1
TH0=0xDC; //10ms
TL0=0x00;
EA=1; //总中断允许
TR0=1; //开启定时器0
ET0=1;
}
//定时器0 中断
void timer0() interrupt 1
{
TH0=0xDC;
TL0=0x00;
display();
}
void main()
{
uchar key;
ledk=0;
key=0;
displaybufpoint=0;
settimer0();
while(1)
{
if( key_press() )
{
key=key_scan();
delay(2);
write_displaybuf(key); //写显存
}
}
}
/*0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,
0 1 2 3 4 5
0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c ,
6 7 8 9 A B
0x39 , 0x5e , 0x79 , 0x71 , 0x00
C D E F 无显示*/
|
|