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

共8条 1/1 1 跳转至

406514993MCU DIY进程帖

菜鸟
2011-12-02 18:56:17     打赏
现在终于有点时间搞下这东西,期末了,实在是太忙了···



关键词: 406514993MCU     进程    

菜鸟
2011-12-02 19:09:06     打赏
2楼
准备写流水灯,液晶显示,数码管显示,跑马灯,温度传感器,时钟等程序。先来个流水灯的吧!

菜鸟
2011-12-02 19:16:28     打赏
3楼

#include <reg51.h>
#include <intrins.h>
unsigned char a,b,k,j;
void delay10ms()
  {
    for(a=100;a>0;a--)
      for(b=225;b>0;b--);
   }
void main()
{
  k=0xfe;
  while(1)
  {
      delay10ms();
     
      beep=0;
      delay10ms();
      beep=1;
      j=_crol_(k,1);
      k=j;
      P1=j;
   }
}

专家
2011-12-02 20:23:43     打赏
4楼
继续哦

菜鸟
2011-12-07 13:15:07     打赏
5楼

数码管显示程序:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,aa,bai,shi,ge;
sbit dula=P3^7;

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void display(uchar bai,uchar shi,uchar ge);
void delay(uint z);
void init();
void main()

 init();//初始化子程序
 while(1)
 {
  if(aa==20)
    {
   aa=0;
   temp++;
   if(temp==100)
      {
     temp=0;
      }
   bai=temp/100;
   shi=temp%100/10;
   ge=temp%10;
    }
  display(bai,shi,ge);
 }
}

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

void display(uchar bai,uchar shi,uchar ge)
{
        dula=1;
  P0=table[bai];
  dula=0;
  P0=0xff;
  P2=0x00;
  P0=0xfe;
  P2=0xff;
  delay(1);

  dula=1;
  P0=table[shi];
  dula=0;
  P0=0xff;
  P2=0x10;
  P0=0xfd;
  P2=0xff;
  delay(1);

  dula=1;
  P0=table[ge];
  dula=0;
  P0=0xff;
  P2=0x20;
  P0=0xfb;
  P2=0xff;
  delay(1);
}

void init()

 P2=0xff;
 dula=0;
 temp=0;
 TMOD=0x01;
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 EA=1;
 ET0=1;
 TR0=1; 
}

void timer0() interrupt 1
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 aa++; 
}


菜鸟
2011-12-16 16:39:34     打赏
6楼

LCD1602液晶显示程序:分2行显示。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^4;
sbit rw=P2^5;
sbit lcden=P2^6;


uchar table1[]="JX-JA MCU";
uchar table2[]="1234567654321";
void delay(uint x)
{
 uint a,b;
 for(a=x;a>0;a--)
  for(b=10;b>0;b--);
}

void delay1(uint x)
{
 uint a,b;
 for(a=x;a>0;a--)
  for(b=100;b>0;b--);
}

void write_com(uchar com)
{
 P0=com;
 rs=0;
    rw = 0;
 lcden=0;
 delay(10);
 lcden=1;
 delay(10);
 lcden=0;
 
}

void write_date(uchar date)
{
 P0=date;
 rs=1;
    rw = 0;
 lcden=0;
 delay(10);
 lcden=1;
 delay(10);
 lcden=0;
 
}

void init()
{
 write_com(0x38);
 delay(20);
 write_com(0x0f);
 delay(20);
 write_com(0x06);
 delay(20);
 write_com(0x01);
 delay(20); 
}

void main()
{
 uchar a;
 init();

 write_com(0x80+17);
 delay(20);
 for(a=0;a<9;a++)
 {
 write_date(table1[a]);
 delay(20);  
 }

 write_com(0xc0+17);
 delay(50);
 for(a=0;a<13;a++)
 {
 write_date(table2[a]);
 delay(40);  
 }

 for(a=0;a<16;a++)
 {
  write_com(0x18);
  delay1(200);
 }
 while(1);
}

 


菜鸟
2011-12-16 16:47:28     打赏
7楼

LCD12864液晶显示程序:在LCD上画一个圆。
#include<reg52.h>
#include<math.h>

#define uchar unsigned char
#define uint  unsigned int
#define Lcd_DatBus  P0

sbit rs=P2^4;
sbit rw=P2^5;
sbit en=P2^6;
sbit PSB=P2^1;


uchar table[]={"我们是都好孩子!"};

uchar GDRAM_hbit=0;
uchar GDRAM_lbit=0;

 
/****************************************************************
名  称:delay1ms
功  能:延时约1ms
参  数:uchar n
返回值:无
*****************************************************************/
void delayms(uchar z)
{
 uchar x,y;
   for(x=0;x<z;x++)
      for(y=0;y<110;y++);
}

 

/*********************************************************
名  称: write_com
功  能:对液晶写控制命令
参  数:com——控制命令
返回值:无
*********************************************************/
void Write_com(uchar com)
{
    uchar temp=0;  
 rs=0;
  rw=1;
  do                //判忙
    {
     en=1;
     delayms(1);
     temp=P0;
     en=0;
    }
    while(temp&0x80);
 rw=0;
  P0=com;
  delayms(1);
  en=1;
  delayms(1);
  en=0;     
}


/********************************************************
名  称:write_dat
功  能:向液晶写入数据
参  数:dat——显示数据
返回值:无
*********************************************************/
void Write_data(uchar dat)

    uchar temp=0;
    rs=0;
    rw=1;
    do    //判忙
    {
       en=1;
     delayms(1);
       temp=P0;
       en=0;
    }
   while(temp&0x80);

   rs=1;
   rw=0;
   P0=dat;
   en=1;
   delayms(1);
   en=0;
}

 

/**********读取当前地址的LCD显示数据**********/

uchar Read_data()
{
 uchar shuju;
 P0=0xff;
 rs=1;      // D/I=1,代表数据
 rw=1;      // R/W=1.读取
 delayms(10);
 en=1;
 delayms(100);
 shuju=P0;    //读取当前显示的数据
 en=0;
 return(shuju);  
}

 

 


/*******************************************
函数名称:Draw_TX
功    能:显示一个16*16大小的图形
参    数:Yaddr--Y地址
          Xaddr--X地址
          dp--指向图形数据存放地址的指针
返回值  :无
********************************************/
void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * p)
{
    uchar j;
    uchar k=0;
 
    Write_com(0x01);  //清屏,只能清除DDRAM
    Write_com(0x34);  //使用扩展指令集,关闭绘图显示
    for(j=0;j<16;j++)
    {
        Write_com(Yaddr++);       //Y地址
     Write_com(Xaddr);    //X地址
     Write_data(p[k++]); 
     Write_data(p[k++]);
    }
    Write_com(0x36);  //打开绘图显示
    Write_com(0x30);  //回到基本指令集模式
}

/**************************************************************
名  称:clear_DGRAM
功  能:清除液晶GDRAM中的随机数据
参  数:无
返回值:无
**************************************************************/
void clear_GDRAM(void)
{
    uchar i,j,k;

    Write_com(0x34);      //打开扩展指令集
 i=0x80;
 for(j=0;j<32;j++)
    { 
     Write_com(i++);
     Write_com(0x80);
     for(k=0;k<16;k++)
       {
   Write_data(0x00);
  }
   }

    i=0x80;
    for(j=0;j<32;j++)
    {
      Write_com(i++);
     Write_com(0x88);
     for(k=0;k<16;k++)
       {
   Write_data(0x00);
  }
    }
    Write_com(0x30);      //回到基本指令集 
}  


/****************************
画点函数:Write_Point()
x表示列,y表示为行。
******************************/


void Write_Point(uchar x,uchar y,uchar flag)
{
    uchar x_dyte,x_byte;               //定义列地址的字节位,及在字节中的哪1位
 uchar y_dyte,y_byte;               //定义为上下两个屏(取值为0,1),行地址(取值为0~31)
 Write_com(0x36);               //绘图模式命令

  /***X,Y坐标互换,即普通的X,Y坐标***/

   x_dyte=y/16;                     //计算在16个字节中的哪一个
   x_byte=y&0x0f;                   //计算在该字节中的哪一位
   y_dyte=x/32;                     //0为上半屏,1为下半屏
   y_byte=x&0x1f;                   //计算在0~31当中的哪一行
   Write_com(0x80+y_byte);           //设定行地址(y坐标)
   Write_com(0x80+x_dyte+8*y_dyte);     //设定列地址(x坐标),并通过8*y_Dyte选定上下屏

    Read_data();
 GDRAM_hbit=Read_data();             //读取当前显示高8位数据
 GDRAM_lbit=Read_data();             //读取当前显示低8位数据
   delayms(5);


   if(flag==1)
 {
  Write_com(0x80+y_byte);           //设定行地址(y坐标)
    Write_com(0x80+x_dyte+8*y_dyte);     //设定列地址(x坐标),并通过8*y_Dyte选定上下屏
  delayms(5);
    
  if(x_byte<8)                       //判断其在高8位,还是在低8位
  {
   Write_data(GDRAM_hbit|(0X01<<(7-x_byte)));   //显示GDRAM区高8位数据
   Write_data(GDRAM_lbit);             //显示GDRAM区低8位数据
  }
     else
  {
      Write_data(GDRAM_hbit);
   Write_data(GDRAM_lbit|(0x01<<(15-x_byte)));
  }
    }
 else
 {
  Write_data((0x00));                   //清除GDRAM区高8位数据
  Write_data((0x00));                   //清除GDRAM区低8位数据
 }
}     

 


/***********************************************************
名称:Write_Line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char colour)
功能:在指定位置上画线。
入口参数:x0  指定线起点所在行的位置
           y0   指定线起点所在列的位置
           x1   指定线终点所在行的位置
           y1   指定线终点所在列的位置
          flag  显示颜色(对于黑白色LCM,为0时灭,为1时显示)
/**********************************************************/
void Write_Line(uchar x0,uchar y0,uchar x1,uchar y1,uchar flag)
{
    int temp;
    int dx,dy;               //定义起点到终点的横、纵坐标增加值
    int s1,s2,i,j;
    int Dx,Dy,k;

    dx=x1-x0;
    if(dx>=0)                 //X的方向是增加的
     s1=1;
    else                     //X的方向是降低的
        s1=-1;
      
    dy=y1-y0;                 //判断Y的方向是增加还是降到的
    if(dy>=0)
        s2=1;
    else
        s2=-1;
  
    Dx=abs(x1-x0);             //计算横、纵标志增加值的绝对值
    Dy=abs(y1-y0);
    if(Dy>Dx)                              
    {                     //以45度角为分界线,靠进Y轴是status=1,靠近X轴是status=0 
        temp=Dx;
        Dx=Dy;
        Dy=temp;
     j=1;
    } 
    else
        j=0;


/*********Bresenham算法画任意两点间的直线********/ 
    k=2*Dy-Dx;                 //第1次判断下个点的位置
    for(i=0;i<Dx;i++)
    { 
        Write_Point(x0,y0,flag);           //画点 
        if(k>=0)                               
        { 
            if(j==1)               //在靠近Y轴区,x值加1
            x0+=s1; 
            else                     //在靠近X轴区,y值加1               
            y0+=s2; 
            k-=2*Dx;                 //判断下下个点的位置 
        } 
        if(j==1)
            y0+=s2; 
        else       
            x0+=s1; 
         k+=2*Dy; 
    } 
}

 


/****************************************************************************
名称:plotC(int x,int y,int xc,int yc,unsigned char colour)
功能:八分点画圆函数
入口参数:x 指定线起点所在行的位置
           y 指定线起点所在列的位置
          color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
****************************************************************************/
void plotC(uint x,uint y,uint xc,uint yc,uchar colour)
{
    Write_Point(xc+x,yc+y,colour);
    Write_Point(xc+x,yc-y,colour);
    Write_Point(xc-x,yc+y,colour);
    Write_Point(xc-x,yc-y,colour);
    Write_Point(xc+y,yc+x,colour);
    Write_Point(xc+y,yc-x,colour);
    Write_Point(xc-y,yc+x,colour);
    Write_Point(xc-y,yc-x,colour);
}

/****************************************************************************
名称:Write_yuan(int xc,int yc,int r,unsigned char colour)
功能:画圆
入口参数:xc  圆心的行坐标
           yc  圆心的列坐标
           r   半径
         color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
****************************************************************************/
void Write_yuan(uint xc,uint yc,uint r,uchar colour)
{
    int x,y,d;
    y=r;
    d=3-2*r;
    x=0;
    while(x<=y)
    {
        plotC(x,y,xc,yc,colour);
        if(d < 0)
            d+=(4*x)+6;
        else
        {
            d+=(4*(x-y))+10;
            y=y-1;
        }
        x=x+1;
    }
}


/********************实心圆*********************/
/****************************************************************************
名称:Write_yuan2(uint x, uint y, uint r,uchar flag)
功能:用绘图的方法填充一个矩形
入口参数:x 圆心横坐标
           y 圆心纵坐标
           r 半径长度
     flag  颜色标志位,为1.
****************************************************************************/

void Write_yuan2(uint x, uint y, uint r,uchar flag)
{
 uint dx,dy,ref;
 uint Temp;

 if(r==0)return;
 dx=r;
 dy=1;
 ref=707*r/1000;      // 0.707r
 while(dy<=dx)
 {
     if(dx>ref)
     Write_Line(x+ref+1,y+dy,x+dx,y+dy,flag);

     if(x>=ref+1&&dx>ref)
     {
      if(x<dx)
        Temp=0;
      else
        Temp=x-dx;
       Write_Line(Temp,y+dy,x-ref-1,y+dy,flag);
     }
  
     if(y>=dy&&dx>ref)
     Write_Line(x+ref+1,y-dy,x+dx,y-dy,flag);

     if(x>=ref+1&&y>=dy&&dx>ref)
     {
      if(x<dx)
        Temp=0;
      else
        Temp=x-dx;
        Write_Line(Temp,y-dy,x-ref-1,y-dy,flag);
     }

     if(dy!=dx||dx==ref)
     {
      if(y<dx)
        Temp=0;
      else
        Temp=y-dx;
       Write_Line(x+dy,Temp,x+dy,y+dx,flag);
     }

     if(x>=dy&&(dy!=dx||dy==ref))
     {
      if(y<dx)
        Temp = 0;
      else
        Temp=y-dx;
       Write_Line(x-dy,Temp,x-dy,y+dx,flag);
     }
     dy++;

     if((r*r-dy*dy)<=(dx-1)*dx)
     dx--;
 }

 Write_Line(x+ref+1,y,x+r,y,flag);
 if(x>=ref+1)
 {
     if(x<r)
      Temp=0;
     else
      Temp=x-r;
      Write_Line(Temp,y,x-ref-1,y,flag);
 

 if(y<r)
     Temp=0;
 else
     Temp=y-r;
     Write_Line(x,Temp,x,y+r,flag);
 }
}

 

 

 


/****************************************************************************
名称:Write_Full(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char colour)
功能:用绘图的方法填充一个矩形
入口参数:x0 起始点横坐标
           y0 起始点纵坐标
           x1 终止点横坐标
           y1 终止点纵坐标
          color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
****************************************************************************/
void Write_Full(uchar x0,uchar y0,uchar x1,uchar y1,uchar colour)
{
    uchar i,j;
 for(j=y0;j<=y1;j++)
    for(i=x0;i<=x1;i++)
    Write_Point(i,j,colour);
}


/********************************************************
名  称:LCD_init
功  能:初始化12864液晶
*********************************************************/
void LCD_init(void)
{
    Write_com(0x30);   //基本指令集
    delayms(1);
    Write_com(0x02);   //地址归位
    delayms(1);
    Write_com(0x0c);   //整体显示打开,游标关闭
    delayms(1);
    Write_com(0x01);   //清除显示屏
    delayms(1);
    Write_com(0x06);   //游标右移
    delayms(1);
    Write_com(0x80);   //设定显示的起始地址
}

 

void main ()
{   
 uchar i=0;
    LCD_init();
    Write_com(0x01);
    Write_com(0x80);
    for(i=0;i<16;i++)
    {
      Write_data(table[i]);
      delayms(5);
    }
  
   clear_GDRAM();
 
   Write_Line(20,1,62,125,1);
   Write_Line(62,1,62,125,1);
   Write_Line(20,1,62,1,1);

 Write_yuan(40,40,10,1);
 Write_yuan2(40,90,20,1);

    Write_Line(40,1,40,30,1);
 Write_Line(40,30,60,30,1);
 Write_Line(60,30,60,1,1);
 Write_Line(60,1,40,1,1);
 Write_Full(40,1,60,30,1);

    while(1);
}

 


  


菜鸟
2011-12-16 16:49:23     打赏
8楼
因为手机比较垃圾。没照相功能,只能附上程序啦,好啦,今天上传2个程序,搞了好久才弄出来的。

共8条 1/1 1 跳转至

回复

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