代码如下:/**
* ************************************************************************************
* 上海芯圣电子股份有限公司
* www.holychip.cn
* ************************************************************************************
* @Examle Version V1.0.1.0
* @demo Version V1.0.2.0
* @Date 2017.12.21
* ************************************************************************************
* 模块性能介绍
* 1、输入(无SMT)模式下VDD=5V时,低电平即输入低电压(VIL1)范围为0~1.5V、高电平即输入
* 高电压(VIH1)范围为3.5~5V。
* 2、输入(SMT)模式下VDD=5V时,低电平即输入低电压(VIL1)范围为0~1V、高电平即输入高电
* 压(VIH1)范围为4~5V。
* 3、P0xDBCT [5:0]配置的消抖时间是一个范围,分频系数*Tosc*P0xDBCT[5:0]-Tosc<消抖时间<
* 分频系数*Tosc*(P0xDBCT[5:0]+1)-Tosc。
* 4、MCU上电复位以及其它复位功能的复位,所有的IO相关寄存器都会恢复为默认值。
* ************************************************************************************
* 应用注意事项
* 1、在使用仿真器时,与JTAG复用的IO口会有读取或写入数据异常,因此建议使用仿真器时不要
* 操作这几个IO口。断开仿真器使用电源供电即可以正常操作。
* 2、分配到P0.0/P0.1/P0.2这三个管脚上的功能脚、外部中断输入、故障检测引脚都受消抖控制。
* ************************************************************************************
* 客户服务
* 感谢您使用我们的单片机,若发现错误或对函数的使用存在疑问。请添加上海芯圣电子官方QQ群
* ****************************技术支持群:201030494***********************************
* ************************************************************************************
**/
#define ALLOCATE_EXTERN
#include "HC89S003F4.h"
#include<intrins.h>
sbit Dout = P1^0;
unsigned char bdata LED_DAT;//可位操作的数据发送暂存变量声明
sbit LEDbit0 = LED_DAT^0; //被发送的数据各位定义
sbit LEDbit1 = LED_DAT^1;
sbit LEDbit2 = LED_DAT^2;
sbit LEDbit3 = LED_DAT^3;
sbit LEDbit4 = LED_DAT^4;
sbit LEDbit5 = LED_DAT^5;
sbit LEDbit6 = LED_DAT^6;
sbit LEDbit7 = LED_DAT^7;
//================================================================
//发送RGB数据,一个nop为62.5ns, 刷新一次24*1.38us=33.2us
//================================================================
//1码 高电平850ns,低电平400ns 实测760,564
#define CODE1 {Dout = 1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();Dout = 0;}
//0码 高电平400ns,低电平850ns 实测380,860
#define CODE0 {Dout = 1;_nop_();_nop_();_nop_();_nop_();Dout = 0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
unsigned char RGB[3]={0,0,0};
void delay(unsigned int time)
{
while(time--);
}
void WS2812rst()//复位码:低电平>50us
{
delay(65);
Dout = 1;
delay(1);
Dout = 0;
}
void WS2812Send(unsigned char *dat) //数据格式G7-G0-R7-R0-B7-B0
{
LED_DAT = *dat++;
if(LEDbit7) {CODE1} else {CODE0}
if(LEDbit6) {CODE1} else {CODE0}
if(LEDbit5) {CODE1} else {CODE0}
if(LEDbit4) {CODE1} else {CODE0}
if(LEDbit3) {CODE1} else {CODE0}
if(LEDbit2) {CODE1} else {CODE0}
if(LEDbit1) {CODE1} else {CODE0}
if(LEDbit0) {CODE1} else {CODE0}
LED_DAT=*dat++;
if(LEDbit7) {CODE1} else {CODE0}
if(LEDbit6) {CODE1} else {CODE0}
if(LEDbit5) {CODE1} else {CODE0}
if(LEDbit4) {CODE1} else {CODE0}
if(LEDbit3) {CODE1} else {CODE0}
if(LEDbit2) {CODE1} else {CODE0}
if(LEDbit1) {CODE1} else {CODE0}
if(LEDbit0) {CODE1} else {CODE0}
LED_DAT=*dat;
if(LEDbit7) {CODE1} else {CODE0}
if(LEDbit6) {CODE1} else {CODE0}
if(LEDbit5) {CODE1} else {CODE0}
if(LEDbit4) {CODE1} else {CODE0}
if(LEDbit3) {CODE1} else {CODE0}
if(LEDbit2) {CODE1} else {CODE0}
if(LEDbit1) {CODE1} else {CODE0}
if(LEDbit0) {CODE1} else {CODE0}
}
int main()
{
/************************************系统初始化****************************************/
WDTCCR = 0x00; //关闭看门狗
while((CLKCON&0x20)!=0x20); //等待内部高频RC起振
CLKSWR = 0x51; //选择内部高频时钟为主时钟,内部高频RC2分频,Fosc=16MHz 50 32Mhz
while((CLKSWR&0xC0)!=0x40); //等待内部高频切换完成
CLKDIV = 0x01; //Fosc1分频得到Fcpu,Fcpu=16MHz
/***********************************设置IO口模式***************************************/
P1M0 = P1M0 & 0xF0 | 0x08; //P10 LED2
while(1){
for(RGB[0]=0;RGB[0]<250;RGB[0]+=2)
{
WS2812Send(RGB);
WS2812Send(RGB);
WS2812Send(RGB);
WS2812rst();
delay(30000);
}
for(RGB[1]=0;RGB[1]<250;RGB[1]+=2)
{
WS2812Send(RGB);
WS2812Send(RGB);
WS2812Send(RGB);
WS2812rst();
delay(30000);
}
for(RGB[2]=0;RGB[2]<250;RGB[2]+=2)
{
WS2812Send(RGB);
WS2812Send(RGB);
WS2812Send(RGB);
WS2812rst();
delay(30000);
}
}
return 0;
}
视频效果见附件。
有两问题:
一个是自己建的功能打开编辑下载完全没问题,打开官方的例程keil4直接卡死是怎么回事?
还有就是编程下载为什么只能用上电复位?reset管脚就一直下载失败?
视频:
QQ视频20180321235048.zip
(3.43 MB)
|