?? finalcd.h
字號:
//液晶顯示基本函數
/***********************************************************************
公司名稱: 泰克通信
模 塊 名: 液晶顯示基本函數 LCD 型號:NHC-01
創 建 人: 輸入輸出模塊組 日期:2004-03-17
修 改 人: 輸入輸出模塊組 日期:2004-03-23
功能描述: 1、液晶的基本讀寫操作
2、畫點、線、矩形、圓
其他說明: 本程序在atmag128和nhc-01上調試通過
版 本: alpha 0.01
**********************************************************************/
#include "chardata.h"//調用字庫文件
#define ada (*(volatile unsigned char*) 0x1118)//外部存儲器地址映射,ada是讀寫地址
#define adb (*(volatile unsigned char*) 0x111a)//adb是橫坐標
#define adc (*(volatile unsigned char*) 0x1119)//adc是縱坐標
//延時函數
void delay_1ms(void);//延時一毫秒
void delay(unsigned int n);//延時n毫秒
//液晶讀寫操作函數
void write(unsigned char x ,unsigned char y, unsigned char buffer1, unsigned char buffer2, unsigned char buffer3);//液晶輸入程序
void read(unsigned char x,unsigned char y,char *b1,char *b2,char *b3);//讀取一個字節位的數據
//液晶基本的畫線、清屏等操作
void point(unsigned int x,unsigned char y,unsigned char color);// 在任意位置顯示一個點的顏色
void clrall(char color);//清屏操作
void juxing(char x1,char y1,char x2,char y2,char color);//填充矩形
void cycle(char x,char y,unsigned int rad,char color);//以(x,y)為圓心,rad為半徑,用color填充這個區域
//畫直線算法,包含了兩種特殊直線
void line(char x1,char y1,char x2,char y2,char color);//在(x1,y1)、(x2,y2)兩點間畫直線
void linex(char x1,char y1,char x2,char y2,char color);//在(x1,y1)、(x2,y2)兩點間畫直線(畫船專用直線,可以不覆蓋掉經維度線)
void xuline(char x1,char y1,char x2,char y2,char color);//在(x1,y1)、(x2,y2)兩點間畫虛線
//液晶上的漢字、字符顯示
void hz_write(char x,char y,const unsigned char *hz,char color);//將輸入的黑白格式轉換為給lcd可以識別的彩色字模,這里的X值為點的位橫作標其值為0~39
void hanzi(char x,char y,const unsigned char *hz,char color,char bs);//按照列位置顯示任意大小顏色的字符,這里的X值為點的位橫作標其值為0~39
void lettershow(char x,char y,char *hz,char color);//按照列位置顯示任意大小顏色的字符,這里的X值為點的位橫作標其值為0~39
void showchar(char x,char y,char a,char letter,char color);//在任意位置顯示a所表示的值,這里的X值為點的位橫作標其值為0~39
void showchars(char x,char y,char *a,char color);//在任意位置顯示字符串a所表示的值,這里的X值為點的位橫作標其值為0~39
void showsmallmun(char x,char y,char *a,char color);//顯示4*8的數字串,這里的X值為點的位橫作標其值為0~39
void showallhz(void);//顯示液晶上所有的漢字
/******液晶的基本輸入輸出,一次寫入或讀出橫向八個點*******/
void write (unsigned char x ,unsigned char y, unsigned char buffer1, unsigned char buffer2, unsigned char buffer3)
{
DDRA=0xff;//a口為輸出,即向外部輸出數據
adb=x;//向外部存儲器送橫作標地址0~39
adc=y;//向外部存儲器送縱作標地址0~239
ada=buffer1;//向該點陣寫入三個顏色值
ada=buffer2;
ada=buffer3;
}
void read(unsigned char x,unsigned char y,char *b1,char *b2,char *b3)
{
DDRA=0x00;//a口為輸入,即讀取外部數據
adb=x;
adc=y;
*b1=ada;//將該點陣的三個顏色值分別讀取出來
*b2=ada;
*b3=ada;
}
/**************畫任意坐標上的一個點*******************/
void point(unsigned int x,unsigned char y,unsigned char color)
{ unsigned int temp;
char buffer1,buffer2,buffer3;
temp=x%8;//判斷該點是屬于該字節位的第幾個點
x=x/8;
read((char)x,y,&buffer1,&buffer2,&buffer3);
if(temp==0)//該字節位的第一個點,將buffer1最高三位修改為color的值
{
buffer1 &= 0x1f;
buffer1 |=(color<<5);
}
else if (temp==1)//該字節位的第2個點,將buffer1的3、4、5三位修改為color的值
{
buffer1 &= 0xe3;
buffer1 |=(color<<2);
}
else if (temp==2)//該字節位的第3個點,將buffer1最低2位和buffer2的最高位修改為color的值
{
buffer1 &= 0xfc;
buffer1 |=(color>>1);
buffer2 &= 0x7f;
buffer2 |=(color<<7);
}
else if (temp==3)//該字節位的第4個點,將buffer2的5、6、7三位修改為color的值
{
buffer2 &= 0x8f;
buffer2 |=(color<<4);
}
else if (temp==4)//該字節位的第5個點,將buffer2的2、3、4三位修改為color的值
{
buffer2 &= 0xf1;
buffer2 |=(color<<1);
}
else if (temp==5)//該字節位的第6個點,將buffer2最低位和buffer3的最高兩位修改為color的值
{
buffer2 &= 0xfe;
buffer2 |=(color>>2);
buffer3 &= 0x3f;
buffer3 |=(color<<6);
}
else if (temp==6)//該字節位的第7個點,將buffer3的4、5、6三位修改為color的值
{
buffer3 &= 0xc7;
buffer3 |=(color<<3);
}
else if (temp==7)//該字節位的第8個點,將buffer3最低三位修改為color的值
{
buffer3 &= 0xf8;
buffer3 |= color;
}
write ((char)x,y,buffer1,buffer2,buffer3);
}
/*********************用某種顏色清屏**************/
void clrall(char color)
{
char buffer1=0,buffer2=0,buffer3=0;
char i,j;
buffer1 |=(color<<5);
buffer1 |=(color<<2);
buffer1 |=(color>>1);
buffer2 |=(color<<7);
buffer2 |=(color<<4);
buffer2 |=(color<<1);
buffer2 |=(color>>2);
buffer3 |=(color<<6);
buffer3 |=(color<<3);
buffer3 |= color;//將三個buffer的值都修改為相應顏色的值
for(i=0;i<40;i++)
{
for(j=0;j<240;j++)
{
write(i,j,buffer1,buffer2,buffer3);
}
}
}
/***********************用某種顏色畫矩形***************************/
void juxing(char x1,char y1,char x2,char y2,char color)
{
char buffer1=0,buffer2=0,buffer3=0;
char i,j;
buffer1 |=(color<<5);
buffer1 |=(color<<2);
buffer1 |=(color>>1);
buffer2 |=(color<<7);
buffer2 |=(color<<4);
buffer2 |=(color<<1);
buffer2 |=(color>>2);
buffer3 |=(color<<6);
buffer3 |=(color<<3);
buffer3 |= color;
for(i=x1;i<=x2;i++)
{
for(j=y1;j<=y2;j++)
{
write(i,j,buffer1,buffer2,buffer3);
}
}
}
/**************兩點間畫帶顏色直線*******************/
void line(char x1,char y1,char x2,char y2,char color)
{
char x,y;
unsigned int dx,dy;
if(x1>x2)
{
x=x2;
y=y2;
x2=x1;
y2=y1;
x1=x;
y1=y;
}//保證(x,y)從最靠近屏幕左側開始開始。
point(x1,y1,color);
x=x1;
y=y1;
dx=x2-x1;
if(dx==0)//直線與y軸平行
{
if(y1<y2)
{
for(;y<=y2;y++)//沿y1畫點到y2成直線
point(x,y,color);
}
else
{
for(;y>=y2;y--)//沿y2畫點到y1成直線
point(x,y,color);
}
}
else if(y1==y2)//直線與X軸平行
{
if(x>x1)
{
for(;x<=x2;x++)//沿x1畫點到x2成直線
point(x,y,color);
}
else
{
for(;x>=x2;x--)//沿x2畫點到x1成直線
point(x,y,color);
}
}
else if(y1<y2)//直線與x軸夾角小于90°
{
dy=y2-y1;
while(x<=x2&&y<=y2)
{
point(x,y,color);
if(dx*(y-y1)<dy*(x-x1))//保證所畫直線盡量和所求直線靠近
y++;
else x++;
}
}
else if(y1>y2)//直線于y軸夾角大于90°
{
dy=y1-y2;
while(x<=x2&&y>=y2)
{
point(x,y,color);
if(dx*(y1-y)<dy*(x-x1))//保證所畫直線盡量和所求直線靠近
y--;
else x++;
}
}
}
/******************兩點間畫虛線**********************/
void xuline(char x1,char y1,char x2,char y2,char color)
{
char x,y;
unsigned int dx,dy;
if(x1>x2)
{
x=x2;
y=y2;
x2=x1;
y2=y1;
x1=x;
y1=y;
}//保證(x,y)從最靠近屏幕左側開始開始。
point(x1,y1,color);
x=x1;
y=y1;
dx=x2-x1;
if(dx==0)//直線與y軸平行
{
if(y1<y2)
{
for(;y<=y2;y++)
{
if(y%3!=0)//每畫兩點空出一點
point(x,y,color);
}
}
else
{
for(;y>=y2;y--)
{
if(y%3!=0)
point(x,y,color);
}
}
}
else if(y1==y2)//直線與X軸平行
{
if(x>x1)
{
for(;x<=x2;x++)
{
if(x%3!=0)//每畫兩點空出一點
point(x,y,color);
}
}
else
{
for(;x>=x2;x--)
{
if(x%3!=0)
point(x,y,color);
}
}
}
else if(y1<y2)//直線與x軸夾角小于90°
{
dy=y2-y1;
while(x<=x2&&y<=y2)
{
if(x%3!=0)
point(x,y,color);
if(dx*(y-y1)<dy*(x-x1))//保證所畫直線盡量和所求直線靠近
y++;
else x++;
}
}
else if(y1>y2)//直線于y軸夾角大于90°
{
dy=y1-y2;
while(x<=x2&&y>=y2)
{
if(x%3!=0)
point(x,y,color);
if(dx*(y1-y)<dy*(x-x1))//保證所畫直線盡量和所求直線靠近
y--;
else x++;
}
}
}
/**************兩點間畫帶顏色直線,畫船專用,避免維度線被覆蓋*******************/
void linex(char x1,char y1,char x2,char y2,char color)
{
char x,y;
unsigned int dx,dy;
if(x1>x2)
{
x=x2;
y=y2;
x2=x1;
y2=y1;
x1=x;
y1=y;
}//保證(x,y)從最靠近屏幕左側開始開始。
if(y1>120)//畫的該點不在維度線上,則畫該點
{
if((y1-120)%40!=0&&x1%40!=0)
point(x1,y1,color);
}
else
{
if((120-y1)%40!=0&&x1%40!=0)
point(x1,y1,color);
}
x=x1;
y=y1;
dx=x2-x1;
if(dx==0)//直線與y軸平行
{
if(y1<y2)
{
for(;y<=y2;y++)
{
if(y>120)
{
if((y-120)%40!=0&&x%40!=0)
point(x,y,color);
}
else
{
if((120-y)%40!=0&&x%40!=0)
point(x,y,color);
}
}
}
else
{
for(;y>=y2;y--)
{
if(y>120)
{
if((y-120)%40!=0&&x%40!=0)
point(x,y,color);
}
else
{
if((120-y)%40!=0&&x%40!=0)
point(x,y,color);
}
}
}
}
else if(y1==y2)//直線與X軸平行
{
if(x1<x2)
{
for(;x<=x2;x++)
{
if(y>120)
{
if((y-120)%40!=0&&x%40!=0)
point(x,y,color);
}
else
{
if((120-y)%40!=0&&x%40!=0)
point(x,y,color);
}
}
}
else
{
for(;x>=x2;x--)
{
if(y>120)
{
if(y>120)
{
if((y-120)%40!=0&&x%40!=0)
point(x,y,color);
}
else
{
if((120-y)%40!=0&&x%40!=0)
point(x,y,color);
}
}
else
{
if(y>120)
{
if((y-120)%40!=0&&x%40!=0)
point(x,y,color);
}
else
{
if((120-y)%40!=0&&x%40!=0)
point(x,y,color);
}
}
}
}
}
else if(y1<y2)//直線與x軸夾角小于90°
{
dy=y2-y1;
while(x<=x2&&y<=y2)
{
if(y>120)
{
if((y-120)%40!=0&&x%40!=0)
point(x,y,color);
}
else
{
if((120-y)%40!=0&&x%40!=0)
point(x,y,color);
}
if(dx*(y-y1)<dy*(x-x1))//保證所畫直線盡量和所求直線靠近
y++;
else x++;
}
}
else if(y1>y2)//直線于y軸夾角大于90°
{
dy=y1-y2;
while(x<=x2&&y>=y2)
{
if(y>120)
{
if((y-120)%40!=0&&x%40!=0)
point(x,y,color);
}
else
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -