?? vga.c
字號(hào):
/*
本項(xiàng)目專門為本站的51 PIC AVR 多功能學(xué)習(xí)開發(fā)板而寫,僅供參考,請(qǐng)勿做商業(yè)用途,歡迎轉(zhuǎn)載但要保留本站信息
志博電子專注于8位單片機(jī)開發(fā)板設(shè)計(jì)和教學(xué)
讓人耳目一心的經(jīng)濟(jì)又豪華型開發(fā)板
性價(jià)比最高
僅售378!
歡迎訪問我們的網(wǎng)站 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}; //測(cè)試使用
xdata uchar set[50]; //重要的命令發(fā)送緩沖區(qū)域 一般命令+參數(shù) 小于16個(gè)字節(jié)
//xdata uchar write_c[1024]; //發(fā)送緩沖區(qū)域 放在外部RAM區(qū)域
//xdata uchar read_c[1024]; //接收緩沖區(qū)域 放在外部RAM區(qū)域
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)
{
/////////////////////////////////////////////指令區(qū)域設(shè)置清除指令參數(shù)//////////////////////////////////////
set[0]=0x62;
set[1]=0x62;
set[2]=0x62;
set[3]=0x62; //前四字節(jié)為清空指令碼
set[4]=w/256;
set[5]=w%256; //清空的列數(shù) 最大720列
set[6]=h/256;
set[7]=h%256; //清空的行數(shù) 最大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重新打開圖象緩沖(以前屏幕數(shù)據(jù)全清掉) 0X01 一般清屏幕(只清指定區(qū)域)
set[14]=0x00; //數(shù)據(jù)寸取情況指示
delay10ms();
/////////////////////////////////////////////指令區(qū)域設(shè)置清除指令參數(shù)//////////////////////////////////////
while(writebyteseq(0,set,16)); //從數(shù)據(jù)交換區(qū)域0開始寫16個(gè)字節(jié)的清屏指令 和清屏參數(shù)
/////////////////////////////////////////////////////等待硬件解碼端取走清除指令///////////////////////////
do
{
delay10ms();
while(!STE);
readbyteseq(0,set,18);
}while(set[14]!=0xaa); //緩沖區(qū)域中第
////////////////////////////////////////////////////等待到MIX5399回應(yīng)后開始發(fā)送圖片格式以及文件//////////////
}
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; //前四個(gè)字節(jié)為寫圖象緩沖指令碼
set[4]=*p;
set[5]=*(p+1); //要寫圖象的寬度
set[6]=*(p+2);
set[7]=*(p+3); //要寫圖象的高度
set[8]=x/256; //圖象顯示在緩沖區(qū)的X 位置
set[9]=x%256;
set[10]=y/256;
set[11]=y%256; //圖象顯示在緩沖區(qū)的Y 位置
set[12]=type;
set[13]=0x00; //數(shù)據(jù)傳輸狀態(tài)標(biāo)志
i=((*p)*256)+(*(p+1));
k=((*(p+2))*256)+(*(p+3));
len=((i*k)/(1024*(8/set[12]))+1);//獲取要發(fā)送的圖片數(shù)據(jù)的大小以K字節(jié)為單位
pp=p;//指針指向要發(fā)送的圖片數(shù)組
///////////////////////////////////////////////////以上數(shù)組初始化為要發(fā)送的圖片格式和發(fā)送指令/////////////////
while(writebyteseq(0,set,18));
///////////////////////////////////////////////////將發(fā)送圖片指令(數(shù)組中前四個(gè)字節(jié))和圖片的參數(shù)真正發(fā)送出去(共18個(gè)字節(jié))
do
{
delay10ms();
while(!STE);
readbyteseq(0,set,18);
}while(set[13]!=0xaa);
//不斷檢測(cè)狀態(tài)標(biāo)志位置是否有完成標(biāo)志 0XAA 如果是0XAA證明MAX5399已經(jīng)將指定的數(shù)據(jù)讀到
for(i=0;i<len;i++) //以K字節(jié)為單位完成LEN個(gè)循環(huán)
{
while(writebyteseq(1024,pp,1024));
set[13]=0x00; //將讀取完成狀態(tài)反送給MIX5399
while(writebyteseq(0,set,16));
pp=pp+1024; //完成1K字節(jié)的數(shù)據(jù)發(fā)送
do
{
while(readbyteseq(0,set,18));
}
while((set[13]!=0xaa)); //此do while語(yǔ)句為檢測(cè)本MCU發(fā)送的數(shù)據(jù)是否MIX5399已經(jīng)接收完成
}
delay10ms(); //發(fā)送結(jié)束 實(shí)際應(yīng)用無(wú)須延遲
}
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);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -