下面是关于 开发板IO的测试
循环LED灯(板自带 红、绿、蓝)闪烁。
熟悉后感觉还是蛮方便的,下面是源程序:
#include "mb95200.h"
unsigned int k=0;
void Delay (unsigned int i) //延时程序
{
unsigned int m,n;
for(m=0;m<i;m++)
{
for(n=0;n<6000;n++)
asm("\tNOP");
}
}
void LED (unsigned int j) //LED灯(自带)控制程序
{
DDR0_P06 = 1; // set P0_P00 output(IO口定义:输出)
DDR6_P62 = 1; // set P6_P62 output(IO口定义:输出)
DDR6_P63 = 1; // set P6_P62 output(IO口定义:输出)
switch(j)
{
case 1: PDR0_P06 = 0; //输出状态定义:0表示灯亮(红灯)
break;
case 2: PDR0_P06 = 1; //输出状态定义:1表示灯灭(红灯)
break;
case 3: PDR6_P62 = 0; //输出状态定义:0表示灯亮(绿灯)
break;
case 4: PDR6_P62 = 1; //输出状态定义:1表示灯灭(绿灯)
break;
case 5: PDR6_P63 = 0; //输出状态定义:0表示灯亮(蓝灯)
break;
case 6: PDR6_P63 = 1; //输出状态定义:1表示灯灭(蓝灯)
break;
default:k=0;
break;
}
}
void main (void) //主程序(死循环)
{
while(1)
{
k++;
LED (k);
Delay (3);
}
}
#include "mb95200.h"
#define PDR_DS PDR6_P64
#define DDR_DS DDR6_P64
unsigned char start;
unsigned char read_data_H=0,read_data_L=0;
unsigned char data_int,data_dec,sign;
unsigned int disp_int,disp_int1,disp_int2,disp_int3;
unsigned int disp_dec,disp_dec1,disp_dec2;
unsigned char dsip_data;
/*DS_delay */
void Delay_250ms(void)
{
unsigned char i,j,k;
for(i=0;i<250;i++)
for(j=0;j<3;j++)
for(k=0;k<220;k++);
}
void Delay_600us(void)
{
unsigned char i,j,k;
for(i=0;i<6;i++)
for(j=0;j<1;j++)
for(k=0;k<63;k++);
}
void Delay_200us(void)
{
unsigned char i,j,k;
for(i=0;i<1;i++)
for(j=0;j<1;j++)
for(k=0;k<128;k++);
}
void Delay_40us(void)
{
unsigned char i,j,k;
for(i=0;i<2;i++)
for(j=0;j<1;j++)
for(k=0;k<9;k++);
}
void Delay_20us(void)
{
unsigned char i,j,k;
for(i=0;i<1;i++)
for(j=0;j<1;j++)
for(k=0;k<8;k++);
}
void Delay_10us(void)
{
unsigned char i,j,k;
for(i=0;i<1;i++)
for(j=0;j<1;j++)
for(k=0;k<1;k++);
}
/*DS_rest*/
unsigned char DS_rest(void)
{
DDR_DS=1;//set io output
PDR_DS=1;
PDR_DS=0;//pull ds line low
Delay_600us();//leave it low for 600us
PDR_DS=1;//allow line to return high
Delay_40us();//40us
DDR_DS=0;//set io input
Delay_200us();//wait for end of timeslot 200us
while(!PDR_DS);
return(PDR_DS);//rest_date signal returned(1:no part)
}
/*DS_read_bit*/
unsigned char read_bit(void)
{
PDR_DS=1;
DDR_DS=1;//set io output
PDR_DS=0;
DDR_DS=0;//set io input
Delay_20us();//20us
return(PDR_DS); // return value of PDR_DS line
}
/*DS_write_bit*/
void write_bit(char bitval)
{
PDR_DS=1;
DDR_DS=1;//set io output
PDR_DS=0;//pull DQ low to start timeslot
if(bitval==1) PDR_DS=1; // return PDR_DS high if write 1
Delay_20us();//20us hold value for remainder of timeslot
PDR_DS=1;
}
/*DS_read_byte*/
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value=0;
for(i=0;i<8;i++)
{
if(read_bit())value|=0x01<<i;// reads byte in, one byte at a time
// and then shifts it left
Delay_10us(); // wait for rest of timeslot
DDR_DS=1;//set io output
PDR_DS=1;//pull DQ low to start timeslot
}
return(value);
}
/*DS_write_byte*/
void write_byte(char val)
{
unsigned char i;
unsigned char temp;
for(i=0;i<8;i++)// writes byte, one bit at a time
{
temp=val>>i;// shifts val right ‘i’ spaces
temp &=0x01;// copy that bit to temp
write_bit(temp);// write bit in temp into
}
Delay_10us();
}
/*DS_count*/
unsigned char ds_count(void)
{
unsigned char temp;
sign=0;
if((read_data_H & 0xf8)!=0x00)//负数处理,取补码
{
sign=1;
read_data_H=~read_data_H;
read_data_L=~read_data_L;
temp=read_data_L+1;
read_data_L=temp;
if(temp>255)
{read_data_H++;}
}
read_data_H=read_data_H<<4;//整数部分处理,左移去掉高位数据
read_data_H=read_data_H & 0x70;//去掉高位和低位数据
data_int=read_data_L;
data_int=data_int>>4;//右移4位去掉小数部分的数据
data_int=data_int & 0x0f;//去掉高位数据
read_data_H=read_data_H | data_int;//完整的整数部分数据
data_int=read_data_H;//数据赋值给缓存
//disp_int=(unsigned int)data_int;
disp_int=(data_int & 0x01)*1;
disp_int+=(data_int & 0x02)*2;
disp_int+=(data_int & 0x04)*4;
disp_int+=(data_int & 0x08)*8;
disp_int+=(data_int & 0x10)*16;
disp_int+=(data_int & 0x20)*32;
disp_int+=(data_int & 0x40)*64;
disp_int+=(data_int & 0x80)*128;
disp_int1=disp_int%10;//个位
disp_int2=(disp_int%100)/10;//十位
disp_int3=disp_int/100;//百位
data_dec=read_data_L & 0x0f;//小数部分处理
data_dec=data_dec<<1;
disp_dec=(unsigned int)data_dec;
disp_dec1=disp_dec%10;//小数低位
disp_dec2=disp_dec/10;//小数高位
}
/*bin_to_dec*/
void bin_to_dec(unsigned char i)
{
unsigned char m;
m=(i&0x01)*1;
m+=(i&0x02)*2;
m+=(i&0x04)*4;
m+=(i&0x08)*8;
m+=(i&0x10)*16;
m+=(i&0x20)*32;
m+=(i&0x40)*64;
m+=(i&0x80)*128;
disp_int=m;
}
/*DS_disp*/
void disp_ds(void)
{
DDR0=0xff;//io output
PDR0=0xff;
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
disp_code(disp_int2);
//PDR0=dsip_data;
PDR0=read_data_H;
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
disp_code(disp_int1);
//PDR0=dsip_data;
PDR0=read_data_L;
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
Delay_250ms();
}
void main (void)
{
while(1)
{
DS_rest();//rest ds18b20
write_byte(0xcc);//command skip ROM
write_byte(0x44);//command convert T
Delay_250ms();//wait convert t ok
Delay_250ms();//500ms
DS_rest();//rest ds18b20
write_byte(0xcc);//command skip ROM
write_byte(0xbe);//command read
read_data_L=~read_byte();//read L_data
read_data_H=~read_byte();//read H_data
// ds_count();//t count
disp_ds();//disp t
}
}
贴出来大家看看 有兴趣的高手 希望能指点一下哪里错了
数据不显示
还在测试过程中 会有点乱
汗
分析你的程序:
1、程序的整合
Delay_10us、Delay_20us、Delay_40us、Delay_200us、Delay_600us、Delay_250ms
可以整合成:
//m为1时代表的是10us
void Delay_10us(unsigned int m)
{
unsigned char i,j,k;
for(i=0;i<m;i++)
for(j=0;j<1;j++)
for(k=0;k<1;k++);
}
2、程序的修改
注意:中文后面的是我修改的
/*DS_rest*/
unsigned char DS_rest(void)
{
DDR_DS=1;//set io output
PDR_DS=1; /*去掉*/
PDR_DS=0;//pull ds line low
Delay_600us();//leave it low for 600us
PDR_DS=1;//allow line to return high
Delay_40us();//40us
DDR_DS=0;//set io input
Delay_200us();//wait for end of timeslot 200us
while(!PDR_DS);/*危险,这样容易造成程序的死循环,这一行去掉*/
return(PDR_DS);//rest_date signal returned(1:no part)
}
/*DS_read_bit*/
unsigned char read_bit(void)
{
DDR_DS=0;//set io input
Delay_20us();//20us
return(PDR_DS); // return value of PDR_DS line
}
后面的你还得再修改修改的!
记得符合时序!
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |