📄 main__.c
字号:
{
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;
}
#include <mega16.h>
#include <delay.h>
#include <12864.h>
#define RS PORTA.0
#define RW PORTA.1
#define E PORTA.2
/*1--GND
2--VCC
3--V0--kong
4--RS--PA0
5--RW--PA1
6--E---PA2
7---14 PC0---PC7
15--PSB---VCC选并口
*/
void lcd_init(void) //初始化
{
DDRC=0xff;
PORTC=0x00;
DDRA=0xff;
PORTA=0x00;
delay_ms(50);
lcd_write_command(0x30); // //选择基本指令集
delay_ms(1);
lcd_write_command(0x0c); //开显示(无游标、不反白)
delay_ms(1);
lcd_write_command(0x01); //清除显示,并且设定地址指针为00H
delay_ms(1);
lcd_write_command(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
delay_ms(1);
lcd_write_command(0x80); //
}
void lcd_write_command(unsigned char cmdcode) //写指令RS=0,RW=0,下降沿打入。
{
chek_busy ();
RS = 0;
RW = 0;
E = 1;
#asm("nop");
PORTC = cmdcode;
#asm("nop");
E = 0;
}
void chek_busy(void) //判忙, RS=0,RW=1,E=1,读指令。
{
DDRC &= 0x7f;
RS = 0;
RW = 1;
E = 1;
#asm("nop");
while(PINC&0x80);
#asm("nop");
E = 0;
DDRC |= 0x80;
}
void lcd_write_data(unsigned char disdata) //写数据,RS=1,RW=0,下降沿打入。
{
chek_busy ();
RS = 1;
RW = 0;
E = 1;
#asm("nop");
PORTC = disdata;
#asm("nop");
E = 0;
#asm("nop");
}
void lcd_set_xy( unsigned char x, unsigned char y ) //写地址函数
{
unsigned char address; //x范围是0~7 y范围0~3
switch ( y )
{
case 0 : address=0x80+x;
break;
case 1 : address=0x90+x;
break;
case 2 : address=0x88+x;
break;
case 3 : address=0x98+x;
break;
default: break;
}
lcd_write_command(address);
}
void SetLCDCursor( unsigned char x,unsigned char y )
{
lcd_cursor_flash(1);
lcd_set_xy(x,y);
}
void lcd_write_stringf(unsigned char flash *s)
{
while(*s>0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -