关于51单片机12864程序的问题
程序里用的12864液晶有CS1和CS2引脚,但是我的12864只有一个PSB引脚,如果把程序改成只用PSF引脚,请问怎么改?/*选择屏幕screen:0-全屏,1-左屏...
程序里用的12864液晶有CS1和CS2引脚,但是我的12864只有一个PSB引脚,如果把程序改成只用PSF引脚,请问怎么改?
/*选择屏幕screen: 0-全屏,1-左屏,2-右屏*/
void SelectScreen(unsigned char screen)
{
switch(screen)
{ case 0: cs1=0;//全屏
_nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_();
break;
case 1: cs1=0;//左屏
_nop_(); _nop_(); _nop_();
cs2=1;
_nop_(); _nop_(); _nop_();
break;
case 2: cs1=1;//右屏
_nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_();
break;
}
}
/*清屏screen: 0-全屏,1-左屏,2-右*/
void ClearScreen(unsigned char screen)
{
unsigned char i,j;
SelectScreen(screen);
for(i=0;i<8;i++) //控制页数0-7,共8页
{
SetLine(i);
SetColumn(0);
for(j=0;j<64;j++) //控制列数0-63,共64列
{
WriteByte(0x00); //写点内容,列地址自动加1
}
}
}
/*延时程序*/
void delay(unsigned int z)
{
unsigned int i,j;
for(i=0; i<z; i++)
for(j = 0; j < 110; j++);
}
/*向上滚屏*//*这里用做滚动显示*/
/*void lcd_rol()
{
uint i;
for(i = 0; i < 64; i++)
{
cs1=0; // 片选1
SendCommandToLCD(0xc0+i);
cs1=1;
cs2=0;// 片选2
SendCommandToLCD(0xc0+62-i);
cs2=0; // 片选2
delay(6);
}
}*/
/*初始化LCD*/
void InitLCD()
{
CheckState();
SelectScreen(0);
SetOnOff(0); //关显示
SelectScreen(0);
SetOnOff(1); //开显示
SelectScreen(0);
ClearScreen(0);//清屏
SetStartLine(0); //开始行:0
}
/*显示全角汉字*/
void Display(unsigned char ss,unsigned char page,unsigned char column,unsigned char number)
{
int i; //选屏参数,pagr选页参数,column选列参数,number选第几汉字输出
SelectScreen(ss);
column=column&0x3f;
SetLine(page); //写上半页
SetColumn(column); //控制列
for(i=0;i<16;i++) //控制16列的数据输出
{
WriteByte(logo[i+32*number]); //i+32*number汉字的前16个数据输出
}
SetLine(page+1); //写下半页
SetColumn(column); //控制列
for(i=0;i<16;i++) //控制16列的数据输出
{
WriteByte(logo[i+32*number+16]); //i+32*number+16汉字的后16个数据输出
}
}
/*显示半角汉字和数字和字母*/
/*-将传来的对应数字(1个字)点阵式在 某行(h)并以某列(l)为开始列 的位置 (16行*8列)-*/
/*显示半角汉字和数字和字母*/
void Displayen(unsigned char ss,unsigned char page,unsigned char column,unsigned char number)
{
unsigned int i;//选屏参数,pagr选页参数,column选列参数,number选第几汉字输出
SelectScreen(ss);
column=column&0x3f;
SetLine(page); //写上半页
SetColumn(column);
for(i=0;i<8;i++)
{
WriteByte(Ezk[i+16*number]);
}
SetLine(page+1); //写下半页
SetColumn(column);
for(i=0;i<8;i++)
{
WriteByte(Ezk[i+16*number+8]);
}
}
#endif 展开
/*选择屏幕screen: 0-全屏,1-左屏,2-右屏*/
void SelectScreen(unsigned char screen)
{
switch(screen)
{ case 0: cs1=0;//全屏
_nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_();
break;
case 1: cs1=0;//左屏
_nop_(); _nop_(); _nop_();
cs2=1;
_nop_(); _nop_(); _nop_();
break;
case 2: cs1=1;//右屏
_nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_();
break;
}
}
/*清屏screen: 0-全屏,1-左屏,2-右*/
void ClearScreen(unsigned char screen)
{
unsigned char i,j;
SelectScreen(screen);
for(i=0;i<8;i++) //控制页数0-7,共8页
{
SetLine(i);
SetColumn(0);
for(j=0;j<64;j++) //控制列数0-63,共64列
{
WriteByte(0x00); //写点内容,列地址自动加1
}
}
}
/*延时程序*/
void delay(unsigned int z)
{
unsigned int i,j;
for(i=0; i<z; i++)
for(j = 0; j < 110; j++);
}
/*向上滚屏*//*这里用做滚动显示*/
/*void lcd_rol()
{
uint i;
for(i = 0; i < 64; i++)
{
cs1=0; // 片选1
SendCommandToLCD(0xc0+i);
cs1=1;
cs2=0;// 片选2
SendCommandToLCD(0xc0+62-i);
cs2=0; // 片选2
delay(6);
}
}*/
/*初始化LCD*/
void InitLCD()
{
CheckState();
SelectScreen(0);
SetOnOff(0); //关显示
SelectScreen(0);
SetOnOff(1); //开显示
SelectScreen(0);
ClearScreen(0);//清屏
SetStartLine(0); //开始行:0
}
/*显示全角汉字*/
void Display(unsigned char ss,unsigned char page,unsigned char column,unsigned char number)
{
int i; //选屏参数,pagr选页参数,column选列参数,number选第几汉字输出
SelectScreen(ss);
column=column&0x3f;
SetLine(page); //写上半页
SetColumn(column); //控制列
for(i=0;i<16;i++) //控制16列的数据输出
{
WriteByte(logo[i+32*number]); //i+32*number汉字的前16个数据输出
}
SetLine(page+1); //写下半页
SetColumn(column); //控制列
for(i=0;i<16;i++) //控制16列的数据输出
{
WriteByte(logo[i+32*number+16]); //i+32*number+16汉字的后16个数据输出
}
}
/*显示半角汉字和数字和字母*/
/*-将传来的对应数字(1个字)点阵式在 某行(h)并以某列(l)为开始列 的位置 (16行*8列)-*/
/*显示半角汉字和数字和字母*/
void Displayen(unsigned char ss,unsigned char page,unsigned char column,unsigned char number)
{
unsigned int i;//选屏参数,pagr选页参数,column选列参数,number选第几汉字输出
SelectScreen(ss);
column=column&0x3f;
SetLine(page); //写上半页
SetColumn(column);
for(i=0;i<8;i++)
{
WriteByte(Ezk[i+16*number]);
}
SetLine(page+1); //写下半页
SetColumn(column);
for(i=0;i<8;i++)
{
WriteByte(Ezk[i+16*number+8]);
}
}
#endif 展开
3个回答
展开全部
用这个吧。我以前用的
#include <reg52.h>
#include<intrins.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
//8bit数据接入IO口
#define Part P0 //P0接8位数据线
//控制数据端
sbit LCD_RS=P3^2; //定义12864液晶RS端,寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit LCD_RW=P1^1; //定义12864液晶RW端,读/写信号 H:读 L:写
sbit LCD_EN=P1^2; //定义12864液晶LCDEN端, 片选信号 下降沿触发,锁存数据
//sbit LCD_PSB=P3^2; //定义12864液晶PSB端, H:并行 L:串行
sbit LCD_RST=P3^6; //定义12864液晶RST端, H:不复位 L:复位
sbit AD_ST=P1^6;//定义AD
sbit AD_OE=P3^7;
sbit AD_A=P1^3;
sbit AD_B=P1^4;
sbit AD_C=P1^5;
sbit AD_EOC=P1^7;
sfr T2MOD=0XC9;
uchar code dis1[]={"转速"};
uchar code dis2[]={"加速度x方向"};
uchar code dis3[]={"加速度y方向"};
uchar code dis4[]={"加速度z方向"};
uchar code Text[]={"欢迎大家观看"};
uint i;
uchar code dat[];
int jishu;
int sudu1;
int sudu2;
int maichong1;
int maichong2;
//毫秒延时函数
void delayms(uint x) //nms的延时
{
uint i;
while(x--)
{
for(i=0;i<125;i++)
{;}
}
}
void delay(uint xms)
{
uint i,j;
for(j=0;i<xms;j++)
for(i=0;i<110;i++);
}
//LCD忙检测函数
bit lcd_busy()
{
bit result;
LCD_RS=0;
LCD_RW=1;
LCD_EN= 1;
result=(bit)(Part & 0x80);
LCD_EN=0;
return result;
}
//液晶写命令函数
void lcd_write_cmd(uchar com)
{
while(lcd_busy());
LCD_RS=0; //选择指令寄存器
LCD_RW=0; //写
LCD_EN=0;
Part=com; //指令值赋给P0口
delay(5);
LCD_EN=1;
delay(5);
LCD_EN=0;
}
//液晶写一个字符数据函数
void lcd_write_dat(uchar date)
{
while(lcd_busy());
LCD_RS=1; //选择数据寄存器
LCD_RW=0; //写
LCD_EN=0;
P0=date; //数据值赋给P0口
delay(5);
LCD_EN=1;
delay(5);
LCD_EN=0;
}
//液晶写一个字符串函数
void lcd_write_string(uchar *str)
{
while(*str!='\0') //未结束
{
lcd_write_dat(*str++);
delay(5);
}
}
//液晶显示位置函数
void lcd_pos(uchar x,uchar y) //从第X行的第Y位置开始显示
{
uchar pos;
if(x==1) //第一行
{x=0x80;}
else if(x==2) //第二行
{x=0x90;}
else if(x==3) //第三行
{x=0x88;}
else if(x==4) //第四行
{x=0x98;}
pos=x+y-1; //首地址为0X80
lcd_write_cmd(pos);
}
//液晶初始化函数
void lcd_init()
{
// LCD_PSB=1; //并行方式
LCD_RST=1; //不复位
lcd_write_cmd(0x30);
delay(5);
lcd_write_cmd(0x0c); //开显示,不显示光标
delay(5);
lcd_write_cmd(0x06); //写一个字符后地址指针自动加1
delay(5);
lcd_write_cmd(0x01); //清屏
delay(5);
}
#include <reg52.h>
#include<intrins.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
//8bit数据接入IO口
#define Part P0 //P0接8位数据线
//控制数据端
sbit LCD_RS=P3^2; //定义12864液晶RS端,寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit LCD_RW=P1^1; //定义12864液晶RW端,读/写信号 H:读 L:写
sbit LCD_EN=P1^2; //定义12864液晶LCDEN端, 片选信号 下降沿触发,锁存数据
//sbit LCD_PSB=P3^2; //定义12864液晶PSB端, H:并行 L:串行
sbit LCD_RST=P3^6; //定义12864液晶RST端, H:不复位 L:复位
sbit AD_ST=P1^6;//定义AD
sbit AD_OE=P3^7;
sbit AD_A=P1^3;
sbit AD_B=P1^4;
sbit AD_C=P1^5;
sbit AD_EOC=P1^7;
sfr T2MOD=0XC9;
uchar code dis1[]={"转速"};
uchar code dis2[]={"加速度x方向"};
uchar code dis3[]={"加速度y方向"};
uchar code dis4[]={"加速度z方向"};
uchar code Text[]={"欢迎大家观看"};
uint i;
uchar code dat[];
int jishu;
int sudu1;
int sudu2;
int maichong1;
int maichong2;
//毫秒延时函数
void delayms(uint x) //nms的延时
{
uint i;
while(x--)
{
for(i=0;i<125;i++)
{;}
}
}
void delay(uint xms)
{
uint i,j;
for(j=0;i<xms;j++)
for(i=0;i<110;i++);
}
//LCD忙检测函数
bit lcd_busy()
{
bit result;
LCD_RS=0;
LCD_RW=1;
LCD_EN= 1;
result=(bit)(Part & 0x80);
LCD_EN=0;
return result;
}
//液晶写命令函数
void lcd_write_cmd(uchar com)
{
while(lcd_busy());
LCD_RS=0; //选择指令寄存器
LCD_RW=0; //写
LCD_EN=0;
Part=com; //指令值赋给P0口
delay(5);
LCD_EN=1;
delay(5);
LCD_EN=0;
}
//液晶写一个字符数据函数
void lcd_write_dat(uchar date)
{
while(lcd_busy());
LCD_RS=1; //选择数据寄存器
LCD_RW=0; //写
LCD_EN=0;
P0=date; //数据值赋给P0口
delay(5);
LCD_EN=1;
delay(5);
LCD_EN=0;
}
//液晶写一个字符串函数
void lcd_write_string(uchar *str)
{
while(*str!='\0') //未结束
{
lcd_write_dat(*str++);
delay(5);
}
}
//液晶显示位置函数
void lcd_pos(uchar x,uchar y) //从第X行的第Y位置开始显示
{
uchar pos;
if(x==1) //第一行
{x=0x80;}
else if(x==2) //第二行
{x=0x90;}
else if(x==3) //第三行
{x=0x88;}
else if(x==4) //第四行
{x=0x98;}
pos=x+y-1; //首地址为0X80
lcd_write_cmd(pos);
}
//液晶初始化函数
void lcd_init()
{
// LCD_PSB=1; //并行方式
LCD_RST=1; //不复位
lcd_write_cmd(0x30);
delay(5);
lcd_write_cmd(0x0c); //开显示,不显示光标
delay(5);
lcd_write_cmd(0x06); //写一个字符后地址指针自动加1
delay(5);
lcd_write_cmd(0x01); //清屏
delay(5);
}
展开全部
完全不一样的屏,两个程序差别很大的,前者不带字库,后者一般好像是带字库的,所以没法改,只能重写,而且,带字库的12864程序编制更容易,网上有很多,你搜搜带字库液晶
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
那个不是配套的,控制芯片的型号不一样,你直接搜索就行,有的是,有的功能特别全
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询