|
最新做了个ATmega128的小板,接了个12864液晶,用洞洞板搭的,由于焊接方便LCD的引脚跟单片机的端口是随意接的,怎么好走线怎么接。
所以造成本来只要一条指令就可以送数据到端口的,而现在要N条,AVR的位操作不太完善啊。
这是我写的,感觉不够紧凑,我想知道有没更简单的方法,我的这个程序读需要35个周期,写需要59个周期,而且程序很长感觉。
还有想问下位传递用怎么写,AVR汇编有位传递指令吗? 比如把某一位data.5送到PORTA.2
void LCD_DataOut(unsigned char LCDData) //59T
{
//--------DB0-------
if (LCDData&1)
PORTC|=(1<<PC7);
else
PORTC&=~(1<<PC7);
//--------DB1-------
if (LCDData&2)
PORTA|=(1<<PA7);
else
PORTA&=~(1<<PA7);
//--------DB2-------
if (LCDData&4)
PORTA|=(1<<PA5);
else
PORTA&=~(1<<PA5);
//--------DB3-------
if (LCDData&8)
PORTA|=(1<<PA3);
else
PORTA&=~(1<<PA3);
//--------DB4-------
if (LCDData&16)
PORTA|=(1<<PA1);
else
PORTA&=~(1<<PA1);
//--------DB5-------
if (LCDData&32)
PORTF|=(1<<PF7);
else
PORTF&=~(1<<PF7);
//--------DB6-------
if (LCDData&64)
PORTF|=(1<<PF5);
else
PORTF&=~(1<<PF5);
//--------DB7-------
if (LCDData&128)
PORTF|=(1<<PF3);
else
PORTF&=~(1<<PF3);
}
unsigned char LCD_DataIn(void) //35T
{
unsigned char DataIn=0,DataR1;
//--------DB0-------
if (PINC&(1<<7))
DataIn+=1;
//--------DB1-------
DataR1=PINA;
if (DataR1&(1<<7))
DataIn+=2;
//--------DB2-------
if (DataR1&(1<<5))
DataIn+=4;
//--------DB3-------
if (DataR1&(1<<3))
DataIn+=8;
//--------DB4-------
if (DataR1&(1<<1))
DataIn+=16;
//--------DB5-------
DataR1=PINF;
if (DataR1&(1<<7))
DataIn+=32;
//--------DB6-------
if (DataR1&(1<<5))
DataIn+=64;
//--------DB7-------
if (DataR1&(1<<3))
DataIn+=128;
return DataIn;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|