标题: stc15单片机按键循环显示源码 [打印本页]

作者: 王wincc    时间: 2018-3-29 17:05
标题: stc15单片机按键循环显示源码
单片机源程序如下:
  1. #include<stc15f2k60s2.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int

  4. uint i;
  5. uint ss_data=0;
  6. uint SS=0;
  7. uchar num=0;
  8. uchar code tab[]={0xc0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0Xc6,0Xa1,0X86,0X8e};//ROM
  9. void delayms(int ms);
  10. void keyscan16();
  11. void Timer0Init(void);
  12. void main()
  13. {
  14. Timer0Init();
  15. EA=1;
  16. P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;  //板子初始化程序 ,以后讲
  17. P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF;  //数码管初始化程序,以后讲

  18.   P0=tab[0];
  19. while(1)
  20. {
  21.   keyscan16();
  22. }
  23. }
  24. void keyscan16()
  25. {
  26. uchar temp;

  27. P44=0;P42=1;P3=0X7F;
  28. temp=P3;
  29. temp=temp&0X0F;//1111 1101 & 0000 1111 = 0000 1101
  30. if(temp!=0x0f)
  31. {
  32.   delayms(5);
  33.   temp=P3;
  34.   temp=temp&0X0F;
  35.   if(temp!=0x0f)
  36.   {
  37.    temp=P3;
  38.    ET0=1;
  39.    switch(temp)
  40.    {
  41.     case 0x7e: ss_data=800;break;
  42.     case 0x7d: ss_data=400;break;
  43.     case 0x7b: ss_data=200;break;
  44.     case 0x77: ss_data=100;break;
  45.    }
  46.    while(temp!=0x0f)
  47.    {
  48.     temp=P3;
  49.     temp=temp&0X0F;
  50.    }
  51.   }
  52. }
  53. P44=1;P42=0;P3=0XBF;//1011 111
  54. temp=P3;
  55. temp=temp&0X0F;//1111 1101 & 0000 1111 = 0000 1101
  56. if(temp!=0x0f)
  57. {
  58.   delayms(5);
  59.   temp=P3;
  60.   temp=temp&0X0F;
  61.   if(temp!=0x0f)
  62.   {
  63.    temp=P3;
  64.    switch(temp)
  65.    {
  66.     case 0xBe: P0=tab[0];break;//1111 1110 P37----p30
  67.     case 0xBd: P0=tab[5];break;//1111 1101
  68.     case 0xBb: P0=tab[6];break;
  69.     case 0xB7: P0=tab[7];break;
  70.    }
  71.    while(temp!=0x0f)
  72.    {
  73.     temp=P3;
  74.     temp=temp&0X0F;
  75.    }
  76.   }
  77. }

  78. P3=0XDF;P44=1;P42=1;//1101 1111
  79. temp=P3;
  80. temp=temp&0X0F;//1111 1101 & 0000 1111 = 0000 1101
  81. if(temp!=0x0f)
  82. {
  83.   delayms(5);
  84.   temp=P3;
  85.   temp=temp&0X0F;
  86.   if(temp!=0x0f)
  87.   {
  88.    temp=P3;
  89.    switch(temp)
  90.    {
  91.     case 0xDe: P0=tab[8];break;//1111 1110 P37----p30
  92.     case 0xDd: P0=tab[9];break;//1111 1101
  93.     case 0xDb: P0=tab[10];break;
  94.     case 0xD7: P0=tab[11];break;
  95.    }
  96.    while(temp!=0x0f)
  97.    {
  98.     temp=P3;
  99.     temp=temp&0X0F;
  100.    }
  101.   }
  102. }

  103. P3=0XEF;P44=1;P42=1;//1101 1111
  104. temp=P3;
  105. temp=temp&0X0F;//1111 1101 & 0000 1111 = 0000 1101
  106. if(temp!=0x0f)
  107. {
  108.   delayms(5);
  109.   temp=P3;
  110.   temp=temp&0X0F;
  111.   if(temp!=0x0f)
  112.   {
  113.    temp=P3;
  114.    switch(temp)
  115.    {
  116.     case 0xEe: P0=tab[0];break;//1111 1110 P37----p30
  117.     case 0xEd: P0=tab[2];break;//1111 1101
  118.     case 0xEb: P0=tab[4];break;
  119.     case 0xE7: P0=tab[6];break;
  120.    }
  121.    while(temp!=0x0f)
  122.    {
  123.     temp=P3;
  124.     temp=temp&0X0F;
  125.    }
  126.   }
  127. }
  128. }
  129. void Timer0Init(void)  //5毫秒@11.0592MHz
  130. {
  131. // AUXR |= 0x80;  //定时器时钟1T模式    AUXR =AUXR|0x80;   0010 1010  | 1000 0000 = 1010 1010
  132. // TMOD &= 0xF0;  //设置定时器模式   // TMOD = TMOD&0xF0;   1010 1010 & 1111 0000 = 1010 0000
  133. AUXR=0X80;
  134. TMOD=0XF0;//11.0592MHz  55296  5MS   65536-55296=10240                  
  135. TL0 = 0x00;  //设置定时初值   
  136. TH0 = 0x28;  //设置定时初值
  137. TF0 = 0;  //清除TF0标志
  138. TR0 = 1;  //定时器0开始计时
  139. }
  140. void time0(void) interrupt 1
  141. {
  142. SS=SS+1;
  143. if(SS==ss_data)
  144. {
  145.   SS=0;
  146.   P0=tab[num];
  147.   num++;
  148.   if(num==16)num=0;
  149. }
  150. }
  151. void delayms(int ms)
  152. {
  153. int i,j;
  154. for(i=ms;i>0;i--)
  155.   for(j=845;j>0;j--);
  156. }
复制代码




作者: wxxl    时间: 2018-3-29 22:06
学习了,谢谢!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1