📄 240128._c
字号:
/*******************************************************************************
T6963C液晶驱动 RT240128
MAGE88 16M
*******************************************************************************/
#include <iom88v.h>
#include <macros.h>
#include "240128.h"
#include "storeroom.h"
const unsigned char turnf[8] = {7,6,5,4,3,2,1,0};
unsigned char gCurRow,gCurCol;
/*******************************************************************************
状态位STA1,STA0判断读写指令和读写数据,在读写数据或者写入命令前必须保证均为1。
*******************************************************************************/
unsigned char fnSTA01(void)
{
if( (LCD_RD_STATUS() & 0x03) == 0x03 ) return(0);
else return(1);
}
/*******************************************************************************
状态位STA2,如果STA2=1 为自动读状态
*******************************************************************************/
unsigned char fnSTA2(void)
{
if( (LCD_RD_STATUS() & 0x04) == 0x04 ) return(0);
else return(1);
}
/*******************************************************************************
状态位STA3 如果STA3 = 1 数据自动写状态
*******************************************************************************/
unsigned char fnSTA3(void)
{
if( (LCD_RD_STATUS() & 0x08) == 0x08 ) return(0);
else return(1);
}
/*******************************************************************************
状态位STA6 如果STA6 =1 屏读/屏拷贝状态
*******************************************************************************/
unsigned char fnSTA6(void)
{
if( (LCD_RD_STATUS() & 0x40) == 0x40 ) return(0);
else return(1);
}
/*******************************************************************************
读LCD状态
*******************************************************************************/
unsigned char LCD_RD_STATUS(void)
{
unsigned char temp;
LCD_DDR = 0x00;
LCD_CD_H;
LCD_RD_L;
NOP();NOP();NOP();
temp = LCD_DATA;
LCD_RD_H;
LCD_DDR = 0xFF;
return(temp);
}
/*******************************************************************************
读LCD数据
*******************************************************************************/
unsigned char LCD_RD_DATA(void)
{
unsigned char temp;
LCD_DDR = 0x00;
LCD_CD_L;
LCD_RD_L;
NOP();NOP();NOP();
temp = LCD_DATA;
LCD_RD_H;
LCD_DDR = 0xFF;
return(temp);
}
/*******************************************************************************
写数据
*******************************************************************************/
void LCD_WR_DATA(unsigned char data)
{
while( fnSTA01() );
LCD_CD_L;
LCD_WR_L;
//LCD_DDR = 0XFF;----------------单片机端口必须处于输出状态
LCD_PORT = data;
LCD_WR_H;
}
/*******************************************************************************
写无参数命令
*******************************************************************************/
void LCD_WR_CODE(unsigned char code)
{
while( fnSTA01() );
LCD_CD_H;
LCD_WR_L;
//LCD_DDR = 0XFF;----------------单片机端口必须处于输出状态
LCD_PORT = code;
LCD_WR_H;
}
/*******************************************************************************
写单参数的指令
*******************************************************************************/
void LCD_WR_CODE1(unsigned char code, unsigned char data1)
{
LCD_WR_DATA(data1);
LCD_WR_CODE(code);
}
/*******************************************************************************
写双参数的指令
*******************************************************************************/
void LCD_WR_CODE2(unsigned char code, unsigned char data1, unsigned char data2)
{
LCD_WR_DATA(data1);
LCD_WR_DATA(data2);
LCD_WR_CODE(code);
}
/*******************************************************************************
初始化LCD
*******************************************************************************/
void LCD_INIT(void)
{
LCD_WR_CODE(LCD_MOD_OR);
LCD_WR_CODE(0x98); //打开图形显示
LCD_WR_CODE2(LCD_TXT_STP,0,0);
LCD_WR_CODE2(LCD_TXT_WID,30,0);
LCD_WR_CODE2(LCD_GRH_STP,0,0);
LCD_WR_CODE2(LCD_GRH_WID,30,0);
}
/*******************************************************************************
清整屏
*******************************************************************************/
void LCD_CLEAR(unsigned char data)
{
unsigned char i,j;
LCD_WR_CODE(0x98); //打开图形显示
LCD_WR_CODE2(LCD_ADD_POS,0,0);
LCD_WR_CODE(LCD_AUT_WR);
for(i=0;i<128;i++)
{
for(j=0;j<30;j++)
{
LCD_WR_DATA(data);
}
}
LCD_WR_CODE(LCD_AUT_OVR);
}
/*******************************************************************************
显示一个240*128的图片 图片的大小为3840 。
*******************************************************************************/
void PRINT_240128(const unsigned char *str)
{
unsigned char i,j;
LCD_WR_CODE(0x98);
LCD_WR_CODE2(LCD_ADD_POS,0,0);
LCD_WR_CODE(LCD_AUT_WR);
for(i=0;i<128;i++)
{
for(j=0;j<30;j++)
{
LCD_WR_DATA(*str++);
}
}
LCD_WR_CODE(LCD_AUT_OVR);
}
/*******************************************************************************
设置当前地址,用于起点定位。
*******************************************************************************/
void LCD_SET_ADD(unsigned char urow, unsigned char ucol)
{
LCD_WR_CODE2(LCD_ADD_POS,(urow*30+ucol) & 0xFF,(urow*30+ucol) / 256);
gCurRow = urow;
gCurCol = ucol;
}
/*******************************************************************************
ASCII(8*16) 及 汉字(16*16) 显示函数,ASCII与汉字区别在于128做分界。
*******************************************************************************/
void PRINT_words (unsigned char x,unsigned char y, char *ptr)
{
unsigned char length=0,i=0,j=0,uRow=0,uCol=0;
unsigned int k=0;
uRow = y;
uCol = x;
LCD_SET_ADD(uRow*16,uCol); //起点定位
while (ptr[length]!=0) //探测字串长度
{
length++;
}
while(i<length)//ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
{
uRow = gCurRow;
uCol = gCurCol;
if(ptr[i] <= 128)//ASCII
{
for(j=0;j<16;j++)
{
LCD_WR_CODE(LCD_AUT_WR);
LCD_WR_DATA(ASC_MSK[(ptr[i]-0x20)*16+j]);
LCD_WR_CODE(LCD_AUT_OVR);
LCD_SET_ADD(uRow+j+1,uCol);
}
uCol += 1;
}
else//中文
{
for(j=0;j<sizeof(GB_16x16)/sizeof(GB_16x16[0]);j++) // 查找定位
{
if(ptr[i] == GB_16x16[j].Index[0] && ptr[i+1] == GB_16x16[j].Index[1])
{
break;
}
}
for(k=0;k<sizeof(GB_16x16[0].Msk)/2;k++)
{
LCD_SET_ADD(uRow+k,uCol);
LCD_WR_CODE(LCD_AUT_WR); // 写数据
if(j < sizeof(GB_16x16)/sizeof(GB_16x16[0]))
{
LCD_WR_DATA(GB_16x16[j].Msk[k*2]);
LCD_WR_DATA(GB_16x16[j].Msk[k*2+1]);
}
else // 未找到该字
{
if(k < sizeof(GB_16x16[0].Msk)/4)
{
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
}
else
{
LCD_WR_DATA(0xff);
LCD_WR_DATA(0xff);
}
}
LCD_WR_CODE(LCD_AUT_OVR);
}
uCol += 2;
i++;
}
if(uCol >= 30) // 光标后移
{
uRow += 16;
if(uRow < 0x80)
{
uCol -= 30;
}
else
{
uRow = 0;
uCol = 0;
}
}
LCD_SET_ADD(uRow,uCol);
i++;
}
}
/*******************************************************************************
画点
*******************************************************************************/
void PRINT_point(unsigned char x,unsigned char y,unsigned char s)
{
unsigned char x1;
x1 = x >> 3; // 取Y方向分页地址
LCD_SET_ADD(y,x1); // 起点定位
x1 = turnf[ x & 0x07 ];
x1 = 0xF0 | x1 | s; // 字节内位置计算
LCD_WR_CODE(x1); // 画上屏幕S显示属性8 画点0 擦除点
}
/*******************************************************************************
画线任意方向的斜线,直线数学方程aX+bY=1
*******************************************************************************/
void PRINT_line(unsigned char x0,unsigned char y0,unsigned char xt,unsigned char yt,unsigned char s)
{
register unsigned char t;
int xerr = 0,yerr = 0;
int delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x = xt-x0; // 计算坐标增量
delta_y = yt-y0;
uRow = x0;
uCol = y0;
if(delta_x>0)
{
incx = 1; // 设置单步方向
}
else if( delta_x==0 )
{
incx=0; // 垂直线
}
else
{
incx = -1;
delta_x = -delta_x;
}
if(delta_y>0)
{
incy=1;
}
else if( delta_y==0 )
{
incy=0; // 水平线
}
else
{
incy=-1;
delta_y=-delta_y;
}
if( delta_x > delta_y )
{
distance=delta_x; // 选取基本增量坐标轴
}
else
{
distance=delta_y;
}
for( t=0;t <= distance+1; t++ ) // 画线输出
{
PRINT_point(uRow,uCol,s); // 画点
xerr += delta_x;
yerr += delta_y;
if( xerr > distance )
{
xerr -= distance;
uRow += incx;
}
if( yerr > distance )
{
yerr -= distance;
uCol += incy;
}
}
}
/*******************************************************************************
画圆数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2
*******************************************************************************/
void circle(unsigned char Ox,unsigned char Oy,unsigned char Rx,unsigned char s)
{
unsigned int xx,rr;
unsigned int xt,yt;
unsigned int rs,row,col;
yt = Rx;
rr = (unsigned int)Rx*Rx+1; // 补偿1 修正方形
rs = (yt+(yt>>1))>>1; // (*0.75)分开1/8圆弧来画
for (xt=0;xt<=rs;xt++)
{
xx = xt*xt;
while ((yt*yt)>(rr-xx))
{
yt--;
}
row = Ox+xt; // 第一象限
col = Oy-yt;
PRINT_point(row,col,s);
row = Ox-xt; // 第二象限
PRINT_point(row,col,s);
col = Oy+yt; // 第三象限
PRINT_point(row,col,s);
row = Ox+xt; // 第四象限
PRINT_point(row,col,s);
/***************45度镜象画另一半***************/
row = Ox+yt; // 第一象限
col = Oy-xt;
PRINT_point(row,col,s);
row = Ox-yt; // 第二象限
PRINT_point(row,col,s);
col = Oy+xt; // 第三象限
PRINT_point(row,col,s);
row = Ox+yt; // 第四象限
PRINT_point(row,col,s);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -