论坛» 嵌入式开发» MCU

专家
2010-12-20 09:08 11楼
以后用的都不会是汇编!一大堆程序的话谁用汇编?
助工
2010-12-20 15:26 12楼

是啊
C语言会是最终的结果

已经知道了 富士通的文件必须要有启动文件什么的
还是用C测试一下吧

助工
2010-12-22 01:37 13楼

下面是关于 开发板IO的测试
循环LED灯(板自带 红、绿、蓝)闪烁。
熟悉后感觉还是蛮方便的,下面是源程序:
#include "mb95200.h"
unsigned int k=0;

void Delay (unsigned int i) //延时程序
{
unsigned int m,n;
for(m=0;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);
}
}

助工
2010-12-28 14:58 14楼

本来还在测试那个DS18B20 温度的
让它读取后显示在数码管上的
但是调来调去就是不行
都快晕死了

助工
2010-12-28 15:04 15楼

#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<// 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
}
}

贴出来大家看看 有兴趣的高手 希望能指点一下哪里错了
数据不显示
还在测试过程中 会有点乱

专家
2010-12-28 16:35 16楼

分析你的程序:
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;ifor(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
}
后面的你还得再修改修改的!
记得符合时序!

助工
2010-12-29 08:18 17楼

谢谢高手出场
我改改看 不过就是因为怕延时不准确 所以才把延时程序单独分开的
我也还在看时序呢
单总线的 写时间间隙、时序都很严格的样子。

菜鸟
2010-12-30 11:36 18楼

因为一直不看好汇编,所以在学校压根就没认真学,略知皮毛而已。看了楼主的帖子,貌似楼主很喜欢汇编吧 对于你遇到的问题,很可能是设置的问题 单纯的程序部分问题应该不大 楼主再仔细检查一下一些关键的地方设置是否正确

助工
2011-01-15 11:18 19楼
最近比较忙 有空还会研究 不过上次 halibote523改的程序 还是不行
助工
2011-01-18 09:17 20楼

白猫 黑猫 能抓老鼠的就是好猫
呵呵
个人偏爱
C与汇编也一样,能发挥到最好的都是OK的

共20条 2/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]