📄 lcd.c
字号:
#include "mb95100.h"
#include "zimo.h"
#define uchar unsigned char
#define uint unsigned int
/***************************************/
/*************液晶接口定义**************/
#define LCD_RESET PDR9_P90
#define LCD_CE PDR9_P91
#define CD1 PDRA_PA0
//#define LCD_FS PDRB_PA1
#define RD1 PDRA_PA2
#define WR1 PDRA_PA3
#define LCD_BUS PDRB
/***************************************/
/*************液晶指令定义************/
#define CursorPointer 0x21 // 光标地址设置
#define OffsetReg 0x22 // CGRAM偏移地址设置
#define AddrSet 0x24 // 显示地址设置
#define TextHomeAddr 0x40 // 文本首地址
#define TextArea 0x41 // 文本宽度设置
#define GraHomeAddr 0x42 // 图形首地址设置
#define GraArea 0x43 // 图形宽度设置
#define OrMode 0x80 // 或模式显示
#define ExorMode 0x81 // 异或模式显示
#define AndMode 0x83 // 与模式显示
#define TextAttMode 0x84 // 文本属性模式
#define InterCGROM 0x80 // 内部CGROM
#define ExCGRAM 0x88 // 外部CGRAM
#define DisplayOff 0x90 // 显示关闭
#define CursorOn 0x92 // 光标显示,但不闪烁
#define CursorBlink 0x93 // 光标闪烁
#define TextOn 0x94 // 文本模式打开
#define GraOn 0x98 // 图形模式打开
#define TGAllOn 0x9c // 文本图形模式都打开
#define DataAutoWrite 0xb0 // 数据自动写
#define DataAutoRead 0xb1 // 数据自动读
#define ExitAutoRW 0xb2 // 退出数据自动读写模式
#define DataWAddrI 0xc0 // 数据写,地址加1
#define DataWAddrD 0xc2 // 数据写,地址减1
#define DataWAddrNV 0xc4 // 数据写,地址不变
#define DataRAddrI 0xc1 // 数据读,地址加1
#define DataRAddrD 0xc3 // 数据读,地址减1
#define DataRAddrNV 0xc5 // 数据读,地址不变
#define ScreenPeek 0xe0 // 屏读
#define ScreenCopy 0xe1 // 屏拷贝
#define LineChar 32 // 设置宽度
unsigned char Cursor_X,Cursor_Y;
unsigned long delayloop;
unsigned char display_flag;
extern unsigned char Clock_yr, Clock_mn, Clock_date, Clock_week, Clock_hr, Clock_min, Clock_sec;
extern unsigned int g_iCurrADValue;
/********************************************************************************
函数原型: 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 delay1(uint k)
{
uchar j;
while ((k--)!=0) { for (j=0;j<125;j++);}
}
/********************************************************************************
函数名: ReadSdate(void)
函数功能: IOPORT输出数据并检查LCD忙数据。
返回数据:checkbusy
/********************************************************************************/
ReadSdate()
{
uchar checkbusy;
DDRB=0x00;
PDRA_PA1=1;
CD1=1;
RD1=0;
WR1=1;
checkbusy=LCD_BUS;
// _LEDDISPLAY(checkbusy);
RD1=1;
DDRB=0xFF;
PDRA_PA1=0;
return ( checkbusy );
}
/********************************************************************************
函数名: Void RWcheck()
函数功能: 判断状态位STA1,STA0子程序(读写指令和读写数据状态),在写指令的读,
写数据之前这两个标志位必须同时为1
/********************************************************************************/
void RWcheck(void)
{
uchar databusy;
do{ databusy=ReadSdate();
//_LEDDISPLAY(9);
}
while( !(databusy&0x03) );
}
/********************************************************************************
函数名: Void AutoRcheck()
函数功能: 判断状态位STA2的子程序(数据自动读状态),该位在数据自动读操作过程中
取代STA0和STA1有效。在连续读过程中每读一次之前都要确认STA2=1
********************************************************************************/
void AutoRcheck(void)
{
uchar databusy;
do{databusy=ReadSdate(); }
while( !(databusy&0x04) );
}
/********************************************************************************
函数名: Void AutoWcheck()
函数功能: 判断状态位STA3子程序(数据自动写状态)
********************************************************************************/
void AutoWcheck(void)
{
uchar databusy;
do{databusy=ReadSdate(); }
while( !(databusy&0x08) );
}
/********************************************************************************
函数名: Void WriteCmd1(uchar cmd)
Void WriteCmd2(uchar dat1,uchar cmd)
Void WriteCmd3(uchar dat1,uchar dat2,uchar cmd)
Void WriteData(uchar dat)
函数功能: 写指令和写数据子程序
********************************************************************************/
void WriteData(uchar dat)
{
RWcheck();
CD1=0;
LCD_BUS=dat;
WR1=0;
WR1=1;
}
void WriteCmd1(unsigned char cmd)
{
RWcheck();
CD1=1;
LCD_BUS=cmd;
WR1=0;
WR1=1;
}
void WriteCmd2(uchar dat,uchar cmd)
{
WriteData(dat);
WriteCmd1(cmd);
}
void WriteCmd3(uchar dat1,uchar dat2,uchar cmd)
{
WriteData(dat1);
//_LEDDISPLAY(1);
WriteData(dat2);
//_LEDDISPLAY(2);
WriteCmd1(cmd);
//_LEDDISPLAY(3);
}
void AutoWriteData( uchar dat)
{
AutoWcheck();
CD1 = 0;
LCD_BUS= dat;
WR1=0;
WR1=1;
}
/********************************************************************************
函数名: Void ClearScreen(unsigned int ram)
函数功能: 清除整个屏幕
ram : 需要清零的单元数
********************************************************************************/
void ClearScreen(uint ram)
{
unsigned int i;
// 清显示 RAM 区 0000h--2000h (8k)
WriteCmd3(0x00,0x00,0x24); // 设置指针地址0000H
WriteCmd1(0xb0); // 设置自动写状态
for(i=0x00;i<ram;i++) AutoWriteData(0x00); // data=0;
WriteCmd1(0xb2); // 自动写结束
}
/********************************************************************************
函数原型: void draw_dot(x,y)
功 能; T6963屏上打点
入口参数: 横坐标(x),枞坐标(y)
出口参数:
********************************************************************************/
void draw_dot(uchar x,uchar y,uchar mode)
{ uchar dat11,dat22;
uchar n,t;
dat11=(y*32)%256 +x/8;
dat22=(y*32)/256;
delay(20);
WriteCmd3(dat11,dat22,0x24);
if(mode) n=0xf8;
else n=0xf0;
t=n|((~(x%8))&0x07);
WriteCmd1(t);
}
/********************************************************************************
函数名: Void CursorPosSet(uchar X,uchar Y)
函数功能: 光标位置设置
********************************************************************************/
void CursorPosSet(unsigned char x,unsigned char y)
{
WriteCmd3(x,y,CursorPointer); //X的取值范围0-20;Y的取值范围0-15;
}
/********************************************************************************
函数名: Void CursorUp()
函数功能: 光标向上移动一格
********************************************************************************/
void CursorUp()
{
if(Cursor_Y>0)Cursor_Y-=1;
WriteCmd3(Cursor_X,Cursor_Y,CursorPointer);
}
/********************************************************************************
函数名: Void CursorDown()
函数功能: 光标向下移动一格
********************************************************************************/
void CursorDown()
{
if(Cursor_Y<8)Cursor_Y+=1;
WriteCmd3(Cursor_X,Cursor_Y,CursorPointer);
}
/********************************************************************************
函数名: Void CursorRight()
函数功能: 光标向右移动一格
********************************************************************************/
void CursorRight()
{
if(Cursor_X<20)Cursor_X+=1;
WriteCmd3(Cursor_X,Cursor_Y,CursorPointer);
}
/********************************************************************************
函数名: Void CursorLeft()
函数功能: 光标向左移动一格
********************************************************************************/
void CursorLeft()
{
if(Cursor_X>0)Cursor_X-=1;
WriteCmd3(Cursor_X,Cursor_Y,CursorPointer);
}
/********************************************************************************
函数名: Void CursorEnter()
函数功能: 光标换行
********************************************************************************/
void CursorEnter()
{
Cursor_X=0;
Cursor_Y+=1;
WriteCmd3(Cursor_X,Cursor_Y,CursorPointer);
}
/********************************************************************************
函数名: void lcd_init (void)
函数功能:LCD初始化设置
********************************************************************************/
void lcd_init (void)
{
PDRA_PA1=0;
LCD_CE=0;
LCD_RESET=1;
WriteCmd3(0x00,0x00,0x40); //文本首地址
WriteCmd3(0x20,0x00,0x41); //文本宽度设置
WriteCmd3(0x00,0x00,0x42); // 图形首地址
WriteCmd3(0x20,0x00,0x43); //设置图形宽度 //即一行显示所占字节数
WriteCmd1(0xa1); //光标设置
WriteCmd1(0x88); //显示方式设置 逻辑“或”合成
WriteCmd1(0x9b); //显示开关
Cursor_X=0x00;
Cursor_Y=0x00;
CursorPosSet(Cursor_X,Cursor_Y);
ClearScreen(0x2000);
//WriteCmd1(0x92);
//WriteCmd1(0x93);
//WriteCmd1(0x9c);
}
/********************************************************************************
函数名:Void ShowHZ16x16(unsigned char column,unsigned char lin,unsigned int hzcode)
函数功能:显示一个汉字(16*16点阵)
column:汉字起始列(0-30) (240/8=30)
lin: 汉字起始行(0-7) (128/16=8)
hzcode: 汉字代码(自定义的)
注:超出范围的将直接写到RAM中,可以实现卷屏效果
********************************************************************************/
void ShowHZ16x16(unsigned char column,unsigned char lin,unsigned char hzcode)
{ unsigned char temp1,temp2;
unsigned int StartAddr;
unsigned char i=0;
unsigned int * temp;
//temp=&Hz[];
StartAddr=16*lin*LineChar+ column; //定位起始行
for(i=1;i<16;i++)
{
WriteCmd3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), AddrSet);
temp1=Hz[hzcode][2*i];
//temp1=i;
WriteCmd2(temp1, DataWAddrI); // 左半部 地址加一
temp2=Hz[hzcode][2*i+1];
//temp2=i;
WriteCmd2(temp2, DataWAddrNV); // 右半部 显示地址不变
StartAddr=StartAddr + LineChar; // 换到下一行
}
}
/********************************************************************************
函数名:Void ShowFX16x16(unsigned char column,unsigned char lin,unsigned int hzcode)
函数功能:反显示一个汉字(16*16点阵)
column:汉字起始列(0-30) (240/8=30)
lin: 汉字起始行(0-7) (128/16=8)
hzcode: 汉字代码(自定义的)
注:超出范围的将直接写到RAM中,可以实现卷屏效果
********************************************************************************/
void ShowFX16x16(unsigned char column,unsigned char lin,unsigned char hzcode)
{ unsigned char temp1,temp2;
unsigned int StartAddr;
unsigned char i=0;
unsigned int * temp;
//temp=&Hz[];
StartAddr=16*lin*LineChar+ column; //定位起始行
for(i=1;i<16;i++)
{
WriteCmd3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), AddrSet);
temp1=~Hz[hzcode][2*i];
//temp1=i;
WriteCmd2(temp1, DataWAddrI); // 左半部 地址加一
temp2=~Hz[hzcode][2*i+1];
//temp2=i;
WriteCmd2(temp2, DataWAddrNV); // 右半部 显示地址不变
StartAddr=StartAddr + LineChar; // 换到下一行
}
}
/********************************************************************************
函数名:Void ShowSZ16x8(unsigned char column,unsigned char lin,unsigned int Szcode)
函数功能:显示一个数字(8*16点阵)
column:数字起始列(0-30) (240/8=30)
lin: 数字起始行(0-7) (128/16=8)
szcode: 数字代码(自定义的)
注:超出范围的将直接写到RAM中,可以实现卷屏效果
********************************************************************************/
void ShowSZ16x16(unsigned char column,unsigned char lin,unsigned char szcode)
{ unsigned char temp1;
unsigned int StartAddr;
unsigned char i=0;
unsigned int * temp;
//temp=&Hz[];
StartAddr=16*lin*LineChar+ column; //定位起始行
for(i=1;i<16;i++)
{
WriteCmd3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), AddrSet);
temp1=Sz[szcode][i];
WriteCmd2(temp1, DataWAddrNV); // 右半部 显示地址不变
StartAddr=StartAddr + LineChar; // 换到下一行
}
}
_ScreenSash()
{unsigned char x;
WriteCmd3(0xa2, 0x0f, AddrSet);
for(x=0;x<26;x++)
{
WriteCmd2(0xff, DataWAddrI);
}
WriteCmd3(0x62,0x00, AddrSet);
for(x=0;x<26;x++)
{
WriteCmd2(0xff, DataWAddrI);
}
WriteCmd3(0x01,0x1, AddrSet);
WriteCmd2(0xff, DataWAddrNV);
WriteCmd3(0x1c,0x1, AddrSet);
WriteCmd2(0xff, DataWAddrNV);
WriteCmd3(0x01,0xf, AddrSet);
WriteCmd2(0xff, DataWAddrNV);
WriteCmd3(0x1c,0xf, AddrSet);
WriteCmd2(0xff, DataWAddrNV);
for(x=0;x<5;x++)
{
draw_dot(15,x+3,1);
draw_dot(224,x+3,1);
draw_dot(15,x+121,1);
draw_dot(224,x+121,1);
}
for(x=8;x<121;x++)
{
draw_dot(7,x,1);
draw_dot(231,x,1);
}
}
_ScreenStart()
{unsigned char x;
_ScreenSash();
for(x=0;x<10;x++)
{
ShowHZ16x16(x*2+5,0x1,x);
}
for(x=0;x<5;x++)
{
ShowHZ16x16(x*2+9,0x3,x+10);
}
for(x=0;x<6;x++)
{
ShowHZ16x16(x*2+9,0x5,x+15);
}
for(x=30;x<210;x++)
{
draw_dot(x,70,1);
draw_dot(x,71,1);
draw_dot(x,72,1);
draw_dot(x,73,1);
draw_dot(x,74,1);
draw_dot(x,75,1);
delay1(50);
}
}
_ScreenMenu()
{unsigned char x;
ClearScreen(0x2000);
_ScreenSash();
for(x=0;x<3;x++)
{
ShowHZ16x16(x*2+12,1,x+21);
}
for(x=0;x<2;x++)
{
ShowHZ16x16(x*2+13,2,x+24);
}
ShowHZ16x16(13,3,26);
ShowHZ16x16(15,3,25);
for(x=0;x<2;x++)
{
ShowHZ16x16(x*2+13,4,x+27);
}
for(x=0;x<2;x++)
{
ShowHZ16x16(x*2+13,5,x+29);
}
for(x=100;x<140;x++)
{
draw_dot(x,0x1f,1);
draw_dot(x,0x2f,1);
draw_dot(x,0x3f,1);
draw_dot(x,0x4f,1);
draw_dot(x,0x5f,1);
}
for(x=0x1f;x<0x60;x++)
{
draw_dot(100,x,1);
draw_dot(139,x,1);
}
for(x=0;x<2;x++)
{
ShowHZ16x16(x*2+4,6,x+31);
}
ShowHZ16x16(13,6,33);
ShowHZ16x16(15,6,32);
for(x=0;x<2;x++)
{
ShowHZ16x16(x*2+22,6,x+34);
}
ShowHZ16x16(10,2,95);
}
_Sc_cz(unsigned char y)
{unsigned char x;
for(x=0;x<2;x++)
{
ShowHZ16x16(x*2+2,y+1,x+41);
}
ShowHZ16x16(6,y+1,38);
ShowHZ16x16(8,y+1,43);
ShowHZ16x16(10,y+1,10);
for(x=0;x<2;x++)
{
ShowHZ16x16(x*2+14,y+1,x+44);
}
ShowHZ16x16(2,y+3,43);
ShowHZ16x16(4,y+3,10);
for(x=0;x<2;x++)
{
ShowHZ16x16(x*2+7,y+3,x+46);
}
ShowHZ16x16(13,y+3,48);
ShowHZ16x16(15,y+3,10);
for(x=0;x<2;x++)
{
ShowHZ16x16(x*2+20,y+3,x+49);
}
}
_ScreenJL(unsigned char num)
{unsigned char x;
unsigned int setpress;
switch(num)
{
case 0: setpress=20000;break;
case 1: setpress=15000;break;
case 2: setpress=10000;break;
default:setpress=20000;
}
ClearScreen(0x2000);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -