📄 tg12864_4.h
字号:
#ifndef TG12864_4_H
#define TG12864_4_H
#include <delay.h>
#define uchar unsigned char
#define uint unsigned int
//*****************************************
#define CS PORTA.5
#define SID_W PORTA.6
#define SID_R PINA.6
#define SCLK PORTA.7
#define RES PORTA.0
#define PSB PORTA.1
#define CS_DDR DDRA.5
#define SID_DDR DDRA.6
#define SCLK_DDR DDRA.7
#define RES_DDR DDRA.0
#define PSB_DDR DDRA.1
//******************************************
uchar LCD_Read1byte();
void LCD_Write1byte(uchar data) ;
void LCD_Check_busy();
void LCD_Write_cmd(uchar cmd);
void LCD_Write_data(uchar data);
void Init_LCD(void);
void LCD_Read_data(uchar row,uchar col);
void LCD_Write_string(uchar datacode[]);
void LCD_Location_xy(uchar row,uchar col);
void LCD_Write_String_xy(uchar row,uchar col,uchar string[]);
void num(unsigned char row,unsigned char col,unsigned int n);
void num16(unsigned char row,unsigned char col,unsigned int n);
void clear(uchar wb);
//**************************************************************
void Init_LCD(void)
{
CS=1;CS_DDR=1;
SID_W=1;SID_DDR=1;
SCLK=1;SCLK_DDR=1;
delay_ms(1);
LCD_Write_cmd(0x30);//扩充指令集
delay_ms(1);
LCD_Write_cmd(0x0C);//开显示,关光标,不闪烁.[00001DCB],D=1:整体显示开,C=1:游标开,B=1:游标位置反白允许
delay_ms(1);
LCD_Write_cmd(0x02);//设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;这个指令不改变DDRAM 的内容
delay_ms(1);
LCD_Write_cmd(0x06);//指定在资料写入或读取时,光标的移动方向,DDRAM的地址计数器(AC)加1。
delay_ms(1);
LCD_Write_cmd(0x01);//清除显示,将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H"
delay_ms(1);
LCD_Write_cmd(0x80);//光标复位
delay_ms(1);
//******************
RES=1;
PSB=0;
RES_DDR=1;
PSB_DDR=1;//
}
/***********************************************************************
功能:清屏
************************************************************************/
void clear(uchar wb)
{
unsigned char row,col;
LCD_Write_cmd(0x34);
LCD_Write_cmd(0x36);
for(row=0;row<32;row++)
{
LCD_Write_cmd(0x80|row); //设置行地址
LCD_Write_cmd(0x80); //设置列地址
if(wb==0)
for(col=0;col<32;col++)
{
LCD_Write_data(0x00); //????
}
else
for(col=0;col<32;col++)
{
LCD_Write_data(0xff);
}
}
}
uchar LCD_Read1byte() //
{
uchar i,tempH,tempL,t;
SCLK=0;
SID_DDR=1;
for(i=8;i>0;i--)
{
tempH<<=1;
tempH=SID_R;
SCLK=1;
SCLK=0;
}
for(i=8;i>0;i--)
{
tempL<<=1;
tempL=SID_R;
SCLK=1;
SCLK=0;
}
SID_DDR=1;
tempL>>=4;
t=tempH+tempL;
return t;
}
void LCD_Write1byte(uchar data) //
{
uchar i,temp;
temp=data;
SCLK=0;
for(i=8;i>0;i--)
{
SID_W=temp&0x80;
temp<<=1;
SCLK=1;
delay_us(1);
SCLK=0;
delay_us(1);
}
}
void LCD_Check_busy() //
{
CS=0;
CS=1;
do{LCD_Write1byte(0xFC);}
while(0x80&LCD_Read1byte());
}
/****************************************************************
功能:写命令到LCM
参数:cmdcode是要写入的命令
****************************************************************/
void LCD_Write_cmd(uchar cmd)
{
CS=1;
LCD_Check_busy();
LCD_Write1byte(0xf8);//00 从MCU至LCD,命令
LCD_Write1byte(0xf0&cmd);
LCD_Write1byte(0xf0&(cmd<<4));
CS=0;
}
/****************************************************************
功能:写数据到LCM
参数:Data是要写入的数据
****************************************************************/
void LCD_Write_data(uchar data)
{
CS=1;
LCD_Check_busy();
LCD_Write1byte(0xfa);//00 从MCU至LCD,
LCD_Write1byte(0xf0&data);
LCD_Write1byte(0xf0&(data<<4));
CS=0;
}
void LCD_Read_data(uchar row,uchar col)
{
uchar data_H,data_L;
uint data;
LCD_Write_cmd(0x80|row);
LCD_Write_cmd(0x80|col);
LCD_Check_busy();
LCD_Write1byte(0xfe);
LCD_Read1byte();
LCD_Write1byte(0xfe);
data_H=LCD_Read1byte();
LCD_Write1byte(0xfe);
data_L=LCD_Read1byte();
data=data_H;
data<<=8;
data=data+data_L;
}
/****************************************************************
功能:写一串字符到LCM
参数:datacode是要写入的数据
****************************************************************/
void LCD_Write_string(uchar datacode[])
{
uchar i=0;
while(datacode[i])
{
LCD_Write_data(datacode[i]);
i++;
if(i==0xff)break;
}
}
/*==============设置坐标======================*/
void LCD_Location_xy(uchar row,uchar col)
{
switch(row)
{
case 0:
row=0x80;break;
case 1:
row=0x90;break;
case 2:
row=0x88;break;
case 3:
row=0x98;break;
default:
row=0x80;
}
col=col&0x07; //防止跑出界
LCD_Write_cmd(row+col);
}
/***********************************************************************
功能:在(x,y)处显示字符串string
************************************************************************/
void LCD_Write_String_xy(uchar row,uchar col,uchar string[])
{
LCD_Write_cmd(0x30);
LCD_Location_xy(row,col);
LCD_Write_string(string);
}
/***********************************************************************
功能:在第row行,col列处显示整型数据n
************************************************************************/
void num(unsigned char row,unsigned char col,unsigned int n)
{
unsigned char i=0,length=0,a[7]={0,0,0,0,0,0,0};
unsigned int nx=n;
for(i=0;i<6;i++)
{
if(nx>0)length++;
nx/=10;
}
nx=n;
for(i=length;i>0;i--)
{
a[i-1]=nx%10+48;
nx=nx/10;
}
if(n==0)a[0]='0';
LCD_Write_cmd(0x30);
LCD_Write_String_xy(row,col,a);
}
/***********************************************************************
功能:在第row行,col列处显示16进制数据n
************************************************************************/
void num16(unsigned char row,unsigned char col,unsigned int n)
{
unsigned char i=0,a[7]={0,0,0,0,0,0,0};
unsigned int nx=n;
if(nx<=0xFF)
{
a[3]=nx%16;
nx/=16;
a[2]=nx%16;
for(i=2;i<4;i++)
{
if(a[i]<10)a[i]+=48;
else a[i]+=55;
}
a[4]=0x00;
}
else
{
a[5]=nx%16;
nx/=16;
a[4]=nx%16;
nx/=16;
a[3]=nx%16;
nx/=16;
a[2]=nx%16;
for(i=2;i<6;i++)
{
if(a[i]<10)a[i]+=48;
else a[i]+=55;
}
}
a[1]='x';
a[0]='0';
LCD_Write_cmd(0x30);
LCD_Write_String_xy(row,col,a);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -