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这个数在数码管上显示出来。
}
}
|