c语言更正错误,4位可加减计数器0-9999.用C语言写的,发现有错误,求高手找出错误,更正!...

4位可加减计数器0-9999.用C语言写的,但通过下载到机板执行时,发现有错误,数字加到9后就变为零了。无法加到9999啊~

电路的数码管驱动是采用段码和位选扫描显示的。

//                                                          3.程序代码清单

#include

#define uchar unsigned char

#define uint unsigned int

sbit k6 = P1^6; //按键k6连接到了单片机的P1.6引脚

sbit k7 = P1^7; //按键k7连接到了单片机的P1.7引脚

uchar Table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//显示段码。

uchar qianwei,baiwei,shiwei,gewei;//定义4个变量用于存放计数值count的各个位

uint count=0;//初始计数值

uint i=0;//定义一个全局变量i,当想把count分成千、百、十、个位是用来临时存储count数据用

//********一下声明三个函数***************/

void display(void); //显示函数

void process(uint i); //数据处理函数,负责做除法运算,将计数器里的数分成千、百、十、个位

void key(void); // 按键函数,用于检测是否有按键按下,如果有就相应的加或减计数器里的数

/*****************************延时子程序********************************/

void delayms(uchar ms)

{ uchar i;

while(ms--)

{

for(i = 0; i < 120; i++);

}

}

/*****************************显示函数**********************************/

void display(void) //动态显示函数,参数P为待显示的数组名

{

P2=0xf7; //打开P2.3位控制的数码管。

P0=Table[qianwei]; //取千位在Table数组中所对应的显示段码送P0口

delayms(1); //延时函数,动态显示,延时过长会出现一个一个点亮的效果。

P2=0xfb; //打开P2.2位控制的数码管。

P0=Table[baiwei]; //取百位在Table数组中所对应的显示段码送P0口

delayms(1); //延时函数,动态显示,延时过长会出现一个一个点亮的效果。

P2=0xfd; //打开P2.1位控制的数码管。

P0=Table[shiwei]; //取十位在Table数组中所对应的显示段码送P0口

delayms(1); //延时函数,动态显示,延时过长会出现一个一个点亮的效果。

P2=0xfe; //打开P2.0位控制的数码管。

P0=Table[gewei]; //取个位在Table数组中所对应的显示段码送P0口

delayms(1); //延时函数,动态显示,延时过长会出现一个一个点亮的效果。

P2=0xff; //P2口输出全"1",所有三极管都截止,数码管全熄灭

}

/*****************************数据处理**********************************/

void process(void)

{

qianwei=i/1000; //取i的千位,保存到数组qianwei中。

i=i%1000; //取i除以1000后的余数,保存到i中。

baiwei=i/100; //取i的百位,保存到数组baiwei中。

i=i%100; //取i除以100后的余数,保存到i中。

shiwei=i/10; //取i的十位,保存到数组shiwei中。

i=i%10; //取i的个位。

gewei=i; //i的个位,保存到数组gewei中。

}

/*************************按键扫描及处理函数*****************************/

void key(void)

{

bit key_jia=0,key_jian=0; //定义两个按键标志位变量

while((1&k6)==0) { key_jia=1; display(); } //如果k6按键按着并且一直不释放的话就循环执行key_jia=1,

while((1&k7)==0) { key_jian=1; display(); }//如果k6按键按着并且一直不释放的话就循环执行key_jian=1,

if (key_jia==1) //如果有按键按下即标志位是1,执行下面大括号里的内容

{

key_jia=0; //将标志位清0,防止下次在没有按键按下的时候仍然执行count加1(count++)的操作

if (count!=9999) //如果count还没有被加到9999,就在本次按键按下时执行下一条

count++; //将count加1

i=count; //把count拷贝给i

}

if (key_jian==1) //如果有按键按下的标志位是1,执行下面大括号里的内容

{

key_jian=0; //将标志位清0,防止下次在没有按键按下的时候仍然执行count减1(count--)的操作

if (count!=0) //如果count还没有被减到0,就在本次按键按下时执行下一条

count--; //将count减1

i=count; //把count拷贝给i

}

}

/****************************主函数*************************************/

void main(void)

{

count=0; //给计数器count赋初始值0

while(1) //主函数是由while构成的死循环,不停的执行下面三个函数

{

key(); //按键扫描处理函数,查看是否有键按下并做相应的处理。

process(); //计数值处理函数,将count分出千位、百位、十位、个位。

display(); //计数值显示函数,将count这个数在数码管上显示出来。

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值