📄 vga.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 + -