找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机八位抢答器,液晶显示方面有些问题求教大神

[复制链接]
跳转到指定楼层
楼主
这是我自己花了好久,查了很多资料做的八位抢答器,其他功能现已全部实现,但是关于液晶屏显示方面,依然有些问题。
我用液晶屏做了一个分数显示器,一开始八个选手都是零分时显示没有问题,但是我在抢答结束后进行加减分操作后,显示就出现了问题,检查了很多地方都不知道哪儿出现了问题,希望有大佬看到帮忙解答一下,万分感谢!!源程序实在过长,都放在附件里了,麻烦了。


单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. void delay(uint z)                        //1ms延时
  6. {
  7.         uint x,y;
  8.         for(x=z;x>0;x--)
  9.                 for(y=110;y>0;y--);
  10. }                                                                                                        

  11. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,   //编码表1-F和-
  12.                     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
  13. uchar code tablewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//各位灯亮
  14. const uchar code ZF_tab[] =
  15. {
  16.         0xF8,0xFC,0x04,0xC4,0x24,0xFC,0xF8,0x00,  // -0-
  17.         0x07,0x0F,0x09,0x08,0x08,0x0F,0x07,0x00,

  18.         0x00,0x10,0x18,0xFC,0xFC,0x00,0x00,0x00,  // -1-
  19.         0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,

  20.         0x08,0x0C,0x84,0xC4,0x64,0x3C,0x18,0x00,  // -2-
  21.         0x0E,0x0F,0x09,0x08,0x08,0x0C,0x0C,0x00,

  22.         0x08,0x0C,0x44,0x44,0x44,0xFC,0xB8,0x00,  // -3-
  23.         0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,

  24.         0xC0,0xE0,0xB0,0x98,0xFC,0xFC,0x80,0x00,  // -4-
  25.         0x00,0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,

  26.         0x7C,0x7C,0x44,0x44,0xC4,0xC4,0x84,0x00,  // -5-
  27.         0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,

  28.         0xF0,0xF8,0x4C,0x44,0x44,0xC0,0x80,0x00,  // -6-
  29.         0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,

  30.         0x0C,0x0C,0x04,0x84,0xC4,0x7C,0x3C,0x00,  // -7-
  31.         0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,

  32.         0xB8,0xFC,0x44,0x44,0x44,0xFC,0xB8,0x00,  // -8-
  33.         0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,   

  34.         0x38,0x7C,0x44,0x44,0x44,0xFC,0xF8,0x00,  // -9-
  35.         0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,
  36. };
  37. sbit beep=P2^3;//蜂鸣器
  38. sbit deng=P2^5;//灯锁存
  39. sbit duan=P2^6;//段锁存
  40. sbit wei=P2^7;//位锁存
  41. sbit key1=P1^0;//八个选手
  42. sbit key2=P1^1;
  43. sbit key3=P1^2;
  44. sbit key4=P1^3;
  45. sbit key5=P1^4;
  46. sbit key6=P1^5;
  47. sbit key7=P1^6;
  48. sbit key8=P1^7;
  49. sbit keyks=P2^0;//开始
  50. sbit keyjia=P2^1;//加
  51. sbit keyjian=P2^2;//减
  52. sbit keyfw=P2^4;//复位
  53. sbit keysz=P3^0;//设置,按一次设置抢答时间,按两次设置答题时间,按三次返回
  54. sbit keyqc=P3^1;//清除积分
  55. sbit ye=P3^2;//液晶锁存
  56. sbit Reset = P3^3;   //复位
  57. sbit RS = P3^5;    //指令数据选择
  58. sbit E = P3^4;    //指令数据控制
  59. sbit CS1 = P3^6;   //左屏幕选择,低电平有效
  60. sbit CS2 = P3^7;   //右屏幕选择
  61. uchar  *ZF;        //数据指针,ZF为首地址         
  62. uchar d,x,y;
  63. uchar num;//选手编号
  64. uchar t0,t1,t2,t3,t4,s3;//定时器时间
  65. uchar dtds,dtds1;//答题定时,设置答题定时
  66. uchar ds,ds1;//抢答定时,设置抢答定时
  67. uchar kaif;//开始标记,0表示未开始,1表示开始
  68. uchar wanf;//抢答完成标记,0表示未完成,1表示完成
  69. uchar daf;//开始答题标记,0表示未开始答题,1表示3s倒计时,2表示开始答题倒计时
  70. uchar setf;//设置标记,0表示未在设置中,1表示正在设置抢答定时,2表示正在设置答题定时
  71. uchar temp;//流水灯
  72. uchar q;//8人按键选择
  73. uchar fen;//分数的中间量
  74. uchar fen1;//八个选手的分数
  75. uchar fen2;
  76. uchar fen3;
  77. uchar fen4;
  78. uchar fen5;
  79. uchar fen6;
  80. uchar fen7;
  81. uchar fen8;
  82. uchar f1,f2,f3,f4,f5,f6,f7,f8;
  83. void init()                                                                                                //初始化子程序
  84. {
  85.         deng=0;//关灯锁存
  86.         duan=0;//关段锁存
  87.         wei=0;//关位锁存
  88.         beep=1;//关蜂鸣器
  89.         keyks=1;//开始按键置1
  90.         keyfw=1;//复位按键置1
  91.         keyjia=1;//加时间按键置1
  92.         keyjian=1;//减时间按键置1
  93.         P1=0xff;//P1口置1
  94.         dtds=dtds1;//设置答题时间
  95.         ds=ds1;//设置抢答时间
  96.         temp=0xfe;
  97.         t0=0;
  98.         t1=0;
  99.         t2=0;
  100.         t3=0;
  101.         t4=0;
  102.         s3=3;
  103.         kaif=0;//开始标记置0
  104.         wanf=0;//抢答完成标记置0
  105.         daf=0;//答题标记置0
  106.         setf=0;//设置标记置0
  107.         TMOD=0x11;//设置定时器0为方式1
  108.         TH0=(65536-50000)/256;//设置50ms
  109.         TL0=(65536-50000)%256;
  110.         EA=1;//开总中断
  111.   ET0=1;//开定时器0中断
  112.         TR0=0;//启动定时器0
  113.         TH1=(65536-50000)/256;//设置50ms
  114.         TL1=(65536-50000)%256;
  115.         ET1=1;//开定时器1中断
  116.         TR1=1;//启动定时器1
  117. }

  118. void Time0() interrupt 1                                         //定时器0中断
  119. {
  120.   TH0=(65536-50000)/256;
  121.         TL0=(65536-50000)%256;
  122.         if(daf==0)//未开始答题,显示抢答倒计时
  123.         {
  124.                 t0++;
  125.                 if(t0==20)//1s计时
  126.                 {t0=0;ds--;}
  127.         }
  128.         if(daf==1)//开始答题之前的3秒倒计时
  129.         {
  130.                 t2++;
  131.                 if(t2==20)
  132.                 {
  133.                         t2=0;
  134.                         s3--;
  135.                         if(s3==0)
  136.                         {
  137.                                 beep=0;
  138.                                 delay(100);
  139.                                 beep=1;
  140.                                 daf=2;
  141.                         }
  142.                 }
  143.         }
  144.         if(daf==2)//开始答题倒计时
  145.         {
  146.                 t3++;
  147.                 if(t3==20)
  148.                 {t3=0;dtds--;}
  149.         }
  150.         if(ds<=6||dtds<=6)//5秒内蜂鸣器报警
  151.         {
  152.                 t4++;
  153.                 if(t4==20)
  154.                 {
  155.                         t4=0;
  156.                         beep=0;
  157.                         delay(100);
  158.                         beep=1;
  159.                 }
  160.         }
  161.         if(ds==0||dtds==0)//计时到0,关闭定时器
  162.         {
  163.                 wanf=1;
  164.                 beep=0;
  165.                 delay(5);
  166.                 TR0=0;
  167.         }
  168. }        
  169. void Time1() interrupt 3                                         //定时器1中断
  170. {
  171.   TH1=(65536-50000)/256;
  172.         TL1=(65536-50000)%256;
  173.         t1++;
  174.         if(t1==10)//1s计时
  175.         {t1=0;temp=_crol_(temp,1);}//流水灯循环左移

  176. }        
  177. void liushui()                                                                                //流水灯
  178. {
  179.                 P0=temp;//灯亮
  180.                 deng=1;
  181.                 deng=0;
  182.                
  183.                 P0=0xfe;
  184.           wei=1;
  185.                 wei=0;
  186. }
  187. void chushi()                                                                                        //数码管初始化 显示四个-
  188. {
  189.                 P0=table[16];//第一位显示-
  190.           duan=1;
  191.                 duan=0;
  192.                 delay(5);
  193.         
  194.                 P0=0xfd;
  195.           wei=1;
  196.                 wei=0;

  197.                 P0=table[16];//第二位显示-
  198.           duan=1;
  199.                 duan=0;
  200.                 delay(5);
  201.         
  202.                 P0=0xfb;
  203.           wei=1;
  204.                 wei=0;

  205.                 P0=table[16];//第三位显示-
  206.           duan=1;
  207.                 duan=0;
  208.                 delay(5);
  209.                
  210.                 P0=0xf7;
  211.           wei=1;
  212.                 wei=0;

  213.                 P0=table[16];//第四位显示-
  214.           duan=1;
  215.                 duan=0;
  216.                 delay(5);
  217. }
  218. void shuzi(uchar a,uchar b)                                //数码管时间号码显示
  219. {
  220.                 uchar shi,ge;
  221.                 shi=a/10;
  222.           ge=a%10;
  223.                
  224.                 P0=0xfe;
  225.           wei=1;
  226.                 wei=0;
  227.                         
  228.           P0=table[shi];//第一位显示十位
  229.           duan=1;        
  230.                 duan=0;
  231.                 delay(5);
  232.         
  233.     P0=0xfd;
  234.           wei=1;
  235.                 wei=0;

  236.                 P0=table[ge];//第二位显示各位
  237.           duan=1;
  238.                 duan=0;
  239.                 delay(5);
  240.                
  241.                 P0=0xfb;
  242.           wei=1;
  243.                 wei=0;

  244.                 P0=table[16];//第三位显示-
  245.           duan=1;
  246.                 duan=0;
  247.                 delay(5);
  248.                
  249.                 P0=0xf7;
  250.           wei=1;
  251.                 wei=0;

  252.                 P0=table[b];//第四位显示选手号码
  253.           duan=1;
  254.                 duan=0;
  255.                 delay(5);
  256.                

  257. }

  258. void baojing(uchar c)                                                        //违规报警
  259. {
  260.           P0=0xfe;
  261.           wei=1;
  262.                 wei=0;
  263.                         
  264.           P0=table[15];//第一位显示F
  265.           duan=1;        
  266.                 duan=0;
  267.                 delay(5);
  268.         
  269.     P0=0xfd;
  270.           wei=1;
  271.                 wei=0;

  272.                 P0=table[15];//第二位显示F
  273.           duan=1;
  274.                 duan=0;
  275.                 delay(5);
  276.                
  277.                 P0=0xfb;
  278.           wei=1;
  279.                 wei=0;

  280.                 P0=table[16];//第三位显示-
  281.           duan=1;
  282.                 duan=0;
  283.                 delay(5);
  284.                
  285.                 P0=0xf7;
  286.           wei=1;
  287.                 wei=0;

  288.                 P0=table[c];//第四位显示选手号码
  289.           duan=1;
  290.                 duan=0;
  291.                 delay(5);
  292.                
  293.                 beep=0;//蜂鸣器报警
  294.                 delay(5);
  295. }
  296. void szxianshi(uchar d,uchar e)                //数码管设置时的显示
  297. {
  298.                 uchar dshi,dge,eshi,ege;
  299.                 dshi=d/10;
  300.                 dge=d%10;
  301.                 eshi=e/10;
  302.                 ege=e%10;
  303.                
  304.                 P0=0xfe;
  305.                 wei=1;
  306.                 wei=0;
  307.                                 
  308.                 P0=table[dshi];//第一位显示抢答定时十位
  309.           duan=1;        
  310.                 duan=0;
  311.                 delay(5);
  312.         
  313.     P0=0xfd;
  314.           wei=1;
  315.                 wei=0;

  316.                 P0=table[dge];//第二位显示抢答定时个位
  317.           duan=1;
  318.                 duan=0;
  319.                 delay(5);
  320.                
  321.                 P0=0xfb;
  322.           wei=1;
  323.                 wei=0;

  324.                 P0=table[eshi];//第三位显示答题定时十位
  325.           duan=1;
  326.                 duan=0;
  327.                 delay(5);
  328.                
  329.                 P0=0xf7;
  330.           wei=1;
  331.                 wei=0;

  332.                 P0=table[ege];//第四位显示答题定时个位
  333.           duan=1;
  334.                 duan=0;
  335.                 delay(5);
  336. }
  337. void shezhi()                                                                                        //设置抢答时间和答题时间
  338. {
  339. if(keysz==0)//判断按下一次设置按键
  340. {
  341.                 delay(5);//延时消抖
  342.                 if(keysz==0)
  343.                 {
  344.                         while(!keysz);//松手判断
  345.       setf++;//setf标志加1
  346.                         while(setf==1)//设置抢答时间
  347.                         {
  348.                                 liushui();
  349.                                 szxianshi(ds1,dtds1);//显示抢答时间和答题时间
  350.                                 if(keyjia==0)//加抢答时间
  351.                                 {
  352.                                         delay(5);
  353.                                         if(keyjia==0)
  354.                                         {
  355.                                                 while(!keyjia);
  356.                                                 ds1++;
  357.                                                 ds=ds1;
  358.                                                 if(ds1>99)ds1=0;
  359.                                         }
  360.                                 }
  361.                                 if(keyjian==0)//减抢答时间
  362.                                 {
  363.                                         delay(5);
  364.                                         if(keyjian==0)
  365.                                         {
  366.                                                 while(!keyjian);
  367.                                                 ds1--;
  368.                                                 ds=ds1;
  369.                                         }
  370.                                 }
  371.                                 if(keysz==0)//判断按下第二次设置按键
  372.                                 {
  373.                                         delay(5);//延时消抖
  374.                                         if(keysz==0)
  375.                                         {
  376.                                                 while(!keysz);//松手判断
  377.                                                 setf++;//setf标志加1
  378.                                         }
  379.                                 }
  380.                          }
  381.                                 while(setf==2)//设置答题时间
  382.                                 {
  383.                                         liushui();
  384.                                         szxianshi(ds1,dtds1);//显示抢答时间和答题时间
  385.                                         if(keyjia==0)//加答题时间
  386.                                         {
  387.                                                 delay(5);
  388.                                                 if(keyjia==0)
  389.                                                 {
  390.                                                         while(!keyjia);
  391.                                                         dtds1++;
  392.                                                         dtds=dtds1;
  393.                                                         if(dtds1>99)dtds1=0;
  394.                                                 }
  395.                                         }
  396.                                         if(keyjian==0)//减答题时间
  397.                                         {
  398.                                                 delay(5);
  399.                                                 if(keyjian==0)
  400.                                                 {
  401.                                                         while(!keyjian);
  402.                                                         dtds1--;
  403.                                                         dtds=dtds1;
  404.                                                 }
  405.                                         }
  406.                                         if(keysz==0)//判断按下第三次设置按键
  407.                                         {
  408.                                                 delay(5);//延时消抖
  409.                                                 if(keysz==0)
  410.                                                 {
  411.                                                         while(!keysz);//松手判断
  412.                                                         setf++;//setf标志加1
  413.                                                 }
  414.                                         }
  415.                                 }
  416.                                 if(setf==3)//setf标志满3清0
  417.                                 {
  418.                                         setf=0;
  419.                                         chushi();//数码管初始化
  420.                                 }
  421.                 }        
  422. }                        
  423. }
  424. void xuanze()                                                                                        //8个选手按键选择
  425. {
  426.                         switch (q)//num对q进行选择
  427.                 {
  428.                         case 0xfe:num=1;break;
  429.                         case 0xfd:num=2;break;
  430.                         case 0xfb:num=3;break;
  431.                         case 0xf7:num=4;break;
  432.                         case 0xef:num=5;break;
  433.                         case 0xdf:num=6;break;
  434.                         case 0xbf:num=7;break;
  435.                         case 0x7f:num=8;break;
  436.                 }
  437.                 P0=tablewei[num-1];//对应灯亮
  438.                 deng=1;
  439.                 deng=0;
  440. }
  441. void scan()                                                                                                //键盘扫描
  442. {
  443. if(P1!=0xff&&wanf==0&&kaif==1)//判断是否有人按下
  444. {
  445.         delay(5);//延时消抖
  446.         if(P1!=0xff&&wanf==0&&kaif==1)
  447.         {
  448.                 q=P1;
  449.                 while(P1!=0xff);//松手判断
  450.                 beep=0;
  451.                 delay(100);
  452.                 beep=1;
  453.                 wanf=1;//抢答完成
  454.                 daf=1;//开始答题
  455.                 xuanze();//8人按键选择
  456.         }
  457. }
  458. }

  459. void jifen()                                                                                        //计分子函数
  460. {
  461.         switch(num)//对选手号码进行选择,给fen赋值
  462.         {
  463.                 case 1:fen=fen1;break;
  464.                 case 2:fen=fen2;break;
  465.                 case 3:fen=fen3;break;
  466.                 case 4:fen=fen4;break;
  467.                 case 5:fen=fen5;break;
  468.                 case 6:fen=fen6;break;
  469.                 case 7:fen=fen7;break;
  470.                 case 8:fen=fen8;break;
  471.         }
  472.         if(keyjia==0)//加分
  473.         {
  474.                 delay(5);
  475.                 if(keyjia==0)
  476.                 {
  477.                         while(!keyjia);
  478.                         fen=fen+10;
  479.                 }
  480.         }
  481.                 if(keyjian==0)//减分
  482.         {
  483.                 delay(5);
  484.                 if(keyjian==0)
  485.                 {
  486.                         while(!keyjian);
  487.                         fen=fen-10;
  488.                 }
  489.         }
  490.         switch(num)//对选手号码进行选择, 把fen值赋给选手
  491.         {
  492.                 case 1:fen1=fen;f1=fen1;break;
  493.                 case 2:fen2=fen;f2=fen2;break;
  494.                 case 3:fen3=fen;f3=fen3;break;
  495.                 case 4:fen4=fen;f4=fen4;break;
  496.                 case 5:fen5=fen;f5=fen5;break;
  497.                 case 6:fen6=fen;f6=fen6;break;
  498.                 case 7:fen7=fen;f7=fen7;break;
  499.                 case 8:fen8=fen;f8=fen8;break;
  500.         }
  501. }
  502. void delayus(uint time)        //延时
  503.          {
  504.            while(time --);
  505.          }

  506. void writedata(uchar dat)        //写数据
  507. {
  508.          delayus(5);
  509.          E = 1;        
  510.          RS = 1;
  511.          P0 = dat;
  512.          ye=1;
  513.          ye=0;
  514.          E = 0;
  515. }
  516. void writecmd(uchar cmd)          //写地址/命令
  517. {
  518.   delayus(5);
  519.   E = 1;        
  520.         RS = 0;
  521.   P0 = cmd;
  522.         ye=1;
  523.         ye=0;
  524.   E = 0;
  525. }
  526. void setPM(uchar PM) //选择屏幕( 0-左屏,1-右屏,2-全屏  )
  527. {
  528. switch(PM)
  529. {
  530.    case 0 :         CS1 = 0;         CS2 = 1;   break;
  531.    case 1 :         CS1 = 1;    CS2 = 0;   break;
  532.    default :    CS1 = 0;    CS2 = 0;
  533. }
  534. }
  535. void set_x( x)  //x -> 0 : 7 页
  536. {
  537. x = x&0x07|0xb8;         
  538. writecmd(x);
  539. }
  540.                
  541. void set_y( y) //y -> 0 :63 列
  542. {
  543. y = y & 0x3f|0x40;         
  544. writecmd(y);
  545. }

  546. void chearPM(uchar PM)  //清屏(0-清左屏,1-清右屏,2-清全屏 )
  547. {
  548.    uchar i,j;
  549.    setPM(PM);
  550.          for(i = 0;i < 8;i++)         
  551.            {
  552.                   set_x(i);                   //从第0到第7页
  553.                   set_y(0);                                //从第0列开始
  554.                   for(j = 0;j < 64; j++)        //在PM=2的情况下左右半屏同时全写0.
  555.                   writedata(0x00);         
  556.            }   
  557. }        
  558. void InitLcd()                  //LCD初始化
  559. {
  560.   Reset = 0;        
  561.         delayus(2);
  562.         Reset = 1;        
  563.         delayus(2);//软件复位                    
  564.   chearPM(2);        //清屏
  565. }
  566. void showZF( x, y, uchar *ZF)          //显示一个字符
  567. {
  568. uchar i;
  569. set_x(x); set_y(y);                            //设置页地址,设置列地址
  570. for(i = 0;i < 8;i ++) writedata(*(ZF++));        // 写字符的上半部分
  571. set_x(x + 1);set_y(y);         
  572. for(i = 0;i < 8;i ++)        writedata(*(ZF++));         // 写字符的下半部分
  573. }
  574. void display()//液晶显示
  575. {
  576.         setPM(0);
  577.         showZF(0,1,ZF_tab+16);
  578.         showZF(0,17,ZF_tab+f1*16);
  579.         showZF(0,25,ZF_tab);
  580.         
  581.         showZF(2,1,ZF_tab+32);
  582.         showZF(2,17,ZF_tab+f2*16);
  583.         showZF(2,25,ZF_tab);
  584.         
  585.         showZF(4,1,ZF_tab+48);
  586.         showZF(4,17,ZF_tab+f3*16);
  587.         showZF(4,25,ZF_tab);
  588.         
  589.         showZF(6,1,ZF_tab+64);
  590.         showZF(6,17,ZF_tab+f4*16);
  591.         showZF(6,25,ZF_tab);

  592.         setPM(1);
  593.         showZF(0,1,ZF_tab+80);
  594.         showZF(0,17,ZF_tab+f5*16);
  595.         showZF(0,25,ZF_tab);
  596.         
  597.         showZF(2,1,ZF_tab+96);
  598.         showZF(2,17,ZF_tab+f6*16);
  599.         showZF(2,25,ZF_tab);
  600.         
  601.         showZF(4,1,ZF_tab+112);
  602.         showZF(4,17,ZF_tab+f7*16);
  603.         showZF(4,25,ZF_tab);
  604.         
  605.         showZF(6,1,ZF_tab+128);
  606.         showZF(6,17,ZF_tab+f8*16);
  607.         showZF(6,25,ZF_tab);
  608.         setPM(2);
  609. }
  610. void main()                                                                                    //主函数
  611. {
  612.                         ds1=60;//抢答时间和答题时间初始化
  613.                         dtds1=60;
  614.                         ye=0;
  615.                         InitLcd();
  616.         
  617. LOOP0:fen=0;//分数初始化
  618.                         fen1=0;
  619.                         fen2=0;
  620.                         fen3=0;
  621.                         fen4=0;
  622.                         fen5=0;
  623.                         fen6=0;
  624.                         fen7=0;
  625.                         fen8=0;
  626.                         f1=fen1/10;
  627.                         f2=fen2/10;
  628.                         f3=fen3/10;
  629.                         f4=fen4/10;
  630.                         f5=fen5/10;
  631.                         f6=fen6/10;
  632.                         f7=fen7/10;
  633.                         f8=fen8/10;
  634.         
  635. LOOP1:init();//初始化子函数
  636.                         while(kaif==0)//抢答未开始
  637.                         {
  638.                                 liushui();//流水灯
  639.                                 chushi();//数码管初始状态
  640.                                 shezhi();//抢答时间和答题时间的设置
  641.                                 display();
  642.                                 if(keyqc==0)
  643.                                 {
  644.                                         delay(5);
  645.                                         if(keyqc==0)
  646.                                         {
  647.                                                 while(!keyqc);
  648.                                                 goto LOOP0;
  649.                                         }
  650.                                 }
  651.                                 if(kaif==0&&P1!=0xff)//判断是否有违规抢答
  652.                                 {
  653.                                         delay(5);
  654.                                         if(kaif==0&&P1!=0xff)
  655.                                         {
  656.                                                 q=P1;
  657.                                                 while(P1!=0xff);//松手判断
  658.                                                 while(1)
  659.                                                 {
  660.                                                         xuanze();//8人按键选择
  661.                                                         baojing(num);//违规报警
  662.                                                         if(keyfw==0)goto LOOP1;//回到初始化子程序
  663.                                                 }
  664.                                         }
  665.                                 }
  666.                                 if(keyks==0&&setf==0)//判断抢答是否开始
  667.                                 {
  668.                                         delay(5);//延时消抖
  669.                                         if(keyks==0)
  670.                                         {
  671.                                                 while(!keyks);//松手判断
  672.                                                 beep=0;
  673.                                                 delay(100);
  674.                                                 beep=1;
  675.                                                 P0=0xff;//关灯
  676.                                                 deng=1;
  677.                                                 deng=0;
  678.                                                 TR0=1;//开定时器0,关定时器1
  679.                                                 TR1=0;
  680.                                                 num=0;//显示0
  681.                                                 kaif=1;//抢答开始标记
  682.                                         }
  683.                                 }
  684.                         }
  685.                         while(kaif==1)//抢答开始
  686.                         {
  687.                                 if(daf==0)//未开始答题
  688.                                 {
  689.                                         scan();//键盘扫描
  690.                                         shuzi(ds,num);//数码管显示
  691.                                 }
  692.                                 else
  693.                                 {
  694.                                         if(daf==1)
  695.                                                 shuzi(s3,num);//答题之前3秒倒计时
  696.                                         else
  697.                                                 shuzi(dtds,num);//开始答题,答题倒计时
  698.                                                 if(!keyjia||!keyjian)
  699.                                                 {
  700.                                                         TR0=0;
  701.                                                         while(keyfw&&keyqc)
  702.                                                         {
  703.                                                                 shuzi(dtds,num);
  704.                                                                 jifen();
  705.                                                                 display();
  706.                                                         }
  707.                                                 }
  708.                                 }
  709.                                 if(keyfw==0)//复位
  710.                                 {
  711.                                         delay(5);
  712.                                         if(keyfw==0)
  713.                                         {
  714.                                                 while(!keyfw);
  715.                                                 goto LOOP1;//回到初始化子程序
  716.                                         }
  717.                                 }
  718.                                 if(keyqc==0)
  719.                                 {
  720.                                         delay(5);
  721.                                         if(keyqc==0)
  722.                                         {
  723.                                                 while(!keyqc);
  724.                                                 goto LOOP0;
  725.                                         }
  726.                                 }
  727.                         }

  728. }
复制代码


加液晶.zip

112.59 KB, 下载次数: 14

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

使用道具 举报

沙发
ID:491412 发表于 2019-3-25 22:04 | 只看该作者
多提一句,虽然他显示的是乱码,但是1和2对应的乱码,我来回切换好多次发现都是不变的,算是。。有规律的乱码吧,不知道什么情况,如果是一开始就显示1或者2那没问题,就是一加减分操作就出问题
回复

使用道具 举报

板凳
ID:123289 发表于 2019-3-27 08:41 | 只看该作者
画出逻辑框图,画的时候或许你就明白了。
回复

使用道具 举报

地板
ID:491412 发表于 2019-3-27 21:32 | 只看该作者
yzwzfyz 发表于 2019-3-27 08:41
画出逻辑框图,画的时候或许你就明白了。

我是初学者,不知道逻辑框图怎么画。。做的时候脑子其实一团浆糊,全靠仿真找问题,算了,还是回头问老师吧。话说你也是扬州的啊,我是扬大的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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