程序改成只有几行了,在avr studio中main()中的语句不能单步运行,去掉g()函数又可以了
我用的是cvavr编译没有出现问题,软件调试使用avr studio 4.12。使用jtagice.#include <mega16.h>
void g (void)
{
unsigned char data1=0;
PORTB&=0x00; //B口初始化,RS=R/W=0.
PORTB|=0x04; //E=1
PORTB=data1; //按8位写入
PORTB&=0xf3; //E=0
PORTB&=0x00;
data1=0b00101000; //功能设置指令代码
}
void main(void)
{
unsigned char data1;
DDRB=0x00;
data1=0x30; //功能设置指令代码
data1&=0xf0;
PORTB|=0x04; //E=1
PORTB=data1; //按8位写入 单步走这句会跳过
PORTB&=0xf3; //E=0 同上
PORTB&=0x00; 同上
g ( ) ;
} g 后面是不是有一个空格 或者后面的括号是中文括号 g后面的空格去掉了。g() 函数在英文状态下重新写了一遍,还是不行。谢谢你的指点。还有其他的可能吗?我一个个试试。 在G后面加两个空指令,或做一个while循环。
你这程序G函数完成后将会失去控制。 是否和编译的优化有关系? 试验了许多次,在加了延时语句//*********后。main()、g()中的语句都可以单步走了。其中的道理不知为何?
#include <mega16.h>
#include <delay.h>
void g(void)
{
unsigned char data1=0xff;
PORTB&=0x00; //B口初始化,RS=R/W=0.
PORTB|=0x04; //E=1
PORTB=data1; //按8位写入
PORTB&=0xf3; //E=0
delay_us(1); //********
PORTB=data1;
PORTB&=0x00;
data1=0b00101000; //功能设置指令代码
}
void main(void)
{
unsigned char data1=0x00;
DDRB=0xff;
data1=0x30; //功能设置指令代码
data1&=0xf0;
PORTB|=0x04; //E=1
PORTB=data1; //按8位写入
PORTB&=0xf3; //E=0
PORTB=data1;
PORTB&=0x00;
g();
while(1);
} 下面这段程序为了能实现单步运行在语句中也加了许多延时语句。
我用的系统是:xp+cvavr+avr studio+软件仿真。您可以试一下,在您的机器上不加延时是否可单步运行。
/*****************************************************
Chip type : ATmega16
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size: 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#include<delay.h>
/*
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
// Declare your global variables here
/*******************************
*读忙标志BF和地址计数器AC
********************************/
void read_bf_and_ac() //读bf和ac
{
unsigned char data1=0x88,data2=0x99,data3;
PORTB&=0x00; //B口初始化,RS=R/W=0.
PORTB|=0x02; //R/W=1,RS=0.
DDRB=0x07; //?
PORTB|=0x04; //数据口为输入状态E=1.
delay_ms(2);
data1=PORTB; //第1次读出的为数据的高4位.
PORTB&=0x03; //E=0.
data1&=0xf0; //取高4位
data2=data1; //保存数据
PORTB|=0xf4; //E=1
delay_ms(2);
data1=PORTB; //第2次读出的为数据的低4位
PORTB&=0x03 ; //E=0
data1&=0xf0; //取数
data1>>=4; //高4位移至低4位
data3=data1|data2;//合成数据
}
/*******************************
*写指令函数
*指令代码放在data1中
********************************/
void write_command(unsigned char data1)
{
unsigned char data2;
PORTB&=0x00; //B口初始化,RS=R/W=0.
while(PINB.7); //等待忙标志BF为0,0表示空闲
delay_ms(1);
data2=data1;
data2&=0xf0; //保留高4位
delay_ms(1);
PORTB|=0x04; //RS=R/W=0, E=1
PORTB=data2; //第1次写出指令代码的高4位
delay_ms(1);
PORTB&=0xf3; //E=0
PORTB&=0x07; //数据线复位
delay_ms(1);
data2=data1;
data2<<=4; //data2中低4位移至高4位
delay_ms(1);
PORTB|=0x04; //E=1
delay_ms(2);
PORTB=data2; //第2次写出指令代码的低4位
delay_ms(1);
PORTB&=0xf3; //E=0
PORTB&=0x00;
}
/*******************************
*写数据函数
*数据放在data1中
********************************/
void write_data(unsigned char data1)
{
unsigned chardata2=0x99;
PORTB&=0x00; //B口初始化,RS=R/W=0.
while(PINB.7); //等待忙标志BF为0,0表示空闲
PORTB|=0x01; //RS=1,R/W=0
data2=data1;
data2&=0xf0; //保留高4位
PORTB|=0x04; //RS=R/W=0, E=1
delay_ms(2);
PORTB=data2; //第1次写出指令代码的高4位
PORTB&=0xf3; //E=0
PORTB&=0x07; //数据线复位
data2=data1;
data2<<=4; //data2中低4位移至高4位
PORTB|=0x04; //E=1
delay_ms(2);
PORTB=data2; //第2次写出指令代码的低4位
PORTB&=0xf3; //E=0
PORTB&=0x00;
}
/*******************************
*读数据函数
*
********************************/
void read_data( )
{
unsigned chardata1,data2=0x99,data3;
PORTB&=0x00; //B口初始化,RS=R/W=0.
while(PINB.7); //等待忙标志BF为0,0表示空闲
PORTB|=0x02; //R/W=1,RS=0.
DDRB=0x04; //数据口为输入状态E=1.
data1=PORTB; //第1次读出的为数据的高4位.
PORTB&=0x03; //E=0.
data1&=0xf0; //取高4位
data2=data1; //保存数据
PORTB|=0xf4; //E=1
delay_ms(2);
data1=PORTB; //第2次读出的为数据的低4位
PORTB&=0x03; //E=0
data1&=0xf0; //取数
data1>>=4; //高4位移至低4位
data3=data1|data2; //合成数据
}
/*******************************
*软件初始化
*
********************************/
void g_lcd_init(void)
{
unsigned char data1, i;
PORTB&=0x00; //B口初始化,RS=R/W=0.
for(i=0;i<3;i++)
{
data1=0x30; //功能设置指令代码
data1&=0xf0;
PORTB|=0x04; //E=1
PORTB=data1; //按8位写入
delay_ms(1);
PORTB&=0xf3; //E=0
delay_ms(1);
PORTB&=0x00;
delay_ms(1);
}
data1=0x20; //功能设置指令代码
data1&=0xf0;
PORTB|=0x04; //E=1
delay_us(1);
PORTB=data1; //按8位写入
delay_us(1);
PORTB&=0xf3; //E=0
delay_us(1);
PORTB&=0x00;
data1=0b00101000; //功能设置指令代码
write_command( data1 );
/*********************
*0x01清屏指令代码
**********************/
data1=0x01; //清屏指令代码
write_command( data1 );
/*********************
*0x06输入方式指令代码
**********************/
data1=0x06; //输入方式指令代码
write_command( data1 );
/*********************
*0x0e显示方式指令代码
**********************/
data1=0x06; //0x0e显示方式指令代码
write_command( data1 );
}
void main(void)
{
unsigned char data1;
DDRB=0x0f;
data1=0x30; //功能设置指令代码
data1&=0xf0;
PORTB|=0x04; //E=1
PORTB=data1; //按8位写入
PORTB&=0xf3; //E=0
PORTB&=0x00;
g_lcd_init( ) ;
write_data(0x02);
read_data( );
read_bf_and_ac();
while(1);
} 你用的单步应该是‘Step Over’而不是‘Step into’吧,‘Step Into’不加while循环应该也可以进去的,如果用‘Step Over’,调试器的动作是这样的: 找到g()的后一条语句,设置断点,然后全速运行。 但是你g()后面没有指令了,设置断点错误,所以全速运行就跑飞了。 当优化为LOW最低时,我认为用Step into应该能执行每一行的语句。现在可不是这样的。
页:
[1]