user-0 提问: c51，数码管，大佬围观

回复:
user: user-1
content: 主要改动了显示函数和主函数，亲测有效！  #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--; 			} 		} 	     }   }

user: user-2
content: 引用 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

user: user-0
content: 希望老师能具体点，感谢！

user: user-0
content: 感谢，但是您能针对以上代码写出减得程序吗？而不是自己重写，希望您能费下力，若合适，分将全给你了！

user: user-2
content: 参考《编译原理》中的词法分析和有限状态自动机。

user: user-3
content: 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);  } }

user: user-0
content: 我是想再加一个key1，按一次减一，当num>=1时实现前面我说的功能，您写的这个不行，能在思考一下给我写一下吧，可以的话我把分就都给您了，再次感谢！

user: user-4
content: while (key==0)//键按下，显示，标志f0=0 {        if(key1 == 1)               num = num - 1;        Disp(num);         f0=0; }