📄 lcd.c
字号:
/************************Copyright (c)**************************
**
**
**--------------文件信息---------------------------------------
**文 件 名: lcd.c
**创 建 人: ade
**最后修改日期:
**描 述:PCR扩增仪显示部分驱动程序
液晶型号:hy-19264b
液晶地址
#define WCOML XBYTE[0xF0FF] // 写左命令
#define WDATAL XBYTE[0XF2FF] // 写左数据
#define RCOML XBYTE[0XF1FF] // 读左状态
#define RDATAL XBYTE[0XF3FF] // 读左数据
#define WCOMM XBYTE[0xF4FF] // 写中命令
#define WDATAM XBYTE[0xF6FF] // 写中数据
#define RCOMM XBYTE[0xF5FF] // 读中状态
#define RDATAM XBYTE[0xF7FF] // 读中数据
#define WCOMR XBYTE[0XF8FF] // 写右命令
#define WDATAR XBYTE[0xFAFF] // 写右数据
#define RCOMR XBYTE[0xF9FF] // 读右状态
#define RDATAR XBYTE[0xFBFF] // 读右数据
**--------------历史版本信息-----------------------------------
** 创建人:
** 版 本:
** 日 期:
** 描 述: 原始版本
**
**
**
**
**--------------当前版本修订------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**--------------------------------------------------------------
****************************************************************/
#include "lcd.h"
//void LCD_reset(void)
//{
// RESET_LCD = 0;
// delay60k(1);
// RESET_LCD = 1;
//}
/**********************************************
*函 数 名:显示屏初始化
*功能描述:设置显示起始行为第一行,开显示设置
*函数说明:使用一字节变量
*调用函数:LCD_clear
*全局变量:
*输入参数:
*返 回 值:
*设 计 者:时间:
*修 改 者:时间:
*
************************************************/
void LCD_init(void)
{
// send_char_com('1');
//delay(500);
while(RCOML&0x80); //读左状态字1 ,busy; 0, OK
WCOML=0xc0; //设置显示起始行为第一行
while(RCOML&0x80); //读左状态字1 ,busy; 0, OK
WCOML=0x3f; //开显示设置
//delay(500);
/* _nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();*/
while(RCOMM&0x80); //读中状态字1 ,busy; 0, OK
WCOMM=0xc0; //设置显示起始行为第一行
while(RCOMM&0x80); //读中状态字1 ,busy; 0, OK
WCOMM=0x3f; //开显示设置
//delay(500);
/* _nop_();_nop_();_nop_();
_nop_();_nop_();_nop_(); */
while(RCOMR&0x80); //读右状态字1 ,busy; 0, OK
WCOMR=0xc0; //设置显示起始行为第一行
while(RCOMR&0x80); //读右状态字1 ,busy; 0, OK
WCOMR=0x3f; //开显示设置
// delay(500);
/* _nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();*/
//LCD_clear();
//send_char_com('2');
}
/**********************************************
*函 数 名:LCD_clear
*功能描述:清显示命令
*函数说明:192列 y,8页 page,
*调用函数:
*全局变量:
*输入参数:
*返 回 值:
*设 计 者:时间:
*修 改 者:时间:
*
************************************************/
void LCD_clear(void)
{ // /* 设置页地址代码 10111?XX 0xB8+xx*/
unsigned char page, y;
while(RCOML&0x80); //读左状态字1 ,busy; 0, OK
WCOML=0xc0; //设置显示起始行为第一行
while(RCOML&0x80); //读左状态字1 ,busy; 0, OK
WCOML=0x3f; //开显示设置
//delay(500);
/* _nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();*/
while(RCOMM&0x80); //读中状态字1 ,busy; 0, OK
WCOMM=0xc0; //设置显示起始行为第一行
while(RCOMM&0x80); //读中状态字1 ,busy; 0, OK
WCOMM=0x3f; //开显示设置
//delay(500);
/* _nop_();_nop_();_nop_();
_nop_();_nop_();_nop_(); */
while(RCOMR&0x80); //读右状态字1 ,busy; 0, OK
WCOMR=0xc0; //设置显示起始行为第一行
while(RCOMR&0x80); //读右状态字1 ,busy; 0, OK
WCOMR=0x3f;
//开显示设置
for( page=0; page<8; page++)
{
WCOML=0xB8+(page&0x07); //设置左起始页
for( y=0; y<64; y++)
{
while(RCOML&0x80);//读左状态字1 ,busy; 0, OK
WCOML=0x40+y; //选择列
while(RCOML&0x80);//读左状态字1 ,busy; 0, OK
WDATAL=0x00;
}
WCOMM=0xB8+(page&0x07); //设置中起始页
for( y=0; y<64; y++)
{
while(RCOMM&0x80);//读中状态字1 ,busy; 0, OK
WCOMM=0x40+y;
while(RCOMM&0x80);//读中状态字1 ,busy; 0, OK
WDATAM=0x00;
}
WCOMR=0xB8+(page&0x07); //设置右起始页
for( y=0; y<64; y++)
{
while(RCOMR&0x80);//读中状态字1 ,busy; 0, OK
WCOMR=0x40+y;
while(RCOMR&0x80);//读中状态字1 ,busy; 0, OK
WDATAR=0x00;
}
}
}
/**********************************************
*函 数 名:outchar
*功能描述:显示字或字符
*函数说明:写字顺序:1 2
3 4
*调用函数:
*全局变量:
*输入参数:x,y 欲显示字符位置,*addr 字形地址, w_or_c 字形宽度值8/16, mode显示模式,正显/反显 00/0xff
* x:0-6 ,y,0-192 推荐8的倍数,或16的倍数,尽量避免在56 120 184处显示汉字
*返 回 值:
*设 计 者:时间:
*修 改 者:时间:
*
************************************************/
void outchar( unsigned char x, unsigned char y, unsigned char code *addr, unsigned char w_or_c, unsigned char mode )
{
unsigned char i,pagenum = 0x0b8,col = y,wordch=w_or_c;
if( mode != 0xff )
mode = 0 ;
pagenum += x;
for( i=0; i<2; i++)
{
for( ; wordch; wordch--)
{
if( y<64 )
{
while(RCOML&0x80);//读左状态字1 ,busy; 0, OK
WCOML=pagenum;
while(RCOML&0x80);//读左状态字1 ,busy; 0, OK
WCOML=(0x40+y); //0x40+(0~63)
while(RCOML&0x80);//读左状态字1 ,busy; 0, OK
WDATAL=(*addr)^mode;
}
else if((y>63)&&(y<128))
{
while(RCOMM&0x80);//读中状态字1 ,busy; 0, OK
WCOMM=pagenum;
while(RCOMM&0x80);//读中状态字1 ,busy; 0, OK
WCOMM=y; // (0x40+y-64)
while(RCOMM&0x80);//读中状态字1 ,busy; 0, OK
WDATAM=(*addr)^mode;
}
else if(y>127)
{
while(RCOMR&0x80);//读中状态字1 ,busy; 0, OK
WCOMR=pagenum;
while(RCOMR&0x80);//读中状态字1 ,busy; 0, OK
WCOMR=(y-0x40); // (0x40+y-64)
while(RCOMR&0x80);//读中状态字1 ,busy; 0, OK
WDATAR=(*addr)^mode;
}
y++;
addr++;
}
wordch=w_or_c;
y = col;
pagenum++;
}
}
/**********************************************
*函 数 名:displayint
*功能描述:显示整形数值<999
*函数说明:
*调用函数:
*全局变量:
*输入参数:x,y显示数字位置;value,显示数值;length,显示数值字节数;add,显示图片起始地址;mode,显示模式(正显或反显)
*返 回 值:
*设 计 者:时间:
*修 改 者:时间:
* 注意value的位数 x=(0-7),y=(0-191)
************************************************/
void displayint(unsigned char x,unsigned char y,unsigned int value,unsigned char length,unsigned char mode)
{
unsigned char dat[5],i;
for(i=0;i<length;i++)
{
outchar(x,y+i*8,CHAR_NULL,8,mode);
}
i=0;
do
{
dat[i++] = value%10;
value /= 10;
}
while(value != 0);
do
{
i--;
outchar(x,y,CHAR_0+16*dat[i],8,mode);
y += 8;
}
while(i != 0);
}
/**********************************************
*函 数 名:display_img
*功能描述:在x,y处显示width*height大小的图片
*函数说明:height须是8的倍数
*调用函数:
*全局变量:
*输入参数:
*返 回 值:
*设 计 者:时间:
*修 改 者:时间:
* 注意value的位数 x=(0-7),y=(0-191),width+y<192,heigth+8*x<64
************************************************/
#if 0
void display_img(unsigned char x,unsigned char y,unsigned char width,unsigned char height,unsigned char code * addr, unsigned char mode)
{
unsigned char i,pagenum = 0x0b8,col = y,wordch=width;
if( mode != 0xff )
mode = 0 ;
pagenum += x;
//////////////////////////
//防止图片超出
if((width + y) > 192)
width=192-y;
wordch=width;
if((height + x*8) > 64)
height=64-8*x;
////////////////////////
for( i=0; i < (height/8); i++)
{
for( ; wordch; wordch--)
{
if( y<64 )
{
while(RCOML&0x80);//读左状态字1 ,busy; 0, OK
WCOML=pagenum;
while(RCOML&0x80);//读左状态字1 ,busy; 0, OK
WCOML=(0x40+y); //0x40+(0~63)
while(RCOML&0x80);//读左状态字1 ,busy; 0, OK
WDATAL=(*addr)^mode;
}
else if((y>63)&&(y<128))
{
while(RCOMM&0x80);//读中状态字1 ,busy; 0, OK
WCOMM=pagenum;
while(RCOMM&0x80);//读中状态字1 ,busy; 0, OK
WCOMM=y; // (0x40+y-64)
while(RCOMM&0x80);//读中状态字1 ,busy; 0, OK
WDATAM=(*addr)^mode;
}
else if(y>127)
{
while(RCOMR&0x80);//读中状态字1 ,busy; 0, OK
WCOMR=pagenum;
while(RCOMR&0x80);//读中状态字1 ,busy; 0, OK
WCOMR=(y-0x40); // (0x40+y-64)
while(RCOMR&0x80);//读中状态字1 ,busy; 0, OK
WDATAR=(*addr)^mode;
}
y++;
addr++;
}
wordch=width;
y = col;
pagenum++;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -