寒假在家没什么事情就在家里做了这个DIY,传上来供广大爱好者参观学习,资料里有源码等等,这里就不详细的介绍了,这里面有5个游戏,视频链接http://v.youku.com/v_show/id_XNjcwMTM5Njg4.html
每个模块的源程序+综合程序+电路图
视频:
感谢那些开源程序的人们!!!
全部源代码下载: http://www.51hei.com/f/IAP15F2K61S2.zip 项目电路图下载:http://www.51hei.com/bbs/dpj-25260-1.html
下面是12864测试程序:
#include "C15F2K60S2.h"
#include "intrins.h"
#include "ico.h"
#include<rtx51tny.h>
sbit _RS=P4^4;
sbit LCD_WR=P4^2;
sbit LCD_E =P4^1;
void LCD_Busy();//检测芯片忙不忙
void Write_cmd(unsigned char cmd);//写指令到lcd
void Write_date(unsigned char date);//写数据到lcd
unsigned char Read_Date();//读数据函数
void LCD_Init(void);//lcd初始化
void LCD_Inverse(unsigned char x);//反白显示选择
void LCD_HangInverse(unsigned char x,unsigned char e);//哪一行进行反白
void LCD_Pos(unsigned char x,unsigned char y);
void LCD_String(unsigned char *s);//发送字符串
void LCD_Hanzi(unsigned char *hanzi);//整体显示汉字
void LCD_Picture(unsigned char *picture);//刷图片
void LCD_ClearG();//清空GDRAM
unsigned long int LCD_Pow(unsigned char m,unsigned char n);
void LCD_Shownum(unsigned long int num,unsigned char len);
void Delay_ms(unsigned char ms); //@11.0592MHz
void Delay_us(); //@11.0592MHz
void LCD_Point(unsigned char x,unsigned y);//画点函数
void LCD_DrawLine(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2);
void LCD_DrawRectangle(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2);
void Draw_Circle(unsigned char x0,unsigned char y0,unsigned char r);
void LCD_RandomPicture(unsigned char x,unsigned char y,unsigned char size,unsigned char *pic);//任意位置显示任意大小和图片
unsigned char code Lcd_Con_X_Y[4][2]={{0x80,0x80},{0x80,0x90},{0x88,0x80},{0x88,0x90}}; //LCD行反白显示坐标
void main()
{
// unsigned char iii=0;
// LCD_Init();
// LCD_Picture(pic);//刷图片
// LCD_ClearGDRAM();
// LCD_HangInverse(2,1);//哪一行进行反白
// LCD_Hanzi(hanzi);
// LCD_Point(1,2);
// LCD_DrawLine(0,0,50,60);
// LCD_DrawRectangle(0,0,60,60);
// Draw_Circle(30,30,20);
LCD_Pos(1,1);
LCD_Shownum(111,3);
LCD_RandomPicture(0,63,24,Game);
LCD_RandomPicture(50,63,24,Rtc);
LCD_RandomPicture(100,63,24,Music);
LCD_RandomPicture(0,30,24,Picture);
LCD_RandomPicture(50,30,24,System);
LCD_RandomPicture(100,30,24,Contact);
while(1);
}
void LCD_Busy()//检测芯片忙不忙
bit BF=0;
LCD_E =0;
LCD_RS=0;
LCD_WR=1;
P2=0xff;
do
LCD_E =1;
BF=P2&0x80;
}while(BF);
void Write_cmd(unsigned char cmd)//写指令到lcd
LCD_Busy();
LCD_WR=0;
P2 =cmd;//Delay_ms(1); //@11.0592MHz
LCD_E =1;//Delay_ms(1); //@11.0592MHz
void Write_date(unsigned char date)//写数据到lcd
LCD_RS=1;
P2 =date;//Delay_ms(1); //@11.0592MHz
unsigned char Read_Date()//读数据函数
unsigned char date=0;
date =P2;
return date;
void LCD_Init(void)
Write_cmd(0x30);//8-BIT 控制 基本指令集
Delay_ms(5);
Write_cmd(0x02);//地址归位
Write_cmd(0x0c);//整体显示 光标关 反白关
Write_cmd(0x01);//清除显示
void LCD_Inverse(unsigned char x)//反白显示选择
Write_cmd(0x34);//8-BIT 控制接口 扩充指令集
Write_cmd(0x04+x-1);//选择哪一行进行反白显示
Write_cmd(0x30);//8-BIT 控制接口 基本指令集
void LCD_Pos(unsigned char x,unsigned char y)//设定坐标函数
switch (x)
case 1:x=0x80;
break;
case 2:x=0x90;
case 3:x=0x88;
case 4:x=0x98;
default:
Write_cmd(x+y);
void LCD_String(unsigned char *s)//发送字符串
while(*s)
Write_date(*s++);
void LCD_Hanzi(unsigned char *hanzi)//整体显示汉字
unsigned char i=0;
LCD_Pos(1,0);
while(*hanzi)
Write_date(*hanzi++);
i++;
switch (i)
case 16:LCD_Pos(2,0);
case 32:LCD_Pos(3,0);
case 48:LCD_Pos(4,0);
//x行数
//e使能反白
void LCD_HangInverse(unsigned char x,unsigned char e)//哪一行进行反白
unsigned char i=0,j=0;
Write_cmd(0x34);//扩充指令 绘图显示关
Delay_ms(1);
for(j=0;j<16;j++)//一大行包含16个小行
Write_cmd(Lcd_Con_X_Y[x-1][1]+j);//y
Write_cmd(Lcd_Con_X_Y[x-1][0]);//x
for(i=0;i<8;i++)//没小行写8次数据,每次写两个字节
if(e)
Write_date(0xff);//D15-D8
Write_date(0xff);//D7-D0
else
Write_date(0);//D15-D8
Write_date(0);//D7-D0
Write_cmd(0x36);//扩充指令 绘图显示开
Write_cmd(0x30);//基本指令
void LCD_Picture(unsigned char *picture)//刷图片
for(j=0;j<32;j++)//上半屏
Write_cmd(0x80+j);//y
Write_cmd(0x80);//x
for(i=0;i<16;i++)
Write_date(*picture++);
for(j=0;j<32;j++)//下半屏
Write_cmd(0x88);//x
for(i=0