?? 240128.h
字號:
/* ----------------------------------------------------------
* 基于T6963C芯片的240x128點陣液晶屏驅(qū)動程序
*
* 程序編寫 John P. Beale May 3-4, 1997 beale@best.com
* 程序改寫 Nico Sachs Feb. 2006 for AVR-GCC
* 程序改寫 bg4uvr 2007年5月22日 for WINAVR 20070122
* 同時將注釋全部改為GB2312,方便中文用戶
* bg4uvr@gmail.com
*
* 基本信息來源:
* 1、Steve Lawther 的著作
* 《Writing Software for T6963C based Graphic LCDs》, 1997年發(fā)布于
* http://ourworld.compuserve.com/homepages/steve_lawther/t6963c.pdf
* 2、東芝公司 T6963C 的數(shù)據(jù)手冊
* 3、其他信息:
* http://www.citilink.com/~jsampson/lcdindex.htm
* http://www.cs.colostate.edu/~hirsch/LCD.html
* http://www.hantronix.com/
* ----------------------------------------------------------
*/
#ifndef __io_h__
#include <avr/io.h>
#endif
#ifndef __delay_h__
#include <util/delay.h>
#endif
#ifndef __stdio_h__
#include <stdio.h>
#endif
#ifndef __ina90_h__
#include <compat/ina90.h> //定義_NOP(),_CLI(),_SEI()
#endif
//以下頭文件只在高級繪圖函數(shù)中使用
/*
#ifndef __stdlib_h__
#include <stdlib.h> // rand()
#endif
#ifndef __string_h__
#include <string.h> // strlen()
#endif
#ifndef __math_h__
#include <math.h> // cos(),sin()
#endif
*/
//引腳定義
#define glcd_fs_PIN 0
#define glcd_wr_PIN 1
#define glcd_rd_PIN 6
#define glcd_ce_PIN 3
#define glcd_cd_PIN 4
#define glcd_rst_PIN 5
#define ctl_ddr DDRC
#define ctl_port PORTC
#define glcd_DATA_PORT PORTE
#define glcd_DATA_PIN PINE
#define glcd_DATADIR DDRE
/* ----- 定義液晶屏內(nèi)部RAM ------ */
#define glcd_T_BASE 0x00 // 文本區(qū)內(nèi)存首地址
#define glcd_G_BASE 0x200 // 圖形區(qū)內(nèi)存首地址
#define glcd_BYTES_PER_ROW 30 // 定義屏幕文本寬度為40字節(jié)
//定義宏
#define glcd_fs_high() ctl_port |= _BV(glcd_fs_PIN)
#define glcd_fs_low() ctl_port &= ~_BV(glcd_fs_PIN)
#define glcd_wr_high() ctl_port |= _BV(glcd_wr_PIN)
#define glcd_wr_low() ctl_port &= ~_BV(glcd_wr_PIN)
#define glcd_rd_high() ctl_port |= _BV(glcd_rd_PIN)
#define glcd_rd_low() ctl_port &= ~_BV(glcd_rd_PIN)
#define glcd_ce_high() ctl_port |= _BV(glcd_ce_PIN)
#define glcd_ce_low() ctl_port &= ~_BV(glcd_ce_PIN)
#define glcd_cd_high() ctl_port |= _BV(glcd_cd_PIN)
#define glcd_cd_low() ctl_port &= ~_BV(glcd_cd_PIN)
#define glcd_rst_high() ctl_port |= _BV(glcd_rst_PIN)
#define glcd_rst_low() ctl_port &= ~_BV(glcd_rst_PIN)
#define glcd_SET_DATADIR_OUT() (glcd_DATADIR = 0xff)
#define glcd_SET_DATADIR_IN() (glcd_DATADIR = 0x00)
//聲明函數(shù)
void glcd_dput(unsigned char byte); // 寫數(shù)據(jù)
//unsigned char glcd_dget(void); // 讀數(shù)據(jù)
unsigned char glcd_sget(void); // 讀狀態(tài)
void glcd_cput(unsigned char byte); // 寫命令
void glcd_setup(void); // 初始化控制線的電位
void glcd_init(void); // 初始化顯存和顯示方式
void glcd_xy(unsigned char x, unsigned char y); // 設(shè)置顯示坐標(biāo)(文本模式)
void glcd_clear_text(void); // 文本清屏
//void glcd_print(unsigned char x,unsigned char y,const char *string); // 顯示字符串ROM
void glcd_print_ram(unsigned char x,unsigned char y,char *string); // 顯示字符串RAM
void glcd_set_address(unsigned int addr); //設(shè)置地址
void glcd_clear_graph(void); // 圖形清屏
void glcd_pixel(unsigned char column, unsigned char row, char show); //畫、清點
void glcd_show(prog_char * s,int start_line,int how_many_line); //指定數(shù)據(jù)組圖
void glcd_line(int x1, int y1, int x2, int y2, unsigned char show); //畫直線
void glcd_circle(int x, int y, int radius, unsigned char show); //畫圓
void glcd_circle_half(int x, int y, int radius, unsigned char show);//畫半圓
void glcd_box(int x1, int y1, int x2, int y2, unsigned char show); //畫矩形
//畫線段
void glcd_degree_line(int x, int y, int degree, int inner_radius, int outer_radius, unsigned char show);
//畫線段包圍線
void glcd_degree_line_bold(int x, int y, int degree, int inner_radius, int outer_radius, unsigned char show);
void glcd_fill(int x1, int y1, int x2, int y2, unsigned char persent,char first); //畫進(jìn)度條
// 繪圖坐標(biāo)限制
#define glcd_XMAX 240
#define glcd_XMIN 0
#define glcd_YMAX 128
#define glcd_YMIN 0
//讀取狀態(tài)字節(jié)
unsigned char glcd_sget(void)
{
unsigned char glcd_status;
glcd_SET_DATADIR_IN();
glcd_cd_high(); // C/D高,讀狀態(tài)字節(jié)
glcd_ce_low(); // CE低,開片選信號
glcd_rd_low(); // RD低,打開讀信號
_NOP();
_NOP();
glcd_status = glcd_DATA_PIN; // 讀取狀態(tài)字節(jié)
glcd_rd_high(); // 關(guān)閉讀信號
glcd_ce_high(); // CE高,關(guān)閉片選
return(glcd_status);
}
// 寫數(shù)據(jù)
void glcd_dput(unsigned char byte)
{
do {} while ((0x03 & glcd_sget()) != 0x03); // 等待屏幕可用
glcd_SET_DATADIR_OUT(); // 數(shù)據(jù)口轉(zhuǎn)換為輸出口
glcd_DATA_PORT = byte; // 寫數(shù)據(jù)到數(shù)據(jù)口
glcd_cd_low();
glcd_ce_low(); // 低電平脈沖大于80ns
glcd_wr_low(); // 打開寫數(shù)據(jù)方式
_NOP();
_NOP();
glcd_wr_high(); // WR拉高
glcd_ce_high(); // CE拉高
}
// 寫命令
void glcd_cput(unsigned char byte)
{
do {} while ((0x03 & glcd_sget()) != 0x03); // 等待屏幕可用
glcd_SET_DATADIR_OUT(); // 數(shù)據(jù)口轉(zhuǎn)換為輸出口
glcd_DATA_PORT = byte; // 送數(shù)據(jù)到數(shù)據(jù)口
glcd_cd_high(); // C/D置高
glcd_ce_low(); // CE置低,要求大于 80ns
glcd_wr_low(); // WR置低
_NOP();
_NOP();
glcd_wr_high(); // WR軒高
glcd_ce_high(); // CE置高
}
// 讀數(shù)據(jù)
/*
unsigned char glcd_dget(void)
{
unsigned char glcd_byte;
do {} while ((0x03 & glcd_sget()) != 0x03); // 等待屏幕可用
glcd_SET_DATADIR_IN(); // 設(shè)置數(shù)據(jù)口為輸入口
glcd_cd_low(); // C/D置低
glcd_rd_low(); // 讀置低
glcd_ce_low(); // CE置低
_NOP();
_NOP();
glcd_byte = glcd_DATA_PIN; // 讀取數(shù)據(jù)
glcd_rd_high(); // RD置高
glcd_ce_high(); // CE置高
return(glcd_byte);
}
*/
//清全部32KB內(nèi)存
void glcd_clear_ram(void)
{
int i;
glcd_set_address(0x0000);
for (i=0;i<0x8000;i++)
{
glcd_dput(0); // 寫入數(shù)據(jù)0x00
glcd_cput(0xc0); // 0xc0為數(shù)據(jù)寫入、增加指針 命令
}
}
//文本清屏
void glcd_clear_text(void)
{
int i;
glcd_set_address(glcd_T_BASE); // 設(shè)置地址為文本區(qū)基地址
for (i=0;i<480;i++)
{
glcd_dput(0); //寫入數(shù)據(jù)
glcd_cput(0xc0); //0xc0為寫入數(shù)據(jù),增加指針命令
}
}
// 圖形清屏
void glcd_clear_graph(void)
{
int i;
glcd_set_address(glcd_G_BASE); // 設(shè)置地址為圖形區(qū)基地址
for (i=0;i<3840;i++) // 必須為3840
{
glcd_dput(0); // 寫入數(shù)據(jù)0x00
glcd_cput(0xc0); // 0xc0為數(shù)據(jù)寫入、增加指針 命令
}
}
// 文本方式設(shè)置顯示坐標(biāo)
void glcd_xy(unsigned char x, unsigned char y)
{
int addr;
addr = glcd_T_BASE + (y * glcd_BYTES_PER_ROW) + x;
glcd_set_address(addr); // 設(shè)置顯示地址
}
//設(shè)置地址
void glcd_set_address(unsigned int addr){
glcd_dput((unsigned char)(addr));
glcd_dput(addr>>8);
glcd_cput(0x24); //0x24為設(shè)定地址命令
}
// 顯示字符串RAM
void glcd_print_ram(unsigned char x,unsigned char y, char *string)
{
unsigned char i,c;
glcd_xy(x,y);
for (i=0;string[i]!=0;i++) {
c = string[i] - 0x20; // 轉(zhuǎn)換ASCII碼為屏幕內(nèi)碼
glcd_dput(c);
glcd_cput(0xc0); // 寫字符,增加內(nèi)部RAM指針
}
}
// 顯示字符串ROM
void glcd_print(unsigned char x,unsigned char y, prog_char *string)
{
unsigned char i,c;
glcd_xy(x,y);
for (i=0;(pgm_read_byte(&string[i]))!=0;i++) {
c = pgm_read_byte(&string[i]) - 0x20; // 轉(zhuǎn)換ASCII碼為屏幕內(nèi)碼
glcd_dput(c);
glcd_cput(0xc0); // 寫字符,增加內(nèi)部RAM指針
}
}
//畫、清點函數(shù)
//column為水平點數(shù),row為垂直點數(shù)
//show=1畫點,show=0清點
void glcd_pixel(unsigned char column, unsigned char row, char show)
{
int addr; // memory address of byte containing pixel to write
if( (column>=glcd_XMAX) || (row>=glcd_YMAX) )return;
addr = glcd_G_BASE + (row*glcd_BYTES_PER_ROW) + (column/8);
glcd_set_address(addr); // set LCD addr. pointer
if(show)
glcd_cput(0xf8 | (7-column%8)); // 0xf8為畫點命令
else
glcd_cput(0xf0 | (7-column%8)); // 0xf0為清點命令
}
//以指定的數(shù)據(jù)進(jìn)行畫點
void glcd_show(prog_char * s,int start_line,int how_many_line){
int addr,i;
addr = glcd_G_BASE +start_line*30;
glcd_set_address(addr);
glcd_cput(0xB0); //自動寫模式
for(i=0;i<how_many_line*30;i++){
glcd_dput(pgm_read_byte(&s[i]));
}
glcd_cput(0xB2);
}
/***********************************************************************
畫一條x1,y1到x2,y2的直線
(show=1畫點,show=0清點)
***********************************************************************/
void glcd_line(int x1, int y1, int x2, int y2, unsigned char show)
{
int dy ;
int dx ;
int stepx, stepy, fraction;
dy = y2 - y1;
dx = x2 - x1;
if (dy < 0)
{
dy = -dy;
stepy = -1;
}
else
{
stepy = 1;
}
if (dx < 0)
{
dx = -dx;
stepx = -1;
}
else
{
stepx = 1;
}
dy <<= 1;
dx <<= 1;
glcd_pixel(x1,y1,show);
if (dx > dy)
{
fraction = dy - (dx >> 1);
while (x1 != x2)
{
if (fraction >= 0)
{
y1 += stepy;
fraction -= dx;
}
x1 += stepx;
fraction += dy;
glcd_pixel(x1,y1,show);
}
}
else
{
fraction = dx - (dy >> 1);
while (y1 != y2)
{
if (fraction >= 0)
{
x1 += stepx;
fraction -= dy;
}
y1 += stepy;
fraction += dx;
glcd_pixel(x1,y1,show);
}
}
}
/***********************************************************************
以x,y為圓心,以radius為半徑畫賀
(show=1畫點,show=0清點)
***********************************************************************/
void glcd_circle(int x, int y, int radius, unsigned char show)
{
int xc = 0;
int yc ;
int p ;
yc=radius;
p = 3 - (radius<<1);
while (xc <= yc)
{
glcd_pixel(x + xc, y + yc, show);
glcd_pixel(x + xc, y - yc, show);
glcd_pixel(x - xc, y + yc, show);
glcd_pixel(x - xc, y - yc, show);
glcd_pixel(x + yc, y + xc, show);
glcd_pixel(x + yc, y - xc, show);
glcd_pixel(x - yc, y + xc, show);
glcd_pixel(x - yc, y - xc, show);
if (p < 0)
p += (xc++ << 2) + 6;
else
p += ((xc++ - yc--)<<2) + 10;
}
}
//畫半圓
void glcd_circle_half(int x, int y, int radius, unsigned char show)
{
int xc = 0;
int yc ;
int p ;
yc=radius;
p = 3 - (radius<<1);
while (xc <= yc)
{
// glcd_pixel(x + xc, y + yc, show);
glcd_pixel(x + xc, y - yc, show);
// glcd_pixel(x - xc, y + yc, show);
glcd_pixel(x - xc, y - yc, show);
// glcd_pixel(x + yc, y + xc, show);
glcd_pixel(x + yc, y - xc, show);
// glcd_pixel(x - yc, y + xc, show);
glcd_pixel(x - yc, y - xc, show);
if (p < 0)
p += (xc++ << 2) + 6;
else
p += ((xc++ - yc--)<<2) + 10;
}
}
//畫矩形
void glcd_box(int x1, int y1, int x2, int y2, unsigned char show)
{
glcd_line(x1,y1,x2,y1,show); // up
glcd_line(x1,y2,x2,y2,show); // down
glcd_line(x2,y1,x2,y2,show); // right
glcd_line(x1,y1,x1,y2,show); // left
}
//***********************************************************************
//以x,y點為原點,以degree為角度,畫一條從內(nèi)徑到外徑之間的線段
//(show=1畫點,show=0清點)
//***********************************************************************
/*
void glcd_degree_line(int x, int y, int degree, int inner_radius, int outer_radius, unsigned char show)
{
int fx,fy,tx,ty;
fx = x + (inner_radius * sin(degree * 3.14 / 180)); // ???????????????
fy = y - (inner_radius * cos(degree * 3.14 / 180));
tx = x + (outer_radius * sin(degree * 3.14 / 180));
ty = y - (outer_radius * cos(degree * 3.14 / 180));
glcd_line(fx,fy,tx,ty,show);
}
//畫上函數(shù)線段的包括線
void glcd_degree_line_bold(int x, int y, int degree, int inner_radius, int outer_radius, unsigned char show)
{
int fx,fy,tx,ty;
fx = x + (inner_radius * sin(degree * 3.14 / 180)); // ???????????????
fy = y - (inner_radius * cos(degree * 3.14 / 180));
tx = x + (outer_radius * sin(degree * 3.14 / 180));
ty = y - (outer_radius * cos(degree * 3.14 / 180));
glcd_line(fx,fy,tx,ty,show);
glcd_line(fx+1,fy+1,tx+1,ty+1,show);
glcd_line(fx-1,fy-1,tx-1,ty-1,show);
}
*/
//畫進(jìn)度條函數(shù)
void glcd_fill(int x1, int y1, int x2, int y2, unsigned char persent,char first)
{
char M,horizon_line,horizon_line2,i,str1[10];
if(persent>100)return;
if(!first){
glcd_line(x1,y2,x2,y2,1); // down
glcd_line(x2,y1,x2,y2,1); // right
glcd_line(x1,y1,x1,y2,1); // left
first=1;
}
M=100/abs(y2-y1);
horizon_line=persent/M;
for(i=0;i<horizon_line;i++)
glcd_line(x1+2,y2-2-i,x2-2,y2-2-i,1);
horizon_line2=100/M;
for(i=horizon_line;i<horizon_line2;i++)
glcd_line(x1+2,y2-2-i,x2-2,y2-2-i,0);
sprintf(str1,"%02d%% ",persent);
glcd_print_ram( (x2+x1)/16-1 , (y2+y1)/16,str1);
}
// 初始化端口
void glcd_setup()
{
ctl_ddr=_BV(glcd_wr_PIN)|_BV(glcd_rd_PIN)|_BV(glcd_cd_PIN)|_BV(glcd_rst_PIN)|_BV(glcd_fs_PIN)|_BV(glcd_ce_PIN);
ctl_port=_BV(glcd_wr_PIN)|_BV(glcd_rd_PIN)|_BV(glcd_cd_PIN)|_BV(glcd_ce_PIN);//|_BV(glcd_fs_PIN);
_delay_ms(5);
glcd_rst_high();
}
// 初始化顯存和顯示模式
void glcd_init()
{
glcd_dput((unsigned char)(glcd_T_BASE));
glcd_dput(glcd_T_BASE>>8);
glcd_cput(0x40); // 0x40為設(shè)置文本存儲區(qū)的基地址命令
glcd_dput(glcd_BYTES_PER_ROW);
glcd_dput(0);
glcd_cput(0x41); // 0x41為設(shè)置文本模式每行多少個字符數(shù)命令
glcd_dput((unsigned char)(glcd_G_BASE));
glcd_dput(glcd_G_BASE>>8);
glcd_cput(0x42); // 0x42為設(shè)置圖形存儲區(qū)基地址命令
glcd_dput(glcd_BYTES_PER_ROW);
glcd_dput(0);
glcd_cput(0x43); // 0x43為設(shè)置圖形模式每行有多少個像素 命令
glcd_cput(0x81); // 模式設(shè)置: 異或 使用內(nèi)部西文字庫
glcd_cput(0xa7); // 光標(biāo)高8線
glcd_dput(0x00);
glcd_dput(0x00);
glcd_cput(0x21); // 設(shè)置光標(biāo)坐標(biāo)
glcd_cput(0x9c); // 顯示設(shè)置為:圖形開、文本開
// 注意:如果設(shè)置顯示光標(biāo),需要設(shè)定光標(biāo)的位置
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -