这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » jomatch MCU DIY进程帖--电路板调试

共26条 3/3 1 2 3 跳转至
菜鸟
2011-12-24 18:14:40     打赏
21楼

/*
按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4...
*/
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;

sbit wela=P2^0;
sbit dula=P3^7;
uint t0;
uint aa,num;
uchar ge,shi,bai;
uchar temp;

uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xa7,0xa1,0x86,0x8e};
void delay(uint z)
{
 uint x,y;
 for(x=118;x>0;x--)
  for(y=z;y>0;y--);
}
void display(uchar,uchar,uchar);
uint keyscan();
void main()
{
 P3=0xFF;
 t0=0;
 TMOD=0x01;
 TH0=(65536-10000)/256;
 TL0=(65536-10000)%256;
 EA=1;
 ET0=1;
 TR0=1;
 while(1)
 {
 aa=keyscan();
 bai=aa/100;
 shi=aa%100/10;
 ge=aa%10;
 display(ge,shi,bai);
 }
}

void timer0() interrupt 1
{
 TH0=(65536-10000)/256;
 TL0=(65536-10000)%256;
 t0++;
 bai=t0/100;
 shi=t0%100/10;
 ge=t0%10;
 if(t0==1000)
  t0=0;
}

void display(uchar ge,uchar shi,uchar bai)
{
 wela=1;
 P0=0x80;
 wela=0;
 dula=1;
 P0=table[ge];
 dula=0;
 delay(10);
 
 wela=1;
 P0=0x40;
 wela=0;
 dula=1;
 P0=table[shi];
 dula=0;
 delay(10);

 wela=1;
 P0=0x20;
 wela=0;
 dula=1;
 P0=table[bai];
 dula=0;
 delay(10); 
}

uint keyscan()
{
 P3=0xfe;
 temp=P3;
 temp=temp & 0xf0;
 while(temp!=0xf0)
 {
  delay(5);
  P3=0xfe;
  temp=P3;
  temp=temp & 0xf0; 
  while(temp!=0xf0) 
  {
   temp=P3;
   switch(temp)
   {
    case 0xee : num=1;
    break;
    case 0xde : num=4;
    break;
    case 0xbe : num=9;
    break;
    case 0x7e : num=16;
    break;
   }  
   while(temp!=0xf0)
   { 
    temp=P3;
    temp=temp & 0xf0;
   }
  }
 }

 P3=0xfd;
 temp=P3;
 temp=temp & 0xf0;
 while(temp!=0xf0)
 {
  delay(5);
  P3=0xfd;
  temp=P3;
  temp=temp & 0xf0; 
  while(temp!=0xf0) 
  {
   temp=P3;
   switch(temp)
   {
    case 0xed : num=25;
    break;
    case 0xdd : num=36;
    break;
    case 0xbd : num=49;
    break;
    case 0x7d : num=64;
    break;
   }  
   while(temp!=0xf0)
   { 
    temp=P3;
    temp=temp & 0xf0;
   }
  }
 }

 P3=0xfb;
 temp=P3;
 temp=temp & 0xf0;
 while(temp!=0xf0)
 {
  delay(5);
  P3=0xfb;
  temp=P3;
  temp=temp & 0xf0; 
  while(temp!=0xf0) 
  {
   temp=P3;
   switch(temp)
   {
    case 0xeb : num=81;
    break;
    case 0xdb : num=100;
    break;
    case 0xbb : num=121;
    break;
    case 0x7b : num=144;
    break;
   }  
   while(temp!=0xf0)
   { 
    temp=P3;
    temp=temp & 0xf0;
   }
  }
 }

 P3=0xf7;
 temp=P3;
 temp=temp & 0xf0;
 while(temp!=0xf0)
 {
  delay(5);
  P3=0xf7;
  temp=P3;
  temp=temp & 0xf0; 
  while(temp!=0xf0) 
  {
   temp=P3;
   switch(temp)
   {
    case 0xe7 : num=169;
    break;
    case 0xd7 : num=196;
    break;
    case 0xb7 : num=225;
    break;
    case 0x77 : num=256;
    break;
   }  
   while(temp!=0xf0)
   { 
    temp=P3;
    temp=temp & 0xf0;
   }
  }
 }


return num;
}


菜鸟
2011-12-24 18:15:10     打赏
22楼

/*
1数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。(用定时器设计表)。
2在上题的基础上,用另外三个独立键盘实现按下第一个时计时停止,按下第二个时计时开始,按下第三个是计数值清零从头开始。
*/
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;

sbit wela=P2^0;
sbit dula=P3^7;
sbit key0=P3^0;
sbit key1=P3^1;
sbit key2=P3^2;
sbit key3=P3^3;
uint t0;
uchar ge,shi,bai;

uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xa7,0xa1,0x86,0x8e};
void delay(uint z)
{
 uint x,y;
 for(x=118;x>0;x--)
  for(y=z;y>0;y--);
}
void display(uchar,uchar,uchar);
void main()
{
 P3=0xFF;
 t0=0;
 TMOD=0x01;
 TH0=(65536-10000)/256;
 TL0=(65536-10000)%256;
 EA=1;
 ET0=1;
 TR0=1;
 while(1)
 {
  display(ge,shi,bai);
  if(key0==0)
  {
   delay(10);
   if(key0==0)
   {
    TR0=0;
    while(!key0)
    display(ge,shi,bai);
    TR0=1;
   }
  }

  if(key1==0)
  {
   delay(10);
   if(key1==0)
   {
    TR0=0;
    while(!key1)
    display(ge,shi,bai);
   }
  }

  if(key2==0)
  {
   delay(10);
   if(key2==0)
   {
    TR0=1;
   }
  }

  if(key3==0)
  {
   delay(10);
   if(key3==0)
   {
    t0=0;
   }
  }
 
 }
}

void timer0() interrupt 1
{
 TH0=(65536-10000)/256;
 TL0=(65536-10000)%256;
 t0++;
 bai=t0/100;
 shi=t0%100/10;
 ge=t0%10;
 if(t0==1000)
  t0=0;
}

void display(uchar ge,uchar shi,uchar bai)
{
 wela=1;
 P0=0x80;
 wela=0;
 dula=1;
 P0=table[ge];
 dula=0;
 delay(10);
 
 wela=1;
 P0=0x40;
 wela=0;
 dula=1;
 P0=table[shi];
 dula=0;
 delay(10);

 wela=1;
 P0=0x20;
 wela=0;
 dula=1;
 P0=table[bai];
 dula=0;
 delay(10); 
}


菜鸟
2011-12-24 18:15:42     打赏
23楼

/*
利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当
数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。到此保持住
*/
#include <reg52.h>
#include <intrins.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit D1=P1^1;
sbit key1=P3^0;

sbit dula=P3^7;
sbit wela=P2^0;
uchar t,num,temp;

uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xa7,0xa1,0x86,0x8e};


void delay(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=210;y>0;y--); 
}

void main()
{
 dula=1;
 P0=0xff;
 dula=0;
 wela=1;
 P0=0xff;
 wela=0;

 while(1)
 {
  P3=0xfe;//赋第一个值
  temp=P3;//读回P3口的值
  temp=temp & 0xf0;//先与0xf0相与,判断是否还等于0xf0
  while(temp!=0xf0)//当按键按下时,此表达式为真,则运行下面语句,否则不运行。检测temp
  {
   delay(5);
   temp=P3;
   temp=temp & 0xf0;
   while(temp!=0xf0)
   {
    temp=P3;
    switch(temp)//将temp与case中值比较
    {
     case 0xee : num=1;
      break;//跳出switch语句
     case 0xde : num=2;
      break;//跳出switch语句
     case 0xbe : num=3;
      break;//跳出switch语句
     case 0x7e : num=4; 
      break;//跳出switch语句
    }
//松手检测在没有的情况下,按键无法转换
   while(temp!=0xf0)
   {
    temp=P3;
    temp=temp&0xf0;
   }
   dula=1;
   P0=table[num-1];
   dula=0;
   }

  }


  P3=0xfd;//赋第一个值
  temp=P3;//读回P3口的值
  temp=temp & 0xf0;//先与0xf0相与,判断是否还等于0xf0
  while(temp!=0xf0)//当按键按下时,此表达式为真,则运行下面语句,否则不运行。检测temp
  {
   delay(5);
   temp=P3;
   temp=temp & 0xf0;
   while(temp!=0xf0)
   {
    temp=P3;
    switch(temp)//将temp与case中值比较
    {
     case 0xed : num=5;
      break;//跳出switch语句
     case 0xdd : num=6;
      break;//跳出switch语句
     case 0xbd : num=7;
      break;//跳出switch语句
     case 0x7d : num=8; 
      break;//跳出switch语句
    }
   while(temp!=0xf0)
   {
    temp=P3;
    temp=temp&0xf0;
   }
   dula=1;
   P0=table[num-1];
   dula=0;
   }

  }


  P3=0xfb;//赋第一个值
  temp=P3;//读回P3口的值
  temp=temp & 0xf0;//先与0xf0相与,判断是否还等于0xf0
  while(temp!=0xf0)//当按键按下时,此表达式为真,则运行下面语句,否则不运行。检测temp
  {
   delay(5);
   temp=P3;
   temp=temp & 0xf0;
   while(temp!=0xf0)
   {
    temp=P3;
    switch(temp)//将temp与case中值比较
    {
     case 0xeb : num=9;
      break;//跳出switch语句
     case 0xdb : num=10;
      break;//跳出switch语句
     case 0xbb : num=11;
      break;//跳出switch语句
     case 0x7b : num=12; 
      break;//跳出switch语句
    }
   while(temp!=0xf0)
   {
    temp=P3;
    temp=temp&0xf0;
   }
   dula=1;
   P0=table[num-1];
   dula=0;
   }

  }


  P3=0xf7;//赋第一个值
  temp=P3;//读回P3口的值
  temp=temp & 0xf0;//先与0xf0相与,判断是否还等于0xf0
  while(temp!=0xf0)//当按键按下时,此表达式为真,则运行下面语句,否则不运行。检测temp
  {
   delay(5);
   temp=P3;
   temp=temp & 0xf0;
   while(temp!=0xf0)
   {
    temp=P3;
    switch(temp)//将temp与case中值比较
    {
     case 0xe7 : num=13;
      break;//跳出switch语句
     case 0xd7 : num=14;
      break;//跳出switch语句
     case 0xb7 : num=15;
      break;//跳出switch语句
     case 0x77 : num=16; 
      break;//跳出switch语句
    }
   while(temp!=0xf0)
   {
    temp=P3;
    temp=temp&0xf0;
   }
   dula=1;
   P0=table[num-1];
   dula=0;
   }

  }


 }
}

uchar kyscan()//带返回值的函数
{

return num;//只需要返回num
}

 


菜鸟
2012-01-01 15:20:56     打赏
24楼

菜鸟
2012-01-01 15:21:20     打赏
25楼
展示最后结果~~~~~~~~~

菜鸟
2012-01-01 15:22:21     打赏
26楼
下个阶段需要进入到ARM系列,可能没过多时间发帖,望版主见谅

共26条 3/3 1 2 3 跳转至

回复

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