电子产品世界 » 论坛首页 » 高校社团 » 坤创E-Geek/天科大新电社 » 关于蓝桥杯训练小程序(3)独立按键练习

共2条 1/1 1 跳转至

关于蓝桥杯训练小程序(3)独立按键练习

菜鸟
2019-01-24 21:53:49    评分

这是关于蓝桥杯备赛路上练习的小程序,蓝桥杯的竞赛路上希望大家互相勉励。      

  •  祝大家有个好成绩。  

  • 以下代码是我利用手头上小红板(JW-51)训练的小程序。  

  • 希望大家一同进步。  

#include<reg52.h>  //按键1  使数码管数字+1 长按连续+1
                     按键2  使数码管数字-1 长按连续-1
typedef unsigned int u16;
typedef unsigned char u8;
  unsigned char code smgduan[]={0x3f,
  0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
   unsigned char code smgwei[]={0xfe,
  0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
sbit rclk=P2^5;
sbit srclk=P2^6;
sbit ser=P2^7;
sbit key0=P3^0;
sbit key1=P3^1; 
sbit key2=P3^2;
sbit key3=P3^3;
 u8 num;
 void smg_dis();
 void send_595(u8 n);
void delay(u16 n)
{
 u8 i ;
 while (n--)
  for(i=0;i<125;i++);
}
void main()
{
    while(1)
 {
 if(key0==0){
  delay(100);
   if(key0==0){
   num=num+1;
   if(num==256)
    num=0;
  }
 }
  if(key1==0){
  delay(100);
   if(key1==0){
   num=num-1;
   if(num==0)
    num=256;
  }
 }
  smg_dis();
 }
}
  void smg_dis()
  { 
         send_595(smgwei[0]);
      send_595(smgduan[num/100]);    
      rclk=0;
      rclk=1;
          delay(1);
         send_595(smgwei[1]);
      send_595(smgduan[num%100/10]);    
      rclk=0;
      rclk=1;
          delay(1);
         send_595(smgwei[2]);
      send_595(smgduan[num%10]);    
      rclk=0;
      rclk=1;
          delay(1);  
}
  void send_595(u8 n)
  {
   u8 i;
   for(i=0;i<8;i++)
   {
     if(n&0x80 )
        ser=1;
     else
     ser=0;
     srclk=0;  
     srclk=1;
     n=n<<1;
  }
  }

/*课程设计自动计数器 数码管显示 一个按键每次按下使数字+1*/
/*同时LED灯闪一次,另一个按键按下后清零同时蜂鸣器响一声*/
#include<reg52.h>
  typedef unsigned char u8;
  typedef unsigned int u16;
  sbit ser=P2^7;   //定义数码管端口
  sbit srclk=P2^6;
  sbit rclk=P2^5;
sbit key1=P3^0;   //定义独立键盘端口
sbit key2=P3^1;
sbit key3=P2^3; //定义蜂鸣器端口
  unsigned char code smgduan[]={0x3f,       
  0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
  0x77,0x7c,0x39,0x5e,0x79,0x71};     //段选数组
   unsigned char code smgwei[]={0xfe,
  0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};   //位选数组
  void DelayMs(u16 n);     //延时函数
 u8 DispSmg(u8 n);        //数码管显示函数
 
 void send_595(u8 dat);   //输送段选位选数据函数
 void main()      //主函数
 {
  u16 n;
    while(1)
  { 
   DispSmg(n);
   if(key2==0)   //若key2按下
 { 
  DelayMs(100);
   if(key2==0) //消抖 确认key2被按下
  {
   n=0;   //n被赋值为0
    key3=0;  
DelayMs(20);
key3=1;   //蜂鸣器响0.02秒后灭 
 }   
 }
    if(key1==0)
 { 
  DelayMs(100);
   if(key1==0) //消抖 确认key1被按下
  {
   n++;    //n每次在原来的基础上+1
      P1=0xfe;
   DelayMs(100);
   P1=0xff; //发光二极管亮0.1秒后灭 
  }
 }
}}
 void DelayMs(u16 n)
 {
   u8 i;
  while(n--)
    for(i=0;i<113;i++);
 }
 
 u8 DispSmg(u8 n)
 {
  send_595(smgwei[5]);      //输送位码数据 提供显示位置
      send_595(smgduan[n/100]);   //输送段码数据 提供显示内容   
      rclk=0;
      rclk=1;    //上升沿有效  说明输送数据到数码管
     send_595(smgwei[6]);
      send_595(smgduan[n/10%10]);    
      rclk=0;
      rclk=1;
      send_595(smgwei[7]);
      send_595(smgduan[n%10]);    
      rclk=0;
      rclk=1;
 }
 void send_595(u8 dat)  
 {
    u8 i;
  for(i=0;i<8;i++)   //比较8次 每次提交一位数据 一共八位数据
  {
    if(dat&0x80)
    ser=1;
   else
    ser=0;
   srclk=0;
      srclk=1;        //上升沿有效  说明输送数据到数码管
   dat=dat<<1;       被输送的数据左移一位
  }
 }




关键词: 训练     按键    

工程师
2019-01-24 23:58:36    评分
2楼

优秀~


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]