打印
[培训专区]

【赛元易码魔盒】V2.15测试问题点和 定时器与PWM例程分享

[复制链接]
1284|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yygdzjs|  楼主 | 2020-7-26 15:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
赛元易码魔盒 V2.15的问题点:
问题点1
SC95F8616 sc95f8x1x_option.h 问题点 枚举问题点(95系列库文件都一样)
问题点2
PWM 互补模式 无输出IO 无输出

SC95f8616 学习例程分享
1. 关于 SC95f8616  学习的寄存器3个基本例程 和大家分享.

2. 关于SC95f8616 定时器与PWM学习例程 易码魔盒与寄存器

详细见附件文件:




SC95F8616_TIMEorPWM例程.jpg (335.21 KB )

SC95F8616_TIMEorPWM例程.jpg

寄存器基本例程.jpg (104.73 KB )

寄存器基本例程.jpg

赛元易码魔盒 V2.15的问题点1.jpg (157.1 KB )

赛元易码魔盒 V2.15的问题点1.jpg

赛元易码魔盒 V2.15的问题点2.jpg (197.19 KB )

赛元易码魔盒 V2.15的问题点2.jpg

SC95F8616_JiBenLiCheng.zip

123.29 KB

SC95F8616_寄存器_TIMEorPWM例程.zip

326.04 KB

SC95F8616_易码魔盒_TIMEorPWM例程.zip

3.96 MB

关于SC95F8616_定时器与PWM测试例程.pdf

143.2 KB

关于赛元易码魔盒问题点2.pdf

62.83 KB

使用特权

评论回复

相关帖子

沙发
yygdzjs|  楼主 | 2020-7-26 16:12 | 只看该作者
关于SC95F8616 学习 LED  模块问题

显示 uint8_t LedDataTab[4] = {0,0,0,0}; OK
uint8_t LedDataTab[4] = {1,2,3,4};  NG
个人觉得问题:
LCD/LED 显示 RAM 配置 问题
扫描问题,具体原因不清楚;官方参考例程试过 一样.
代码如下:


/*
***********************************************************
文件名称: main.c
日期: 2020/01/01
版本: 1.0
功能说明:

************************************************************
*/
//--头文件---
#include "sc95f8x1x.h"


//--宏定义---
#define SYS_MCLK 32000000L    // 32MhzCPU时钟 系统时钟1分频 32MHZ / 1分频
//#define SYS_MCLK 16000000L    // 16MhzCPU时钟系统时钟2分频 32MHZ / 2分频
//#define SYS_MCLK  8000000L    //  8MhzCPU时钟系统时钟4分频 32MHZ / 4分频
//#define SYS_MCLK  4000000L    //  4MhzCPU时钟系统时钟8分频 32MHZ / 8分频

#define KEY_INPUT1 P17
#define KEY_INPUT2 P16
#define LED1 P22
#define LED2 P23

uint8_t xdata LCDRAM[28] _at_ 0x1000;

volatile unsigned int vGu16SmgNumValue = 20; //


unsigned char code SmgNumChar[] = {  //共阳极  0~F
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
//-----------------------编码表下标数据-----------------------
uint8_t LedDataTab[4] = {1,2,3,4};
//-----------------------LED显示RAM数据缓存数组----------------
uint8_t LedTemp[8] = {0,0,0,0,0,0,0,0};

//--变量----
volatile unsigned char vGu8T0RH;  //定义变量 保存定时器0 高字节的重载值
volatile unsigned char vGu8T0RL;  //定义变量 保存定时器0 低字节的重载值

u16 LedDisplayNum;
bit T0Flag1s;
bit T0Flag10ms;

//--变量----

//--函数声明---

void DelayMs(unsigned int ms); //
void GPIO_Init(void);
void ConfigTimer0(u16 ms); //--定时器0配置
       
void LedDisplayInit(); //
void LedDisplayUpdate(unsigned int Number); //-LED显示的设置
void Led_Display(void);



void main(void)
{
        GPIO_Init();
        ConfigTimer0(1); //--定时器0配置
       
        LedDisplayInit(); //
        DelayMs(20); //
    Led_Display();
       
        EA = 1; //
       
        while(1)
        {
                if(T0Flag10ms)
                {
                        T0Flag10ms = 0;
                        Led_Display();
                }
                if(T0Flag1s)
                {
                        T0Flag1s = 0;
                        LedDisplayNum++;   //显示数据加一
                        if(LedDisplayNum==16)
                        {
                                LedDisplayNum = 0;
                        }
                        LedDataTab[0] = LedDisplayNum;          //显示数据装载到数组
                        LedDataTab[1] = LedDisplayNum;
                        LedDataTab[2] = LedDisplayNum;
                        LedDataTab[3] = LedDisplayNum;       
                }
               
        if(KEY_INPUT1 == 0)
                {
                        DelayMs(20); //
                        if(KEY_INPUT1 == 0)
                        {
                                while(!KEY_INPUT1);
                                LED1 = ~LED1; //
                                if(vGu16SmgNumValue < 9999)
                                {
                                        vGu16SmgNumValue++; //
                                        //LedDisplayUpdate(vGu16SmgNumValue); //-LED显示的设置
                                        //Led_Display();
                                }
                               
                        }
                }
               
        if(KEY_INPUT2 == 0)
                {
                        DelayMs(20); //
                        if(KEY_INPUT2 == 0)
                        {
                                while(!KEY_INPUT2);
                                LED1 = ~LED1; //
                                //LED2 = ~LED2; //
                                if(vGu16SmgNumValue > 0)
                                {
                                        vGu16SmgNumValue--; //
                                        //LedDisplayUpdate(vGu16SmgNumValue); //-LED显示的设置
                                        //Led_Display();
                                }
                               
                        }
                }               
               
               
//                P0 |= 0xFF; //
//                P1 |= 0xFF; //
//                P2 |= 0xFF; //
//                P3 |= 0xFF; //
//                P4 |= 0x3F; //
//                P5 |= 0x0F; //
//                DelayMs(500); //
//                P0 &= 0x00; //
//                P1 &= 0x00; //
//                P2 &= 0x00; //
//                P3 &= 0x00; //
//                P4 &= 0xC0; //
//                P5 &= 0xF0; //
//                DelayMs(500); //
        }

}

//--毫秒延时--
void DelayMs(unsigned int ms)
{
        unsigned int i;
        for(;ms>0;ms--)
          for(i=(SYS_MCLK/994)/10;i>0;i--);
          //for(i=SYS_MCLK/994/10;i>0;i--);
}

//--IO初始化--
void GPIO_Init(void)
{
    //P1CON &= 0x3F; // P17 P16设置为输入(默认)       
        P1PH |= 0xC0; // P17 P16 设置上拉
        P2CON |= 0x0C; // P22 P23 设置输出
        LED1 = 1; //
        LED2 = 1; //
               
//        P0CON |= 0xFF; //
//        P1CON |= 0xFF; //
//        P2CON |= 0xFF; //
//        P3CON |= 0xFF; //
//        P4CON |= 0x3F; //
//        P5CON |= 0x0F; //        
}

//- LCD_LED显示驱动相关寄存器
void LedDisplayInit()
{
//        unsigned char i=0; //
//        //15.1 LCD/LED显示驱动相关寄存器
//        //DDRCON (93H) 显示驱动控制寄存器
//        DDRCON &= 0x7F; //显示驱动扫描开关 关
//        DDRCON |= 0x80; //显示驱动扫描开关 开       
//        DDRCON &= 0xBF; //驱动模式 0 LCD模式
//        DDRCON |= 0x40; //驱动模式 1 LED模式
//        DDRCON &= 0xCF; //显示占空比控制 00 1/8
//        DDRCON |= 0x10; //显示占空比控制 01 1/6       
//        DDRCON |= 0x20; //显示占空比控制 02 1/5       
//        DDRCON |= 0x30; //显示占空比控制 03 1/4       
//        DDRCON &= 0xF0; //LCD电压调节 VLCD=VDD*(17+VLCD[3:0])/32        

//        //P0VO (9CH) P0 口显示驱动输出寄存器
//                P0VO |= 0xFF; //打开 P0n口显示驱动输出
//        //P1VO (94H) P1 口显示驱动输出寄存器
//                P1VO |= 0xFF; //打开 P1n口显示驱动输出
//        //P2VO (9CH) P2 口显示驱动输出寄存器
//                P2VO |= 0xFF; //打开 P2n口显示驱动输出
//        //P3VO (94H) P3 口显示驱动输出寄存器
//                P3VO |= 0xFF; //打开 P3n口显示驱动输出
//
//   //OTCON (8FH) 输出控制寄存器(读/写)
//   OTCON &= 0xF3; //LCD电压输出口分压电阻选择 00: 100K
//   OTCON |= 0x04; //LCD电压输出口分压电阻选择 01: 200K
//   OTCON |= 0x08; //LCD电压输出口分压电阻选择 10: 400K  
//   OTCON |= 0x0C; //LCD电压输出口分压电阻选择 11: 800K
//   OTCON &= 0xFD; //0:当设定为 1/4占空比时,S0~S27为 segment,C4~C7为 common
//   OTCON |= 0x02; //1:当设定为 1/4占空比时,S4~S27为 segment,C0~C3为 common
//   OTCON &= 0xFE; //0:1/4 偏置电压;
//   OTCON |= 0x01; //1:1/3偏置电压
//   for(i=0;i<30;i++)
//   {
//           LCDRAM[i] = 0x00; //
//   }


//DDRCON |= 0x7F;  //0:LCD 模式 1:LED模式
////LED模式; 1/4 占空比
////S4~S27为 segment,C0~C7为 common;
//DDRCON |= 0x80;  //显示驱动扫描打开
//IOHCON0 = 0xC0;  //设置 P1高四位 IOH等级 3(最小),其它管脚 IOH等级 0(最大)
//IOHCON1 = 0x00;
//P0VO = 0xFF;    // 打开 P0口的显示驱动输出功能
//P1VO = 0xFF;    // 打开 P1口的显示驱动输出功能
//P2VO = 0xFF;    // 打开 P2口的显示驱动输出功能
//P3VO = 0xFF;    // 打开 P3口的显示驱动输出功能
//OTCON = 0x00;     
//LCDRAM[led_addr] = led_data;  //向 LED RAM写入待显示的值   

DDRCON |= 0x7F;  //0:LCD 模式 1:LED模式
//LED模式; 1/4 占空比
//S4~S27为 segment,C0~C7为 common;
DDRCON |= 0x80;  //显示驱动扫描打开
//IOHCON0 = 0xC0;  //设置 P1高四位 IOH等级 3(最小),其它管脚 IOH等级 0(最大)
//IOHCON1 = 0x00;
//IOHCON0 = 0x00;
P1VO = 0x0F;    // 打开 P1口的显示驱动输出功能 低4位S7~S4
P3VO = 0xFF;    // 打开 P3口的显示驱动输出功能 高4位C7~C4 低S0~S3
OTCON = 0x00;

////-C7~C4-
//LCDRAM[led_addr] = led_data;  //向 LED RAM写入待显示的值

//LCDRAM[0] |= 0xF0;  //向 LED RAM写入待显示的值
//LCDRAM[1] |= 0xF0;  //向 LED RAM写入待显示的值
//LCDRAM[2] |= 0xF0;  //向 LED RAM写入待显示的值
//LCDRAM[3] |= 0xF0;  //向 LED RAM写入待显示的值
//LCDRAM[4] |= 0xF0;  //向 LED RAM写入待显示的值
//LCDRAM[5] |= 0xF0;  //向 LED RAM写入待显示的值
//LCDRAM[6] |= 0xF0;  //向 LED RAM写入待显示的值
//LCDRAM[7] |= 0xF0;  //向 LED RAM写入待显示的值

}



//-LED显示的设置
void LedDisplayUpdate(unsigned int Number) //-LED显示的设置
{

        LedDataTab[3] = SmgNumChar[Number/1000]; //
        LedDataTab[2] = SmgNumChar[Number%1000/100]; //       
        LedDataTab[1] = SmgNumChar[Number%100/10]; //       
        LedDataTab[0] = SmgNumChar[Number%10]; //       
                               
}

/**************************************************
*函数名称:void LedSegData(UINT8 LedData,LedSelCOM COMx)
*函数功能:LED显示数据转换
*入口参数:LedData               LED显示数据
                   COMx                             COM口选择(取值范围:LEDCOM0~7)
*出口参数:void
*功能说明:
**************************************************/
void LedSegData(u8 LedData,u8 COMx)
{
        LedTemp[0]  |=  ((LedData>>0)&0x01)<<COMx;
        LedTemp[1]  |=  ((LedData>>1)&0x01)<<COMx;
        LedTemp[2]  |=  ((LedData>>2)&0x01)<<COMx;
        LedTemp[3]  |=  ((LedData>>3)&0x01)<<COMx;
        LedTemp[4]  |=  ((LedData>>4)&0x01)<<COMx;
        LedTemp[5]  |=  ((LedData>>5)&0x01)<<COMx;
        LedTemp[6]  |=  ((LedData>>6)&0x01)<<COMx;
    LedTemp[7]  |=  ((LedData>>7)&0x01)<<COMx;
}
/**************************************************
*函数名称:void Led_Display(void)
*函数功能:led
*入口参数:无
*出口参数:void
*功能说明:COM口必须跟使用的COM相对应
**************************************************/
void Led_Display(void)
{
        uint8_t i;
        for(i=0;i<8;i++)
        {
                LedTemp[i] = 0;       
        }
        for(i=0;i<4;i++)
        {
                LedSegData(SmgNumChar[LedDataTab[i]],4+i);
        }
        LCDRAM[0]  = LedTemp[0];
        LCDRAM[1]  = LedTemp[1];
        LCDRAM[2]  = LedTemp[2];
        LCDRAM[3]  = LedTemp[3];
        LCDRAM[4]  = LedTemp[4];
        LCDRAM[5]  = LedTemp[5];
        LCDRAM[6]  = LedTemp[6];
        LCDRAM[7]  = LedTemp[7];         
}


//--定时器0配置--
void ConfigTimer0(u16 ms) //--定时器0配置
{
      u32 tmp; //
          TMOD &= 0xF0; //清零定时器0模式配置
          TMOD |= 0x01; //mode1 16bit timer
       
          //---定时器0时钟12分频---
         TMCON &= 0xFE;  //定时器0 频率 set 0(12分频):Fsys/12(默认0)
         tmp = SYS_MCLK / 12; //默认12分频
         // //---定时器0时钟1分频---
         //TMCON |= 0x01;  //定时器0 频率 set 1(1分频):Fsys/1
         //tmp = SYS_MCLK ; //默认1分频
       
         tmp = (tmp / 1000) * ms; //得到1ms 乘以需要配置
         tmp = 65536 - tmp; // 定时器0是向上计数减去定时值

         vGu8T0RH = (u8)(tmp >> 8); // 保存定时器0高字节重载值
         vGu8T0RL = (u8)tmp; //  // 保存定时器0低字节重载值
         TH0 = vGu8T0RH; // 加载 T0高字节重载值
         TL0 = vGu8T0RL; // 加载 T0低字节重载值
     ET0 = 1; //使能T0中断
         TR0 = 1;  //定时器运行       
}

//-中断函数(timer0)定时器0-中断号1-
void InterruptTimer0() interrupt 1
{
   static u16 T0Flag10msCount = 0;
   static u16 T0Flag1sCount = 0;
   static u16 i = 0; //
         TH0 = vGu8T0RH; // 加载 T0高字节重载值
         TL0 = vGu8T0RL; // 加载 T0低字节重载值       

         if(++i > 500)  //判断定时次数是否 大于 设定 500
         {
                 i = 0; //
                 //LED1 = ~LED1;  //LED1取反
                 LED2 = ~LED2;  //LED2取反
         }
         
         
         if(++T0Flag10msCount >= 10)
         {
                 T0Flag10msCount = 0;
         T0Flag10ms = 1;                 
         }
         if(++T0Flag1sCount >= 1000)
         {
                T0Flag1sCount = 0;
                T0Flag1s = 1;
         
         }
}




  

使用特权

评论回复
板凳
zeshoufx| | 2020-7-26 21:47 | 只看该作者
谢谢分享【定时器与PWM例程】

使用特权

评论回复
地板
yygdzjs|  楼主 | 2020-7-27 00:55 | 只看该作者

关于SC95F8616 学习 LED  模块问题
找到问题;使用共阴极数码管,修改阴极显示字符码  测试OK .

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

180

帖子

2

粉丝