📄 lcd.c
字号:
/*------------液晶显示程序,通过芯片T6963C控制128*64液晶屏-------------*/
//8月19日完成汉字显示
//注意,由于使用T6963C作为液晶驱动,因此,字符ASCII码减32后方为要显示的字符
//例如要显示字母A(65),应向T6963数据端口写入65-32=33=0x21
//完成波形绘制
//需要与8279配合做菜单功能
#include <string.h>
#include <absacc.h>
#include <C8051F120.h>
#include <zimo.h>
#include <LCD.h>
#include <delay.h>
#include <intrins.h>
//驱动芯片的C/D端接A0,LCD片选线一直接低
#define COM_LCD XBYTE[0x21FF] //LCD控制芯片命令端口地址
#define DATA_LCD XBYTE[0x23FF] //LCD控制芯片数据端口地址
//对不同的液晶屏,可修改下面的参数
#define SIZE_ROW 128 //行
#define SIZE_COL 240 //列
/*----------------------LCD控制命令---------------------------*/
//寄存器设定命令
#define CURSOR_CONTROL 0x21 //光标位置控制命令字
#define REGISTER_SHIFT 0x22 //寄存器偏移设定
#define ADDRESS_SET 0x24 //地址指针设定
//显示方式设定命令
#define TEXT_START_ADDRESS_SET 0x40 //文本起始地址设定
#define TEXT_AREA_SET 0x41 //文本区域宽度
#define FIGURE_START_ADDRESS_SET 0x42 //图形起始地址设定
#define FIGURE_AREA_SET 0x43 //图形区域宽度
//显示方式设置
#define OR_WAY 0x80 //或方式
#define XOR_WAY 0x81 //异或方式
#define AND_WAY 0x83 //与方式
#define TEXT_WAY 0x84 //文本属性方式
#define INNER_CGROM 0x80 //内部CGROM方式
#define EXTERNAL_CGRAM 0x88 //外部CGRAM方式
//显示开关控制
#define DISPLAY_OFF 0x90 //显示关
#define CURSOR_ON_BLINK_OFF 0x92 //光标开闪烁关
#define CURSOR_ON_BLINK_ON 0x93 //光标开闪烁开
#define TEXT_ON_FIGURE_OFF 0x94 //文本模式开,图形模式关
#define TEXT_OFF_FIGURE_ON 0x98 //文本模式关,图形模式开
#define TEXT_ON_FIGURE_ON 0x9F //文本模式开,图形模式开
//光标模式选择
#define CURSOR_ONE 0xA0 //1行光标
#define CURSOR_TWO 0xA1 //2行光标
#define CURSOR_THREE 0xA2 //3行光标
#define CURSOR_FOUR 0xA3 //4行光标
#define CURSOR_FIVE 0xA4 //5行光标
#define CURSOR_SIX 0xA5 //6行光标
#define CURSOR_SEVEN 0xA6 //7行光标
#define CURSOR_EIGHT 0xA7 //8行光标
//数据自动读写选择
#define DATA_AUTO_WRITE 0xB0 //数据自动写
#define DATA_AUTO_READ 0xB1 //数据自动读
#define RESET_AUTO_WR 0xB2 //复位自动读写
//数据读写控制
#define WRITE_ADDRESS_ADD 0xC0 //数据写地址自动加1
#define READ_ADDRESS_ADD 0xC1 //数据读地址自动加1
#define WRITE_ADDRESS_SUB 0xC2 //数据写地址自动减1
#define READ_ADDRESS_SUB 0xC3 //数据读地址自动减1
#define WRTIE_ADDRESS_HOLD 0xC4 //数据写地址不变
#define READ_ADDRESS_HOLD 0xC5 //数据读地址不变
//屏幕操作
#define SCREEN_GET 0xE0 //屏获取一字节显示数据
#define SCREEN_COPY 0xE8 //屏拷贝,拷贝一行数据到图形显示区
/*
//位位置操作
#define BIT_CLEAR 0xF0 //bit清零,11110xxx
#define BIT_SET 0xFF //bit置位,11111xxx
#define BIT0 0xF8 //1111x000,LSB,第0位
#define BIT1 0xF9 //1111x001,第1位
#define BIT2 0xFA //1111x010
#define BIT3 0xFB //1111x011
#define BIT4 0xFC //1111x100
#define BIT5 0xFD //1111x101
#define BIT6 0xFE //1111x110
#define BIT7 0xFF //1111x111
*/
BYTE idata uRow;
BYTE idata uCol; //LCD光标控制变量
typedef idata struct
{
WORD size;
BYTE sizeL,sizeH;
WORD addr;
BYTE start_addrL,start_addrH;
}LCD;
LCD Text,Figure;
void Check_Status01(void) //检查Status0/1是否同时为1,必须同时检查这两位
{ //且每条指令写都需要检查这两位
BYTE idata temp;
do
{
temp = COM_LCD&0x03;
}while(temp!=0x03);
}
void Check_Status3(void)
{
BYTE idata temp;
do
{
temp = COM_LCD &0x08;
}while(temp!=0x08);
}
/*------------------------------------------------
写双字节命令函数
入口参数:数据Data_A,Data_B;命令Com
出口参数:无
----------------------------------------------*/
void Write_Word_Command(BYTE Com,BYTE Data_A,BYTE Data_B) //写双参数命令
{
Check_Status01();
DATA_LCD = Data_A;
Check_Status01();
DATA_LCD = Data_B;
Check_Status01();
COM_LCD = Com;
}
/*--------------------------------------------
写单参数命令函数
入口参数:数据Data_A;命令Com
出口参数:无
------------------------------------------------*/
void Write_Byte_Command(BYTE Data_A,BYTE Com) //写单参数命令
{
Check_Status01();
DATA_LCD = Data_A;
Check_Status01();
COM_LCD = Com;
}
/*----------------------------------------------
写无参数命令函数
入口参数:命令COMMAND
出口参数:无
-----------------------------------------------*/
void Write_Nopara_Command(BYTE COMMAND) //写无参数命令
{
Check_Status01();
COM_LCD = COMMAND;
}
/*----------------------------------------------
写数据函数
入口参数:数据DATA
出口参数:无
---------------------------------------------*/
void Write_Nopara_Data(BYTE DATA) //写无参数数据
{
Check_Status01();
DATA_LCD = DATA;
}
/*----------------------------------------------
设置光标位置函数
入口参数:行位置urow,列位置:ucol
出口参数:无
------------------------------------------------*/
void LCD_SetPos(BYTE urow, BYTE ucol)
{
WORD idata iPos;
iPos = urow * 30 + ucol; //30?
Write_Word_Command(ADDRESS_SET,iPos%256,iPos / 256);
}
/*------------------------------------------------
清屏函数
入口参数:无
出口参数:无
-------------------------------------------------*/
void Clear_Screen(void)
{
WORD idata i;
EA=0;
Write_Word_Command(ADDRESS_SET,0,0); //设置地址指针
Write_Nopara_Command(DATA_AUTO_WRITE); //数据自动写
for(i=0;i<30*128;i++)
{
Check_Status3();
Write_Nopara_Data(0x00); //置0
}
Write_Nopara_Command(RESET_AUTO_WR); //数据自动写结束
Write_Word_Command(ADDRESS_SET,0,0); //重置地址指针
EA=1;
}
/********************************************************************************
函数原型: void Delay(uchar t)
功 能; (1)延时 T*10 (2) 1MS*k
入口参数: (1) uchar t (2)uint k
出口参数:
********************************************************************************/
/*void Delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++) { for(j=0;j<10;j++); }
}*/
void Display_hz(BYTE x,BYTE y,BYTE *shz)
{
WORD idata length=0;
WORD idata no;
WORD idata k;
BYTE idata uRow;
BYTE idata uCol;
EA=0;
while (*(shz+length)!='\0') //计算汉字字符串长度
{
length++;
}
for(no=0;no<length/2;no++) //根据索引查找相应的汉子字模
{
WORD j,find;
for(j=0;j<sizeof(Hz_Index)/2;j++)
{
if(Hz_Index[j*2]==*(shz+no*2)&&Hz_Index[j*2+1]==*(shz+no*2+1))
{
find=1; //找到字模
break;
}
}
for(k=0;k<16;k++) //显示
{
uRow=y;
uCol=x+no*2; //汉字占两个字节(16*16)
LCD_SetPos(uRow*16+k,uCol);
Write_Nopara_Command(DATA_AUTO_WRITE); //自动写,0xB0
Write_Nopara_Data(CGTAB[j*32+2*k]); //写入字模数据(一半)
Write_Nopara_Command(RESET_AUTO_WR ); //自动写结束
x++;
Write_Nopara_Command(DATA_AUTO_WRITE);
Write_Nopara_Data(CGTAB[j*32+2*k+1]);
Write_Nopara_Command(RESET_AUTO_WR );
x--;
}
}
EA=1;
}
//显示字符串
void Display_String(BYTE x,BYTE y,BYTE *ptr)
{
char idata c1;
BYTE idata i=0;
BYTE idata j=0;
WORD idata uLen;
BYTE idata uRow;
BYTE idata uCol;
EA=0;
uLen=strlen(ptr);
for(i=0;i<uLen;i++)
{
c1 =ptr[i];
for(j=0;j<16;j++)
{
uRow=y;
uCol=x;
LCD_SetPos(uRow*16+j,uCol);
Write_Nopara_Command(DATA_AUTO_WRITE);
Write_Nopara_Data(ASC_MSK[(c1-0x20)*16+j]);
Write_Nopara_Command(RESET_AUTO_WR);
}
if(x<29)
{
x++;
}
else
{
y++;x=0;
}
}
EA=1;
}
void Display_Image(BYTE x,BYTE y)
{
BYTE idata uRow;
BYTE idata uCol;
BYTE idata i;
BYTE idata j;
WORD idata pos=0;
EA=0;
for(i=0;i<64;i++)
{
for(j=0;j<8;j++)
{
uRow=y;
uCol=x;
LCD_SetPos(uRow*16+i,uCol+j);
Write_Nopara_Command(DATA_AUTO_WRITE);
Write_Nopara_Data(logo[pos++]);
Write_Nopara_Command(RESET_AUTO_WR);
}
}
EA=1;
}
void Init_LCD(void) //LCD初始化函数
{
EA=0;
Text.size = Figure.size= (SIZE_COL>>3)*SIZE_ROW; //128*64/8 = 1024 = 0x4000
Text.sizeL = Text.size; //0x00
Text.sizeH = Text.size>>8; //0x40
Figure.sizeL = Text.size;
Figure.sizeH = Text.size>>8;
Text.addr = 0x0000;
Text.start_addrL = Text.addr;
Text.start_addrH = Text.addr>>8;
Figure.addr = 0x0000;
Figure.start_addrL = Figure.addr;
Figure.start_addrH = Figure.addr>>8;
Write_Word_Command(TEXT_START_ADDRESS_SET,Text.start_addrL,Text.start_addrH);//设置文本起始地址
Write_Word_Command(TEXT_AREA_SET,0x1E,0x00); //文本区域设定,只需给出行地址(宽度30)
Write_Word_Command(FIGURE_START_ADDRESS_SET,Figure.start_addrL,Figure.start_addrH);//设置图形显示起始地址
Write_Word_Command(FIGURE_AREA_SET,0x1E,0x00); //图形区域设定
Write_Nopara_Command(OR_WAY); //图形或文本
Write_Nopara_Command(CURSOR_ONE);
//Write_Word_Command(0x22,0x02,0x00);
//Write_Word_Command(0x24,0x00,0x14);
Write_Nopara_Command(0x98);
EA=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -