c51,数码管,大佬围观

宜风逍遥 2017-11-21 06:33:20
现有代码是用开关key控制两位数数码管依次+1,从0加到99.我想再加key1控制数码管,按一次减一,从99减到0,有会的大佬来帮帮小弟,在此感谢!

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define LED P0//段选线
sbit num0=P2^0;//位选线
sbit num1=P2^1;//位选线
uint num;
uchar f0;
uchar f1;
sbit key=P1^0;//开关
sbit key1=P1^1;
uchar code dis_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//段码表0,1,2,3,4,5,6,7
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};//段码表8,9,a,b,c,d,e,f,灭(16),-(17)
unsigned char SegBuf[2]={0};
//---延时函数---//
void delayled(uchar N)
{
uchar i,j;
for(i=0;i<N;i++)
for(j=0;j<125;j++);
}
//---填充显示缓冲区函数---//
void convert(uint n)
{
SegBuf[0] =n%10;
SegBuf[1] =n/10%10;
}
//---显示函数---//
void display(void)
{
LED=dis_code[SegBuf[0]];
num0=0;
delayled(3);
num0=1;

LED=dis_code[SegBuf[1]];
num1=0;
delayled(3);
num1=1;
}
//---显示数据---//
void Disp(uint n)
{
convert(n);
display() ;
}
//---主函数---//
void main()
{
num=0;//开始显示的数字为0
f0=1;//f0为按键标志位,如果按下键,f0=0,否则f0=1
f1=1;
while(1)
{

while (key==0)//键按下,显示,标志f0=0
{
Disp(num);
f0=0;
}

while (key==1)//键未按下,显示
{
Disp(num);
if (f0==0)
{
num=num+1;
f0=1;

}



}
}

}
...全文
225 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dong_learning 2017-12-05
  • 打赏
  • 举报
回复
主要改动了显示函数和主函数,亲测有效! #include <reg52.h> #define uchar unsigned char #define uint unsigned int #define LED P0//段选线 /*********我使用的是开发板,硬件连接是,两个573锁存器左边接P0口 **********和位选 段选(一个接位选 一个接段选)通过软件切换段选 位选*******/ sbit du_EN = P2^6;//段选线 sbit we_EN = P2^7;//位选线 uint num; sbit key_up = P3^0;//开关 使用的是开发板硬件连接的按键 sbit key_down = P3^1; uchar code dis_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//段码表0,1,2,3,4,5,6,7 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};//段码表8,9,a,b,c,d,e,f,灭(16),-(17) unsigned char SegBuf[2]={0}; //---延时函数---// void delayled(uchar N) { uchar i,j; for(i=0;i<N;i++) for(j=0;j<125;j++); } //---填充显示缓冲区函数---// void convert(uint n) { SegBuf[0] =n%10; SegBuf[1] =n/10%10; } //---显示函数---// void display(void) { du_EN = 1; LED=dis_code[SegBuf[1]]; du_EN = 0; P0 = 0xff; we_EN = 1; P0 = 0xfe; we_EN = 0; delayled(5); du_EN = 1; LED=dis_code[SegBuf[0]]; du_EN = 0; P0 = 0xff; we_EN = 1; P0 = 0xfd; we_EN = 0; delayled(5); } //---显示数据---// void Disp(uint n) { convert(n); display() ; } //---主函数---// void main() { num=0;//开始显示的数字为0 while(1) { Disp(num); if(key_up == 0) { delayled(10); if(key_up == 0) { while(!key_up) { display(); } num++; } } if(key_down == 0) { delayled(10); if(key_down == 0) { while(!key_down) { display(); } num--; } } } }
赵4老师 2017-12-05
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
参考《编译原理》中的词法分析和有限状态自动机。
仅供参考:
//有字符串
//1_22_333,,4444__55555,_666666
//需要解析为
//1
//22
//333
//_
//4444
//55555
//666666
#include <stdio.h>
char s[]="1_22_333,,4444__55555,_666666";
char c,*p,*p1;
int st;
void main() {
    st=0;
    p=s;
    while (1) {
        c=*p;
        if (0==c) {
            switch (st) {
            case 1:printf("_\n");    break;
            case 2:printf("%s\n",p1);break;
            }
            break;//
        }
        switch (st) {
        case 0:
                 if ('_'==c) {                            st=0;}
            else if (','==c) {                            st=1;}
            else             {p1=p;                       st=2;}
        break;
        case 1:
                 if ('_'==c) {                            st=1;}
            else if (','==c) {printf("_\n");              st=1;}
            else             {p1=p;                       st=2;}
        break;
        case 2:
                 if ('_'==c) {*p=0;printf("%s\n",p1);*p=c;st=0;}
            else if (','==c) {*p=0;printf("%s\n",p1);*p=c;st=1;}
            else             {                            st=2;}
        break;
        }
        p++;
    }
}
//1
//22
//333
//_
//4444
//55555
//666666
宜风逍遥 2017-12-05
  • 打赏
  • 举报
回复
希望老师能具体点,感谢!
宜风逍遥 2017-12-01
  • 打赏
  • 举报
回复
感谢,但是您能针对以上代码写出减得程序吗?而不是自己重写,希望您能费下力,若合适,分将全给你了!
赵4老师 2017-12-01
  • 打赏
  • 举报
回复
参考《编译原理》中的词法分析和有限状态自动机。
ccbbcc 2017-11-25
  • 打赏
  • 举报
回复
if(key==0) { for(i=0;i<200;i++); if(key==0) { while(key==0); num++; Disp(num); } } if(key1==0) { for(i=0;i<200;i++); if(key1==0) { while(key1==0); num--; Disp(num); } }
宜风逍遥 2017-11-22
  • 打赏
  • 举报
回复
我是想再加一个key1,按一次减一,当num>=1时实现前面我说的功能,您写的这个不行,能在思考一下给我写一下吧,可以的话我把分就都给您了,再次感谢!
kuangbao9 2017-11-22
  • 打赏
  • 举报
回复
while (key==0)//键按下,显示,标志f0=0 { if(key1 == 1) num = num - 1; Disp(num); f0=0; }

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧