本帖最后由 米花卷 于 2021-5-17 12:21 编辑
请问这样情况应该怎么解决
#include <reg52.h>
#include<intrins.h>
#include<string.h>
#include "hanzi.h" //汉字库头文件
#include "shuzi.h" //字符库头文件
#define uchar unsigned char
#define uint unsigned int
// lcd12864(ks0108)
#define LCD_DATA P0 //LCD8位并行数据口
sbit LCD_RS=P1^2; //寄存器选择
sbit LCD_RW=P1^1; //读/写选择
sbit LCD_EN=P1^0; //读写使能
sbit LCD_CS1=P1^3; //右半屏选择,1有效
sbit LCD_CS2=P1^4; //左半屏选择,1有效
sbit LCD_RST=P1^5; //复位信号
//*********************************************//
// 函数声明
void init_lcd(void);
void lcd_delay(uint time); //延时
void lcd_write_com(uchar cmdcode); //写命令
void lcd_write_data(uchar Rsspdata); //写数据
void lcd_Clr_Scr(void); //清屏
void lcd_werite_x_y(uchar x,uchar y); //写地址
void lcd_write_chinese(uchar x,uchar y, uchar hz,uchar *dat); //任意位置显示任意汉字
void lcd_write_english(uchar x,uchar y, uchar en,uchar *dat); //任意位置显示任意字符
void lcd_write_english2(uchar x,uchar y, uchar en,uchar *dat);
//****************************************************************************//
//---------------------------------------
// 主函数
//---------------------------------------
void main(void)
{
init_lcd(); //初始化
lcd_Clr_Scr(); //清屏
while(1)
{
lcd_write_chinese(0,40,9,HANZI);
lcd_write_chinese(0,56,10,HANZI);
lcd_write_chinese(0,72,11,HANZI);
//lcd_write_english(2,0,0,SHUZI);
//lcd_write_english(2,8,1,SHUZI);
//lcd_write_english(2,16,2,SHUZI);
lcd_write_english2(2,28,5,SHUZI24);
lcd_write_english2(2,52,5,SHUZI24);
lcd_write_english2(2,76,5,SHUZI24);
while(1);
}
}
//---------------------------------------
// 延时函数
//---------------------------------------
void lcd_delay(uint time)
{
uint i;
for(i=0;i<time;i++);
}
//---------------------------------------
// 12864初始化函数
//---------------------------------------
void init_lcd(void)
{
LCD_RST=0; //液晶复位
lcd_delay(250); //适当延时
LCD_RST=1; //复位结束
LCD_CS1=1; //左半屏选通
LCD_CS2=1; //右半屏选通
lcd_delay(250); //适当延时
lcd_write_com(0x3f); //显示开
}
//---------------------------------------
// 写命令函数
//---------------------------------------
void lcd_write_com(uchar cmdcode)
{
LCD_RS=0; //选择命令寄存器
LCD_RW=0; //写选通
LCD_DATA=cmdcode; //将命令写入总线
_nop_(); //空操作,做短暂的延时
LCD_EN=1; //E的下降沿,数据写入
_nop_(); //空操作,做短暂的延时
LCD_EN=0; //E的下降沿,数据写入
}
//---------------------------------------
// 写数据函数
//---------------------------------------
void lcd_write_data(uchar Rsspdata)
{
LCD_RS=1; //选择数据寄存器
LCD_RW=0; //写选通
LCD_DATA=Rsspdata; //将数据写入总线
_nop_(); //空操作,做短暂的延时
LCD_EN=1; //E的下降沿,数据写入
_nop_(); //空操作,做短暂的延时
LCD_EN=0; //E的下降沿,数据写入
}
//---------------------------------------
// 清屏函数
//---------------------------------------
void lcd_Clr_Scr(void)
{
uchar j,k;
LCD_CS1=1; //左半屏选通
LCD_CS2=1; //右半屏选通
lcd_write_com(0x40+0); //将列地址写入
for(k=0;k<8;k++)
{
lcd_write_com(0xb8+k); //将行地址写入
for(j=0;j<64;j++) //每行的64列都写0,因为选了左右两屏,
{
lcd_write_data(0x00); //64列同时写0
}
}
}
//---------------------------------------
// 地址写入函数
//---------------------------------------
void lcd_werite_x_y(uchar x,uchar y)
{
y=y&0x7f; //限定范围,列不能超过128
x=x&0x07; //限定范围,行不能超过8
if(y<64) //如果列小于64
{
LCD_CS1=1; //选通左半屏
LCD_CS2=0; //关闭右半屏
lcd_write_com(0x40+y); //将列地址写入
}
else
{
LCD_CS1=0; //关闭左半屏
LCD_CS2=1; //选通右半屏
y&=0x3f;
lcd_write_com(0x40+y); //将列地址写入
}
lcd_write_com(0xb8+x); //将行地址写入
}
//---------------------------------------
// 指定位置写16*16汉字函数
//---------------------------------------
void lcd_write_chinese(uchar x,uchar y, uchar hz,uchar *dat)
{
uchar i=0;
lcd_werite_x_y(x,y); //设定起始地址
for(i=0;i<16;i++)
lcd_write_data(dat[hz*32+i]); //先写上半个字,共16个字节
lcd_werite_x_y(x+1,y); //设定起始地址,此次将行地址加1,以便写下行
for(i=0;i<16;i++)
lcd_write_data(dat[hz*32+16+i]); //再写下半个字,共16个字节
}
//---------------------------------------
// 指定位置写8*16字符函数
//---------------------------------------
void lcd_write_english(uchar x,uchar y, uchar en,uchar *dat)
{
uchar i=0;
lcd_werite_x_y(x,y); //设定起始地址
for(i=0;i<8;i++)
lcd_write_data(dat[en*16+i]); //先写上半个字,共8个字节
lcd_werite_x_y(x+1,y); //设定起始地址,此次将行地址加1,以便写下行
for(i=0;i<8;i++)
lcd_write_data(dat[en*16+8+i]); //再写下半个字,共8个字节
}
// 指定位置写24*48字符函数
//---------------------------------------
void lcd_write_english2(uchar x,uchar y, uchar en,uchar *dat)
{
uchar i=0;
lcd_werite_x_y(x,y); //设定起始地址
for(i=0;i<24;i++)
lcd_write_data(dat[en*144+i]); //先写上半个字,共8个字节
lcd_werite_x_y(x+1,y); //设定起始地址,此次将行地址加1,以便写下行
for(i=0;i<24;i++)
lcd_write_data(dat[en*144+24+i]); //再写下半个字,共8个字节
lcd_werite_x_y(x+2,y); //设定起始地址,此次将行地址加1,以便写下行
for(i=0;i<24;i++)
lcd_write_data(dat[en*144+48+i]); //再写下半个字,共8个字节
lcd_werite_x_y(x+3,y); //设定起始地址,此次将行地址加1,以便写下行
for(i=0;i<24;i++)
lcd_write_data(dat[en*144+72+i]); //再写下半个字,共8个字节
lcd_werite_x_y(x+4,y); //设定起始地址,此次将行地址加1,以便写下行
for(i=0;i<24;i++)
lcd_write_data(dat[en*144+96+i]); //再写下半个字,共8个字节
lcd_werite_x_y(x+5,y); //设定起始地址,此次将行地址加1,以便写下行
for(i=0;i<24;i++)
lcd_write_data(dat[en*144+120+i]); //再写下半个字,共8个字节
}
问题出在左右半屏的交接出,感觉右半屏没及时开,但程序里找不到改动的地方,我把代码补上,麻烦各位看看怎么改
|