2
15
66
注册会员
u8 matrix_key(void) { u8 key_num=0; P13=0;P12=1;P11=1;P10=1; if(P17==0) { key_num=1; }else if(P16==0) { key_num=2; }else if(P15==0) { key_num=3; }else if(P14==0) { key_num=4; } P13=1;P12=0;P11=1;P10=1; if(P17==0) { key_num=5; }else if(P16==0) { key_num=6; }else if(P15==0) { key_num=7; }else if(P14==0) { key_num=8; } P13=1;P12=1;P11=0;P10=1; if(P17==0) { key_num=9; }else if(P16==0) { key_num=10; }else if(P15==0) { key_num=11; }else if(P14==0) { key_num=12; } P13=1;P12=1;P11=1;P10=0; if(P17==0) { key_num=13; }else if(P16==0) { key_num=14; }else if(P15==0) { key_num=15; }else if(P14==0) { key_num=16; } return key_num; }复制代码
使用道具 举报 送花
//复位USB 很重要 P3M0 &=~0x03; P3M1 |=0x03; USBCON=0x00; USBCLK=0x00; IRC48MCR=0x00; delay_ms(10);复制代码
;P3的13号中断 ;CSEG AT 0143H ;JMP P3INT_SR ;P3INT_SR: ;JMP 006BH ;END 复制代码
#define COUNTER 10 void Timer1_Init(void) //计数器 { AUXR |= 0x40; //定时器时钟1T模式 TMOD &= 0x0F; //设置定时器模式为计数器 TMOD |= 0x40; TL1 = (65536-COUNTER); //设置定时初始值 TH1 = (65536-COUNTER)>>8; //设置定时初始值 TF1 = 0; //清除TF1标志 P3PU |=0x20; //打开P3.5上拉电阻 TR1 = 1; //定时器1开始计时 ET1 = 1; //使能定时器1中断 }复制代码
#include "18B20.h" #include "io.h" u32 DS18B20_Temp=0; u8 minus=0; void Delay480us(void) //@40.000MHz { unsigned long edata i; _nop_(); _nop_(); _nop_(); i = 4798UL; while (i) i--; } void Delay60us(void) //@40.000MHz { unsigned long edata i; _nop_(); _nop_(); _nop_(); i = 598UL; while (i) i--; } void Delay1us(void) //@40.000MHz { unsigned long edata i; _nop_(); _nop_(); _nop_(); i = 8UL; while (i) i--; } void DS18B20_reset(void) { u8 flag=1; while(flag) { DQ=0; Delay480us(); DQ=1; Delay60us(); flag=DQ; Delay480us(); } } void DS18B20_write_0(void) { DQ=0; Delay60us(); DQ=1; Delay1us(); Delay1us(); } void DS18B20_write_1(void) { DQ=0; Delay1us(); Delay1us(); DQ=1; Delay60us(); } bit DS18B20_read(void) { bit b=0; DQ=0; Delay1us(); Delay1us(); DQ=1; Delay1us(); Delay1us(); b=DQ; Delay60us(); return b; } void DS18B20_write_byte(u8 dat) { u8 i; for(i=0;i<8;i++) { if((dat>>i) & 0x01) DS18B20_write_1(); else DS18B20_write_0(); } } u8 DS18B20_read_byte(void) { u8 dat=0; u8 i; for(i=0;i<8;i++) { dat >>= 1; if(DS18B20_read()) dat |= 0x80; } return dat; } void DS18B20_ReadTemp(void) { u8 datH=0, datL=0; u16 temp=0; /* 发送检测命令 */ DS18B20_reset(); DS18B20_write_byte(0xCC); //跳过ROM命令 DS18B20_write_byte(0x44); //开始转化 while(!DQ); /* 发送读取命令 */ DS18B20_reset(); DS18B20_write_byte(0xCC); //跳过ROM命令 DS18B20_write_byte(0xBE); //开始读取 datL=DS18B20_read_byte(); datH=DS18B20_read_byte(); if(datH & 0x80) { minus=1; temp=((u16)datH<<8)|(u16)datL; temp =~temp+1; //负数取补码 DS18B20_Temp=(u32)temp*625; //放大1万倍 } else { minus=0; temp=((u16)datH<<8)|(u16)datL; DS18B20_Temp=(u32)temp*625; //放大1万倍 } } void DS18B20_ShowTemp(u8 digit) { u8 i; u32 new_temp; if(digit>4) digit=4; //最多4为小数 new_temp=DS18B20_Temp/(u32)pow(10,4-digit); for(i=0;i<digit+2;i++) { if(i==digit) digit_show((u8)(new_temp/(u32)pow(10,i)%10),(u8)(i+1),1); else digit_show((u8)(new_temp/(u32)pow(10,i)%10),(u8)(i+1),0); } }复制代码
//<<AICUBE_USER_HEADER_REMARK_BEGIN>> //////////////////////////////////////// // 在此添加用户文件头说明信息 // 文件名称: uart.c // 文件描述: // 文件版本: V1.0 // 修改记录: // 1. (2025-04-30) 创建文件 //////////////////////////////////////// //<<AICUBE_USER_HEADER_REMARK_END>> #include "config.h" //<<AICUBE_USER_INCLUDE_BEGIN>> // 在此添加用户头文件包含 //<<AICUBE_USER_INCLUDE_END>> //<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>> u8 Rec_Dat[50]; u8 Rec_Num=0; bit B_TX2_Busy=0; bit B_TX2_OK=0; //<<AICUBE_USER_GLOBAL_DEFINE_END>> //////////////////////////////////////// // 串口2中断服务程序 // 入口参数: 无 // 函数返回: 无 //////////////////////////////////////// void UART2_ISR(void) interrupt UART2_VECTOR { //<<AICUBE_USER_UART2_ISR_CODE1_BEGIN>> // 在此添加中断函数用户代码 if (UART2_CheckTxFlag()) //判断串口发送中断 { UART2_ClearTxFlag(); //清除串口发送中断标志 B_TX2_Busy=0; } if (UART2_CheckRxFlag()) //判断串口接收中断 { UART2_ClearRxFlag(); //清除串口接收中断标志 UR2TOCR = 0xe0; Rec_Dat[Rec_Num++]=S2BUF; } if(UR2TOSR & 0x01) { B_TX2_OK = 1; UR2TOSR = 0; UR2TOCR = 0x00; } //<<AICUBE_USER_UART2_ISR_CODE1_END>> } //////////////////////////////////////// // 串口2初始化函数 // 入口参数: 无 // 函数返回: 无 //////////////////////////////////////// void UART2_Init(void) { #ifdef BAUDRATE #undef BAUDRATE #endif #define BAUDRATE (115200) #define T2_RELOAD (65536 - (SYSCLK / BAUDRATE + 2) / 4) UART2_SwitchP4243(); //设置串口数据端口: RxD2 (P4.2), TxD2 (P4.3) // UART2_Timer2BRT(); //串口2固定选择定时器2作为波特率发生器 TIMER2_TimerMode(); //设置定时器2为定时模式 TIMER2_1TMode(); //设置定时器2为1T模式 TIMER2_SetPrescale(0); //设置定时器2的8位预分频 TIMER2_SetReload16(T2_RELOAD); //设置定时器2的16位重载值 TIMER2_Run(); //定时器2开始运行 UART2_EnableRx(); //使能串口2接收数据 UART2_Mode3(); //设置串口2为模式3 (9位数据可变波特率) UART2_OddParity(); //串口2硬件自动奇校验 UART2_SetIntPriority(0); //设置中断为最低优先级 UART2_EnableInt(); //使能串口2中断 UART2_TimeoutScale_BRT(); //设置串口波特率为接收超时时间基准 UART2_SetTimeoutInterval(0x0000ff); //设置接收超时时间长度 UART2_EnableTimeoutInt(); //使能串口接收超时中断 UART2_EnableTimeout(); //使能串口接收超时功能 //<<AICUBE_USER_UART2_INITIAL_BEGIN>> // 在此添加用户初始化代码 //<<AICUBE_USER_UART2_INITIAL_END>> } //<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>> void uart_receive(void) { if(B_TX2_OK) { B_TX2_OK=0; uart_send("receive finish\r\n"); } if(Rec_Num>=6) { if(Rec_Dat[Rec_Num-1]=='\n' && Rec_Dat[Rec_Num-2]=='\r') { if(Rec_Dat[Rec_Num-6]=='o' && Rec_Dat[Rec_Num-5]=='p'&& Rec_Dat[Rec_Num-4]=='e' && Rec_Dat[Rec_Num-3]=='n') { P00=0; uart_send("open\r\n"); } if(Rec_Dat[Rec_Num-7]=='c' && Rec_Dat[Rec_Num-6]=='l' && Rec_Dat[Rec_Num-5]=='o'&& Rec_Dat[Rec_Num-4]=='s' && Rec_Dat[Rec_Num-3]=='e') { P00=1; uart_send("closed\r\n"); } Rec_Num=0; } } } void uart_send(u8 *dat) { for(;*dat !=0; dat++) { S2BUF=*dat; B_TX2_Busy=1; while(B_TX2_Busy); } } //<<AICUBE_USER_FUNCTION_IMPLEMENT_END>> 复制代码
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2025-5-1 17:54 , Processed in 0.128088 second(s), 79 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.