数码之家

 找回密码
 立即注册
搜索
查看: 5278|回复: 19

[C51] STC15F2K60S2 单片机T12控制板 改LCD版无法编译求助

[复制链接]
发表于 2021-7-9 14:59:49 | 显示全部楼层 |阅读模式
搞了两块 STC 15F2K60S2 单片机T12 的控制板 程序是直接驱动OLED屏的,直接用LCD屏接入 无显示 。

看说明书里说固件可以在 config.h  里改成使用ST7565主控的LCD屏


在uVision4里将 原来  #define SCREEN     0   更改为  #define SCREEN      2   

现在无法编译了, 改成 0 或 1  都可以编译的

显示如下:

Build target 'HAKKO'
compiling main.c...
compiling Sys_Init.c...
..\USER\SYS_INIT.C(192): error C202: 'LED_ON': undefined identifier
compiling Sys_basic.c...
..\USER\SYS_BASIC.C(108): error C202: 'LED_ON': undefined identifier
..\USER\SYS_BASIC.C(123): error C202: 'LED_ON': undefined identifier
..\USER\SYS_BASIC.C(163): error C187: not an lvalue
..\USER\SYS_BASIC.C(172): error C187: not an lvalue
..\USER\SYS_BASIC.C(277): error C202: 'LED_OFF': undefined identifier
compiling Sys_Monitor.c...
compiling Sys_Control.c...
compiling Sys_IO.c...
compiling Sys_Sample.c...
compiling SYS_Para.c...
assembling STARTUP.A51...
compiling LQ12864.c...
compiling menu.c...
compiling user_menu.c...
compiling window.c...
compiling img.c...
目标未创建


请各位高手帮看一下是什么原因,如何解决!谢谢!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
 楼主| 发表于 2021-7-9 15:01:42 | 显示全部楼层
config.h  文件


* 未经著作权所有人书面授权,任何单位和个人不得将以下程序用于商业盈利用途!
* 修改此程序请保留上述版权声明,引用程序请注明出处!
**********************************************************************************/
#ifndef                __CONFIG_H
#define                __CONFIG_H


/************************定义系统时钟*****************************/
#define MAIN_Fosc                24000000L        //定义主时钟
#define Main_Fosc_KHZ        (MAIN_Fosc / 1000)

/****************************用户可调设置****************************/
//如果需要开机LOGO,请定义DRAW_LOGO;不需要LOGO可把该定义注释
#define DRAW_LOGO
//如果需要在调整温度时大字显示设定的温度,请定义SET_TEMP;如果需要大字持续显示实际温度可把该定义注释
#define SET_TEMP
//此处选择使用的控制板版本,支持智盟1.0/智盟1.1/小张设计(ZM1_0),
//智盟1.2(ZM1_2),雪驹旧版(XJ_OLD),雪驹新版(XJ_NEW),五笔LCD版(WB_LCD)
#define WB_LCD
//屏幕选择(0.96寸OLED(SSD1306)选择0;1.3寸OLED(SSH1106)选择1;LCD选择2)
#define SCREEN                        2
/****************************IO设置****************************/
//版本号
#define VERSION_DIS                ("V3.3.4")


#if        SCREEN == 1
        #define DIS_ERR 2
#else
        #define DIS_ERR 0
#endif
//以下是三个自定义按键
#define KEY_A                         (P15)
#define KEY_B                         (P32)
#define KEY_C                         (P14)

//单片机切断220V电源输出IO
#define SHUTDOWN                (P35) //未使用

#ifdef WB_LCD
        //蜂鸣器
        #define        BEEP                                 (P33)  //P33 蜂鸣器
        #define BEEP_ON                        (P33 = 1)
        #define BEEP_OFF                (P33 = 0)
        /**LCD背光灯
        #define        LED                         (P11)
        #define LED_ON                        (P11 = 1)
        #define LED_OFF                    (P11 = 0) **/
    //EC11编码器
        #define        EC11_A                        (P15)         //EC11 -
        #define        EC11_B                        (P32)         //EC11 +
        #define        EC11_KEY                (P14)         //EC11 转轴按键
        //PWM输出
        #define IRON                                (P34)   //T12 PWM输出
        //休眠/水银开关
        #define SLEEP                                (P36)   //休眠开关
        #define PWM_EN                            (P37)        //震动开关 未使用
       
        //ADC设置
        #define ADC_VCC                                0u        //P10  VCC ADC
        #define ADC_ROOMTEMP            6u  //P16  NTC ADC
    #define ADC_IRON                        7u        //P17  T12 ADC
#endif

/***************************包含库函数***************************/
#include        "STC15Fxxxx.H"                                                                                               
#include         "stdio.h"
#include    "math.h"
#include    "LQ12864.h"
#include        "img.h"
//#include  "DataScope_DP.h"

/***************************包含用户函数***************************/
#include "Sys_Init.h"
#include "Sys_Basic.h"
#include "Sys_Monitor.h"
#include "Sys_IO.h"
#include "Sys_Sample.h"
#include "Sys_Control.h"
#include "Sys_Para.h"
#include "user_menu.h"

#endif
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-9 15:03:20 | 显示全部楼层
本帖最后由 zjhchp 于 2021-7-9 15:04 编辑

Sys_Init.c   文件

*

* 未经著作权所有人书面授权,任何单位和个人不得将以下程序用于商业盈利用途!
* 修改此程序请保留上述版权声明,引用程序请注明出处!
**********************************************************************************/
#include "config.h"

/************************************************************
* 函数名                :        Exti_Init
* 功能说明        :        使能外部中断4(编码器中断)
*
* 输入参数        :        无
* 输出参数        :        无
*

*************************************************************/        
void Exti_Init(void)
{
        INT_CLKO |= 0x40;           //(EX4 = 1)使能INT4下降沿中断
        INT0 = 1;
        IT0 = 0;                    //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
        EX0 = 1;                    //使能INT0中断
}

/************************************************************
* 函数名                :        ADC_Init
* 功能说明        :        初始化ADC的0,6,7通道,并使能ADC电源
*
* 输入参数        :        无
* 输出参数        :        无
*
* 修改记录        :        新增函数,第一次编辑
* 历次作者        :        王志浩
* 日期                        :        2017-10-18
*************************************************************/        
void ADC_Init(void)
{
        #ifdef WB_LCD        
                P1ASF             =         ADC_P10|ADC_P16|ADC_P17;
        #else
                P1ASF             =         ADC_P10|ADC_P16|ADC_P17;        
        #endif        
        ADC_CONTR  =         (ADC_CONTR & ~ADC_90T) | ADC_360T;//ADC速度ADC_180T
        ADC_CONTR |=         0x80;                                                                                                                        //ADC功率ENABLE
        PCON2                 |=         (1<<5);                                                                                                                //ADC结果调整,        ADC_RES_H2L8
        PADC                          =         0;                                                                                                                                //优先级设置PolityLow
        EADC                          =         0;                                                                                                                                //中断允许DISABLE
        ADC_CONTR |=         0x80;                                                                                                                        //ADC电源操作ENABLE
}


/************************************************************
* 函数名                :        Timer_Init
* 功能说明        :        初始化定时器0,1,2,并使能中断
*
* 输入参数        :        无
* 输出参数        :        无
*

*************************************************************/        
void Timer_Init(void)
{                        
        //定时器0,16位自动重装载,12T,25us,用于蜂鸣器和PWM
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0         = 0xA8;                //设置定时初值
        TH0         = 0xFD;                //设置定时初值
        TF0         = 0;                        //清除TF0标志
        TR0         = 1;                        //定时器0开始计时
        
        //定时器1,16位自动重装载,1T,1ms,用于温度控制和休眠待机计时等
        AUXR |= 0x40;                //定时器时钟1T模式
        TMOD &= 0x0F;                //设置定时器模式
        TL1         = 0x40;                //设置定时初值
        TH1         = 0xA2;                //设置定时初值
        TF1         = 0;                        //清除TF1标志
        TR1         = 1;                        //定时器1开始计时
        
               
        //定时器中断允许
        ET0         =         1;
        ET1         =         1;
}


/************************************************************
* 函数名                :        ParaInit
* 功能说明        :        如果EEPROM前5个字节为FF,则重新载入EEPROM参数
*
* 输入参数        :        无
* 输出参数        :        无
*

*************************************************************/        
void ParaInit(void)
{
        unsigned char temp[5],i;
        
        //先读EEPROM前五位
        EEPROM_read_n(0x0,(unsigned char *)&temp,sizeof(temp));
        for(i=0;i<5;i++)
        {
                temp[0] &= temp;
        }
        
        //如果都是OXFF,那么重新刷EEPROM,这样的话下载的时候只需要勾选本次将EEPROM全部填充为FF的话,就可以实现重新刷EEPROM
        if(temp[0] == 0xff)
        {
                EEPROM_SectorErase(0x0);
                EEPROM_SectorErase(0x200);
                EEPROM_write_n(0x0,(unsigned char *)&MENU_DATA_Table,sizeof(MENU_DATA_Table));
                EEPROM_write_n(0x200,(unsigned char *)&FAC_DATA_Table,sizeof(FAC_DATA_Table));
        }
        
        EEPROM_read_n(0x0,(unsigned char *)&MENU_DATA_Table,sizeof(MENU_DATA_Table));
        EEPROM_read_n(0x200,(unsigned char *)&FAC_DATA_Table,sizeof(FAC_DATA_Table));
        
        //如果默认温度不为0,则将默认温度设定为开机温度
        if(MENU_DATA_Table.Temp_s.Default_Temp != 0)
        {
                IronTemp.Set = MENU_DATA_Table.Temp_s.Default_Temp;
        }
        if(MENU_DATA_Table.Temp_s.Default_CH != 0)
        {
                IronTemp.Chn = MENU_DATA_Table.Temp_s.Default_CH;
        }
        //如果默认温度为0,则将上次温度设定为开机温度
        if(MENU_DATA_Table.Temp_s.Default_Temp == 0)
        {
                IronTemp.Set = MENU_DATA_Table.Temp_s.Last_Temp;
        }
        if(MENU_DATA_Table.Temp_s.Default_CH == 0)
        {
                IronTemp.Chn = MENU_DATA_Table.Temp_s.Last_CH;
        }
        
}


/************************************************************
* 函数名                :        Sys_Init
* 功能说明        :        调用以上函数,初始化整个系统
*
* 输入参数        :        无
* 输出参数        :        无
*
************************/        
void Sys_Init(void)

{
        //PWM,EN,蜂鸣器推挽输出,ADC接口高阻,SLEEP上拉
        //M1,M0: 00 pullup,01 PP, 10 HZ, 11 OD
        
        #ifdef        WB_LCD
                P1M0 = 0x00;
                P1M1 = 0xc9;
                P3M0 = 0x18;
                P3M1 = 0x00;
        #else
                P1M0 = 0x00;//00000000
                P1M1 = 0xc9;//11001001         P1.7 P1.6 P1.3 P1.0高阻ADC采集模式
                //P0M0 = 0x00;//00000000
            //P0M1 = 0x00;//00000000
            P3M0 = 0x18;//00011000 P3.4 P3.3配置为推挽模式
                P3M1 = 0x00;//00000000
        #endif
        
        //烙铁初始化为关闭
        IRON = 0;
        PWM_EN = 0;
        
        #if SCREEN == 2
                LED_ON;//LCD背光打开
        #endif

        //先读EEPROM参数
        EA = 0;
  ParaInit();
        EA = 1;
        
        //UI初始化
        user_menu_init();
        //继续初始化
        Beep(MENU_DATA_Table.Other_s.Beep_Volume);
        ADC_Init();
        Timer_Init();
        Exti_Init();
        //Uart_Init();
        
        //开机LOGO
        #ifdef DRAW_LOGO
                Draw_LOGO(Logo);
                Delay_ms(200);Delay_ms(200);
                Delay_ms(200);Delay_ms(200);
                Delay_ms(200);Delay_ms(200);
        #endif
        OLED_CLS();
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-9 15:07:54 | 显示全部楼层
/*********************************************************************************
Sys_Basic.c  文件

* 修改此程序请保留上述版权声明,引用程序请注明出处!
**********************************************************************************/
#include "config.h"

/********************** 全局变量定义 ************************/
PWM_s                                                        PWM                                                 =         {0,Disable};        //PWM相关变量
IRON_STATUS_e                        IronStateFlag         =         NORMAL;                                //烙铁工作状态标志位
TIMER_s                                                Timer                                                 =         {0,0,0};                        //定时计数器
IRONUSE_STATUS_s        IronUse_Status         =         {FREE,FREE};        //烙铁使用状态标志位


/************************************************************
* 函数名                :        timer0_int
* 功能说明        :        定时器0中断,生成PWM波,蜂鸣器响
*
* 输入参数        :        无
* 输出参数        :        无
*

*************************************************************/
void timer0_int (void) interrupt TIMER0_VECTOR
{
        static unsigned int                 BeepCounter = 0;
       
        //蜂鸣器响
        //旋转或按下后BeepCounterFlag被置位,开始计数
        if(BeepCounterFlag)
        {
                BeepCounter++;
        }
        //计数小于设定值时打开,大于时关闭,Beep_Volume的值决定了占空比
        if((BeepCounter > 0) && (BeepCounter <= MENU_DATA_Table.Other_s.Beep_Volume*BEEP_TIME))
        {
                BEEP_ON;
        }
        else
        {
                BEEP_OFF;
        }
        //清零
        if(BeepCounter == BEEP_TIME*10)
        {
                BeepCounter = 0;
                BeepCounterFlag = 0;
        }
}


/************************************************************
* 函数名                :        timer1_int
* 功能说明        :        定时器1中断,主要控制
*
* 输入参数        :        无       
* 输出参数        :        无
*

*************************************************************/       
void timer1_int (void) interrupt TIMER1_VECTOR
{
        static unsigned int                 IronUseCounter[2]={0,0};
        static        unsigned int         ShutDownCounter = 0;
        static unsigned char         Sleep_Old = 0;
        static unsigned char         PWM_counter        =        0;
        static unsigned char SetTempCounter = 0;

       
        //烙铁PWM生成
        PWM_counter=Timer.mSec%100;
        if((PWM_counter<PWM.Duty) && PWM.Run)
                IRON = 1;
        else
                IRON = 0;
       
        //1ms处理部分
        Timer.mSec++;                        //定时器0分段计数器自加
        EC11_Capture();                //捕捉EC11信息       

        //10ms处理部分
        if(Timer.mSec%10 == 0)
        {
                if(IronUse_Status.Handle || IronUse_Status.Coder)//烙铁或编码器用了,那要看看现在是不是休眠什么的状态了
                {
                        if(IronStateFlag && MENU_DATA_Table.Time_s.Slp_Time > 0)
                        {
                                Timer.Sec = 0;
                                Timer.Min = 0;
                                ec11_state.Key = KEY_FREE;
                                ec11_state.Coder = CODER_FREE;
                                IronStateFlag = NORMAL;
                                #if SCREEN == 2
                                LED_ON;//LCD背光打开
                                #else
                                        Screen_Contrast(FAC_DATA_Table.Adjust_s.Lightness);
                                #endif
                                Beep(MENU_DATA_Table.Other_s.Beep_Volume);
                        }
                        else if(IronStateFlag && MENU_DATA_Table.Time_s.Slp_Time == 0)
                        {
                                Timer.Sec = 0;
                                Timer.Min = 0;
                                ec11_state.Coder = CODER_FREE;
                                IronStateFlag = NORMAL;
                                #if SCREEN != 2
                                        Screen_Contrast(FAC_DATA_Table.Adjust_s.Lightness>>2);
                                #else
                                        LED_ON;//LCD背光打开
                                #endif
                                Beep(MENU_DATA_Table.Other_s.Beep_Volume);
                        }
                }
        }
        if(Timer.mSec%25 == 0)
        {
                //如果正在设定温度,那么大字显示设定温度值
                if(SetTempFlag == 1)
                {
                        SetTempCounter++;
                }
                if(SetTempCounter == 50)
                {
                        SetTempCounter = 0;
                        SetTempFlag = 0;
                        if((MENU_DATA_Table.Temp_s.Default_Temp == 0) || (MENU_DATA_Table.Temp_s.Default_CH == 0))
                        {
                                EEPROM_SectorErase(0x0);
                                EEPROM_write_n(0x0,(unsigned char *)&MENU_DATA_Table,sizeof(MENU_DATA_Table));
                        }
                }
               
                //读室温和电压
                RoomTemp = GetRoomTemp();
                VCCVoltage = GetVoltage();
               
                //按键扫描
                Key_Scan();
        }
        //100ms处理部分
        if(Timer.mSec%100 == 0)
        {
                //大于0按时间休眠
                if(MENU_DATA_Table.Time_s.Slp_Time > 0)
                {
                        //水银开关跳变沿检测并计数
                        if(SLEEP != Sleep_Old)
                        {
                                IronUseCounter[0]++;
                        }
                        Sleep_Old = SLEEP;
                }
                //等于零按电平休眠
                else
                {
                        if(SLEEP == 0)
                        {
                                IronUseCounter[1]++;
                        }
                }

                //温度控制(正常工作按IronTemp_AM控制,休眠按Slp_Temp控制,否则关烙铁)
                if(IronStateFlag == NORMAL)
                {
                        IronTempControl(IronTemp.Set);
                }
                else if(IronStateFlag==SLEEPING)
                {
                        IronTempControl(MENU_DATA_Table.Temp_s.Slp_Temp);
                }
                else
                {
                        IronTempControl(0);
                }
        }
       
        //1s处理部分
        if(Timer.mSec == 1000)
        {
                //如果休眠时间大于零,那么按时间休眠
                if(MENU_DATA_Table.Time_s.Slp_Time > 0)
                {
                        //一秒内看10次跳变沿,如果这10次有N次烙铁手柄状态发生变化,那么认为是确实在使用
                        if(IronUseCounter[0]>MENU_DATA_Table.Other_s.Shock_Sensor)
                        {
                                IronUse_Status.Handle = USING;
                        }
                        else
                        {
                                IronUse_Status.Handle = FREE;
                        }
                        //看完后清计数器
                        IronUseCounter[0] = 0;
                }
                else//否则按电平休眠
                {
                        //1s内看10次电平,如果10次电平有N次都是低电平,认为该休眠了
                        if((IronUseCounter[1]>MENU_DATA_Table.Other_s.Shock_Sensor) && (IronStateFlag == NORMAL)  &&(ShutdownCounterFlag==0))
                        {
                                IronUse_Status.Handle = FREE;
                                IronStateFlag = SLEEPING;
                                Beep(MENU_DATA_Table.Other_s.Beep_Volume);
                                //清计时器为待机做准备
                                Timer.Sec = 0;
                                Timer.Min = 0;
                        }
                        else if((IronUseCounter[1]<=MENU_DATA_Table.Other_s.Shock_Sensor) && (IronStateFlag == SLEEPING))
                        {
                                IronUse_Status.Handle = USING;
                                IronStateFlag = NORMAL;
                        }
                        IronUseCounter[1] = 0;
                }

               
                //如果认为没有使用,那么开始计时,只要用了就清零(烙铁没有使用&&编码器没有使用&&没有进菜单)
                if(IronUse_Status.Handle == FREE && IronUse_Status.Coder == FREE && ShutdownCounterFlag==0)
                {
                        Timer.Sec++;
                }
                else
                {
                        Timer.Sec = 0;
                        Timer.Min = 0;
                        IronUse_Status.Coder = FREE;
                }
                Timer.mSec = 0;
        }
       
        //1min处理部分
        if(Timer.Sec == 55)//定时不准
        {
                Timer.Min++;
                Timer.Sec = 0;
                //以下是休眠、关屏、和软关机
                //如果 (睡眠时间不为0&&在正常工作状态)
                if((MENU_DATA_Table.Time_s.Slp_Time > 0) && (IronStateFlag == NORMAL))
                {
                        if(Timer.Min == MENU_DATA_Table.Time_s.Slp_Time)
                        {
                                #if SCREEN != 2
                                        Screen_Contrast(FAC_DATA_Table.Adjust_s.Lightness>>2);
                                #endif
                               
                                IronStateFlag = SLEEPING;
                                Beep(MENU_DATA_Table.Other_s.Beep_Volume);
                                //清计时器为待机做准备
                                Timer.Sec = 0;
                                Timer.Min = 0;
                        }
                }
                //如果软关机时间>=0&&已经休眠
                if((MENU_DATA_Table.Time_s.Shutdown_Time > 0) && (IronStateFlag == SLEEPING))
                {
                        if(Timer.Min == MENU_DATA_Table.Time_s.Shutdown_Time)
                        {
                                //清计时器为掉电唤醒做准备
                                Timer.Sec = 0;
                                Timer.Min = 0;
                                //置烙铁状态标志位
                                IronStateFlag = STANDBY;
                                #if SCREEN == 2
                                        LED_OFF;//LCD背光关
                                #endif
                                //蜂鸣器响,确保烙铁关到位了
                                BEEP_ON;
                                Delay_ms(100);
                                OLED_Init();//进中断时可能屏幕指针不在初始位置,顺便初始化一下
                                OLED_CLS();
                                PWM.Run = Disable;
                                IRON = 0;
                                BEEP_OFF;
                                Delay_ms(150);
                                OLED_CLS();
                                BEEP_ON;
                                Delay_ms(150);
                                OLED_CLS();
                                BEEP_OFF;
                                //如果关机时间大于零,则初始化掉电唤醒定时器为16s,并且进入掉电模式,否则直接掉电
                                if(MENU_DATA_Table.Time_s.Suicide_Time > 0)
                                {
                                        //掉电唤醒定时器初始化
                                        WKTCL = 0xfe;                           //设置唤醒周期16s
                                        WKTCH = 0xff;                           //使能掉电唤醒定时器
                                        PCON |= 0x02;//掉电
                                        _nop_();
                                        _nop_();
                                }
                                else
                                {
                                        PCON |= 0x02;//掉电
                                        _nop_();
                                        _nop_();
                                }
                                while(MENU_DATA_Table.Time_s.Suicide_Time > 0)
                                {
                                        //记录掉电次数,如果等于定时时间则自杀,否则继续掉电
                                        ShutDownCounter++;
                                        if(ShutDownCounter > MENU_DATA_Table.Time_s.Suicide_Time*4+1)
                                        {
                                                SHUTDOWN = 0;
                                        }
                                        //如果是由掉电唤醒定时器唤醒,则继续掉电;否则清计数器跳出循环
                                        if(WKTCL==0xff && WKTCH==0xff)
                                        {
                                                PCON |= 0x02;//掉电
                                        }
                                        else
                                        {
                                                ShutDownCounter = 0;
                                                break;
                                        }
                                        _nop_();
                                        _nop_();
                                }
                                IronUse_Status.Coder = USING;
                        }
                }
        }
}


/************************************************************
* 函数名                :        timer2_int
* 功能说明        :        大字设定温度和扩展按键扫描,读室温和电压
*
* 输入参数        :        无
* 输出参数        :        无
*

*************************************************************/       
void timer2_int (void) interrupt TIMER2_VECTOR
{
}
void exint0() interrupt 0       //INT0中断入口
{
}
void exint4() interrupt 16
{}
//void Uart() interrupt 4 using 1
//{
//        if (RI)
//        {
//                RI = 0;                 //清除RI位
//                SendChar(SBUF);              
//        }       
//}
//void SendChar(unsigned char dat)
//{
//        SBUF = dat;                //发送数据
//        while(!TI);                // 等待数据发送完成中断
//        TI = 0;        //清中断
//}

//float ADC_BandGap_Volt(void)     //读取ADC内部电压数据,转化为10位
//{
//        unsigned int         BangGap=0;
//        unsigned char code *BandAddr;
//       
//        BandAddr=BangGap_Addr;
//        BangGap=*BandAddr++;
//        BangGap=BangGap<<8;
//        BangGap+=*BandAddr;
//       
//        return (float)BangGap / 4.88f;
//}

//u16 ADC_GetDat(u8 Ch,u8 ChASF)   //读ADC数据
//{
//        u16 ADC_Dat=0;
//        P1ASF=ChASF;
//        ADC_CONTR&=~(0x07<<0);
//        ADC_CONTR|=(Ch&0x07)<<0;
//        ADC_CONTR&=~(1<<4);
//         ADC_RES=0;
//         ADC_RESL=0;
//        ADC_CONTR|=1<<3;  //启动ADC转换
//       
//        while((ADC_CONTR&0x10)==0);  //等待ADC转换完成
//        ADC_CONTR&=~(1<<4);
//       
//        ADC_Dat=ADC_RES<<8;
//        ADC_Dat+=ADC_RESL;
//       
//        return ADC_Dat;
//}

//u16 ADC_BandGap_Dat()    //读取ADC基准电压
//{
//        u16 AD_Return = 0;
//        u8  i;
//       
//        ADC_GetDat(0,0x00);  //读取2次取得稳定
//        ADC_GetDat(0,0x00);
//       
//        EA = 0;
//        for (i = 0 ; i <DATA_SUM ; i++ )   //连续读取DATA_SUM次基准电压 求和取得平均值
//        {
//                AD_Return += ADC_GetDat(0,0x00);
//        }
//        EA = 1;
//        return AD_Return        >>        DATA_DIV;
//}
//u16 ADC_ReadCH_Dat(u8 CH)   //读取通道电压
//{
//        u16 AD_Return = 0;
//        u8  i;
//       
//        ADC_GetDat(CH,0xff);    //读取2次取得稳定
//        ADC_GetDat(CH,0xff);
//       
//        EA = 0;
//        for (i = 0 ; i <DATA_SUM ; i++ )   //连续读取DATA_SUM次基准电压求和取得平均值
//        {
//                AD_Return += ADC_GetDat(CH,0xff);
//        }
//        EA = 1;
//        return AD_Return >> DATA_DIV;
//}
/************************************************************
* 函数名                :        Get_ADC10bitResult
* 功能说明        :        读ADC值
*
* 输入参数        :        channel,ADC通道号(0-7)
* 输出参数        :        返回ADC值(0-1023)
*

*************************************************************/       
unsigned int        Get_ADC10bitResult(unsigned char channel)
{
        u16        adc;
        u8        i;

        ADC_RES = 0;
        ADC_RESL = 0;

        ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;
        NOP(4);                        //对ADC_CONTR操作后要4T之后才能访问

        for(i=0; i<250; i++)                //超时
        {
                if(ADC_CONTR & ADC_FLAG)
                {
                        ADC_CONTR &= ~ADC_FLAG;
                        adc = (u16)(ADC_RES & 3);
                        adc = (adc << 8) | ADC_RESL;
                        return        adc;
                }
        }
        return        1024;        //错误,返回1024,调用的程序判断
}


/************************************************************
* 函数名                :        DisableEEPROM
* 功能说明        :        失能EEPROM
*
* 输入参数        :        无
* 输出参数        :        无
*

*************************************************************/       
void        DisableEEPROM(void)
{
        ISP_CONTR = 0;                        //禁止ISP/IAP操作
        ISP_CMD   = 0;                        //去除ISP/IAP命令
        ISP_TRIG  = 0;                        //防止ISP/IAP命令误触发
        ISP_ADDRH = 0xff;                //清0地址高字节
        ISP_ADDRL = 0xff;                //清0地址低字节,指向非EEPROM区,防止误操作
}


/************************************************************
* 函数名                :       
* 功能说明        :        从指定EEPROM首地址读出n个字节放指定的缓冲.
*
* 输入参数        :        EE_address读出EEPROM的首地址,DataAddress读出数据放缓冲的首地址,number读出的字节长度.
* 输出参数        :        无
*

*************************************************************/       
void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
{
        EA = 0;                //禁止中断
        ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY);        //设置等待时间,允许ISP/IAP操作,送一次就够
        ISP_READ();                                                                                                                                        //送字节读命令,命令不需改变时,不需重新送命令
        do
        {
                ISP_ADDRH = EE_address / 256;                                                        //送地址高字节(地址需要改变时才需重新送地址)
                ISP_ADDRL = EE_address % 256;                                                        //送地址低字节
                ISP_TRIG();                                                                                                                                //先送5AH,再送A5H到ISP/IAP触发寄存器,每次都需要如此
                                                                                                                                                                                        //送完A5H后,ISP/IAP命令立即被触发启动
                                                                                                                                                                                        //CPU等待IAP完成后,才会继续执行程序。
                _nop_();
                *DataAddress = ISP_DATA;                                                                        //读出的数据送往
                EE_address++;
                DataAddress++;
        }while(--number);

        DisableEEPROM();
        EA = 1;                //重新允许中断
}


/************************************************************
* 函数名                :        EEPROM_SectorErase
* 功能说明        :        把指定地址的EEPROM扇区擦除
*
* 输入参数        :        EE_address:要擦除的扇区EEPROM的地址.
* 输出参数        :        无
*

*************************************************************/       
void EEPROM_SectorErase(u16 EE_address)
{
        EA = 0;                //禁止中断
                                                                                                                                                                                        //只有扇区擦除,没有字节擦除,512字节/扇区。
                                                                                                                                                                                        //扇区中任意一个字节地址都是扇区地址。
        ISP_ADDRH = EE_address / 256;                                                                //送扇区地址高字节(地址需要改变时才需重新送地址)
        ISP_ADDRL = EE_address % 256;                                                                //送扇区地址低字节
        ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY);        //设置等待时间,允许ISP/IAP操作,送一次就够
        ISP_ERASE();                                                                                                                                //送扇区擦除命令,命令不需改变时,不需重新送命令
        ISP_TRIG();
        _nop_();
        DisableEEPROM();
        EA = 1;                //重新允许中断
}


/************************************************************
* 函数名                :        EEPROM_write_n
* 功能说明        :        把缓冲的n个字节写入指定首地址的EEPROM.
*
* 输入参数        :        EE_address写入EEPROM的首地址,DataAddress写入源数据的缓冲的首地址,number写入的字节长度.
* 输出参数        :        无
*

*************************************************************/       
void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
{
        EA = 0;                //禁止中断

        ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY);        //设置等待时间,允许ISP/IAP操作,送一次就够
        ISP_WRITE();                                                                                                                                //送字节写命令,命令不需改变时,不需重新送命令
        do
        {
                ISP_ADDRH = EE_address / 256;                                                        //送地址高字节(地址需要改变时才需重新送地址)
                ISP_ADDRL = EE_address % 256;                                                        //送地址低字节
                ISP_DATA  = *DataAddress;                                                                        //送数据到ISP_DATA,只有数据改变时才需重新送
                ISP_TRIG();
                _nop_();
                EE_address++;
                DataAddress++;
        }while(--number);

        DisableEEPROM();
        EA = 1;                //重新允许中断
}


/************************************************************
* 函数名                :        Delay_ms
* 功能说明        :        ms级延时
*
* 输入参数        :        ms
* 输出参数        :        无
*

*************************************************************/       
void Delay_ms(unsigned char ms)                //@24MHz
{
        unsigned char i = 22,j = 128,k;
       
        for(k=0;k<ms;k++)
        {
                i = 22;
                j = 128;
                do
                {
                        while (--j);
                } while (--i);
        }
}

回复 支持 反对

使用道具 举报

发表于 2021-7-9 15:29:24 | 显示全部楼层
  /**LCD背光灯
        #define        LED                         (P11)
        #define LED_ON                        (P11 = 1)
        #define LED_OFF                    (P11 = 0) **/
把这里注释去掉试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-9 15:34:30 | 显示全部楼层
谢谢!
只要   #define SCREEN     改为        2                 
  删掉
/**LCD背光灯
        #define        LED                         (P11)
        #define LED_ON                        (P11 = 1)
        #define LED_OFF                    (P11 = 0) **/

还是不行
回复 支持 反对

使用道具 举报

发表于 2021-7-9 15:38:32 | 显示全部楼层
t12是用的K型热电偶吗?有测温曲线吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-9 15:49:30 | 显示全部楼层
魂の殇 发表于 2021-7-9 15:38
t12是用的K型热电偶吗?有测温曲线吗

T12 据说是K型,但热电动势好象比K型小得多!
回复 支持 反对

使用道具 举报

发表于 2021-7-9 16:41:34 | 显示全部楼层
明显缺少定义啊,哪里注释没去掉吧,仔细检查下就行,又没几个变量
回复 支持 反对

使用道具 举报

发表于 2021-7-9 21:39:37 | 显示全部楼层
我这改2是可以的,显然你这修改过了,应该哪里改错了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-10 06:56:14 | 显示全部楼层
本帖最后由 zjhchp 于 2021-7-10 06:58 编辑

@ploestar              原程序能发一份给我看看吗,谢谢!
回复 支持 反对

使用道具 举报

发表于 2021-7-10 12:59:59 来自手机浏览器 | 显示全部楼层
zjhchp 发表于 2021-7-10 06:56
@ploestar              原程序能发一份给我看看吗,谢谢!

立创哪有的自己去找找
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-11 07:11:52 | 显示全部楼层

终于搞定了,找来原版的代码,与这份对比了一下!原来是这段改了:
  /**LCD背光灯
        #define        LED                         (P11)
        #define LED_ON                        (P11 = 1)
        #define LED_OFF                    (P11 = 0) **/
改成
  //LCD背光灯
        #define        LED                         (P11)
        #define LED_ON                        (P11 = 1)
        #define LED_OFF                    (P11 = 0)
就好了!

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-11 07:13:38 | 显示全部楼层
得瑟一下!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2021-7-11 15:27:50 来自手机浏览器 | 显示全部楼层
zjhchp 发表于 2021-7-11 07:13
得瑟一下!

屏幕右侧显示不对,初始化那还得改改
回复 支持 反对

使用道具 举报

发表于 2021-7-26 06:58:33 来自手机浏览器 | 显示全部楼层
刷五笔的LCD固件应该可以用,单片机都是用的一样的
回复 支持 反对

使用道具 举报

发表于 2021-9-28 16:13:38 | 显示全部楼层

能否发个原版程序包上来学习?
回复 支持 反对

使用道具 举报

发表于 2023-4-1 18:11:46 | 显示全部楼层

刷五笔的LCD固件应该可以用
回复 支持 反对

使用道具 举报

发表于 2023-4-2 10:49:43 | 显示全部楼层
最新的STC-ISP V6.91M版本,范例程序中的 STC15实验箱的演示程序包中:
也有 LCD12864, LCD1602的完整演示程序包

http://www.stcmcudata.com/STCISP/stc-isp-15xx-v6.91M.zip        最新版本 STC-ISP软件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-14 06:41 , Processed in 0.483601 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表