找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6923|回复: 13
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
ID:59980 发表于 2014-9-27 15:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
4位可加减计数器0-9999.用C语言写的,但通过下载到机板执行时,发现有错误,数字加到9后就变为零了。无法加到9999啊~
电路的数码管驱动是采用段码和位选扫描显示的。



//                                                          3.程序代码清单
#include <reg52.h>
#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这个数在数码管上显示出来。
}
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:19715 发表于 2014-9-27 17:23 | 只看该作者

回帖奖励 +3

/*****************************数据处理**********************************/
void process(void)
{
qianwei=i/1000; //取i的千位,保存到数组qianwei中。
baiwei=i%1000/100; //取i的百位,保存到数组baiwei中。
shiwei=i%100/10; //取i的十位,保存到数组shiwei中。
gewei=i%10 //取i的个位。
}

评分

参与人数 1威望 +50 黑币 +50 收起 理由
admin + 50 + 50 回帖助人的积分奖励

查看全部评分

回复

使用道具 举报

板凳
ID:66032 发表于 2014-9-27 17:48 | 只看该作者
楼上给你改的和你写的code运行是一样的结果, 我看了一遍, 程序没有任何问题, 可能是你的硬件连接将千位和个位弄反了, 个位的已经是千位, 当你按到9,已经是9000, 再加一是10000就溢出。

评分

参与人数 1威望 +50 黑币 +50 收起 理由
admin + 50 + 50 回帖助人的积分奖励

查看全部评分

回复

使用道具 举报

地板
ID:19715 发表于 2014-9-27 18:30 | 只看该作者
mqwu 发表于 2014-9-27 17:48
楼上给你改的和你写的code运行是一样的结果, 我看了一遍, 程序没有任何问题, 可能是你的硬件连接将千位 ...

是啊,我的也是一样,
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,执行下面大括号里的内容
{
   count++; //将count加1
   key_jia=0; //将标志位清0,防止下次在没有按键按下的时候仍然执行count加1(count++)的操作
   if (count>9999)
   count=0; //将count加1
   i=count; //把count拷贝给i
}
if (key_jian==1) //如果有按键按下的标志位是1,执行下面大括号里的内容
{
   count--; //将count减1
   key_jian=0; //将标志位清0,防止下次在没有按键按下的时候仍然执行count减1(count--)的操作
   if (count>9999)
   count=9999;
   i=count; //把count拷贝给i
}
}

回复

使用道具 举报

5#
ID:59980 发表于 2014-9-27 21:53 | 只看该作者
可是这个程序设计的是,就算加,也只能从个位加起的,控制线只有两根,接反了只是变成减少,再说如果是数码管那力接错线的话,那个数只变到别的位去也不会一点也没有变化啊!
回复

使用道具 举报

6#
ID:59980 发表于 2014-9-27 21:57 | 只看该作者
STARTUP.A51(0): warning A41: MISSING 'END' STATEMENT
compiling main.c...
linking...
Program Size: data=27.2 xdata=0 code=502
creating hex file from "LED"...
"LED" - 0 Error(s), 1 Warning(s).


以上是这个程序的有1个警告??? 1 Warning(s).
回复

使用道具 举报

7#
ID:1 发表于 2014-9-30 00:48 | 只看该作者
STARTUP.A51(0): warning A41: MISSING 'END' STATEMENT   
就是说 你没有写 end
回复

使用道具 举报

8#
ID:66645 发表于 2014-9-30 14:01 | 只看该作者
void process(uint i); //数据处理函数,负责做除法运算,将计数器里的数分成千、百、十、个位
这个有问题
回复

使用道具 举报

9#
ID:59980 发表于 2014-9-30 16:32 | 只看该作者
哦,谢谢!原来如此啊!
回复

使用道具 举报

10#
ID:59980 发表于 2014-9-30 16:36 | 只看该作者
修改了:
/*****************************数据处理**********************************/
void process(void)
{
qianwei=i/1000; //取i的千位,保存到数组qianwei中。
baiwei=i%1000/100; //取i的百位,保存到数组baiwei中。
shiwei=i%100/10; //取i的十位,保存到数组shiwei中。
gewei=i%10 //取i的个位。
}




变成:


Build target 'Target 1'




compiling LED.c...
LED.C(47): error C141: syntax error near '}'
Target not created

还有问题啊!
回复

使用道具 举报

11#
ID:19715 发表于 2014-9-30 17:35 | 只看该作者
hts2008222 发表于 2014-9-30 16:36
修改了:
/*****************************数据处理**********************************/
void process(v ...

就差一个分号:
  gewei=i%10; //取i的个位
回复

使用道具 举报

12#
ID:61876 发表于 2014-9-30 18:07 | 只看该作者
建议你还是按二楼说的修改一下c源程序,但是位码要修改成
P2=0xf1;
P2=0xf2;
P2=0xf4;
P2=0xf8;
我用proteus7作了仿真,全部OK。
回复

使用道具 举报

13#
ID:61876 发表于 2014-9-30 18:11 | 只看该作者
最后一句 要改成 P2=0x0;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表