📄 lcd-ad.c
字号:
/***********************************************************************************************
** 文件名称:_LCD_C
** 功能说明:ST7920驱动LCD显示软件包
** 使用说明:软件包用到LPC213x的二个引脚,默认为P1.24,P1.25,如需修改,请修改头文件中的宏定义数据即可
(接触一天,时间不足,理解不深,代码有待优化,鉴谅)
***********************************************************************************************/
#include "config.h"
#include "lad.h"
uint8 chartab4[1024] ={0x00 };
/***********************************************************************************************
** 函数名称:LCD_Init()
** 函数功能:LCD初始化
** 入口参数:无
** 出口参数:无
***********************************************************************************************/
void LCD_Init(void)
{
PIN_INITI;
LCD_Dly(50); //启动等待,等LCD进入工作状态
LCD_Write(0,0x30); //8 位介面,基本指令集
LCD_Write(0,0x0c); //显示打开,光标关,反白关
LCD_Write(0,0x01); //清屏,将DDRAM的地址计数器归零
}
/***********************************************************************************************
** 函数名称:LCD_Write()
** 函数功能:LCD写指令或数据
** 入口参数:control_flow 数据控制流,0 为写指令 1 为写数据
ddata 数据
** 出口参数:无
***********************************************************************************************/
void LCD_Write(unsigned char control_flow, unsigned char ddata)
{
unsigned char start_data,Hdata,Ldata;
if(0==control_flow) start_data=0xf8; //写指令
else start_data=0xfa; //写数据
Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
LCD_SendByte(start_data); //发送起始信号
LCD_Dly(1); //延时是必须的
LCD_SendByte(Hdata); //发送高四位
LCD_Dly(1); //延时是必须的
LCD_SendByte(Ldata); //发送低四位
LCD_Dly(1); //延时是必须的
}
/***********************************************************************************************
** 函数名称:LCD_SendByte()
** 函数功能:发送一个字节
** 入口参数:bbyte 字节数据
** 出口参数:无
***********************************************************************************************/
void LCD_SendByte(unsigned char bbyte)
{
unsigned char i;
for(i=0;i<8;i++)
{
if( (bbyte&0x80)!=0 ) SID_1;
else
{
SID_0 ; //SID=bbyte&0x80;取出最高位
}
SCKL_1; //SCLK=1;
__asm
{
nop
}
SCKL_0; //SCLK=0;
bbyte<<=1; //左移
}
}
/***********************************************************************************************
** 函数名称:LCD_Dly()
** 函数功能://延时
** 入口参数:dly 延时参数,值越大,延时时间越长
** 出口参数:无
***********************************************************************************************/
void LCD_Dly(unsigned int dly)
{
unsigned int i,j;
for(i=dly;i>0;i--)
for(j=500;j>0;j--);
}
/***********************************************************************************************
** 函数名称:LCD_Point()
** 函数功能:写LCD画点数据
** 入口参数:uint16 x 横坐标
uint16 y 纵坐标
uint8 disp_onoff 0:清零某一点;1:点亮某一点
** 出口参数:无
***********************************************************************************************/
void LCD_Point(uint16 x, uint16 y, uint8 disp_onoff)
{
uint16 z=0;
z = (63-x) * 16 + (y/8);
if (disp_onoff == 0)
chartab4[z] = (chartab4[z] & (~(0x80 >> (y%8))));
else
chartab4[z] = (chartab4[z] | (0x80 >> (y%8)));
LCD_GRP(chartab4);
}
/***********************************************************************************************
** 函数名称:Modify_Point()
** 函数功能:修改chartab4数组函数
** 入口参数:uint16 x 横坐标
uint16 y 纵坐标
** 出口参数:无
***********************************************************************************************/
void Modify_Point(uint16 x, uint16 y)
{
uint16 z=0;
z = (63-x) * 16 + (y/8);
chartab4[z] |= (0x80 >> (y%8));
}
void Draw_Point(uint16 x, uint16 y)
{
uint16 z=0;
z = (63-x) * 16 + (y/8);
chartab4[z] |= (0x80 >> (y%8));
}
/***********************************************************************************************
** 函数名称:Draw_HLine()
** 函数功能:在第row(0~63)行画从最左端至最右端的直线
** 入口参数:uint8 row ;LCD行参数,取值范围0~63
** 出口参数:无
***********************************************************************************************/
void Draw_HLine(uint8 row)
{
uint8 x,y;
for(x=row,y=0;y<128;y++)
Modify_Point(x,y);
LCD_GRP(chartab4);
}
/***********************************************************************************************
** 函数名称:Draw_HLine2()
** 函数功能:在第row(0~63)行画从starty至endy的直线
** 入口参数:uint8 row ;LCD行参数,取值范围0~63;starty和endy在0~127之间
** 出口参数:无
***********************************************************************************************/
void Draw_HLine2(uint8 starty,uint8 endy,uint8 row)
{
uint8 x,y;
for(x=row,y=starty;y<endy;y++)
Modify_Point(x,y);
LCD_GRP(chartab4);
}
/***********************************************************************************************
** 函数名称:Draw_VLine()
** 函数功能:在第colm(0~127)列画从最下端至最上端的直线
** 入口参数:uint8 row ;LCD行参数,取值范围0~63
** 出口参数:无
***********************************************************************************************/
void Draw_VLine(uint8 colm)
{
uint8 x,y;
for(x=0,y=colm;x<64;x++)
Modify_Point(x,y);
LCD_GRP(chartab4);
}
/***********************************************************************************************
** 函数名称:Draw_HLine()
** 函数功能:修改chartab4数组函数
** 入口参数:uint16 x 横坐标
uint16 y 纵坐标
uint8 disp_onoff 画点
** 出口参数:无
***********************************************************************************************/
void Draw_VLine2(uint8 startx,uint8 endx,uint8 colm)
{
uint8 x,y;
for(x=startx,y=colm;x<endx;x++)
Modify_Point(x,y);
LCD_GRP(chartab4);
}
/***********************************************************************************************
** 函数名称:Draw_HArrow()
** 函数功能:在LCD水平方向上画直线末端的箭头
** 入口参数:(x,y)需要箭头的水平直线末端点坐标
** 出口参数:无
***********************************************************************************************/
void Draw_HArrow(uint8 x,uint8 y)
{
Modify_Point(x,y+1);
Modify_Point(x,y+2);
Modify_Point(x,y+3);
Modify_Point(x,y+4);
Modify_Point(x,y+5);
Modify_Point(x+2,y+3);
Modify_Point(x-2,y+3);
Modify_Point(x+1,y+4);
Modify_Point(x-1,y+4);
LCD_GRP(chartab4); //取数组数据来绘图
}
/***********************************************************************************************
** 函数名称:LCD_HLine()
** 函数功能:在LCD垂直方向上画直线末端的箭头
** 入口参数:(x,y)需要箭头的垂直直线末端点坐标
** 出口参数:无
***********************************************************************************************/
void Draw_VArrow(uint8 x,uint8 y)
{
uint8 i;//i<4决定箭头大小
Draw_VLine2(x,x+6,y);//先延长原直线3个像素点
for(i=1;i<3;i++)
{
Modify_Point(x+6-i,y+i);//右侧
Modify_Point(x+6-i,y-i);//左侧
}
LCD_GRP(chartab4); //取数组数据来绘图
}
/***********************************************************************************************
** 函数名称:LCD_GRP()
** 函数功能:绘图函数
** 入口参数:string_num 液晶点阵数组
** 出口参数:无
***********************************************************************************************/
void LCD_GRP(uint8 const *string_num)
{
uint8 i,j,k;
k = 0x80;
LCD_Write(0,0x32); // 功能设定
LCD_Dly(2);
LCD_Write(0,0x36);
LCD_Dly(2);
// 上半屏
for (i = 0; i<32; i++)
{
LCD_Write(0,k);
LCD_Dly(2);
k++;
LCD_Write(0,0x80);
LCD_Dly(2);
for (j = 0;j <16;j++)
{
LCD_Write(1,*string_num);
string_num++;
LCD_Dly(1);
}
}
// 下半屏
k = 0x80;
for (i = 0;i < 32;i++)
{
LCD_Write(0,k);
LCD_Dly(2);
k++;
LCD_Write(0,0x88);
LCD_Dly(2);
for (j = 0;j < 16;j++)
{
LCD_Write(1,*string_num);
string_num++;
LCD_Dly(1);
}
}
}
void DrawX(uint8 x,uint8 y)
{
Modify_Point(x,y);
Modify_Point(x+1,y-1);
Modify_Point(x+1,y+1);
Modify_Point(x+2,y-2);
Modify_Point(x+2,y+2);
Modify_Point(x-1,y-1);
Modify_Point(x-1,y+1);
Modify_Point(x-2,y-2);
Modify_Point(x-2,y+2);
LCD_GRP(chartab4); //取数组数据来绘图
}
void DrawY(uint8 x,uint8 y)
{
Modify_Point(x,y);
Modify_Point(x-1,y);
Modify_Point(x-2,y);
Modify_Point(x+1,y-1);
Modify_Point(x+1,y+1);
Modify_Point(x+2,y-2);
Modify_Point(x+2,y+2);
LCD_GRP(chartab4); //取数组数据来绘图
}
void Draw0(uint8 x,uint8 y)
{
Modify_Point(x,y-1);
Modify_Point(x,y+1);
Modify_Point(x-2,y);
Modify_Point(x-2,y-1);
Modify_Point(x-2,y+1);
Modify_Point(x+2,y);
Modify_Point(x+2,y-1);
Modify_Point(x+2,y+1);
Modify_Point(x+1,y-1);
Modify_Point(x-1,y-1);
Modify_Point(x+1,y+1);
Modify_Point(x-1,y+1);
LCD_GRP(chartab4);
}
void Draw1(uint8 x,uint8 y)
{ uint8 i;
for(i=1;i<3;i++)
{
Modify_Point(x+i,y);
Modify_Point(x-i,y);
}
Modify_Point(x,y);
LCD_GRP(chartab4);
}
void Draw2(uint8 x,uint8 y)
{
Modify_Point(x,y);
Modify_Point(x+1,y+1);
Modify_Point(x,y+1);
Modify_Point(x,y-1);
Modify_Point(x+2,y);
Modify_Point(x+2,y+1);
Modify_Point(x+2,y-1);
Modify_Point(x-2,y);
Modify_Point(x-2,y+1);
Modify_Point(x-2,y-1);
Modify_Point(x-1,y-1);
LCD_GRP(chartab4);
}
void Draw3(uint8 x,uint8 y)
{
Modify_Point(x,y);
Modify_Point(x,y+1);
Modify_Point(x,y-1);
Modify_Point(x+2,y);
Modify_Point(x+2,y+1);
Modify_Point(x+2,y-1);
Modify_Point(x-2,y);
Modify_Point(x-2,y+1);
Modify_Point(x-2,y-1);
Modify_Point(x+1,y+1);
Modify_Point(x-1,y+1);
LCD_GRP(chartab4);
}
void Draw4(uint8 x,uint8 y)
{
Modify_Point(x,y);
Modify_Point(x,y+1);
Modify_Point(x,y-1);
Modify_Point(x,y-2);
Modify_Point(x+1,y-2);
Modify_Point(x+2,y-2);
Modify_Point(x-2,y);
Modify_Point(x+1,y);
Modify_Point(x+2,y);
Modify_Point(x-1,y);
LCD_GRP(chartab4);
}
void Draw5(uint8 x,uint8 y)
{
Modify_Point(x,y);
Modify_Point(x,y+1);
Modify_Point(x,y-1);
Modify_Point(x+1,y-1);
Modify_Point(x+2,y-1);
Modify_Point(x+2,y-1);
Modify_Point(x+2,y);
Modify_Point(x+2,y+1);
Modify_Point(x-1,y+1);
Modify_Point(x-2,y);
Modify_Point(x-2,y);
Modify_Point(x-2,y-1);
Modify_Point(x-2,y+1);
LCD_GRP(chartab4);
}
void Draw6(uint8 x,uint8 y)
{
Modify_Point(x,y);
Modify_Point(x,y-1);
Modify_Point(x,y+1);
Modify_Point(x-1,y+1);
Modify_Point(x-1,y-1);
Modify_Point(x-2,y);
Modify_Point(x-2,y-1);
Modify_Point(x-2,y+1);
Modify_Point(x+1,y-1);
Modify_Point(x+2,y);
Modify_Point(x+2,y-1);
Modify_Point(x+2,y+1);
LCD_GRP(chartab4);
}
void Draw7(uint8 x,uint8 y)
{
Modify_Point(x+2,y+1);
Modify_Point(x+1,y+1);
Modify_Point(x,y+1);
Modify_Point(x-1,y+1);
Modify_Point(x-2,y+1);
Modify_Point(x+2,y);
Modify_Point(x+2,y-1);
LCD_GRP(chartab4);
}
void Draw8(uint8 x,uint8 y)
{
Modify_Point(x,y);
Modify_Point(x,y-1);
Modify_Point(x,y+1);
Modify_Point(x-2,y);
Modify_Point(x-2,y-1);
Modify_Point(x-2,y+1);
Modify_Point(x+2,y);
Modify_Point(x+2,y-1);
Modify_Point(x+2,y+1);
Modify_Point(x+1,y-1);
Modify_Point(x-1,y-1);
Modify_Point(x+1,y+1);
Modify_Point(x-1,y+1);
LCD_GRP(chartab4);
}
void Draw9(uint8 x,uint8 y)
{
Modify_Point(x-1,y);
Modify_Point(x-2,y);
Modify_Point(x,y);
Modify_Point(x+1,y);
Modify_Point(x+2,y);
Modify_Point(x+2,y-1);
Modify_Point(x+2,y-2);
Modify_Point(x+1,y-2);
Modify_Point(x,y-2);
Modify_Point(x,y-1);
LCD_GRP(chartab4);
}
void drawquxian(void)
{ uint8 dangwei;
uint8 x;
uint8 i;
uint8 k=0;
for(i=3;i<127;i++)
{ dangwei=((i-4)%20)/10;
switch(dangwei)
{ case 0:
i=i-20*k;
x=63+13*i/5-(i*i)/10-379/10;
i=i+20*k; //还原i
Modify_Point(x,i);
LCD_GRP(chartab4);
break;
case 1:
i=i-20*k;
x=63+13*i/5-(i*i)/10-379/10;
i=i+20*k; //还原i
Modify_Point(x,i);
LCD_GRP(chartab4);
break;
}
if(i==3+20*(k+1))
{
k++;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -