📄 main.c
字号:
lcd_set_xy(7,menuY);
}
}
break;
}
default:
// Either no buttons are pressed or mulitple buttons are pressed.
break;
}// end case
}//end ( if buttons are presed )
check_key ();
//判断是否连接电脑,下载程序
check_download();
} //end while( 1 )
}
void ShowMenu(void)
{
unsigned char n;
if ( userchoose%ShowCount==0)
{
displaystart = userchoose;
}
else if ((userchoose+1)%ShowCount==0)
displaystart = userchoose-2;
else if ((userchoose-1)%ShowCount==0)
displaystart = userchoose-1;
lcd_clear();
displaypoint=displaystart;
for ( n=0;displaypoint<16 && n< ShowCount; n++)
{
lcd_set_xy(1,n+1);
lcd_write_string(&menuBuffer[displaypoint][0]);
if (displaypoint==userchoose)
{
menuY=(int)n+1;
lcd_set_xy(0,n+1);
lcd_write_stringf("->");
}
displaypoint++;
}
lcd_set_xy(3,0);
lcd_write_stringf("目录");
}
void check_download(void)
{
unsigned char i;
unsigned char temp;
while(start_flag)
{
if(address_get)
{
for (i=0;i<4;i++)
{
if(Buffer[i]=='*')
{
temp=Buffer[i];
i++;
if(temp!=Buffer[i])
{
switch(Buffer[i])
{
case 'A':
currentMemoryPage=0x0002;
break;
case 'B':
currentMemoryPage=0x0041;
break;
case 'C':
currentMemoryPage=0x0081;
break;
case 'D':
currentMemoryPage=0x00C1;
break;
case 'E':
currentMemoryPage=0x00FF;
break;
case 'F':
currentMemoryPage=0x013E;
break;
case 'G':
currentMemoryPage=0x017D;
break;
case 'H':
currentMemoryPage=0x01BC;
break;
case 'I':
currentMemoryPage=0x01FB;
break;
case 'J':
currentMemoryPage=0x023A;
break;
case 'K':
currentMemoryPage=0x0279;
break;
case 'L':
currentMemoryPage=0x02B8;
break;
case 'M':
currentMemoryPage=0x02F7;
break;
case 'N':
currentMemoryPage=0x0336;
break;
case 'O':
currentMemoryPage=0x0375;
break;
case 'P':
currentMemoryPage=0x03B4;
break;
default:
start_flag=0;
break;
}
}
}
}
if(start_flag)
{
address_get=0;
for(i=0;i<buffersize;i++)
Buffer[i]=' ';
lcd_clear();
lcd_set_xy(0,1);
lcd_write_stringf("文档下载中.....");
USART_Transmit('#');
USART_Transmit('#');
}
}
if(buffer_overflow)
{
//关USART中断
UCSRB=0x00;
//判断BUFFER内容***号吗,若是就停止接受。
if (Buffer[2]=='*') //一个奇怪的符号
{
lcd_clear();
lcd_set_xy(0,1);
lcd_write_stringf("文档下载完毕!");
for(i=0;i<buffersize;i++)
Buffer[i]=' ';
delay_ms(1000);
delay_ms(1000);
start_flag=0;
address_get=1; //此标志位很重要 确定下载地址
ShowMenu();
UCSRB=0x98;
}
if( start_flag)
{
WriteBufferToMemory( Buffer, BUFFER_SIZE,currentMemoryPage);
buffer_overflow=0;
currentMemoryPage++;
for(i=0;i<buffersize;i++)
Buffer[i]=' ';
UCSRB=0x98;
delay_us(10);
USART_Transmit('#');
USART_Transmit('#');
}
}
}
start_flag=0;
}
/******************************************************************************
* Initialize()
*
* Initializes the AVR microcontroller by setting up port I/O, etc.
******************************************************************************/
void Initialize( void )
{
unsigned char i = 0;
menuX=7;
menuY=0;
textY=3;
textX=7;
PORTD = 0x03; // TXD(PD1)输出
DDRD = 0x02; // RXD(PD0)输入,上拉有效
/* InitializeButtons */
DDRB&=0xF0;
PORTB=(0xF0&PINB);
UCSRA = 0x00; // USART初始化
UCSRB = 0x98; // 允许RXC中断,接收允许,发送允许
UCSRC = 0x86; // 8 Data, 1 Stop, No Parity
UBRRH = BAUD_H; // 设置波特率
UBRRL = BAUD_L;
lcd_init();
InitializeKeyboard();
Initi_Flash();
lcd_clear();
mode = MENU;
endOfmenuBuffer=15;
currentMemoryPage = 0;
endOfBuffer = 63;
userchoose=0;
displaypoint=0;
displaystart=0;
for( i = 0; i < BUFFER_SIZE; i++ )
{
Buffer[i] = ' ';
}
lcd_clear();
#asm("sei") // 开中断
menuBufferTOBuffer();
WriteBufferToMemory( Buffer, BUFFER_SIZE,0 );
ReadMemoryToBuffer( Buffer, BUFFER_SIZE,0 );
BufferTOmenuBuffer();
ShowMenu();
return;
}
/******************************************************************************
* interrupt [EXT_INT0] void ext_into_isr (void)
* Interrupt subroutine triggered by INT0, which is an external interrupt.
* The keyboard clock pin is attached to INT0, so whenever the keyboard has
* data to send this interrupt is triggered.
******************************************************************************/
void check_key(void)
{
if(EDIT==1)
{
if( key != 0 )
{
// A valid scancode was found
//lcd_set_xy(0,0);
// lcd_write_data( key );
if( key == 8 )
{
// backspace
if (mode==MENU)
{
endOfmenuBuffer--;
if( endOfmenuBuffer <=2 )
{
endOfmenuBuffer = 2;
}
menuBuffer[userchoose][endOfmenuBuffer] = ' ';
if (++negative_counter>1)
{ negative_counter=0;
menuX--;}
if( menuX <= 2 )
{
menuX = 2;
}
}
else {//mode=TEXT
endOfBuffer--;
if( endOfBuffer < 0 )
{
endOfBuffer = 0;
}
*(screenBuffer+endOfBuffer) = ' ';
if (++negative_counter>1)
{ negative_counter=0 ;
textX--;
}
if( textX < 0 )
{
textX = 7;
textY--;
if(textY<0)
{
textX = 0;
textY=0;
}
}
SetLCDCursor(textX,textY);
}
}
else
{
if (mode==MENU)
{
menuBuffer[userchoose][endOfmenuBuffer]=key;
endOfmenuBuffer++;
if( endOfmenuBuffer >=13)
{
endOfmenuBuffer = 13;
}
if (negative_counter++>1)
{ negative_counter=0;
menuX++;
}
if( menuX >7 )
{
menuX = 7;
}
}
else// mode == TEXT )
{
*(screenBuffer+endOfBuffer) = key;
endOfBuffer++;
if( endOfBuffer >= 63 )
{
endOfBuffer = 63;
}
if (++negative_counter>1)
{ negative_counter=0 ;
textX++;
}
if( textX >7 )
{
textX = 0;
textY++;
if(textY>3)
{
textX = 7;
textY=3;
}
}
}
}
if (mode==TEXT)
{
lcd_write_full( screenBuffer );
SetLCDCursor( textX, textY );
}
else
{
ShowMenu();
SetLCDCursor( menuX, menuY );
}
}
}
key=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -