#include <STC15F2K60S2.H>
#include <intrins.h>
void delay_us(int i);
uchar code blackblock[]={
0x00,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0x00,0x00,
0x00,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x00,0x00};
uchar code jiong1[]={
0x00,0xFE,0x82,0x42,0xA2,0x9E,0x8A,0x82,0x86,0x8A,0xB2,0x62,0x02,0xFE,0x00,0x00,
0x00,0x7F,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x7F,0x00,0x00};
uchar code lei1[]={
0x80,0x80,0x80,0xBF,0xA5,0xA5,0xA5,0x3F,0xA5,0xA5,0xA5,0xBF,0x80,0x80,0x80,0x00,
0x7F,0x24,0x24,0x3F,0x24,0x24,0x7F,0x00,0x7F,0x24,0x24,0x3F,0x24,0x24,0x7F,0x00};
void transfer_command_lcd(int data1)
{
char i;
lcd_cs1=0;
lcd_rs=0;
for(i=0;i<8;i++)
{
lcd_sclk=0;
delay_us(1);
if(data1&0x80) lcd_sid=1;
else lcd_sid=0;
lcd_sclk=1;
delay_us(1);
data1=data1<<=1;
}
lcd_cs1=1;
}
void transfer_data_lcd(int data1)
{
char i;
lcd_cs1=0;
lcd_rs=1;
for(i=0;i<8;i++)
{
lcd_sclk=0;
if(data1&0x80) lcd_sid=1;
else lcd_sid=0;
lcd_sclk=1;
data1=data1<<=1;
}
lcd_cs1=1;
}
void delay(int i)
{
int j,k;
for(j=0;j<i;j++)
for(k=0;k<500;k++);
}
void delay_us(int i)
{
int j,k;
for(j=0;j<i;j++)
for(k=0;k<2;k++);
}
void initial_lcd()
{
lcd_reset=0;
delay(20);
lcd_reset=1;
delay(20);
transfer_command_lcd(0xe2);
delay(5);
transfer_command_lcd(0x2c);
delay(5);
transfer_command_lcd(0x2e);
delay(5);
transfer_command_lcd(0x2f);
delay(5);
transfer_command_lcd(0x24);
transfer_command_lcd(0x81);
transfer_command_lcd(0x15);
transfer_command_lcd(0xa2);
transfer_command_lcd(0xc8);
transfer_command_lcd(0xa0);
transfer_command_lcd(0x40);
transfer_command_lcd(0xaf);
}
void lcd_address(uint page,uint column)
{
column=column-1;
transfer_command_lcd(0xb0+page-1);
transfer_command_lcd(0x10+(column>>4&0x0f));
transfer_command_lcd(column&0x0f);
}
void clear_screen()
{
unsigned char i,j;
for(i=0;i<9;i++)
{
lcd_address(1+i,1);
for(j=0;j<224;j++)
{
transfer_data_lcd(0x00);
}
}
lcd_cs1=1;
}
void display_graphic_16x16(uint page,uint column,uchar reverse,uchar *dp)
{
uint i,j;
for(j=0;j<2;j++)
{
lcd_address(page+j,column);
for (i=0;i<16;i++)
{
if(reverse==1)
transfer_data_lcd(~*dp);
else
transfer_data_lcd(*dp);
dp++;
}
}
}
/******************************************************************/
unsigned int code NoteFrequ[] = {
523, 587, 659, 698, 784, 880, 988,
1047, 1175, 1319, 1397, 1568, 1760, 1976
};
unsigned int code NoteReload[] = {
65536 - (11059200/12) / (523*2),
65536 - (11059200/12) / (587*2),
65536 - (11059200/12) / (659*2),
65536 - (11059200/12) / (698*2),
65536 - (11059200/12) / (784*2),
65536 - (11059200/12) / (880*2),
65536 - (11059200/12) / (988*2),
65536 - (11059200/12) / (1047*2),
65536 - (11059200/12) / (1175*2),
65536 - (11059200/12) / (1319*2),
65536 - (11059200/12) / (1397*2),
65536 - (11059200/12) / (1568*2),
65536 - (11059200/12) / (1760*2),
65536 - (11059200/12) / (1976*2),
};
bit enable = 1;
bit tmrflag = 0;
unsigned char T0RH = 0xFF;
unsigned char T0RL = 0x00;
int t;
uchar code bmp1[];
uchar code bmp2[];
uchar code bmp3[];
uchar code bmp4[];
uchar code bmp5[];
uchar code bmp6[];
unsigned char code TwoTigerNote[] = {
1, 2, 3, 1, 1, 2, 3, 1, 3, 4, 5, 3, 4, 5,
5,6, 5,4, 3, 1, 5,6, 5,4, 3, 1, 1, 5, 1, 1, 5, 1,
};
unsigned char code TwoTigerBeat[] = {
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 4, 8,
3, 1, 3, 1, 4, 4, 3, 1, 3, 1, 4, 4, 4, 4, 8, 4, 4, 8,
};
void display_128x64(uchar *dp)
{
uint i,j;
for(j=0;j<8;j++)
{
lcd_address(j+1,1);
for (i=0;i<128;i++)
{
transfer_data_lcd(*dp);
dp++;
}
}
}
//===============main program===================
void main(void)
{
Rom_CS=1;
lcd_cs1=0;
initial_lcd();
delay(1000);
EA = 1;
TMOD = 0x01;
TH0 = T0RH;
TL0 = T0RL;
ET0 = 1;
TR0 = 1;
while(1)
{
clear_screen();
if(TwoTigerNote[t] == 1)
{
display_128x64(bmp1);
}
else if(TwoTigerNote[t] == 2)
{
display_128x64(bmp2);
}
else if(TwoTigerNote[t] == 3)
{
display_128x64(bmp3);
}
else if(TwoTigerNote[t] == 4)
{
display_128x64(bmp4);
}
else if(TwoTigerNote[t] == 5)
{
display_128x64(bmp5);
}
else if(TwoTigerNote[t] == 6)
{
display_128x64(bmp6);
}
unsigned char beat;
unsigned char note;
unsigned int time = 0;
unsigned int beatTime = 0;
unsigned int soundTime = 0;
void InterruptTimer0() 1
{
TH0 = T0RH;
TL0 = T0RL;
tmrflag = 1;
if (enable)
BUZZ = ~BUZZ;
else
BUZZ = 1;
if (time == 0)
{
t++;
note = TwoTigerNote[beat] - 1;
T0RH = NoteReload[note] >> 8;
T0RL = NoteReload[note];
beatTime = (TwoTigerBeat[beat] * NoteFrequ[note]) >> 2;
soundTime = beatTime - (beatTime >> 2);
enable = 1;
time++;
}
else
{
if (time >= beatTime)
{
time = 0;
beat++;
}
else
{
time++;
if (time == soundTime)
{
enable = 0;
}
}
}
}