主程序:
#include <iostm8s105S4.h>
#include<ram.h> //自建的RAM区定义
//==================主程序==========================================================================
void main ()
{ init_devices(); //系统上电初始化
while (1)
{
if(PB_IDR_IDR3==0) {Y2=1;} //我在这专门做了个输出位,可以读到PB3口已经是有信号输入了
else {Y2=0;}
}
}
//========================================================================================================
void init_devices(void) //上电初始化
{
asm("sim"); //关全局中断
CLK_init(); //系统时间配置
GPIO_init(); //端口功能配置
TIM1_init(); //定时器1配置
TIM2_init();
asm("rim"); // 开全局中断
}
//======================================================================================================
void CLK_init(void) //系统时间配置
{
CLK_CKDIVR = 0x08; //08 16M内部RC经2分频后系统时钟为8M
}
//=======================================================================================================
void GPIO_init(void) //端口功能配置
{
PD_DDR = 0xAF; //配置PD端口的方向寄存器,PD6串口输入,其余输出 10111111,10101111=AFPD4输入
PD_CR1 = 0xef; //设置PD为推挽输出11101111=EF
PD_ODR=0xFF;
PE_DDR = 0x27; //配置PE端口的方向寄存器-输出
PE_CR1 = 0xff; //设置PE为推挽输出
PC_DDR = 0xff;
PC_CR1 = 0xff;
PG_DDR = 0xff;
PG_CR1 = 0xff;
PB_DDR = 0x00;
PB_CR1 = 0xf7;
PB_CR2 = 0x00;
}
//==============================================
void TIM1_init(void) //定时器1配置
{
CLK_PCKENR1=0xff;
TIM1_ETR=0xC0; //C0反相输入,40不反相输入
TIM1_SMCR=0x00;
TIM1_ARRH = 0x00;
TIM1_ARRL = 0xAA;
TIM1_RCR=0x00;
TIM1_CR1=0x04;
///TIM1_CNTRH=0x00;
///TIM1_CNTRL=0xAA;
TIM1_IER = 0x01;
TIM1_CR1=0x01;
}
//===========================================================================
void TIM2_init(void) //定时器2配置定时模式
{
TIM2_PSCR=0x00; //定时器2分频,o分频
TIM2_ARRH=0x0F; //0FA0=4000
TIM2_ARRL=0xA0;
TIM2_CNTRH=0x0F;
TIM2_CNTRL=0xA0;
TIM2_CR1 = 0x81; // 计数器使能,开始计数
TIM2_IER=0x01;
}
//=================================================================================
#pragma vector=TIM1_OVR_UIF_vector
__interrupt void TIM1_OVR_UIF(void)
{
Y1=~Y1;
TIM1_SR1 = 0; // 清除更新中断标记,这步不能漏掉,否则会连续进入中断程序
}
//===============================================================================
#pragma vector=TIM2_OVR_UIF_vector
__interrupt void TIM2_OVR_UIF(void)
{
Y0=~Y0;
TIM2_SR1 = 0; // 清除更新中断标记,这步不能漏掉,否则会连续进入中断程序
}
//======================================================================
RAH文件:
#ifndef __ram_H__
#define __ram_H__
#include <iostm8s105S4.h>
#define uchar unsigned char //定义为无符号字付 ~~typedef unsigned char uchar;
#define uint unsigned int //~~typedef unsigned int uint;
#define Y0 PE_ODR_ODR5 //上模升
#define Y1 PC_ODR_ODR1 //上模降
#define Y2 PC_ODR_ODR2 //下模升
#define Y3 PC_ODR_ODR3 //下模降
#define Y4 PC_ODR_ODR5 //热板出
#define Y5 PC_ODR_ODR6 //热板入
#define Y6 PC_ODR_ODR7 //上夹件
#define Y7 PG_ODR_ODR0 //下夹件
#define Y8 PG_ODR_ODR1 //运行指示闪灯
//========这里声明后面要用到的子程序=============================================
void CLK_init(void); //系统时钟配置
void GPIO_init(void); //端口用途配置(输入或输出)
void init_devices(void); //上电初始化
void TIM1_init(void); //定时1配置
void TIM2_init(void); //定时1配置
//-------------------------------------------
#endif
|