?? display.c
字號(hào):
#include <stdio.h>
#include <absacc.h>
#include <./Atmel/at89x52.h>
#include <string.h>
#include <intrins.h>
#include "source.h"
//#include <intrins.h>
/*輸入的X為以8個(gè)點(diǎn)為單位,Y以一個(gè)點(diǎn)為單位,寬度也是以8個(gè)點(diǎn)為單位的,高度以一個(gè)點(diǎn)為單位的.*/
unsigned char zero_buf[100]={//為全0的數(shù)據(jù),在清除某行的時(shí)候用
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
};
void clear_all(void){
unsigned int cnt;
for(cnt=VRAM_BASE;cnt<VRAM_LEN;cnt++){
XBYTE[cnt]=0X00;
}
}
/**在orgx,orgy的位置上顯示寬度為8,高度為depth的圖片**/
void draw_wordw8(unsigned char orgx,unsigned int orgy,unsigned char depth,unsigned char *buf){
unsigned char row;
unsigned int basex;
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
for(row=0;row<depth;row++){
XBYTE[basex]=buf[row];
basex +=SCREEN_WIDTH;
}
}
/**在orgx,orgy的位置上顯示寬度為16,高度為depth的圖片**/
void draw_wordw16(unsigned char orgx,unsigned int orgy,unsigned char depth,unsigned char *buf){
unsigned char row;
unsigned int temp;
unsigned int basex;
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
for(row=0;row<depth;row++){
temp=row<<1;
XBYTE[basex]=buf[temp];
XBYTE[basex+1]=buf[temp+1];
basex +=SCREEN_WIDTH;
}
}
/**在orgx,orgy的位置上顯示寬度為24,高度為depth的圖片**/
void draw_wordw24(unsigned char orgx,unsigned int orgy,unsigned char depth,unsigned char *buf){
unsigned char row;
unsigned int temp;
unsigned int basex;
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
for(row=0;row<depth;row++){
temp=row<<1;
temp +=row;//temp=3*row
XBYTE[basex]=buf[temp];
XBYTE[basex+1]=buf[temp+1];
XBYTE[basex+2]=buf[temp+2];
basex +=SCREEN_WIDTH;
}
}
/**在orgx,orgy的位置上顯示寬度為32,高度為depth的圖片**/
void draw_wordw32(unsigned char orgx,unsigned int orgy,unsigned char depth,unsigned char *buf){
unsigned char row;
unsigned int temp;
unsigned int basex;
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
for(row=0;row<depth;row++){
temp=row<<2;
XBYTE[basex ]=buf[temp ];
XBYTE[basex+1]=buf[temp+1];
XBYTE[basex+2]=buf[temp+2];
XBYTE[basex+3]=buf[temp+3];
basex +=SCREEN_WIDTH;
}
}
/**在orgx,orgy的位置上顯示寬度為48,高度為depth的圖片**/
void draw_wordw48(unsigned char orgx,unsigned int orgy,unsigned char depth,unsigned char *buf){
unsigned char row;
unsigned int temp;
unsigned int basex;
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
for(row=0;row<depth;row++){
temp=row<<2;
temp +=row<<1;
XBYTE[basex ]=buf[temp ];
XBYTE[basex+1]=buf[temp+1];
XBYTE[basex+2]=buf[temp+2];
XBYTE[basex+3]=buf[temp+3];
XBYTE[basex+4]=buf[temp+4 ];
XBYTE[basex+5]=buf[temp+5];
basex +=SCREEN_WIDTH;
}
}
/**在orgx,orgy的位置上顯示寬度為24,高度為24的圖片**/
void draw_wordw24x24(unsigned char orgx,unsigned int orgy,unsigned char *buf){
unsigned char row;
unsigned int temp;
unsigned int basex;
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
for(row=0;row<3;row++){
temp=row<<1;
temp +=row;
XBYTE[basex]=buf[temp];
XBYTE[basex+1]=buf[temp+1];
XBYTE[basex+2]=buf[temp+2];
basex +=SCREEN_WIDTH;
}
}
/**在orgx,orgy點(diǎn)陣為24x24,區(qū)碼為qh,位碼為wh的漢字**/
void draw_hz24x24(unsigned char orgx,unsigned int orgy,unsigned char qh,unsigned char wh){
union SFADD offset;
unsigned int ladd;
unsigned int basex;
unsigned char i;
if(qh<16){//漢字庫(kù)的區(qū)碼從15開始
return;
}
offset.l=(94*(qh-16)+(wh-1));//區(qū)位碼與flash的對(duì)應(yīng)關(guān)系
offset.l *=72;
offset.l +=FLASH_ADD_HZK24X24_START;//把其轉(zhuǎn)換為flash可以尋址的范圍
ladd=offset.i[1];
ladd &=FLASH_ADD_MASK;
ladd |=FLASH_SPACE_START;//分離出flash的低位地址
offset.l <<=2;
FLASHADD=offset.c[1];//分離出flash的高位地址
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;//確定圖片在屏幕上的位置
if(ladd>=(FLASH_SPACE_END-3*24)){//因?yàn)槊總€(gè)漢字使用72個(gè)字節(jié),表明其跨越了flash的高位地址.
for(i=0;i<24;i++){
XBYTE[basex ]=XBYTE[ladd];
if(ladd==FLASH_SPACE_END){//高位地址跨越16K字節(jié),高位要進(jìn)一
FLASHADD=offset.c[1]+1;//高位地址進(jìn)一
ladd=0;
}
else{//沒(méi)有跨越16K字節(jié)地址
ladd++;//低位地址加一
}
XBYTE[basex+1]=XBYTE[ladd];
if(ladd==FLASH_SPACE_END){
FLASHADD=offset.c[1]+1;
ladd=0;
}
else{
ladd++;
}
XBYTE[basex+2]=XBYTE[ladd];
if(ladd==FLASH_SPACE_END){
FLASHADD=offset.c[1]+1;
ladd=0;
}
else{
ladd++;
}
basex +=SCREEN_WIDTH;
}
}
else{//沒(méi)有跨越16K字節(jié)地址
for(i=0;i<24;i++){
memcpy((unsigned char *)basex,(unsigned char *)ladd,3);//字節(jié)顯示
ladd +=3;//FLASH地址加3
basex +=SCREEN_WIDTH;//換下一行
}
}
}
/**在orgx,orgy點(diǎn)陣為24x24漢字字庫(kù)擴(kuò)展為48x48,區(qū)碼為qh,位碼為wh的漢字**/
void draw_double_hz24x24(unsigned char orgx,unsigned int orgy,unsigned char qh,unsigned char wh){
union SFADD offset;
unsigned char frtemp[3];
unsigned int ladd;
unsigned int basex;
unsigned char i;
if(qh<16){//漢字庫(kù)的區(qū)碼從15開始
return;
}
offset.l=(94*(qh-16)+(wh-1));//區(qū)位碼與flash的對(duì)應(yīng)關(guān)系
offset.l *=72;
offset.l +=FLASH_ADD_HZK24X24_START;//把其轉(zhuǎn)換為flash可以尋址的范圍
ladd=offset.i[1];
ladd &=FLASH_ADD_MASK;
ladd |=FLASH_SPACE_START;//分離出flash的低位地址
offset.l <<=2;
FLASHADD=offset.c[1];//分離出flash的高位地址
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;//確定圖片在屏幕上的位置
if(ladd>=(FLASH_SPACE_END-3*24)){//因?yàn)槊總€(gè)漢字使用72個(gè)字節(jié),表明其跨越了flash的高位地址.
for(i=0;i<24;i++){
frtemp[0]=XBYTE[ladd];//取出第一字節(jié)的數(shù)據(jù)
if(ladd==FLASH_SPACE_END){//高位地址跨越16K字節(jié),高位要進(jìn)一
FLASHADD=offset.c[1]+1;//高位地址進(jìn)一
ladd=0;
}
else{//沒(méi)有跨越16K字節(jié)地址
ladd++;//低位地址加一
}
frtemp[1]=XBYTE[ladd];//取出第二字節(jié)的數(shù)據(jù)
if(ladd==FLASH_SPACE_END){
FLASHADD=offset.c[1]+1;
ladd=0;
}
else{
ladd++;
}
frtemp[2]=XBYTE[ladd];//取出第三字節(jié)的數(shù)據(jù)
if(ladd==FLASH_SPACE_END){
FLASHADD=offset.c[1]+1;
ladd=0;
}
else{
ladd++;
}
/**下面把一行長(zhǎng)度擴(kuò)展一倍同時(shí)變成二行顯示**/
XBYTE[basex ]=double_byte[frtemp[0]][0];
XBYTE[basex+1]=double_byte[frtemp[0]][1];
XBYTE[basex+2]=double_byte[frtemp[1]][0];
XBYTE[basex+3]=double_byte[frtemp[1]][1];
XBYTE[basex+4]=double_byte[frtemp[2]][0];
XBYTE[basex+5]=double_byte[frtemp[2]][1];
basex +=SCREEN_WIDTH;
XBYTE[basex ]=double_byte[frtemp[0]][0];
XBYTE[basex+1]=double_byte[frtemp[0]][1];
XBYTE[basex+2]=double_byte[frtemp[1]][0];
XBYTE[basex+3]=double_byte[frtemp[1]][1];
XBYTE[basex+4]=double_byte[frtemp[2]][0];
XBYTE[basex+5]=double_byte[frtemp[2]][1];
basex +=SCREEN_WIDTH;
}
}
else{
for(i=0;i<24;i++){
frtemp[0]=XBYTE[ladd];ladd++;
frtemp[1]=XBYTE[ladd];ladd++;
frtemp[2]=XBYTE[ladd];ladd++;
/**下面把一行長(zhǎng)度擴(kuò)展一倍同時(shí)變成二行顯示**/
XBYTE[basex ]=double_byte[frtemp[0]][0];
XBYTE[basex+1]=double_byte[frtemp[0]][1];
XBYTE[basex+2]=double_byte[frtemp[1]][0];
XBYTE[basex+3]=double_byte[frtemp[1]][1];
XBYTE[basex+4]=double_byte[frtemp[2]][0];
XBYTE[basex+5]=double_byte[frtemp[2]][1];
basex +=SCREEN_WIDTH;
XBYTE[basex ]=double_byte[frtemp[0]][0];
XBYTE[basex+1]=double_byte[frtemp[0]][1];
XBYTE[basex+2]=double_byte[frtemp[1]][0];
XBYTE[basex+3]=double_byte[frtemp[1]][1];
XBYTE[basex+4]=double_byte[frtemp[2]][0];
XBYTE[basex+5]=double_byte[frtemp[2]][1];
basex +=SCREEN_WIDTH;
}
}
}
/***在屏幕上顯示大數(shù)字的圖片,其為112x170,每個(gè)數(shù)字被安排在沒(méi)4K字節(jié)的起始空間,所以不存在跨越16K邊界的問(wèn)題**/
void draw_storey(unsigned char orgx,unsigned int orgy,unsigned char num){//this is 112x170
unsigned char row;
unsigned int basex;
unsigned int ladd;
union SFADD offset;
basex=0x8000+SCREEN_WIDTH*orgy+orgx;
//draw picture from flash. 4kbyte per picture
offset.l=num;
offset.l <<=12;//乘以4K,因?yàn)槊總€(gè)大數(shù)字圖片占用4K字節(jié)的空間
offset.l +=FLASH_ADD_STORY_START;
ladd=offset.i[1];
ladd &=FLASH_ADD_MASK;
ladd |=FLASH_SPACE_START;//分離出flash的低位地址
offset.l <<=2;
FLASHADD=offset.c[1];//分離出flash的高位地址
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;//確定圖片在屏幕上的位置
for(row=0;row<STOREY_HEIGHT;row++){
memcpy((unsigned char *)basex,(unsigned char *)ladd,STOREY_WIDTH);
ladd +=STOREY_WIDTH;
basex +=SCREEN_WIDTH;
}
}
/**畫向下的箭頭圖片為96x97點(diǎn)陣**/
void draw_downarrow(unsigned char orgx,unsigned int orgy){
unsigned char row;
unsigned int temp;
unsigned int basex;
unsigned char *buf;
buf=downarrow;//12x97
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
/**箭頭圖片是存儲(chǔ)在單片機(jī)的程序空間,可以直接尋址**/
for(row=0;row<ARROW_HEIGHT;row++){
temp=row*ARROW_WIDTH;
memcpy((unsigned char *)basex,(unsigned char *)buf+temp,ARROW_WIDTH);
basex +=SCREEN_WIDTH;
}
}
/**畫向上的箭頭圖片為96x97點(diǎn)陣,是把向下的箭頭圖片上下顛倒一下就可以了**/
void draw_uparrow(unsigned char orgx,unsigned int orgy){
unsigned char row;
unsigned int temp;
unsigned int basex;
unsigned char *buf;
unsigned int top_num;
top_num=ARROW_WIDTH*(ARROW_HEIGHT-1);
buf=downarrow;//12x97
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
for(row=0;row<ARROW_HEIGHT;row++){//ARROW_HEIGHT=97
temp=top_num-row*ARROW_WIDTH;
memcpy((unsigned char *)basex,(unsigned char *)buf+temp,ARROW_WIDTH);
basex +=SCREEN_WIDTH;
}
}
/*畫24x48的ASSCII字符,因?yàn)榇俗址辉跐h字字庫(kù)中, 存儲(chǔ)的形式只有位碼*/
void draw_asc24x48(unsigned char orgx,unsigned int orgy,unsigned char wh){
union SFADD offset;
unsigned int ladd;
unsigned int basex;
unsigned char i;
offset.l=wh;
offset.l *=144;//每個(gè)字符是144個(gè)字節(jié)
offset.l +=FLASH_ADD_ASC48X48_START;
ladd=offset.i[1];
ladd &=0x3fff;
ladd |=FLASH_SPACE_START;
offset.l <<=2;
FLASHADD=offset.c[1];
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
for(i=0;i<48;i++){
XBYTE[basex ]=XBYTE[ladd];ladd++;
XBYTE[basex+1]=XBYTE[ladd];ladd++;
XBYTE[basex+2]=XBYTE[ladd];ladd++;
basex +=SCREEN_WIDTH;
}
}
void draw_asc16x24(unsigned char orgx,unsigned int orgy,unsigned char wh){
union SFADD offset;
unsigned int ladd;
unsigned int basex;
unsigned char i;
offset.l=wh+32;//英文的區(qū)位碼減32為ASCII的數(shù)值。
offset.l *=48;//perword is 48 bytes.
offset.l +=FLASH_ADD_ASC16X24_START;
ladd=offset.i[1];
ladd &=FLASH_ADD_MASK;
ladd |=FLASH_SPACE_START;
offset.l <<=2;
FLASHADD=offset.c[1];
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
for(i=0;i<24;i++){
XBYTE[basex ]=XBYTE[ladd];ladd++;
XBYTE[basex+1]=XBYTE[ladd];ladd++;
basex +=SCREEN_WIDTH;
}
}
/**顯示從串口傳輸過(guò)來(lái)的信息**/
void show_elvinfo(struct NOTICE *info){
unsigned char orgtemp,ad_len,cnt,temp,hzqh,hzwh;
unsigned int cur_y;
ad_len=info->len;/*表示顯示漢字的長(zhǎng)度*/
ad_len >>=1;//由于一個(gè)漢字要一個(gè)區(qū)碼和一個(gè)位碼表示,所以整個(gè)要顯示的漢字?jǐn)?shù)為文字長(zhǎng)度除2
orgtemp=POS_NOTICE_ORGX;
cur_y=POS_NOTICE_SINGEL_LINE_ORGY;
for(cnt=0;cnt<ad_len;cnt++){// draw_hz24x24
temp=cnt<<1;//第一個(gè)區(qū)碼,第二個(gè)是位碼
hzqh=info->buf[temp];
if(hzqh<HZK24X24_QH_START){//IT IS OUT OF HZK24X24
if(hzqh==3){//是英文和數(shù)值區(qū)域。
if((orgtemp+QW_ASSCII_SPACE)<SCREEN_WIDTH){//是空格
draw_asc24x48(orgtemp,cur_y,info->buf[temp+1]);
orgtemp +=QW_ASSCII_SPACE;
}
}
else if(hzqh==10){//是控制字符
hzwh=info->buf[temp+1];
if((hzwh&0xf0)==0x20){//是空格空格
hzwh &=0x0f;
hzwh +=1;
orgtemp +=QW_ASSCII_SPACE*hzwh;
}
else if(hzwh==0x0a){//是回車
cur_y +=POS_NOTICE_LINE_HIGH;//換到下一行
orgtemp=0;
}
}
}
else{//是漢字
if((orgtemp+QW_HZ_SPACE)<SCREEN_WIDTH){
draw_double_hz24x24(orgtemp,cur_y,hzqh,info->buf[temp+1]);//寫漢字
orgtemp +=QW_HZ_SPACE;//顯示位置到下一個(gè)漢字
}
}
}
}
/*在orgx,orgy處清除寬度為8高度為depth的區(qū)域*/
void clr_wordw8(unsigned char orgx,unsigned int orgy,unsigned char depth){
unsigned char row;
unsigned int basex;
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
for(row=0;row<depth;row++){
XBYTE[basex]=0;;
basex +=SCREEN_WIDTH;
}
}
/*在orgx,orgy處清除寬度為16高度為depth的區(qū)域*/
void clr_wordw16(unsigned char orgx,unsigned int orgy,unsigned char depth){
unsigned char row;
unsigned int basex;
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
for(row=0;row<depth;row++){
memcpy((unsigned char *)basex,(unsigned char *)zero_buf,2);
basex +=SCREEN_WIDTH;
}
}
/*在orgx,orgy處清除寬度為24高度為depth的區(qū)域*/
void clr_wordw24(unsigned char orgx,unsigned int orgy,unsigned char depth){
unsigned char row;
unsigned int basex;
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
for(row=0;row<depth;row++){
memcpy((unsigned char *)basex,(unsigned char *)zero_buf,3);
basex +=SCREEN_WIDTH;
}
}
/*在orgx,orgy處清除寬度為32高度為depth的區(qū)域*/
void clr_wordw32(unsigned char orgx,unsigned int orgy,unsigned char depth){
unsigned char row;
unsigned int basex;
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
for(row=0;row<depth;row++){
memcpy((unsigned char *)basex,(unsigned char *)zero_buf,4);
basex +=SCREEN_WIDTH;
}
}
/*在orgx,orgy處清除寬度為width高度為depth的區(qū)域,是通用的清除函數(shù)*/
void clr_area(unsigned char org_x,unsigned int org_y,unsigned char width,unsigned char height){
unsigned char row;
unsigned char column;
unsigned int tempa,tempb;
for(row=0;row<height;row++){
tempa=VRAM_BASE+SCREEN_WIDTH*(org_y+row)+org_x;
tempb=width*row;
for(column=0;column<width;column++){
XBYTE[tempa+column]=0x00;
}
}
}
/*在orgx,orgy處清除箭頭*/
void clr_arrow(unsigned char orgx,unsigned int orgy){
unsigned char row;
unsigned int basex;
basex=VRAM_BASE+SCREEN_WIDTH*orgy+orgx;
for(row=ARROW_HEIGHT;row>0;row--){
memcpy((unsigned char *)basex,(unsigned char *)zero_buf,ARROW_WIDTH);
basex +=SCREEN_WIDTH;
}
}
/*清除顯示信息的區(qū)域*/
void clr_notice(void){
unsigned int j,basex;
basex=VRAM_BASE+SCREEN_WIDTH*POS_NOTICE_TOP+POS_NOTICE_ORGX;
for(j=POS_NOTICE_TOP;j<SCREEN_HIGHT;j++){
memcpy((unsigned char *)basex,(unsigned char *)zero_buf,SCREEN_WIDTH-POS_NOTICE_ORGX);
basex +=SCREEN_WIDTH;
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -