|

楼主 |
发表于 2021-4-14 18:00:42
|
显示全部楼层
以下是程序的显示部分
/******************************************************
程 序:240×128液晶驱动
内 容:实现各种函数功能
液 晶:MSP240128(T6963C)
软 件:keil uVision4
作 者:Hzxin
整理日期:2011年7月20日
=====================================================
本程序参考仿真社区(http://proteus.5d6d.com)一个网友
写的LCD240*128显示程序,在此表示感谢!
******************************************************/
#ifndef MSP240128_H
#define MSP240128_H
#define unchar unsigned char
#define unint unsigned int
#define LCD_Data P2
// LCD240*128 I/O 信号管脚
sbit WR0 = P0^7; // 写信号,低有效
sbit RD0 = P0^6; // 读选择 ,低电平有效
sbit CE = P0^5; // 片选信号,低电平有效,可直接接地
sbit CD = P0^4; // 指令\数据 选择 高选择指令,低选择数据
//读取LCD状态字
uchar readstate(void)
{
uchar lcd_state;
LCD_Data=0xff; // 读取总线端口物理电平
CD=1;
_nop_();
RD0=0;
_nop_();
lcd_state=LCD_Data;
_nop_();
_nop_();
RD0=1;
return lcd_state;
}
//判断指令(数据)读写忙否状态
void st01(void)
{
while((readstate()&0x03)!=3)
;
}
//判断数据自动写状态
void st3(void)
{
while((readstate()&0x08)!=8)
;
}
/******************写一个命令***********/
void WriteCmd(unchar cmd)
{
st01(); //状态判断
LCD_Data=cmd;
WR0=0;
_nop_();
_nop_();
WR0=1;
}
/****************写一个数据*************/
void WriteDate(unchar date)
{
st01(); //状态判断
CD=0;
_nop_();
LCD_Data=date;
WR0=0;
_nop_();
_nop_();
WR0=1;
}
//数据自动写入函数
void writeauto(uchar onedata)
{
st3(); //状态判断
CD=0; //C/D=0,数据通道
_nop_();
LCD_Data=onedata;
WR0=0;
_nop_();
_nop_();
WR0=1;
}
/**************写单参数******************/
void WriteTcp(unchar onep1,unchar comd1)
{
WriteDate(onep1);
WriteCmd(comd1);
}
/**************写双参数******************/
void WriteTcp2(unchar date1,unchar date2,unchar comd2)
{
WriteDate(date1);
WriteDate(date2);
WriteCmd(comd2);
}
/***********************************************************
液晶初始化,清屏
***********************************************************/
void LcdInit()
{
WriteTcp2(0,0,0x40);
WriteTcp2(30,0,0x41);
WriteTcp2(0,0,0x42);
WriteTcp2(30,0,0x43);
WriteCmd(0x80);
WriteCmd(0x9a);
}
//清除屏幕(清所有8K存储空间)
void LcdClear(void)
{
uint cl_count;
WriteTcp2(0x00,0x00,0x24); //设置显示存储器首地址
WriteCmd(0xb0); //设置自动写状态
for(cl_count=8192;cl_count>0;cl_count--) writeauto(0x00);
WriteCmd(0xb2); //关闭自动写状态
}
void Show816(uchar x_num,uchar y_num,uchar code_num)
{//8*16数字;x_hz:0~19; y_hz:0~29 Show816(19,28,);
uchar i_num;
uint address,addr_num;
address=x_num*30+y_num; //计算显示存储器地址
addr_num=code_num*16; //计算汉字字模地址(cctab的下标)
for(i_num=0;i_num<16;i_num++) //计数值32
{
WriteTcp2(address&0xff,address/256,0x24); //设置显示存储器地址
WriteTcp(num816[addr_num++],0xc0); //写入字模
address+=30; //修改显示存储器地址,显示下一列
}
}
void Show3264(unchar x_num,unchar y_num,unchar code_num)
{//32*64秒点;x_hz:0~19; y_hz:0~7
unchar i_num;
unint address,addr_num;
address=x_num*30+y_num; //计算显示存储器地址
addr_num=code_num*256; //计算汉字字模地址(cctab的下标)
for(i_num=0;i_num<64;i_num++) //计数值32
{
WriteTcp2(address&0xff,address/256,0x24); //设置显示存储器地址
WriteTcp(num3264[addr_num++],0xc0); //写入字模
WriteTcp(num3264[addr_num++],0xc0); //写入字模
WriteTcp(num3264[addr_num++],0xc0); //写入字模
WriteTcp(num3264[addr_num++],0xc0); //写入字
address+=30; //修改显示存储器地址,显示下一列
}
}
/*******************LCD显示字符****************/
void LcdPutStr(unchar x,unchar y,char *cha)
{
unint address,i=0;
unchar length,c1,c2,j,k;
for(length=0;cha[length]!=0;length++);
do
{
c1=cha;
c2=cha[i+1];
address=x*30+y;
if(c1<=128)
{
for(k=0;k<16;k++)
{
WriteTcp2(address&0xff,address/256,0x24); //写入地址
WriteCmd(0xb0); //启动自动写
WriteDate(ASCII[(c1-0x20)*16+k]);
WriteCmd(0xb2);
address=address+30;
}
if(y>28)
{x=x+16;y=0;}
else
{y++;}
i++;
}
else
{
for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)
{
if(c1==GB_16[j].InitCode[0]&&c2==GB_16[j].InitCode[1]) //查找汉字
break;
}
if(j<sizeof(GB_16)/sizeof(GB_16[0]))
{
for(k=0;k<16;k++)
{
WriteTcp2(address&0xff,address/256,0x24);
WriteCmd(0xb0); //启动自动写
WriteDate(GB_16[j].CharCode[k*2]);
WriteDate(GB_16[j].CharCode[k*2+1]);
WriteCmd(0xb2);
address=address+30;
}
}
else
{
for(k=0;k<16;k++)
{
WriteTcp2(address&0xff,address/256,0x24); //写入地址
WriteCmd(0xb0); //地址设置
WriteDate(0xff);
WriteDate(0xff);
WriteCmd(0xb2);
address=address+30;
}
}
if(y>27)
{x+=16;y=0;}
else
{y+=2;}
i+=2;
}
}
while(i<length);
}
#endif
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|