⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vga.c

📁 俄罗斯方块的源代码雅俗文件
💻 C
字号:
/*
本项目专门为本站的51 PIC AVR 多功能学习开发板而写,仅供参考,请勿做商业用途,欢迎转载但要保留本站信息
                                  志博电子专注于8位单片机开发板设计和教学  
                                      让人耳目一心的经济又豪华型开发板
                                                性价比最高 
                                                 仅售378! 
欢迎访问我们的网站 www.elecmcu.com                                              
*/
#define uchar unsigned char
#define uint unsigned int
#include "new_iic.h"
#include "reg52.h"
#include "font.h"
sbit STE=P3^2;                                       //总线是否忙碌指示
xdata uchar setclk[16]={0x00,0x00,0x12};             //测试使用
xdata uchar set[50];                                 //重要的命令发送缓冲区域          一般命令+参数 小于16个字节
//xdata uchar write_c[1024]; //发送缓冲区域   放在外部RAM区域
//xdata uchar read_c[1024];  //接收缓冲区域   放在外部RAM区域
xdata uchar make_bmp[1024*3];
#define bmp_2  1
#define bmp_16  4
#define bmp_256  8
#define black 0x00
#define white 0xff
#define blue  0x88
uchar *pp;
void clean_rec(uint x,uint y,uint w,uint h,uchar color,uchar mode)
{
/////////////////////////////////////////////指令区域设置清除指令参数//////////////////////////////////////
set[0]=0x62;
set[1]=0x62;
set[2]=0x62;
set[3]=0x62;   //前四字节为清空指令码
set[4]=w/256;   
set[5]=w%256;   //清空的列数  最大720列  
set[6]=h/256;
set[7]=h%256;   //清空的行数   最大480列
set[8]=x/256;
set[9]=x%256;    //从X 位置开始清空
set[10]=y/256;
set[11]=y%256;   //从Y位置开始清空
set[12]=color;  //清空后填充的颜色  0XFF 为白色
set[13]=mode;  //清空方式   0X02重新打开图象缓冲(以前屏幕数据全清掉)           0X01 一般清屏幕(只清指定区域)
set[14]=0x00;  //数据寸取情况指示
delay10ms();   
/////////////////////////////////////////////指令区域设置清除指令参数//////////////////////////////////////                              
while(writebyteseq(0,set,16));   //从数据交换区域0开始写16个字节的清屏指令 和清屏参数
/////////////////////////////////////////////////////等待硬件解码端取走清除指令///////////////////////////
		do
		{
		delay10ms(); 
        while(!STE); 
        readbyteseq(0,set,18);
        }while(set[14]!=0xaa); //缓冲区域中第
////////////////////////////////////////////////////等待到MIX5399回应后开始发送图片格式以及文件//////////////
}
xdata uchar font2bmp[3000]={0};
void draw_bmp(uint x,uint y,uchar *p,uchar type)
{
uint i=0;
uint k=0;
uint b=0;
uchar len=0;
uchar m=0;
set[0]=0x67;
set[1]=0x67;
set[2]=0x67;
set[3]=0x67;                   //前四个字节为写图象缓冲指令码
set[4]=*p;
set[5]=*(p+1);                     //要写图象的宽度         
set[6]=*(p+2);
set[7]=*(p+3);                     //要写图象的高度
set[8]=x/256;                    //图象显示在缓冲区的X 位置
set[9]=x%256;
set[10]=y/256;
set[11]=y%256;                   //图象显示在缓冲区的Y 位置
set[12]=type;                  
set[13]=0x00;                  //数据传输状态标志
i=((*p)*256)+(*(p+1));
k=((*(p+2))*256)+(*(p+3));
len=((i*k)/(1024*(8/set[12]))+1);//获取要发送的图片数据的大小以K字节为单位   
pp=p;//指针指向要发送的图片数组
///////////////////////////////////////////////////以上数组初始化为要发送的图片格式和发送指令/////////////////                 
while(writebyteseq(0,set,18));  
///////////////////////////////////////////////////将发送图片指令(数组中前四个字节)和图片的参数真正发送出去(共18个字节)

		do
		{
		delay10ms(); 
        while(!STE); 
        readbyteseq(0,set,18);
        }while(set[13]!=0xaa); 
//不断检测状态标志位置是否有完成标志 0XAA 如果是0XAA证明MAX5399已经将指定的数据读到
        
		

        for(i=0;i<len;i++)                //以K字节为单位完成LEN个循环
		{
		   while(writebyteseq(1024,pp,1024));
		   set[13]=0x00;                                                  //将读取完成状态反送给MIX5399
		   while(writebyteseq(0,set,16));
		   pp=pp+1024;               //完成1K字节的数据发送
		      do
		       {
                 while(readbyteseq(0,set,18));
               }
		      while((set[13]!=0xaa)); //此do while语句为检测本MCU发送的数据是否MIX5399已经接收完成
        }
		delay10ms();        //发送结束 实际应用无须延迟
}

void display_char(uint x,uint y,uchar *charr,uchar back_color,uchar front_color)
{
  uchar i=0;
  uchar k=0;
  uchar m=0;
  uchar temp=0;
  uchar *pk=font2bmp;
  pk=pk+6;
  for(i=0;i<18;i++)
   {
     for(m=0;(*(charr+m))!=0;m++)
     {
        *pk=(asic[(*(charr+m)-0x20)*16+i]);
		pk++;
     }
   }
   *font2bmp=((m*8)/256);
   *(font2bmp+1)=((m*8)%256);
   *(font2bmp+2)=0;
   *(font2bmp+3)=16;
   *(font2bmp+4)=front_color;
   *(font2bmp+5)=back_color;
   draw_bmp(x,y,font2bmp,1);
}
void display_dig(uint num,uint x,uint y,uchar f_color,uchar b_color)
{
xdata uchar dig[6]={0};
dig[0]=0x30+(num/10000);
dig[1]=0x30+(num%10000)/1000;
dig[2]=0x30+(num%1000)/100;
dig[3]=0x30+(num%100)/10;
dig[4]=0x30+num%10;
dig[5]=0;
display_char(x,y,dig,f_color,b_color);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -