/*有问题的我都注释了,下面应该要有程序明细介绍*/
/************************************************************************
* 工 程 名: xxxxxxxx
* 单片机型号: xxxxxxxx
* 晶 振: xxxxxxxx
* 接口说明:
* 例如 数码管段选什么IO,位选什么IO,数码管驱动芯片有哪些,分别接到了哪些IO。
* 按键接到哪个IO,有没有跳帽 等 等 等 等 等 等 !
* 还可以写更详细,客户一看就都知道了。
************************************************************************/
#include "reg51.h"
typedef unsigned int uint;
typedef unsigned char uchar;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0~9的数组 (共阳极)
sbit key = P1^0; //定义按键
void Delay_ms(uint z); //声明延时函数
//主函数
void main(void)
{
uint i=50; /* i=50; 在这里初始化 ,运行程序就会显示50 */
while(1)
{
if(key == 0) //判断按键是否按下
{
Delay_ms(10); //延时10ms
if(key == 0) //再次判断
{
i++; /* i=50; i++; 不能放在这里初始化,否则每一次按键都是50, i++; 留着 */ //按键次数
while(key == 0); //判断是否松开按键
if(i == 100) i=0; //如果到达99,下一次回到0
}
}
/*
这里基本上全错了,P2->十位, P3->个位 这不乱套了吗? 段选有两个IO口的吗???
位选 居然看不到 是哪个IO? 有没有驱动芯片?
P2 = table[i/10]; //显示十位
P3 = table[i%10]; //显示各位
要么我猜 P2 位选? P3 段选? 还是位选直接接了电源正极吗???
*/
// 乱猜开始,数码管延时函数值可能要调一调,不然会闪
P2 = 0x01; //位选开 P20
P3 = table[i/10]; //显示十位 P3 段选
Delay_ms(5);
P2 = 0x00; //关闭数码管显示
Delay_ms(5);
//
P2 = 0x02; //位选开 P21
P3 = table[i%10]; //显示个位 P3 段选
Delay_ms(5);
P2 = 0x00; //关闭数码管显示
Delay_ms(5);
// 乱猜结束,IO不对那就自己改,问题不明确,我也没办法。
}
}
//延时函数 12.000MHz
void Delay_ms(uint z)
{
while(z--) //while 这种少用,容易出问题,特别是while很多的时候。 用for吧,不改了,这种小程序错误实在太多
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
|