关于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;
}
}
|