初次玩12864部分显示乱码,高手分析一下问题出在哪里?
本帖最后由 4758866 于 2016-9-19 09:52 编辑//液晶屏型号:JLX12864G-086-PC-3S
//接口:串行
//中文字库:带中文字库 IC:JLX-GB2312,竖置横排
//驱动 IC:UC1701X(与 ST7565R 兼容)
//主板:89C516-001 老主板
//单片机:51 系列
//版权所有:深圳市晶联讯电子有限公司:网址http://www.jlxlcd.cn;
//编程:叶建人,2013 年 10 月 11 日
#include <REGX52.H>
#include <intrins.h>
sbit lcd_sclk=P0^0; //接口定义:lcd_sclk 就是 LCD 的 SCLK
sbit lcd_sid=P0^1; //接口定义:lcd_sid 就是 LCD 的 SDA
sbit lcd_rs=P0^2; //接口定义:lcd_rs 就是 LCD 的 RS,也叫“CD”
sbit lcd_reset=P0^3;//接口定义:lcd_reset 就是 LCD 的 RESET
sbit lcd_cs1=P0^4; //接口定义:lcd_cs1 就是 LCD 的 CS1
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
code unsigned char Zf816_0[]={
0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x00,0x00,0x00,};//0
code unsigned char Zf816_1[]={
0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,};//1
code unsigned char Zf816_2[]={
0x00,0x00,0x00,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x00,0x00,0x00,};//2
code unsigned char Zf816_3[]={
0x00,0x00,0x00,0x00,0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0x00,0x00,};//3
code unsigned char Zf816_4[]={
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,0x00,0x00,0x00,0x00,};//4
code unsigned char Zf816_5[]={
0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0x00,0x00,};//5
code unsigned char Zf816_6[]={
0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0x00,0x00,};//6
code unsigned char Zf816_7[]={
0x00,0x00,0x00,0x00,0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};//7
code unsigned char Zf816_8[]={
0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0x00,0x00,0x00,};//8
code unsigned char Zf816_9[]={
0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,0x00,0x00,0x00,0x00,};//9
code unsigned char Zf816_dian[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,};//://10
code unsigned char Zf816_xian[]={
0x04,0x84,0x84,0xFC,0x84,0x84,0x00,0xFE,0x02,0x02,0xF2,0x02,0x02,0xFE,0x00,0x00,
0x20,0x60,0x20,0x1F,0x10,0x90,0x40,0x23,0x18,0x06,0x01,0x7E,0x80,0x83,0xE0,0x00,};//现//11
code unsigned char Zf816_zai[]={
0x08,0x08,0x88,0xC8,0x38,0x0C,0x0B,0x08,0x08,0xE8,0x08,0x08,0x08,0x08,0x08,0x00,
0x02,0x01,0x00,0xFF,0x40,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x00,};//在//12
code unsigned char Zf816_shi[]={
0x00,0xFC,0x84,0x84,0x84,0xFC,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x00,
0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x01,0x06,0x40,0x80,0x7F,0x00,0x00,0x00,};//时//13
code unsigned char Zf816_jian[]={
0x00,0xF8,0x01,0x06,0x00,0xF0,0x12,0x12,0x12,0xF2,0x02,0x02,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x00,0x00,0x00,0x1F,0x11,0x11,0x11,0x1F,0x00,0x40,0x80,0x7F,0x00,0x00,};//间//14
void delay(int n_ms) //延时
{
int j,k;
for(j=0;j<n_ms;j++)
for(k=0;k<110;k++);
}
/*void delay_us(int n_us) //短延时
{
int j,k;
for(j=0;j<n_us;j++)
for(k=0;k<1;k++);
} */
void transfer_command_lcd(int data1) //写指令到 LCD 模块
{
char i;
lcd_cs1=0;
lcd_rs=0;
for(i=0;i<8;i++)
{
lcd_sclk=0;
if(data1&0x80)
lcd_sid=1;
elselcd_sid=0;
lcd_sclk=1;
data1=data1<<=1;
}
lcd_cs1=1;
}
void transfer_data_lcd(int data1) //写数据到 LCD 模块
{
char i;
lcd_cs1=0;
lcd_rs=1;
for(i=0;i<8;i++)
{
lcd_sclk=0;
if(data1&0x80)
lcd_sid=1;
else lcd_sid=0;
lcd_sclk=1;
data1=data1<<=1;
}
lcd_cs1=1;
}
void initial_lcd( ) //LCD 模块初始化
{
lcd_reset=0; //低电平复位
delay(100);
lcd_reset=1; //复位完毕
delay(100);
transfer_command_lcd(0xe2);//软复位
delay(5);
transfer_command_lcd(0x2c);//升压步聚 1
delay(50);
transfer_command_lcd(0x2e);//升压步聚 2
delay(50);
transfer_command_lcd(0x2f);//升压步聚 3
delay(5);
transfer_command_lcd(0x23);//粗调对比度,可设置范围 0x20~0x27
transfer_command_lcd(0x81);//微调对比度
transfer_command_lcd(0x28);//微调对比度的值,可设置范围 0x00~0x3f
transfer_command_lcd(0xa2);//1/9 偏压比(bias)
transfer_command_lcd(0xc8);//行扫描顺序:从上到下
transfer_command_lcd(0xa0);//列扫描顺序:从左到右
transfer_command_lcd(0x40);//起始行:第一行开始
transfer_command_lcd(0xaf);//开显示
}
void lcd_address(uint page,uint column) //设置页地址
{
column=column-0x01;
transfer_command_lcd(0xb0+page-1); //设置页地址,每 8 行为一页,全屏共 64 行,被分成8页
transfer_command_lcd(0x10+(column>>4&0x0f)); //设置列地址的高 4 位
transfer_command_lcd(column&0x0f); //设置列地址的低 4 位
}
void clear_screen( ) //全屏清屏
{
unsigned char i,j;
for(i=0;i<9;i++)
{
transfer_command_lcd(0xb0+i);
transfer_command_lcd(0x10);
transfer_command_lcd(0x00);
for(j=0;j<132;j++)
{
transfer_data_lcd(0x00);
}
}
}
/*void display_128x64(uchar *dp) //显示 128x64 点阵图像
{
uint i,j;
for(j=0;j<8;j++)
{
lcd_address(j+1,1);
for (i=0;i<128;i++)
{
transfer_data_lcd(*dp); //写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1
dp++;
}
}
} */
void display_graphic_16x16(uchar page,uchar column,uchar *dp) //显示 16x16 点阵图像、汉字、生僻字或 16x16 点阵的其他图标
{
uint i,j;
for(j=0;j<2;j++)
{
lcd_address(page+j,column);
for (i=0;i<16;i++)
{
transfer_data_lcd(*dp); //写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1
dp++;
}
}
}
/*void display_graphic_8x16(uchar page,uchar column,uchar *dp) //显示 8x16 点阵图像、ASCII, 或 8x16 点阵的自造字符、其他图标
{
uint i,j;
for(j=0;j<2;j++)
{
lcd_address(page+j,column);
for (i=0;i<8;i++)
{
transfer_data_lcd(*dp); //写数据到 LCD,每写完一个 8 位的数据后列地址自动加 1
dp++;
}
}
} */
/*void display_graphic_5x8(uchar page,uchar column,uchar *dp) //显示 5X8 点阵图像、ASCII, 或 5x8 点阵的自造字符、其他图标
{
uint i;
lcd_address(page,column);
for (i=0;i<6;i++)
{
transfer_data_lcd(*dp);
dp++;
}
} */
unsigned char *number_to_matrix(unsigned charucBitNumber) //字模返回
{
unsigned char *p_ucAnyNumber;//此指针根据ucBitNumber数值的大小,分别调用不同的字库。
switch(ucBitNumber)//根据ucBitNumber数值的大小,分别调用不同的字库。
{
case 0:
p_ucAnyNumber=Zf816_0;
break;
case 1:
p_ucAnyNumber=Zf816_1;
break;
case 2:
p_ucAnyNumber=Zf816_2;
break;
case 3:
p_ucAnyNumber=Zf816_3;
break;
case 4:
p_ucAnyNumber=Zf816_4;
break;
case 5:
p_ucAnyNumber=Zf816_5;
break;
case 6:
p_ucAnyNumber=Zf816_6;
break;
case 7:
p_ucAnyNumber=Zf816_7;
break;
case 8:
p_ucAnyNumber=Zf816_8;
break;
case 9:
p_ucAnyNumber=Zf816_9;
break;
case 10:
p_ucAnyNumber=Zf816_dian;
break;
case 11:
p_ucAnyNumber=Zf816_xian;
break;
case 12:
p_ucAnyNumber=Zf816_zai;
break;
case 13:
p_ucAnyNumber=Zf816_shi;
break;
case 14:
p_ucAnyNumber=Zf816_jian;
break;
}
return p_ucAnyNumber;//返回转换结束后的指针
}
建议贴程序。还有液晶资料。是集成了字库的液晶屏么? 路过羊圈的狼 发表于 2016-9-19 09:17
建议贴程序。还有液晶资料。是集成了字库的液晶屏么?
无字库的,程序稍等更新楼主位 既然已经可以显示出来,但不稳定,
那么我想多半是 总线时序过快的问题,
在总线操作适当加些延时(对照手册的时序要求),降低总线的速度,
试试看吧。 送数太快了,慢一些。 定时,把
整个一下刷一下 也可能是屏坏了? runapp 发表于 2016-9-19 21:21
也可能是屏坏了?
所有的都刷新就没有问题了 可能是iic时序被干扰了,写数据前先关闭中断,写完再恢复看看 我现在是全屏刷新 可以像中语言一样先用PROTEUS仿真一下,成了再写入单片机 你时钟别那么高 a136498491 发表于 2016-9-23 21:41
你时钟别那么高
即然都显示出来了,做计也没啥大题了,
不稳定就按楼上说的试试吧,一个是调整通信速度,要满足手册中的要求,最好按推荐值去做;
如果怀疑屏有问题,就换个个屏再试试看。 这个是SPI串口的吧 这种屏我也玩过也遇到过 偶尔会显示错位错误的时候
页:
[1]