STC8H8K64U 四肢行走的小机器

 MAIN.C :PWM设置及主函数

#include <STC8H.H>
#include "face.h"
#include "intrins.h"

void Delay200ms(void)    //@24.000MHz
{
    unsigned char data i, j, k;

    _nop_();
    _nop_();
    i = 25;
    j = 90;
    k = 176;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void PWMInit()
{
    PWMA_CCER1=0X00;
    PWMA_CCMR1=0X60;
    PWMA_CCMR2=0X60;
    PWMA_CCMR3=0X60;
    PWMA_CCMR4=0X60;
    
    PWMA_PSCR=23;
    PWMA_CCER1=0X11;
    PWMA_CCER2=0X11;
    PWMA_CCR1=699;
    PWMA_CCR2=699;
    PWMA_CCR3=699;
    PWMA_CCR4=699;
    PWMA_ARR=19999;
    PWMA_ENO=0X55;
    PWMA_BKR=0X80;
    PWMA_CR1=0X01;
}    

void Walk(unsigned char steps)
{
    unsigned char i;
    for(i=0;i<steps;i++)
    {
        PWMA_CCR2=1499;
        PWMA_CCR4=1499;
        Delay200ms();
        PWMA_CCR1=999;
        PWMA_CCR3=1999;
        Delay200ms();
        PWMA_CCR2=999;
        PWMA_CCR4=1999;
        Delay200ms();
        PWMA_CCR1=1499;
        PWMA_CCR3=1499;
        Delay200ms();
        PWMA_CCR2=1999;
        PWMA_CCR4=999;
        Delay200ms();
        PWMA_CCR1=1999;
        PWMA_CCR3=999;
        Delay200ms();
        
    }
}

void GetDown(unsigned char t)
{
    unsigned char i;
 
        PWMA_CCR1=660;
        PWMA_CCR2=2499;
        PWMA_CCR3=660;
        PWMA_CCR4=2499;
     for(i=0;i<t;i++)
    {    
        
        Delay512ms();
    }
}

void StandUp(unsigned char t)
{
    unsigned char i;
 
        PWMA_CCR1=1499;
        PWMA_CCR2=1499;
        PWMA_CCR3=1499;
        PWMA_CCR4=1499;
     for(i=0;i<t;i++)
    {    
        
        Delay512ms();
    }
}
void main()
{
    P_SW2|=0XB0;
    P3M0=0X00;
    P3M1=0X00;
    P1M0=0X00;
    P1M1=0X00;
    I2CCFG=0XC0;
    I2CMSST=0X00;
    OLED_Init();
    OLED_Clear();
    
    PWMInit();
    
    while(1)
    {
        OpenEye(8);
        
        
        OpenMouth();
        ClearEye();
        
        Wink();
        OpenMouth();
        LookAround();
        
        
        StandUp(2);
        GetDown(2);
        StandUp(2);
        Walk(10);
        
        
    }
}

简单的脸部表情

#include "face.h"

void OpenEye(unsigned char x)
{
	int i;
	for(i=1;i<5;i++)
	{
		OLED_FillRect(16+x,i,32);
		
		OLED_FillRect(64+x,i,32);
	}
}

void CloseEye()
{
	OLED_FillRect(24,3,32);
	OLED_FillRect(72,3,32);
}

void ClearEye()
{
	int i;
	for(i=1;i<5;i++)
	{
		OLED_Clear_Rect(0,i,128);
		
		
	}
}
void Mouth()
{
	unsigned char i;
	OLED_Clear_Rect(0,7,128);
	for(i=48;i<80;i++)
	{
			OLED_DrawPoint(i,60);
	}
}

void OpenMouth()
{
	
	OLED_FillRect(48,7,32);
	Delay512ms();
	Mouth();
	Delay512ms();
}

void Wink()
{
	ClearEye();
	OpenEye(8);
	
	Delay512ms();
	Delay512ms();
	ClearEye();
	CloseEye();
	
	
	Delay512ms();
	ClearEye();
	OpenEye(8);
	
	Delay512ms();
	Delay512ms();
	ClearEye();
	CloseEye();
	
	
	Delay512ms();
	ClearEye();
	OpenEye(8);
	
	Delay512ms();
	Delay512ms();
		
}

void LookAround()
{
	ClearEye();
	OpenEye(0);
	
	Delay512ms();
	Delay512ms();
	ClearEye();
	OpenEye(16);
	
	Delay512ms();
	Delay512ms();
	ClearEye();
	OpenEye(0);
	
	Delay512ms();
	Delay512ms();
	ClearEye();
	OpenEye(8);
	
	Delay512ms();
	Delay512ms();
		
}

OLED相关函数

#include "oled.h"

void Delay512ms(void)	//@12.000MHz
{
	unsigned char data i, j, k;

	i = 85;
	j = 40;
	k = 170;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);

}

void Wait()
{
	while(!(I2CMSST&0X40));
	I2CMSST&=~0X40;
}

void IIC_Start()
{
	I2CMSCR=0X01;
	Wait();
}

void Write_IIC_Byte(unsigned char dat)
{
	I2CTXD=dat;
	I2CMSCR=0X02;
	Wait();
}

void IIC_Wait_Ack()
{
	I2CMSCR=0X03;
	Wait();
}

void IIC_Stop()
{
	I2CMSCR=0X06;
	Wait();
}

void Write_IIC_Command(unsigned char IIC_Command)
{
   IIC_Start();
   Write_IIC_Byte(0x78);            //Slave address,SA0=0
	IIC_Wait_Ack();	
   Write_IIC_Byte(0x00);			//write command
	IIC_Wait_Ack();	
   Write_IIC_Byte(IIC_Command); 
	IIC_Wait_Ack();	
   IIC_Stop();
}

void Write_IIC_Data(unsigned char IIC_Data)
{
   IIC_Start();
   Write_IIC_Byte(0x78);			//D/C#=0; R/W#=0
	IIC_Wait_Ack();	
   Write_IIC_Byte(0x40);			//write data
	IIC_Wait_Ack();	
   Write_IIC_Byte(IIC_Data);
	IIC_Wait_Ack();	
   IIC_Stop();
}

void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
	if(cmd)
			{

   Write_IIC_Data(dat);
   
		}
	else {
   Write_IIC_Command(dat);
		
	}

}


void OLED_Set_Pos(unsigned char x, unsigned char y) 
{ 	
	OLED_WR_Byte(0xb0+y,OLED_CMD);
	OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
	OLED_WR_Byte((x&0x0f),OLED_CMD); 
}   	  

void OLED_DrawPoint(unsigned char x,unsigned char y)
{
	 unsigned char i,m,n;
	i=y/8;  //页号
	m=y%8;  //页内行号
	n=0x01<<m;
	OLED_Set_Pos(x,i);
	OLED_WR_Byte(n,OLED_DATA);
}

void OLED_FillRect(unsigned char x,unsigned char y,unsigned char w)
{
	unsigned char i;
	
		for(i=x;i<(x+w);i++)
		{
			OLED_Set_Pos(i,y);
			OLED_WR_Byte(0xFF,OLED_DATA);
		}
	
}

void OLED_Clear()  
{  
	unsigned char  i,n;		    
	for(i=0;i<8;i++)  
	{  
		OLED_WR_Byte (0xb0+i,OLED_CMD);   
		OLED_WR_Byte (0x00,OLED_CMD);    
		OLED_WR_Byte (0x10,OLED_CMD);        
		for(n=0;n<128;n++) OLED_WR_Byte(0,OLED_DATA); 
	}
}

void OLED_Clear_Rect(unsigned char x,unsigned char y,unsigned char w)  
{  
	unsigned char  i;		    
	for(i=x;i<(x+w);i++)
		{
			OLED_Set_Pos(i,y);
			OLED_WR_Byte(0x00,OLED_DATA);
		}
}


void OLED_Init(void)
{ 	
 
	OLED_WR_Byte(0xAE,OLED_CMD);//--display off
	OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
	OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
	OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  
	OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
	OLED_WR_Byte(0x81,OLED_CMD); // contract control
	OLED_WR_Byte(0xFF,OLED_CMD);//--128   
	OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap 
	OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
	OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
	OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
	OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
	OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
	OLED_WR_Byte(0x00,OLED_CMD);//
	
	OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
	OLED_WR_Byte(0x80,OLED_CMD);//
	
	OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
	OLED_WR_Byte(0x05,OLED_CMD);//
	
	OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
	OLED_WR_Byte(0xF1,OLED_CMD);//
	
	OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
	OLED_WR_Byte(0x12,OLED_CMD);//
	
	OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
	OLED_WR_Byte(0x30,OLED_CMD);//
	
	OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
	OLED_WR_Byte(0x14,OLED_CMD);//
	
	OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
}  

face.h

#include "oled.h"

void OpenEye(unsigned char x);


void CloseEye();


void Mouth();

void Wink();

void LookAround();
void OpenMouth();

void ClearEye();

OLED.h

#include "STC8H.H"

#define OLED_CMD  0	
#define OLED_DATA 1	
#define OLED_MODE 0

sbit SDA=P1^4;
sbit SCL=P1^5;
void Delay512ms(void);	//@12.000MHz

void Wait();

void IIC_Start();

void Write_IIC_Byte(unsigned char dat);

void IIC_Wait_Ack();

void IIC_Stop();

void Write_IIC_Command(unsigned char IIC_Command);

void Write_IIC_Data(unsigned char IIC_Data);

void OLED_WR_Byte(unsigned dat,unsigned cmd);

void OLED_Set_Pos(unsigned char x, unsigned char y) ;

void OLED_DrawPoint(unsigned char x,unsigned char y);

void OLED_FillRect(unsigned char x,unsigned char y,unsigned char w);

void OLED_Clear(void);  

void OLED_Init(void);

void OLED_Clear_Rect(unsigned char x,unsigned char y,unsigned char w)  ;

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值