📄 复件 (4) main.c
字号:
{
//hsszsz(); //时钟设置
hsqkmg(); //清看门狗
hsiosz(); //io设置
//hst0sz(); //t0设置
//hszdsz(); //中断设置
//hspdtc0(); //判断定时器
//ws_hspddsq(uz_1msyd,c10ms,c100ms,c1s,&uz_10ms,&uz_100ms,&uz_1s,&uz_10msyd,&uz_100msyd,&uz_1syd);
//1ms已到,10ms分频,100ms分频,1s分频,10MS地址,100MS地址,1S地址,10MS地址已到,100MS地址已到,1S地址已到
//ws_hs_dwbsr(uz_1msyd,cqdcs,&uz_qdcs,&ul_zcs,&ul_ccs,&ul_srycz);//读输入
//去抖时间间隔,去抖次数,去抖次数,端口地址,暂存数,储存数,输入已操作
//ws_hssrcl(&ul_ccs,&ul_srycz); //输入处理
//ws_hssc(); //输出
hsyjcl(); //液晶驱动
//hsqdsq(); //清定时器
}
}
//初始化
void hscsh(void)
{
hszdsz(); //中断设置
hsiocsh(); //io初始化
hssdys(); //上电延时
//hsszcsh(); //时钟初始化
hskmgcsh(); //看门狗初始化
//hszdsz(); //中断设置
//hszdcsh(); //中断初始化
hsiocsh(); //io初始化
//hst0csh(); //t0初始化
hssdys(); //上电延时
hsramcsh(); //RAM初始化
}
//RAM初始化
void hsramcsh(void)
{
unsigned int jzsjdz = 0;
uz_qdcs = cqdcs; //去抖次数
ul_zcs = 0xffffffff; //暂存数
ul_ccs = 0xfffffff; //储存数
ul_srycz = 0; //输入已操作
/*******************定时器********************/
uz_10ms = c10ms;
uz_100ms = c10ms;
uz_1s = c10ms;
uz_zd1msyd = 0;
uz_1msyd = 0;
uz_10msyd = 0;
uz_100msyd = 0;
uz_1syd = 0;
ul_bza = 0; //标志
while(jzsjdz <9600)
{
uc_yjsj[jzsjdz] = 0xaa;
++jzsjdz;
}
}
//io初始化
unsigned long cqbgb; //全部关闭
void hsiocsh(void)
{
PIO_PER = 0xffffffff; //使能寄存器,0 = 无效,1 = 使能(禁用引脚外设控制)。只写
//PIO_PDR = 0xffffffff; //禁用寄存器,0 = 无效,1 = 禁用(使能引脚外设控制)。只写
PIO_ODR = 0xffffffff; //输出禁用寄存器,0 = 无效,1 = 禁用I/O 线上输出。只写
PIO_OER = 0xf; //输出使能寄存器,0 = 无效,1 = 使能I/O 线上输出。只写
PIO_OER |= set_8;
PIO_OER |= set_9;
PIO_OER |= set_10;
PIO_OER |= set_24;
//PIO_OSR PIO 输出状态寄存器,0 = I/O 线为纯输入,1 = I/O 线输出使能。只读
//PIO_IFER PIO 输入滤波器使能寄存器,0 = 无效,1 = 使能。只写
//PIO_IFDR PIO 输入滤波器禁用寄存器,0 = 无效,1 = 禁用。只写
//PIO_IFSR PIO 输入滤波器状态寄存器,0 = 滤波器禁用,1 = 滤波器使能。只读
//PIO_SODR PIO 置位输出数据寄存器,0 = 无效,1 = 设置在I/O 线上驱动的数据。只写
//PIO_CODR PIO 输出数据清零寄存器,0 = 无效,1 = 清除在I/O 线上驱动的数据。只写
//PIO_ODSR PIO 输出数据状态寄存器,0 = 驱动到I/O线上的数据为0,1 = 驱动到I/O线上的数据为1。只读或读/写
//PIO_PDSR PIO 引脚数据状态寄存器,0 = I/O线上的数据为0,1 = I/O线上的数据为1。只读
//PIO_IER = 0; //PIO 中断使能寄存器,0 = 无效,1 = 使能I/O 线上输入变化中断。只写
PIO_IDR = 0xffffffff;//中断禁用寄存器,0 = 无效,1 = 禁用I/O 线上输入变化中断。只写
//PIO_IMR PIO 中断屏蔽寄存器,0 = I/O 线上输入变化中断禁用,1 = I/O 线上输入变化中断使能。只读
//PIO_ISR PIO 中断状态寄存器,0 = 上次PIO_ISR读后或复位后, I/O 线上未检测到输入变化,1 = 上次PIO_ISR读后或复位后, I/O 线上至少检测到一次输入变化。只读
PIO_MDER = 0xffffffff; //多驱动使能寄存器,0 = 无效,1 = 使能(使能引脚外设控制)。只写
//PIO_MDDR PIO 多驱动禁用寄存器,0 = 无效,1 = 禁用(使能引脚外设控制)。只写
//PIO_MDSR PIO 多驱动状态寄存器,0 = 禁用,引脚驱动为高低电平,1 = 使能,引脚仅驱动为低电平。只读
//PIO_PUDR PIO 上拉禁用寄存器,0 = 无效,1 = 禁用I/O 线上拉电阻。只写
PIO_PPUER = 0xffffffff; //上拉使能寄存器,0 = 无效,1 = 使能I/O 线上拉电阻。只写
//PIO_PUSR PIO 多驱动状态寄存器,0 = I/O 线上拉电阻使能,1 = I/O 线上拉电阻禁用。只读
//PIO_ASR PIO 外设A 选择寄存器,0 = 无效,1 = I/O 线分配给外设A。只写
//PIO_BSR PIO 外设B 选择寄存器,0 = 无效,1 = I/O 线分配给外设B。只写
//PIO_ABSR PIO 外设A B 状态寄存器,0 = I/O 线分配给外设A,1 = I/O 线分配给外设B。只读
PIO_OWER = 0xefffff8f; //输出写使能寄存器,0 = 无效,1 = 使能I/O 线对PIO_ODSR 写。只写
PIO_OWDR = 0x100000e0; //PIO 输出写禁用寄存器,0 = 无效,1 = 禁用I/O 线对PIO_ODSR 写。只写
//PIO_OWSR PIO 输出写状态寄存器,0 = 写PIO_ODSR 不影响I/O 线,1 = 写PIO_ODSR 影响I/O 线。只读
}
//看门狗初始化
void hskmgcsh(void)
{
WDT_CR = 0xa5000001; //看门狗定时器控制寄存器
WDT_MR = 0x1fff8fff; //看门狗定时器模式寄存器
}
//时钟初始化
void hsszcsh(void)
{
PMC_SCER = 0xffffffff; //系统时钟使能寄存器
PMC_PCER = 0XFFFFFFFF; //外设时钟使能寄存器
CKGR_MOR = 0x0000ff01; //时钟发生器主振荡器寄存器
PMC_MCKR = 0x00000001; //PMC 主机时钟寄存器
//CKGR_PLLR = 0x00040805;
}
//t0初始化
void hst0csh(void)
{
unsigned long ul_sj;
ul_sj = 0;
// clock
TC0_CCR=0x01; // clk en
//采用timer_clock5(MCK/1024)作为触发
ul_sj|=set_15;
ul_sj|=set_14;
ul_sj|=set_2;
TC0_CMR =ul_sj;
//TC0_RC=18432; // 1S进一次定时器中断服务程序
//TC0_RC=184; // 10ms进一次定时器中断服务程序
TC0_RC=184; // 1S进一次定时器中断服务程序
ul_sj=0;
ul_sj |= set_4;
TC0_IER =ul_sj;//使能RC比较中断
//最低优先级、内部中断源边沿触发
AT91C_AIC_SVR[AT91C_ID_TC0] = (uint32)irq_Tc0; //定时器0中断 12
AT91C_AIC_SMR[AT91C_ID_TC0]=0x64;
//系统级使能TC2中断
AIC_IECR = set_12;
//赋中断服务函数指针
TC0_CCR=0x05; // reset start软件触发命令软件触发执行:计数器复位,时钟启动。
}
//中断初始化
void hszdcsh(void)
{
//AIC_SMR0 源模式寄存器0 读/ 写0x0
//AIC_SMR1 源模式寄存器1 读/ 写0x0
//AIC_SMR31 源模式寄存器31 读/ 写0x0,,---,0-2优先级,5-6中断源类型
//-----00 电平敏感 01 边沿触发10 电平敏感 11 边沿触发,内部中断源有效电平或边沿不可编程
//AIC_SVR0 源向量寄存器0 读/ 写0x0
//AIC_SVR1 源向量寄存器1 读/ 写0x0
//AIC_SVR31 源向量寄存器31 读/ 写0x0
//-----用户可在这些寄存器中存储各个中断源相关处理程序地址
//AIC_IVR 中断向量寄存器 只读0x0 --中断向量寄存器包含了用户编程的当前中断相关的源向量寄存器
//AIC_FVR 快速中断向量寄存器 只读0x0--FIQ向量寄存器包含用户在源向量寄存器0中编程的向量值
//AIC_ISR 中断状态寄存器只读0x0--中断状态寄存器返回当前中断源序号
//AIC_IPR 中断挂起寄存器只读0x0(1) --0 = 相关中断未挂起。1 = 相关中断挂起。
//AIC_IMR 中断屏蔽寄存器只读0x0 --0 = 相应中断禁用。1 = 相应中断使能。
//AIC_CISR = 0;//内核中断状态寄存器只读0x0 --0-0 0 = nFIQ 线无效。1 = nFIQ 线激活。1-1 0 = nIRQ 线无效。1 = nIRQ 线激活。
//AIC_IECR = 0x7ff4; //中断使能命令寄存器只写–- 0 = 无效。1 = 使能相应中断。
AIC_IDCR = 0xffffffff;// 中断禁用命令寄存器只写–- 0 = 无效。1 = 禁用相应中断。
AIC_ICCR = 0xffffffff;// 中断清除命令寄存器只写–- 0 = 无效。1 = 清除相应中断。
//AIC_ISCR = 0xffffffff;//中断置位命令寄存器只写–- 0 = 无效。1 = 置位相应中断
//AIC_EOICR 中断结束命令寄存器只写–-中断处理程序用中断结束命令寄存器指示中断处理结束。因为只需要向该寄存器地址写值以标识中断处理结束,所以可向其写入任意值。
//AIC_SPU 伪中断向量寄存器读/ 写0x0--用户可在该寄存器中存储伪中断处理程序的地址。当出现未中断时,写入该寄存器的值为AIC_IVR 的返回值,类似的发生伪快速中断时,写入该寄存器的值为AIC_IVR 的返回值。
//AIC_DCR 调试控制寄存器读/ 写0x0-- 0-0 0 = 保护模式禁用。1 = 保护模式使能。1-1 0 = nIRQ 与nFIQ 线由AIC 控制。1 = nIRQ 与nFIQ 线置于无效状态。
//AIC_FFER = 0xffffffff; //快速强制使能寄存器只写–- 0 = 无效。1 = 使能相应中断快速强制特性
AIC_FFDR = 0xffffffff;// 快速强制禁用寄存器只写–- 0 = 无效。1 = 禁用相应中断快速强制特性
//AIC_FFSR 快速强制状态寄存器只读0x0--0 = 禁用相应中断的快速强制特性。1 = 使能相应中断的快速强制特性。
}
//上电延时
void hssdys(void)
{
PMC_SCER = 0xffffffff; //系统时钟使能寄存器
PMC_PCER = 0XFFFFFFFF; //外设时钟使能寄存器
/*if((PIO_PDSR&set_16)==0)
{
while(1)
{
hsqkmg();
PMC_SCER = 0xffffffff; //系统时钟使能寄存器
PMC_PCER = 0XFFFFFFFF; //外设时钟使能寄存器
CKGR_MOR = 0x0000ff01; //时钟发生器主振荡器寄存器
PMC_MCKR = 0x00000001; //PMC 主机时钟寄存器
}
}
*/
}
//时钟设置
void hsszsz(void)
{
PMC_SCER = 0xffffffff; //系统时钟使能寄存器
PMC_PCER = 0XFFFFFFFF; //外设时钟使能寄存器
CKGR_MOR = 0x0000ff01; //时钟发生器主振荡器寄存器
PMC_MCKR = 0x00000001; //PMC 主机时钟寄存器
//CKGR_PLLR = 0x00040805;
}
//清看门狗
void hsqkmg(void)
{
WDT_MR = 0x30000000;
WDT_CR = 0xa5000001; //看门狗定时器控制寄存器
}
//t0设置
void hst0sz(void)
{
AIC_IECR = set_12; //AIC中断使能命令寄存器
TC0_CCR=0x01; // reset start软件触发命令软件触发执行:计数器复位,时钟启动
}
//中断设置
void hszdsz(void)
{
AT91C_AIC_SVR[AT91C_ID_FIQ] = (uint32)irq_fiq; //快速中断 0
AT91C_AIC_SVR[AT91C_ID_SYS] = (uint32)irq_SYS;
AT91C_AIC_SVR[AT91C_ID_PIOA] = (uint32)irq_pioa; //并行I/O控制器A 2
AT91C_AIC_SVR[AT91C_ID_3_Reserved] = (uint32)irq_Reserved;
AT91C_AIC_SVR[AT91C_ID_ADC] = (uint32)irq_adc; //模数转换器 4
AT91C_AIC_SVR[AT91C_ID_SPI] = (uint32)irq_spi; //串行外设接口 5
AT91C_AIC_SVR[AT91C_ID_US0] = (uint32)irq_us0; //USART 0 6
AT91C_AIC_SVR[AT91C_ID_US1] = (uint32)irq_us1; //USART 1 7
AT91C_AIC_SVR[AT91C_ID_SSC] = (uint32)irq_ssc; //同步串行接口 8
AT91C_AIC_SVR[AT91C_ID_TWI] = (uint32)irq_twi; //两线接口 9
AT91C_AIC_SVR[AT91C_ID_PWMC] = (uint32)irq_pwmc; //PWM 控制器 10
AT91C_AIC_SVR[AT91C_ID_UDP] = (uint32)irq_udp; //USB设备端口 11
AT91C_AIC_SVR[AT91C_ID_TC0] = (uint32)irq_Tc0; //定时器0中断 12
AT91C_AIC_SVR[AT91C_ID_TC1] = (uint32)irq_Tc1; //定时器1中断 13
AT91C_AIC_SVR[AT91C_ID_TC2] = (uint32)irq_Tc2; //定时器2中断 14
AT91C_AIC_SVR[AT91C_ID_15_Reserved] = (uint32)irq_15_Reserved;
AT91C_AIC_SVR[AT91C_ID_16_Reserved] = (uint32)irq_16_Reserved;
AT91C_AIC_SVR[AT91C_ID_17_Reserved] = (uint32)irq_17_Reserved;
AT91C_AIC_SVR[AT91C_ID_18_Reserved] = (uint32)irq_18_Reserved;
AT91C_AIC_SVR[AT91C_ID_19_Reserved] = (uint32)irq_19_Reserved;
AT91C_AIC_SVR[AT91C_ID_20_Reserved] = (uint32)irq_20_Reserved;
AT91C_AIC_SVR[AT91C_ID_21_Reserved] = (uint32)irq_21_Reserved;
AT91C_AIC_SVR[AT91C_ID_22_Reserved] = (uint32)irq_22_Reserved;
AT91C_AIC_SVR[AT91C_ID_23_Reserved] = (uint32)irq_23_Reserved;
AT91C_AIC_SVR[AT91C_ID_24_Reserved] = (uint32)irq_24_Reserved;
AT91C_AIC_SVR[AT91C_ID_25_Reserved] = (uint32)irq_25_Reserved;
AT91C_AIC_SVR[AT91C_ID_26_Reserved] = (uint32)irq_26_Reserved;
AT91C_AIC_SVR[AT91C_ID_27_Reserved] = (uint32)irq_27_Reserved;
AT91C_AIC_SVR[AT91C_ID_28_Reserved] = (uint32)irq_28_Reserved;
AT91C_AIC_SVR[AT91C_ID_29_Reserved] = (uint32)irq_29_Reserved;
AT91C_AIC_SVR[AT91C_ID_IRQ0] = (uint32)irq_IRQ0;
AT91C_AIC_SVR[AT91C_ID_IRQ1] = (uint32)irq_IRQ1;
}
//io设置
void hsiosz(void)
{
PIO_PER = 0xffffffff; //使能寄存器,0 = 无效,1 = 使能(禁用引脚外设控制)。只写
//PIO_PDR = 0xffffffff; //禁用寄存器,0 = 无效,1 = 禁用(使能引脚外设控制)。只写
PIO_OER = 0xf; //输出使能寄存器,0 = 无效,1 = 使能I/O 线上输出。只写
PIO_OER |= set_8;
PIO_OER |= set_9;
PIO_OER |= set_10;
PIO_OER |= set_24; //PIO_OSR PIO 输出状态寄存器,0 = I/O 线为纯输入,1 = I/O 线输出使能。只读
//PIO_IFER PIO 输入滤波器使能寄存器,0 = 无效,1 = 使能。只写
//PIO_IFDR PIO 输入滤波器禁用寄存器,0 = 无效,1 = 禁用。只写
//PIO_IFSR PIO 输入滤波器状态寄存器,0 = 滤波器禁用,1 = 滤波器使能。只读
//PIO_SODR PIO 置位输出数据寄存器,0 = 无效,1 = 设置在I/O 线上驱动的数据。只写
//PIO_CODR PIO 输出数据清零寄存器,0 = 无效,1 = 清除在I/O 线上驱动的数据。只写
//PIO_ODSR PIO 输出数据状态寄存器,0 = 驱动到I/O线上的数据为0,1 = 驱动到I/O线上的数据为1。只读或读/写
//PIO_PDSR PIO 引脚数据状态寄存器,0 = I/O线上的数据为0,1 = I/O线上的数据为1。只读
//PIO_IER = 0; //PIO 中断使能寄存器,0 = 无效,1 = 使能I/O 线上输入变化中断。只写
PIO_IDR = 0xffffffff;//中断禁用寄存器,0 = 无效,1 = 禁用I/O 线上输入变化中断。只写
//PIO_IMR PIO 中断屏蔽寄存器,0 = I/O 线上输入变化中断禁用,1 = I/O 线上输入变化中断使能。只读
//PIO_ISR PIO 中断状态寄存器,0 = 上次PIO_ISR读后或复位后, I/O 线上未检测到输入变化,1 = 上次PIO_ISR读后或复位后, I/O 线上至少检测到一次输入变化。只读
PIO_MDER = 0xffffffff; //多驱动使能寄存器,0 = 无效,1 = 使能(使能引脚外设控制)。只写
//PIO_MDDR PIO 多驱动禁用寄存器,0 = 无效,1 = 禁用(使能引脚外设控制)。只写
//PIO_MDSR PIO 多驱动状态寄存器,0 = 禁用,引脚驱动为高低电平,1 = 使能,引脚仅驱动为低电平。只读
//PIO_PUDR PIO 上拉禁用寄存器,0 = 无效,1 = 禁用I/O 线上拉电阻。只写
PIO_PPUER = 0xffffffff; //上拉使能寄存器,0 = 无效,1 = 使能I/O 线上拉电阻。只写
//PIO_PUSR PIO 多驱动状态寄存器,0 = I/O 线上拉电阻使能,1 = I/O 线上拉电阻禁用。只读
//PIO_ASR PIO 外设A 选择寄存器,0 = 无效,1 = I/O 线分配给外设A。只写
//PIO_BSR PIO 外设B 选择寄存器,0 = 无效,1 = I/O 线分配给外设B。只写
//PIO_ABSR PIO 外设A B 状态寄存器,0 = I/O 线分配给外设A,1 = I/O 线分配给外设B。只读
PIO_OWER = 0xefffff8f; //输出写使能寄存器,0 = 无效,1 = 使能I/O 线对PIO_ODSR 写。只写
PIO_OWDR = 0x100000e0;//PIO //输出写禁用寄存器,0 = 无效,1 = 禁用I/O 线对PIO_ODSR 写。只写
//PIO_OWSR PIO 输出写状态寄存器,0 = 写PIO_ODSR 不影响I/O 线,1 = 写PIO_ODSR 影响I/O 线。只读
}
//判断定时器
void hspdtc0()
{
//AIC_IDCR |= set_12; //AIC中断禁用命令寄存器
if(uz_zd1msyd != 0)
{
uz_zd1msyd = 0;
uz_1msyd = 1;
}
//AIC_IECR |= set_12; //AIC中断使能命令寄存器
}
//清定时器
void hsqdsq()
{
uz_1msyd = 0;
uz_10msyd = 0;
uz_100msyd = 0;
uz_1syd = 0;
}
//输入处理
unsigned char a0;
unsigned char a1;
unsigned char a2;
unsigned char a3;
void ws_hssrcl(unsigned long *ul_ccs,unsigned long *ul_srycz)
{
}
//输出
void ws_hssc(void)
{
// PIO_ODSR = ul_sc;
}
#define set_s PIO_SODR = set_8
#define clr_s PIO_CODR = set_8
#define set_cp1 PIO_SODR = set_9
#define clr_cp1 PIO_CODR = set_9
#define set_cp2 PIO_SODR = set_10
#define clr_cp2 PIO_CODR = set_10
#define set_disp PIO_SODR = set_24
#define clr_disp PIO_CODR = set_24
//液晶驱动
void hsyjcl(void)
{
unsigned char y;
unsigned char jzsj;
unsigned long jzsjdz;
PIO_ODSR &= 0xfffffff0;
PIO_OWER = 0x0f; //使能I/O 线对PIO_ODSR 写
PIO_OWDR = 0xfffffff0; //禁用I/O 线对PIO_ODSR 写。只写
jzsjdz = 0;
clr_disp;
{
y = 240;
set_disp;
clr_s;
clr_s;
set_cp1;
set_cp1;
set_s;
set_s;
clr_cp1;
clr_cp1;
clr_cp2;
clr_cp2;
clr_s;
clr_s;
while (y!=0)
{
hsqkmg(); //清看门狗
{
jzsj = uc_yjsj[jzsjdz];
jzsj = jzsj>>4;
set_cp2;
PIO_ODSR = jzsj;
clr_cp2;//0
jzsj = uc_yjsj[jzsjdz];
++jzsjdz;
set_cp2;
PIO_ODSR = jzsj;
clr_cp2; //1
jzsj = uc_yjsj[jzsjdz];
jzsj = jzsj>>4;
set_cp2;
PIO_ODSR = jzsj;
clr_cp2;//2
jzsj = uc_yjsj[jzsjdz];
++jzsjdz;
set_cp2;
PIO_ODSR = jzsj;
clr_cp2; //3
jzsj = uc_yjsj[jzsjdz];
jzsj = jzsj>>4;
set_cp2;
PIO_ODSR = jzsj;
clr_cp2;//4
jzsj = uc_yjsj[jzsjdz];
++jzsjdz;
set_cp2;
PIO_ODSR = jzsj;
clr_cp2; //5
jzsj = uc_yjsj[jzsjdz];
jzsj = jzsj>>4;
set_cp2;
PIO_ODSR = jzsj;
clr_cp2;//6
jzsj = uc_yjsj[jzsjdz];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -