?? main__.c
字號:
/******************************************************************************
*電子書設(shè)計程序
* File: 'e_record.c'
******************************************************************************/
#include <mega16.h>
#include <delay.h>
#include <flashic.h>
#include <key.h>
#include <12864.h>
#define MENU 0
#define TEXT 1
#define ShowCount 3
#define BUFFER_SIZE 255 //336 /* LINE_LENGTH * NUM_ROWS */
#define BAUD 9600 //波特率采用9600bps
#define CRYSTAL 4000000 //系統(tǒng)時鐘4MHz
#define DATA_REGISTER_EMPTY (1<<5)
//計算和定義波特率設(shè)置參數(shù)
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)
#define buffersize 255
unsigned char negative_counter=0;
unsigned char command=' ';
bit buffer_overflow=0;
bit start_flag=0;
bit download_flag=0;
bit address_get=1;
unsigned char menuBuffer[16][16]=
{{"1.Text1"}, {"2.Text2"}, {"3.Text3"}, {"4.Text4"},
{"5.Text5"},{"6.Text6"}, {"7.Text7"}, {"8.Text8"},
{"9.Text9"},{"10.Text10"}, {"11.Text11"},{"12.Text12"},
{"13.Text13"},{"14.Text14"},{"15.Text15"},{"16.Text16"}
};
//開辟screenBuffer
//專門用來顯示,一個屏幕只能顯示64字節(jié)
unsigned char mode;
unsigned char key;//全局變量用來存放中斷獲取的鍵值
unsigned int currentMemoryPage;
unsigned char * screenBuffer;
unsigned char Buffer[255];
unsigned char displaypoint,displaystart;
bit EDIT_flag=0;
unsigned char EDIT=0;
int endOfBuffer;
unsigned char userchoose;
char endOfmenuBuffer;
int startOfBuffer;
int textX,menuX;
int textY,menuY;
void Initialize( void );
void ShowMenu(void);
void check_key(void);
void check_download(void);
void USART_Transmit(unsigned char data);
void menuBufferTOBuffer(void)
{
unsigned char *p;
unsigned char i;
p=&menuBuffer[0][0];
for (i=0;i< BUFFER_SIZE;i++)
{
Buffer[i]=*p;
p++;
}
}
void BufferTOmenuBuffer(void)
{
unsigned char *p;
unsigned char i,j;
p=Buffer;
for (i=0;i<16;i++)
for (j=0;j<16;j++)
{
menuBuffer[i][j]=*p;
p++;
}
}
interrupt [USART_RXC] void usart_rx_isr(void) // USART接收中斷服務
{
unsigned char status,data;
static unsigned char i=0;
status = UCSRA;
data=UDR ;
if(!start_flag)
{
Buffer[i]=data ;
if(i++>3)
{
i=0;
start_flag=1;
}
}
else
{
Buffer[i]=data;
if(i++==buffersize)
buffer_overflow=1;
}
}
void USART_Transmit(unsigned char data)
{
while (!(UCSRA & DATA_REGISTER_EMPTY)); // 等待發(fā)送寄存器空
UDR = data; // 發(fā)送數(shù)據(jù)
}
void main( void )
{
unsigned char buttons = 0;
unsigned char buttons2 = 0;
int i = 0;
Initialize();
while( 1 )//功能鍵連接端口
{
buttons = PINB & 0x0F;
delay_ms(10);
buttons2 = PINB & 0x0F;
if( ( buttons == buttons2 ) && ( buttons != 0x0F ) )
{
while( ( PINB & 0x0F ) != 0x0F ); // wait for button release
switch( buttons )
{
case 0x0D: // PB1 is low 0000 1101 UPBUTTON
{
if(EDIT==0)
{
if( mode==TEXT )
{
startOfBuffer=startOfBuffer-64; //screenBuffer是一個指針
if(startOfBuffer<0)
{
startOfBuffer=192;
// clear the buffer
for( i = 0; i < BUFFER_SIZE; i++ )
{
Buffer[i] = ' '; //可以限制在一個文件即8個PAGES內(nèi)變動
}
currentMemoryPage -= 1;
if( currentMemoryPage < 0x02 )
{
currentMemoryPage = 0x02;
}
ReadMemoryToBuffer(Buffer,BUFFER_SIZE,currentMemoryPage );
}
screenBuffer = &Buffer[startOfBuffer];
lcd_clear();
endOfBuffer = startOfBuffer+63;
//screenBuffer保證指向64個元素,開頭是startOfBuffer,結(jié)尾是endOfBuffer
lcd_write_full(screenBuffer);
//如果是編輯狀態(tài),就把光標設(shè)置在最右角,并閃動,泛白顯示
}
else //mode==MENU
{
// lcd_cursor_flash(0);
userchoose--;
if( userchoose ==255 )
{
userchoose = 15;
}
ShowMenu();
}
}
break;
}
case 0x07: // PB3 is low 0000 0111 ENTER
{
lcd_cursor_flash(0);
if( mode == TEXT) //閱讀狀態(tài)時,在文本模式中,按ENTER返回菜單
{
if(EDIT==0)
{
mode = MENU; // go back to the menu
ReadMemoryToBuffer( Buffer, BUFFER_SIZE,0 );
BufferTOmenuBuffer();
ShowMenu();
}
}
else // mode == MENU
{ //在菜單模式下 按ENTER就直接進入對應文章顯示DISPLAY置位
//把菜單對用的數(shù)組存入第0 ,1,頁中
//估計有16*16個字節(jié)大小,故要0頁才可
mode =TEXT;
menuBufferTOBuffer();
WriteBufferToMemory( Buffer, BUFFER_SIZE,0 );
switch( userchoose )
{
case 0:
currentMemoryPage = 0x0002; // 0000 0010
break;
case 1:
currentMemoryPage=0x0041;
break;
case 2:
currentMemoryPage=0x0081;
break;
case 3:
currentMemoryPage=0x00C1;
break;
case 4:
currentMemoryPage=0x00FF;
break;
case 5:
currentMemoryPage=0x013E;
break;
case 6:
currentMemoryPage=0x017D;
break;
case 7:
currentMemoryPage=0x01BC;
break;
case 8:
currentMemoryPage=0x01FB;
break;
case 9:
currentMemoryPage=0x023A;
break;
case 10:
currentMemoryPage=0x0279;
break;
case 11:
currentMemoryPage=0x02B8;
break;
case 12:
currentMemoryPage=0x02F7;
break;
case 13:
currentMemoryPage=0x0336;
break;
case 14:
currentMemoryPage=0x0375;
break;
case 15:
currentMemoryPage=0x03B4;
break;
default:
currentMemoryPage = 0;
break;
}
lcd_clear();
ReadMemoryToBuffer( Buffer, BUFFER_SIZE,currentMemoryPage );
/////////////////
startOfBuffer=0;
screenBuffer=&Buffer[startOfBuffer];
lcd_write_full(screenBuffer);
endOfBuffer = startOfBuffer+63;
}
break;
}
case 0x0B: // PB2 is low 0000 1011 DOWNBUTTON
{
if(EDIT==0)
{
if( mode==TEXT )
{
startOfBuffer=startOfBuffer+64; //screenBuffer是一個指針
if(startOfBuffer>255)
{
startOfBuffer=0;
// clear the buffer
for( i = 0; i < BUFFER_SIZE; i++ )
{
Buffer[i] = ' '; //可以限制在一個文件即8個PAGES內(nèi)變動
}
currentMemoryPage += 1;
if( currentMemoryPage > 0x1ff )
{
currentMemoryPage = 0x1ff;
}
ReadMemoryToBuffer(Buffer,BUFFER_SIZE,currentMemoryPage );
}
screenBuffer=&Buffer[startOfBuffer];
lcd_clear();
lcd_write_full(screenBuffer);
endOfBuffer = startOfBuffer+63;
//screenBuffer保證指向64個元素,開頭是startOfBuffer,結(jié)尾是endOfBuffer
//如果是編輯狀態(tài),就把光標設(shè)置在最右角,并閃動,泛白顯示
}
else if( mode == MENU )
{
//lcd_cursor_flash(0);
userchoose++;
if( userchoose ==16 )
{
userchoose = 0;
}
ShowMenu();
}
}
break;
}
case 0x0E: // PB0 is low 0000 1110 edit
{
EDIT_flag=~EDIT_flag;
if(EDIT_flag)
{
EDIT=1;
}
else
{
EDIT=0;
}
if (EDIT==0)
{
//綠燈滅
PORTD&=~0x20;
if( mode== MENU )
{
menuBufferTOBuffer();
WriteBufferToMemory( Buffer, BUFFER_SIZE,0 );
lcd_cursor_flash(0);
}else
{
WriteBufferToMemory( Buffer, BUFFER_SIZE,currentMemoryPage );
lcd_cursor_flash(0);
}
}
else {
//綠色燈亮
DDRD|=0x20;//PD5控制綠燈
PORTD|=0x20;
if(mode==TEXT)
{
lcd_cursor_flash(1);
textX=7;
textY=3;
lcd_set_xy(textX,textY);
}
else if(mode==MENU)
{
lcd_cursor_flash(1);
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)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -