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) ;