求一单片机程序

要求用C,用89S51和一个共阳或共阴三位数码管。
有一个按键接在某一IO口,按一下该键,就显示2,再按一下,就显示4,再按一下就显示6......(以2递增)直至998

下面是一个自动以2递增显示的程序,你可以修改下,把最下面一行的定时器中断改为外部按键中断就行了,中断里加按键去抖动,三位数码管好像是接移位寄存器静态显示的。
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char

sbit sda = P1^0;
sbit clk = P1^1;
sbit dig1 = P1^2;
sbit dig2 = P1^3;
sbit dig3 = P1^4;
sbit dig4 = P1^5;

uchar code table[]={0x7e,0x0c,0xb6,0x9e,0xcc,0xda,0xfa,0x0e,0xfe,0xde};
uchar times;

void init();
void delay(uchar);
void write(uchar);
void display(uchar);

void main()
{
uint i = 0;
init();
while(1)
{
i = 2;
display(i);
if(times>2)
{
times = 0;
i=i+2 ++;
if(i==998)
i = 2;
}
}
}
/** 显示一个3位的整数 **/
void display(uchar num)
{
uchar bai,shi,ge;
bai = num/100;
shi = num%100/10;
ge = num%10;
/* 显示个位 */
dig4 = 0;
write(table[ge]);
delay(10);
dig4 = 1;
/* 显示十位 */
dig3 = 0;
write(table[shi]);
delay(10);
dig3 = 1;
/* 显示百位 */
dig2 = 0;
write(table[bai]);
delay(10);
dig2 = 1;

}
/** 程序初始化函数 **/
void init()
{
clk = 0;
times = 0;
TMOD = 0x01; //定时器模式1
TH0 = (65536-50000)/256; //每500毫秒产生一次中断
TL0 = (65536-50000)%256;
TR0 = 1; //开始计时
EA = 1; //打开总中断开关
ET0 = 1;
}
/** 向数据码管写入一个字节数据 **/
void write(uchar u)
{
uchar i;
for(i=0;i<8;i++)
{
clk = 1;
sda = u&0x80;
clk = 0;
u = u<<1;
}
}
/** 延迟函数 **/
void delay(uchar t)
{
uchar x,y;
for(x=t;x>0;x--)
for(y=101;y>0;y--);
}
/** 1号中断 **/
void timer0() interrupt 1
{
TH0 = (65536-50000)/256; //每500毫秒产生一次中断
TL0 = (65536-50000)%256;
times ++;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-02-24
我可以用汇编编写动态显示的,但是你要的不是汇编的。汗!

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网