找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机按键按着没反应,各位大神来帮看看

[复制链接]
跳转到指定楼层
楼主
ID:257618 发表于 2017-12-10 22:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码如下
实现功能:
上电自检,数码管 LED 全亮, 3 秒钟后黑屏,然后蜂鸣器响 200mS;
(25 分)
2 按键 S4,显示学号后四位;(15 分)
3 按下 S5, 测温,即显示当前温度;
再次按下 S5,将温度显示为华氏温度。(25 分)
4 按下 S6,存储当前温度;(15 分)
5 按下 S7,显示存储温度;再次按下 S7,将温度显示为华氏温度。  

卡在写按键很久了,不知道哪有逻辑问题,大神帮忙看看

单片机源程序如下:
  1. #include<STC15F2K60S2.H>
  2. #include<onewire.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int      
  5.                  //  0    1    2    3    4    5    6    7    8    9    .   a     b    c    d    e   f   熄灭
  6. uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xFF};
  7. uchar yi,er,san,si,wu ,liu,qi,ba,temp,b;
  8. int num=600;int nun=640;
  9. int ducunwendu[];
  10. void delayms(int ms);
  11. void allinit();
  12. int keycan();
  13. void Timer0Init(void);
  14. void display1(uchar yi,uchar er);
  15. void display2(uchar san,uchar si);
  16. void display3(uchar wu,uchar liu);
  17. void display4(uchar qi,uchar ba);

  18. void main()
  19. {float wendu;float huashi;int x;
  20.       
  21.         allinit();

  22.       
  23.         P0=0X00;
  24.         P2=0X80;
  25.         P0=0X00;
  26.       
  27.                                 Timer0Init();
  28.       
  29.         while(1)
  30.         {
  31.                 keycan();
  32.                 x=keycan();
  33.                 if(x==1)
  34.                 {
  35.                        
  36.                        
  37.                 }
  38.                 else if(x==2)
  39.                 {
  40.                        
  41.                        
  42.                 }
  43.                         else if(x==3)
  44.                 {
  45.             b++;
  46.                         if(b==1)
  47.                         {yi=17;er=17;san=17;si=17;wu=17;
  48.                         wendu=rd_temperature_f();
  49.                        
  50.                    wu=(int)(wendu/10)%10;
  51.              liu=(int)wendu%10;
  52.                         P2=0XFF;
  53.                        
  54.                        
  55.                    qi=(int)(wendu*10)%10;
  56.                        
  57.                     ba= 13;
  58.                        
  59.                     display1(yi,er);
  60.                     display2(san,si);
  61.                     display3(wu,liu);
  62.                           display3(wu,10);
  63.         display4(qi,ba);}
  64.                               
  65.                         if(b==2)
  66.                         {
  67.                                 yi=17;er=17;san=17;si=17;wu=17;
  68.                         wendu=rd_temperature_f();
  69.                         huashi=wendu*1.8+32;
  70.                    wu=(int)(huashi/10)%10;
  71.              liu=(int)huashi%10;
  72.                         P2=0XFF;
  73.                        
  74.                        
  75.                    qi=(int)(huashi*10)%10;
  76.                        
  77.                     ba= 13;
  78.                        
  79.                     display1(yi,er);
  80.                     display2(san,si);
  81.                     display3(wu,liu);
  82.                           display3(wu,10);
  83.         display4(qi,ba);
  84.                                 b=0;
  85.                         }
  86.       
  87.                
  88.                        
  89.                        
  90.                
  91.                        
  92.                 }
  93.                 else if(x==4)
  94.                 {yi=17;er=17;san=17;si=17;
  95.                         wu=8;liu=0;qi=3;ba=4;
  96.                         display1(yi,er);
  97.                 display2(san,si);
  98.                 display3(wu,liu);
  99.                 display4(qi,ba);
  100.                 }
  101.                
  102.         }
  103. }





  104. void delayms(int ms)
  105. {
  106.         int i,j;
  107.         for(i=ms;i>0;i--)
  108.                 for(j=845;j>0;j--);
  109. }

  110. void allinit()
  111. {
  112.         P2=0XA0;
  113.         P0=0X00;//关闭蜂鸣器,继电器
  114.       
  115.         P2=0X80;
  116.         P0=0XFF;//关闭LED灯
  117.       
  118.         P2=0XC0;
  119.         P0=0XFF;//选择所有数码管
  120.         P2=0XFF;
  121.         P0=0XFF;//关闭所有数码管
  122. }

  123. void display1(uchar yi,uchar er)
  124. {
  125.                 P2=0XC0;//打开位选573   U8
  126.                 P0=0X01;//选择第一个数码管
  127.                 P2=0XFF;//打开段选573   U7
  128.                 P0=tab[yi];
  129.                 delayms(1);
  130.                
  131.                 P2=0XC0;//打开位选573   U8
  132.                 P0=0X02;//选择第二个数码管
  133.                 P2=0XFF;//打开段选573   U7
  134.                 P0=tab[er];
  135.                 delayms(1);
  136. }      

  137. void display2(uchar san,uchar si)
  138. {
  139.                 P2=0XC0;//打开位选573   U8
  140.                 P0=0X04;//选择第三个数码管
  141.                 P2=0XFF;//打开段选573   U7
  142.                 P0=tab[san];
  143.                 delayms(1);
  144.                
  145.                 P2=0XC0;//打开位选573   U8
  146.                 P0=0X08;//选择第四个数码管
  147.                 P2=0XFF;//打开段选573   U7
  148.                 P0=tab[si];
  149.                 delayms(1);
  150. }

  151. void display3(uchar wu,uchar liu)
  152. {
  153.                 P2=0XC0;//打开位选573   U8
  154.                 P0=0X10;//选择第一个数码管
  155.                 P2=0XFF;//打开段选573   U7
  156.                 P0=tab[wu];
  157.                 delayms(1);
  158.                
  159.                 P2=0XC0;//打开位选573   U8
  160.                 P0=0X20;//选择第一个数码管
  161.                 P2=0XFF;//打开段选573   U7
  162.                 P0=tab[liu];
  163.                 delayms(1);
  164. }

  165. void display4(uchar qi,uchar ba)
  166. {
  167.                 P2=0XC0;//打开位选573   U8
  168.                 P0=0X40;//选择第一个数码管
  169.                 P2=0XFF;//打开段选573   U7
  170.                 P0=tab[qi];
  171.                 delayms(1);
  172.                
  173.                 P2=0XC0;//打开位选573   U8
  174.                 P0=0X80;//选择第一个数码管
  175.                 P2=0XFF;//打开段选573   U7
  176.                 P0=tab[ba];
  177.                 delayms(1);
  178. }





  179. void Timer0Init(void)                //5毫秒@11.0592MHz
  180. {
  181.         AUXR |= 0x80;                //定时器时钟1T模式
  182.         TMOD &= 0xF0;                //设置定时器模式
  183.         TL0 = 0x00;                //设置定时初值
  184.         TH0 = 0x28;                //设置定时初值
  185.         TF0 = 0;                //清除TF0标志
  186.         TR0 = 1;
  187. EA=1;
  188. ET0=1;        //定时器0开始计时
  189. }

  190. void Timer0() interrupt 1
  191. {
  192.         num--;
  193. nun--;
  194.         if(num==0)
  195.         {
  196.       
  197.                 P0=0XFF;
  198.                 P2=0XFF;
  199.                 P0=0XFF;
  200.                 P2=0XA0;
  201.                 P0=0X40;
  202.         }
  203.         if(nun==0)
  204.         {P0=0X00;}
  205. }

  206. int keycan()
  207. {int s1=0;
  208.         P3=0x7f;P4=0xef;
  209.         temp=P3;
  210.         if(P3!=0x7f)
  211.         {
  212.                 delayms(5);
  213.                 temp=P3;
  214.                 if(P3!=0x7f)
  215.                 {
  216.                         switch(temp)
  217.                         {
  218.                                 case 0x7e : s1=1; break;
  219.                                 case 0x7d : s1=2; break;
  220.                                 case 0x7b : s1=3; break;
  221.                                 case 0x77 : s1=4; break;
  222.                         }
  223.                         while(temp!=0x7f)
  224.                         {
  225.                                 temp=P3;
  226.                                 delayms(5);
  227.                         }
  228.                 }
  229.         }
  230.         return s1;
  231. }
复制代码

评分

参与人数 1黑币 +5 收起 理由
马騳骉 + 5 回帖助人的奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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