各位大虾们,小弟写了个12864的程序,在ATmega16上运行正常,烧到ATmega8L上就不行了,下面是详细的情况 100
12864液晶驱动器位ST7920,使用串口方式工作,psb,固定接地,cs(RS)固定接高,Atmega16:sid(RW)接ATMega16的portb1,scl(E...
12864液晶驱动器位ST7920,使用串口方式工作,
psb,固定接地,cs(RS)固定接高,
Atmega16:sid(RW)接ATMega16 的portb1,scl(E)接ATMega16 的portb0, rst,A,K都接的正确
可以确定硬件接口连接都正确,程序正确,延时也是对的,在1Mhz,4Mhz时钟下都能在M16上运行出来,
ATmega8:上的portc5接scl,portc6接sid,熔丝位设置时rstdisbl=0,portc6做I/0用,把头文件改成m8的,scl,sid接口改掉,程序烧到片上,死活不成功,急啊
一下是ATMega16上的C程序
//ICC-AVR application builder : 2012-3-21 下午 10:18:40
// Target : M16
// Crystal: 4.0000Mhz
#include <iom16v.h>
#include <macros.h>
#define SET_SCL() PORTB|=(1<<PORTB6)
#define CLR_SCL() PORTB&=~(1<<PORTB6)
#define SET_SID() PORTB|=(1<<PORTB5)
#define CLR_SID() PORTB&=~(1<<PORTB5)
void Io_Init(void);
void Write_Byte(unsigned char); //写一个字节
void Write_Command(unsigned char); //写一个字节数据到LCD指令寄存器
void Write_Char(unsigned char); //写一个字符到资料寄存器
void Init_Lcd(void); //LCD 初始化函数
void Delay_Ms(void); //4Mhz下延时一个ms的函数
void Write_Byte(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(dat&0x80)//dat最高位是1
{
SET_SID();
}
else
{
CLR_SID();
}
CLR_SCL();
NOP();
NOP();
NOP();
SET_SCL();
dat<<=1;
}
Delay_Ms();
Delay_Ms();
}
/*********写指令寄存器函数***********/
void Write_Command(unsigned char comm)
{
//一:先要写入同步字 0b 11111 1,0,Rs,0 rs=0写指令 rs=1写资料
Write_Byte(0xf8);
//二:先写命令高四位,后四位补零
Write_Byte(comm&0xf0);
//三:在写命令低四位,后四位补零
Write_Byte(comm<<4);
}
void Write_Char(unsigned char dat)
{
//一:先要写入同步字 0b 11111 1,0,Rs,0 rs=0写指令 rs=1写资料
Write_Byte(0xfa);
//二:先写命令高四位,后四位补零
Write_Byte(dat&0xf0);
//三:在写命令低四位,后四位补零
Write_Byte(dat<<4);
}
void Init_Lcd()
{
Write_Command(0x30);
Delay_Ms();
Write_Command(0x04);
Delay_Ms();
Write_Command(0x0c);
Delay_Ms();
Write_Command(0x01);
Delay_Ms();
Write_Command(0x02);
Delay_Ms();
Write_Command(0x80);
Delay_Ms();
Write_Char(0x70);
Write_Char(0x71);
Write_Char(0x72);
Write_Char(0x73);
}
//大概延时1ms以上
void Delay_Ms()
{
unsigned char i=100;
unsigned char k=100;
while(i--)
{
while(k--);
}
}
void Io_Init()
{
}
void main(void)
{
DDRB=0xff;
Init_Lcd();
while(1);
}
Atmega8,Atmega16都是一个系列的,指令完全兼容,书上说的,程序移植时要注意什么问题吗?
问题解决,原来Mega8芯片也有坏的,而且不止一个,都被我用上了 展开
psb,固定接地,cs(RS)固定接高,
Atmega16:sid(RW)接ATMega16 的portb1,scl(E)接ATMega16 的portb0, rst,A,K都接的正确
可以确定硬件接口连接都正确,程序正确,延时也是对的,在1Mhz,4Mhz时钟下都能在M16上运行出来,
ATmega8:上的portc5接scl,portc6接sid,熔丝位设置时rstdisbl=0,portc6做I/0用,把头文件改成m8的,scl,sid接口改掉,程序烧到片上,死活不成功,急啊
一下是ATMega16上的C程序
//ICC-AVR application builder : 2012-3-21 下午 10:18:40
// Target : M16
// Crystal: 4.0000Mhz
#include <iom16v.h>
#include <macros.h>
#define SET_SCL() PORTB|=(1<<PORTB6)
#define CLR_SCL() PORTB&=~(1<<PORTB6)
#define SET_SID() PORTB|=(1<<PORTB5)
#define CLR_SID() PORTB&=~(1<<PORTB5)
void Io_Init(void);
void Write_Byte(unsigned char); //写一个字节
void Write_Command(unsigned char); //写一个字节数据到LCD指令寄存器
void Write_Char(unsigned char); //写一个字符到资料寄存器
void Init_Lcd(void); //LCD 初始化函数
void Delay_Ms(void); //4Mhz下延时一个ms的函数
void Write_Byte(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(dat&0x80)//dat最高位是1
{
SET_SID();
}
else
{
CLR_SID();
}
CLR_SCL();
NOP();
NOP();
NOP();
SET_SCL();
dat<<=1;
}
Delay_Ms();
Delay_Ms();
}
/*********写指令寄存器函数***********/
void Write_Command(unsigned char comm)
{
//一:先要写入同步字 0b 11111 1,0,Rs,0 rs=0写指令 rs=1写资料
Write_Byte(0xf8);
//二:先写命令高四位,后四位补零
Write_Byte(comm&0xf0);
//三:在写命令低四位,后四位补零
Write_Byte(comm<<4);
}
void Write_Char(unsigned char dat)
{
//一:先要写入同步字 0b 11111 1,0,Rs,0 rs=0写指令 rs=1写资料
Write_Byte(0xfa);
//二:先写命令高四位,后四位补零
Write_Byte(dat&0xf0);
//三:在写命令低四位,后四位补零
Write_Byte(dat<<4);
}
void Init_Lcd()
{
Write_Command(0x30);
Delay_Ms();
Write_Command(0x04);
Delay_Ms();
Write_Command(0x0c);
Delay_Ms();
Write_Command(0x01);
Delay_Ms();
Write_Command(0x02);
Delay_Ms();
Write_Command(0x80);
Delay_Ms();
Write_Char(0x70);
Write_Char(0x71);
Write_Char(0x72);
Write_Char(0x73);
}
//大概延时1ms以上
void Delay_Ms()
{
unsigned char i=100;
unsigned char k=100;
while(i--)
{
while(k--);
}
}
void Io_Init()
{
}
void main(void)
{
DDRB=0xff;
Init_Lcd();
while(1);
}
Atmega8,Atmega16都是一个系列的,指令完全兼容,书上说的,程序移植时要注意什么问题吗?
问题解决,原来Mega8芯片也有坏的,而且不止一个,都被我用上了 展开
3个回答
展开全部
哇靠,这样的程序不修改直接弄上去,能行才见鬼呢。
#include <iom16v.h>
也不改下#include <iom8v.h>
还有这是怎么写的程序,如此凌乱
#include <iom16v.h>
也不改下#include <iom8v.h>
还有这是怎么写的程序,如此凌乱
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
ad_l=Spi_Transmit(1);//ad读出的是高8位值,ad_l为低8位
这里不是给1,应该是和上面的一样。
这里不是给1,应该是和上面的一样。
追问
什么意思啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询