求51单片机LCD12864串行显示程序,只用SID口和SCLK口,能显示输出四行中文的,最好写上main函数,谢谢

求51单片机LCD12864串行显示程序,只用SID口和SCLK口,能显示输出四行中文的,最好写上main函数,谢谢,第1张

//LCD12864字库系列(控制器ST7920A),单片机:89S52,晶振:12M,
//串口连接 与 并口连接 ( 串口时 屏蔽 并行模块)
//并行连接方式,P20-RS,P21-RW,P22-E
#include<reg52h>
#include <intrinsh>
sbit RS=P3^2; //串口时为CS
sbit RW=P3^1; //串口为SID
sbit E=P3^0; //串口为时钟SCLK
sbit stop=P2^2;
sbit PSB=P3^4;
sbit REST=P3^3;
//以下是用<at89x51h>头文件的定义
/
#define RS P2_0
#define RW P2_1 //定义引脚
#define E P2_2
#define PSB P2_3
#define REST P2_4
#define Data P1
#include<at89x51h>
/
#define BF 0x80 //用于检测LCM状态字中的Busy标识
typedef unsigned int Uint;
typedef unsigned char Uchar;
//字符串例子
//"F1--English",也可以往里面写入汉字码,一个汉字由两个码组成
const Uchar F1English[]={0x46,0x31,0x2d,0x2d,0x45,0x6e,0x67,0x6c,0x69,0x73,0x68,0x00};
const Uchar lengthF1=6; //字符串长度
//汉字,直接可以写入字形
unsigned char code uctech[] = {"有限公司"};
const Uchar lengthCF3=8;
Uchar code TAB1[]={
/-- 调入了一幅图像:D:\公司的文件\程序\未命名11bmp --/
/-- 宽度x高度=128x64 --/
0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x05,0xAE,0x90,0x00,0x00,0x00,0x00,0x00,
0x95,0x55,0x48,0x80,0x00,0x00,0x00,0x00,
0x2B,0x55,0x00,0x00,0x00,0x00,0x00,0x00,
0xA8,0x00,0x22,0x15,0x20,0x00,0x00,0x00,
0x97,0xFB,0x00,0x00,0x00,0x00,0x00,0x00,
0x45,0x55,0x08,0xA0,0x00,0x00,0x00,0x0A,
0x6F,0xF4,0x00,0x00,0x00,0x00,0x00,0x00,
0xB2,0x80,0x40,0x00,0x04,0x40,0x00,0x00,
0xBA,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,
0x4D,0x55,0x15,0x15,0x20,0x00,0x00,0x95,
0xD5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xE8,0x40,0x40,0x00,0x00,0x00,0x4A,
0xAA,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0x2A,0x00,0x40,0x00,0x00,0x15,
0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFD,0xD0,0xAA,0x01,0x00,0x00,0x25,
0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xB6,0x00,0x10,0x00,0x01,0x4A,
0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFD,0xE8,0x40,0x00,0x00,0x11,
0x00,0x24,0x84,0x00,0x00,0x00,0x00,0x00,
0xAB,0xFF,0xFF,0x55,0x00,0x00,0x00,0x24,
0x02,0x49,0x5E,0xA0,0x00,0x00,0x00,0x00,
0x84,0xBF,0xFF,0xF4,0x88,0x00,0x00,0x00,
0x10,0x05,0xFF,0xF4,0x00,0x00,0x00,0x00,
0x29,0x0B,0xFF,0xFA,0x20,0x00,0x00,0x00,
0x02,0xBF,0xFF,0xFC,0x00,0x00,0x00,0x00,
0x44,0xA0,0x57,0xFD,0x80,0x00,0x00,0x00,
0x08,0x5F,0xFF,0xFF,0x80,0x00,0x00,0x00,
0x91,0x0A,0xAA,0xF6,0x50,0x00,0x00,0x00,
0x41,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,
0x44,0xA0,0x01,0x1B,0x84,0x00,0x00,0x00,
0x26,0xFF,0xFF,0xFF,0x90,0x00,0x00,0x00,
0x11,0x0A,0xAA,0x6D,0x68,0x00,0x00,0x00,
0x0B,0xFB,0xFF,0xEF,0xE0,0x00,0x00,0x00,
0xC4,0xA0,0x01,0x02,0x80,0x00,0x00,0x00,
0x43,0xF1,0xFE,0x63,0xF0,0x00,0x00,0x00,
0x15,0x55,0x54,0x55,0x6A,0x00,0x00,0x00,
0x9F,0xE3,0xFC,0x87,0x38,0x00,0x00,0x00,
0xCA,0xAB,0x91,0x00,0x90,0x00,0x00,0x00,
0x07,0xC1,0xFA,0x2A,0x80,0x00,0x00,0x00,
0x25,0xFF,0xFE,0x95,0x2A,0x00,0x00,0x00,
0x2F,0x13,0xFE,0xFC,0x10,0x00,0x00,0x00,
0x95,0xFF,0xFF,0xC0,0x50,0x00,0x00,0x00,
0x0F,0x41,0xFF,0xF3,0x80,0x00,0x00,0x00,
0x4F,0xFF,0xFF,0xF9,0x2A,0x00,0x00,0x00,
0x9F,0x08,0xFF,0xD4,0x00,0x00,0x00,0x00,
0xB3,0xFF,0xFF,0xFE,0x54,0x80,0x00,0x00,
0x1E,0xA0,0x7F,0xA0,0x00,0x00,0x00,0x00,
0x5F,0xFE,0x7F,0xFE,0xAA,0x00,0x00,0x00,
0x5F,0x57,0xFE,0x00,0x00,0x00,0x00,0x00,
0xAF,0xFD,0x7F,0xFF,0x94,0x80,0x00,0x00,
0x1F,0xFE,0xE8,0x00,0x00,0x00,0x00,0x00,
0x7F,0xFA,0x7F,0x5F,0xCA,0x00,0x00,0x00,
0x3F,0x55,0x00,0x00,0x00,0x00,0x00,0x00,
0xAF,0xF1,0x7F,0xDE,0xF5,0x40,0x00,0x00,
0x1A,0xA0,0x80,0x00,0x00,0x00,0x00,0x00,
0xDF,0xF2,0x3F,0xFC,0xC2,0x00,0x00,0x00,
0x50,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
0x2F,0xFA,0xBF,0xFF,0xF4,0xA0,0x00,0x00,
0x05,0x42,0x00,0x00,0x00,0x00,0x00,0x00,
0x97,0xFE,0x3F,0xFF,0xE3,0x00,0x00,0x00,
0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x68,0xFF,0xDF,0xD5,0x78,0x40,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x07,0x5F,0xFF,0x48,0x02,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xD0,0xAA,0xF4,0xA0,0xAA,0x40,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0A,0x45,0x09,0x05,0x11,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xA1,0x28,0xA0,0x00,0x44,0x40,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x08,0x42,0x04,0x52,0x12,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xA5,0x09,0x51,0x00,0x48,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x50,0x04,0x4A,0x12,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xAA,0x05,0x50,0x21,0x48,0x20,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x90,0x02,0x84,0x12,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xD4,0x05,0x48,0x10,0x48,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x81,0x20,0x00,0x02,0x02,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xA4,0x84,0x92,0x48,0x94,0x40,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x48,0x10,0x00,0x00,0x21,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
//这个是在串口时指令和数据之间的延时
/
void delay10US(Uchar x)
{
Uchar k;
for(k=0;k<x;k++);
}
/
const Uchar delay=250; //延时时间常数
static void Wait1ms(void)//延迟1 ms
{
Uchar cnt=0;
while (cnt<delay) cnt++;
}
//延迟n ms
void WaitNms(int n)
{
Uchar i;
for(i=1;i<=n;i++)
Wait1ms();
}
void stopint(void)//中断程序
{
if(stop==0)
while(1);
}
////
//以下是并口时才开的
//读忙标志,
void RDBF(void)
{
Uchar temp;
RS=0; // RS=0
RW=1; // RW=1
while(1)
{
P1=0xFF; //数据线为输入
E=1;
temp=P1;
E=0; // E=0
if ((temp&0x80)==0) break;
}
}
//写数据到指令寄存器
void WRCommand(Uchar comm)
{
RDBF();
RW=0;
P1=comm;
E=1;
E=0;
}
//写数据到数据寄存器
void WRData(Uchar TEMP)
{
RDBF();
RS=1;
RW=0;
P1=TEMP;
E=1;
E=0;
stopint();
}
/////////////////////////////////////////////////////////////////////////////////
//以下是串口时开的读写时序
/void SendByteLCD(Uchar WLCDData)
{
Uchar i;
for(i=0;i<8;i++)
{
if((WLCDData<<i)&0x80)RW=1;
else RW=0;
E=0;
E=1 ;
}
}
SPIWR(Uchar Wdata,Uchar WRS)
{
SendByteLCD(0xf8+(WRS<<1));
SendByteLCD(Wdata&0xf0);
SendByteLCD((Wdata<<4)&0xf0);
}
void WRCommand(Uchar CMD)
{
RS=0;
RS=1;
SPIWR(CMD,0);
delay10US(90);//89S52来模拟串行通信,所以,加上89S52的延时,
}
void WRData(Uchar Data)
{
RS=0;
RS=1;
SPIWR(Data,1);
}
/
//
//初始化LCD-8位接口
void LCDInit(void)
{ // PSB=0; //串口
PSB=1;//并口时选这个,上一行取消
REST=1;
REST=0;
REST=1;
WRCommand(0x30); //基本指令集,8位并行
WRCommand(0x06); //启始点设定:光标右移
WRCommand(0x01); //清除显示DDRAM
WRCommand(0x0C); //显示状态开关:整体显示开,光标显示关,光标显示反白关
WRCommand(0x02); //地址归零
}
//显示数组字符串(显示半宽字型168点阵)
void ShowQQChar(Uchar addr,Uchar english,Uchar count)
{
Uchar i;
WRCommand(addr); //设定DDRAM地址
for(i=0;i<count;)
{
WRData(english[i2]);
WRData(english[i2+1]);
i++;
}
}
//显示连续字串(半宽字符)
void ShowNUMChar(Uchar addr,Uchar i,Uchar count)
{
Uchar j;
for(j=0;j<count;)
{
WRCommand(addr); //设定DDRAM地址
WRData(i+j);
j++;
WRData(i+j);
addr++;
j++;
}
}
//自定义字符写入CGRAM
void WRCGRAM(Uchar data1,Uchar data2,Uchar addr)
{
Uchar i;
for(i=0;i<16;)
{
WRCommand(addr+i); //设定CGRAM地址
WRData(data1);
WRData(data1);
i++;
WRCommand(addr+i); //设定CGRAM地址
WRData(data2);
WRData(data2);
i++;
}
}
//显示自定义的字符,并把这个字符填满全屏1616
void ShowCGChar(Uchar addr,Uchar i)
{
Uchar j;
for(j=0;j<0x20;)
{
WRCommand(addr+j); //设定DDRAM地址
WRData(0x00);
WRData(i);
j++;
}
}
void CLEARGDRAM(void)
{
Uchar j;
Uchar i;
WRCommand(0x34);
WRCommand(0x36);
for(j=0;j<32;j++)
{
WRCommand(0x80+j);
WRCommand(0x80);//X坐标
for(i=0;i<32;i++)//
{
WRData(0x00);
}
}

}
//写入GDRAM 绘图,Y是Y绘图坐标,2个字节一行,CLONG是图形长度,以字节
//为单位;HIGHT是图形高度,TAB是图形数据表12864M的图形显示是相当于25632点阵
//由两屏12832上下两屏组成,同一行的下屏的头地址紧接上屏的未地址。
//绘图在串口输入时,会比在并口下的输入要慢一些
void WRGDRAM(Uchar Y1,Uchar clong,Uchar hight,Uchar TAB1)
{
Uint k;
Uchar j;
Uchar i;
WRCommand(0x34);
WRCommand(0x36);
for(j=0;j<hight;j++)//32
{ //先上半屏
WRCommand(Y1+j); //Y总坐标,即第几行
WRCommand(0x80);//X坐标,即横数第几个字节开始写起
for(i=0;i<clong;i++)//
{
WRData(TAB1[clongj+i]);
}
//后下半屏

for(k=0;k<clong;k++)//
{
WRData(TAB1[clong(j+hight)+k]);
}

}
}
void menu(void)
{
LCDInit();
ShowNUMChar(0x80,0x01,0x0f);//显示半宽特殊符号
ShowNUMChar(0x90,0x30,0x0f);//显示半宽0~数字标点
ShowNUMChar(0x88,0x41,0x0f);//显示半宽A~P大写
ShowNUMChar(0x98,0x61,0x0f);//显示半宽a~p小写
WaitNms(250); //等待时间
WaitNms(250); //等待时间
stopint();
WRCommand(0x01); //清除显示DDRAM
WRCGRAM(0xff,0x00,0x40);//写入横
WRCGRAM(0x00,0xff,0x50);//写入横2
WRCGRAM(0xaa,0xaa,0x60);//写入竖
WRCGRAM(0x55,0x55,0x70);//写入竖2
ShowCGChar(0x80,0x00);//显示横并填满
WaitNms(250); //等待时间
WaitNms(250); //等待时间
stopint();
WRCommand(0x01); //清除显示DDRAM
ShowCGChar(0x80,02);//显示横2并填满
WaitNms(250); //等待时间
WaitNms(250); //等待时间
stopint();
WRCommand(0x01); //清除显示DDRAM
ShowCGChar(0x80,04);//显示竖并填满
WaitNms(250); //等待时间
WaitNms(250); //等待时间
stopint();
WRCommand(0x01); //清除显示DDRAM
ShowCGChar(0x80,06);//显示竖2并填满
WaitNms(250); //等待时间
WaitNms(250); //等待时间
stopint();
WRCommand(0x01); //清除显示DDRAM
WRCGRAM(0x00,0x00,0x40);//清CGRAM1
WRCGRAM(0x00,0x00,0x50);//清CGRAM2
WRCGRAM(0xaa,0x55,0x40);//写入点
WRCGRAM(0x55,0xaa,0x50);//写入点2
ShowCGChar(0x80,00);//显示点并填满
WaitNms(250); //等待时间
WaitNms(250); //等待时间
stopint();
WRCommand(0x01); //清除显示DDRAM
ShowCGChar(0x80,02);//显示点2并填满
WaitNms(250); //等待时间
WaitNms(250); //等待时间
stopint();
WRCommand(0x01); //清除显示DDRAM
ShowQQChar(0x80,uctech,lengthCF3);//显示'有限公司',以下共四行
ShowQQChar(0x90,uctech,lengthCF3);
ShowQQChar(0x88,uctech,lengthCF3);
ShowQQChar(0x98,uctech,lengthCF3);
WaitNms(250); //等待时间
WaitNms(250); //等待时间
stopint();
WRCommand(0x01); //清除显示DDRAM
}
void menu2(void)
{ CLEARGDRAM();
WRGDRAM(0x80,16,32,TAB1);
WaitNms(250); //等待时间
WaitNms(250); //等待时间
stopint();
}
//主函数
void main(void)
{
menu();//初始化及半宽字符和点横竖汉字扫描
menu2();//绘图显示
for(;;)
{;}
}

(1)S3C2440 的地址线 ADDR1-19 与 Am29LV800D 的地址线 A0-18 依次武汉理工大学硕士学位论文
10
相连。由于 NOR Flash 选择的是 512K×16Bit 存储形式,即 NOR Flash 的最小
存储单位为 2 字节,而 S3C2440 最小寻址单位为 1 字节,因此需要将地址线的
第二位 ADDR1 与 A0 相连,而 ADDR0 不与 NOR Flash 芯片相连。
(2)16位数据线依次相连。其中端口DQ15/A-1有两种用途,如果NOR Flash
芯片选择的是 1024K×8Bit 存储方式,该端口将作为最低位的地址线,而本文选
择的是 512K×16Bit 存储方式,因此该端口用作数据线的最高位 DQ15。
(3)CE 是片选信号,由于 NOR Flash 连接到 BANK0,因此需要用到 BANK0
的片选信号 nGCS0。读使能 OE,写使能 WE 与 S3C2440 对应引脚相连。
(4)RY/BY 表示 NOR Flash 是就绪还是繁忙的状态信息,此处没有使用,
所以悬空。RESET 低电平有效,与电路的复位模块相连。
(5)BYTE 是 NOR Flash 芯片读写方式的选择,高电平对应 16bit 模式,低
电平对应 8bit 模式。本文使用的是 16bit 模式,因此直接接 VDD。
(6)OM0,OM1 是 S3C2440 启动方式的选择。当 OM0=1,OM1=0 芯片置
为 16bit 方式,并且将 NOR Flash 芯片映射到 BANK0 地址 0x0 处。S3C2440 只
有 16bit 和 32bir 两种使用 NOR Flash 启动的方式,因此前面的 Am29LV800D 只
能使用 16bit 读写方式,而不能使用 8bit 模式。
NOR Flash 的读写方式基本与内存一样,可以直接在其地址范围内进行读写。
因此将启动程序拷贝到 NOR Flash 里面,上电后便可以直接运行。但 NOR Flash
价格昂贵,而且 1M 容量也显不足,因此本系统还加上了一块 NAND Flash 芯片
作为补充。
242 NAND Flash 存储器电路设计
相对于 NOR Flash 的昂贵,NAND Flash 则要便宜很多,因此更适合作为较
大容量的存储介质使用。1989 年东芝公司发表了 NAND Flash 技术(后将该技
术无偿转让给韩国三星公司),NAND Flash 技术强调降低每比特的成本,更高
的性能,并且像磁盘一样可以通过接口轻松升级。NAND Flash 结构能提供极高
的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。其缺点在
于需要特殊的系统接口,并且 CPU 需要驱动程序才能从 NAND Flash 中读取数
据,使用时一般是将数据从 NAND Flash 中拷贝到 SDRAM 中,再供 CPU 顺序
执行,这也是大多数嵌入式系统不能从 NAND Flash 中启动的原因。
S3C2440 不仅支持从 NOR Flash 启动,而且支持从 NAND Flash 启动。这是武汉理工大学硕士学位论文
11
因为从 NAND Flash 启动的时候,Flash 中开始 4k 的数据会被 S3C2440 自动地复
制到芯片内部一个叫“Steppingstone”的 RAM 中,并把 0x0 设置为内部 RAM
的起始地址,然后 CPU 从内部 RAM 的 0x0 位置开始执行。这个过程不需要程
序干涉。而程序则可使用这 4k 代码来把更多数据从 NAND Flash 中拷贝到
SDRAM 中去,从而实现从 NAND Flash 启动。
选择是从 NOR Flash 启动,还是 NAND Flash 启动,需要对 OM0 和 OM1
引脚进行不同的设置,如果常常需要切换启动模式,可以将这两个引脚接到跳
线柱上,通过跳线夹对其进行设置。
本文选用的是三星公司出品的 K9F1208U0B NAND Flash 芯片,该芯片容量
为 64M×8bit。由于 S3C2440 已经内置了 NAND Flash 控制器,因此电路设计十
分简单,不需要再外加控制芯片。电路图如图 2-4 所示。
图 2-4 NAND Flash 电路图
电路图说明:
(1)由于 NAND Flash 芯片是以字节为单位存储的,因此的数据线 I/O0-7
直接与 S3C2440 的数据线 DATA0-7 相连,不需要像 NOR Flash 那样偏移一位进
行相连。I/O0-7 是充当地址,命令,数据复用的端口。
(2)ALE 地址锁存允许,CLE 命令锁存允许,CE 片选,WE 写使能,RE
读使能依次与 S3C2440 的 NAND Flash 控制器的引脚 ALE,CLE,nFCE,nFWE,
nFRE 相连。
(3)WP 写保护,这里没有用到,直接接到高电平使其无效。VCC 与电源
相连,VSS 与地相连。武汉理工大学硕士学位论文
12
(4)当 OM0,OM1 均接地为 0 时,S3C2440 将会从 NAND Flash 中启动,
内部 RAM“Steppingstone”将会被映射到 0x0 位置,取代本来在这个位置的 NOR
Flash。上电时 NAND Flash 中的前 4K 数据会被自动拷贝到“Steppingstone”中,
从而实现从 NAND Flash 启动。
(5)NCON、GPG15 接地;GPG13、14 接电源。这四个引脚用来对 NAND
Flash 进行设置。以上设置表示使用的 Flash 是普通 NAND Flash,一页的大小为
512 字 节 , 需 要 进 行 4 个 周 期 的 地 址 传 输 完 成 一 次 寻 址 *** 作 ( 这 是 因 为
K9F1208U0B 片内采用 26 位寻址方式,从第 0 位开始分四次通过 I/O0-I/O7 进
行传送),数据位宽为 8bit。不同的芯片有不同的设置方式,以上是 K9F1208U0B
的设置方式,其它芯片的设置方法需要参考 S3C2440 和具体使用的 NAND Flash
芯片的数据手册。
NAND Flash 不对应任何 BANK,因此不能对 NAND Flash 进行总线 *** 作,
也就无法像 NOR Flash 和 SDRAM 一样通过地址直接进行访问。对 NAND Flash
存储芯片进行 *** 作,必须通过 NAND Flash 控制器的专用寄存器才能完成。
NAND Flash 的写 *** 作必须以块方式进行,读 *** 作可以按字节读取。
对 K9F1208U0B 的 *** 作是通过向命令寄存器(对于 S3C2440 来说此寄存器
为 NFCMMD,内存映射地址为 0x4e000004)发送命令队列实现的,命令队列一
般是连续几条命令或是一条命令加几个参数,具体的命令可以参考 K9F1208U0B
的数据手册。地址寄存器把一个完整的 NAND Flash 地址分解成 Column Address
与 Page Address 进行寻址。Column Address 是列地址,用来指定 Page 上的具体
某个字节。Page Address 是页地址,用来确定读写 *** 作是在 Flash 上的哪个页进
行的,由于页地址总是以 512 字节对齐的,所以它的低 9 位总是 0。
一个 26 位地址中的 A0~A7 是它的列地址,A9~A25 是它的页地址。当发送
完命令后(例如读命令 00h 或 01h),地址将分 4 个周期发送。第一个周期是发
送列地址。之后 3 个周期则是指定页地址。当发送完地址后,就可以通过数据
寄存器对 NAND Flash 进行数据的读写。以上只是 S3C2440 的 NAND Flash 控制
器的大致 *** 作流程,具体 *** 作方式需要参考数据手册。
243 SDRAM 存储器电路设计
从 Flash 中读取数据的速度相对较慢,而 S3C2440 运行的速度却很快,其执
行指令的速度远高于从 Flash 中读取指令的速度。如果仅按照数据从 Flash 读取,武汉理工大学硕士学位论文
13
然后再到芯片处理的方式设计系统,那么即使芯片的运算能力再强,在没有指
令执行的情况下,它也只能等待。因此系统中还需要加入 SDRAM。
SDRAM(Synchronous Dynamic Random Access Memory)是同步动态随机
存取存储器,同步是指工作时需要同步时钟,内部命令的发送与数据的传输都
以它为基准,动态是指存储阵列需要不断的刷新来保证数据不丢失,随机是指
数据不是线性依次存储,而是由指定地址进行数据读写。
SDRAM 是与系统时钟同步工作的动态存储器,它具有数据吞吐量大,速度
快,价格便宜等特点。SDRAM 在系统中的主要作用是作为程序代码的运行空间。
当系统启动时,CPU 首先从复位地址处读取启动代码,在完成系统的初始化后,
将程序代码调入 SDRAM 中运行,以提高系统的运行速度。同时,系统和用户
堆栈、 *** 作数据也存放在 SDRAM 中。
由于 SDRAM 自身结构的特点,它需要定时刷新,这就要求硬件电路要有
定时刷新的功能,S3C2440 芯片在片内集成了独立的 SDRAM 控制电路,可以
很方便的与 SDRAM 连接,使系统得以稳定的运行。
本设计使用的 SDRAM 芯片型号是 HY57V561620,存储容量为 4Bank×4M
×l6bit,每个 Bank 为 8M 字节,总共大小为 32M。本系统通过两片 HY57V561620
构建了 64MB 的 SDRAM 存储器系统,能满足嵌入式 *** 作系统及较复杂算法的
运行要求。电路图如图 2-5 所示。
图 2-5 SDRAM 电路图
电路图说明:
(1)本系统使用两块 HY57V561620 芯片组成容量 64M 的 SDRAM。两片
SDRAM 都是以 2 字节为单位进行存储,因此一次存储的最小容量为 4 字节。将
一块芯片的数据线 DQ0-DQ15 与 S3C2440 的数据线低位 DATA0-DATA15 相连,武汉理工大学硕士学位论文
14
而另一块则与数据线的高位 DATA16-DATA31 相连。
(2)两块 SDRAM 芯片地址线均与 S3C2440 地址线 ADDR2-ADDR14 依次
相连。SDRAM 的内部是一个存储阵列,阵列就如同表格一样,将数据“填”进去,
和表格的检索原理一样,先指定一个行(Row),再指定一个列(Column),就
可以准确地找到所需要的单元格,这就是内存芯片寻址的基本原理。正因为如
此 , 地 址 是 通 过 将 存 储 单 元 的 列 地 址 和 行 地 址 分 开 进 行 传 送 的 , 因 此
HY57V561620 只用了 13 根地址线便完成了一个 BANK(8M 大小)的寻址。否
则按照正常情况 8M 大小的地址空间,按照字节传输,需要用到 24 根地址线。
由于本系统由两块 16bit 的芯片组成,一次最小的存储单位为 4 字节,也就是说
寻址的间隔应该为 4(2
2
)字节。ADDR0 的间隔对应为 1 字节,ADDR1 为 2 字
节,ADDR2 为 4 字节。因此 HY57V561620 需要从 ADDR2 开始连接,从而达
到一次寻址的间隔为 4 字节的目的。
(3)HY57V561620由 4个BANK组成,每个BANK大小为8M(4M×16bit)。
因此在不同的 BANK 之间也需要寻址。由于一个 BANK 的大小为 8M=2
23
,因
此对间隔为 8M 的 BANK 空间寻址,需要使用从 ADDR24 开始的两根地址线。
所以 BA0,BA1 分别接到 ADDR24,ADDR25。
(4)LDQM,UDQM 为数据输入输出屏蔽,由 S3C2440 的 SDRAM 控制器
使用,这里连接到低位数据线的芯片连接到 DQM0,DQM1;而连接到高位数据
线的芯片连接到 DQM2,DQM3。具体连接方法可以查看 S3C2440 的数据手册。
(5)片选信号 CS 连接到 SDRAM 的片选信号 nSCS0,两块芯片对应同一
片选信号。这是因为两块芯片是按照高位,低位的方式连接的,他们处于同一
地址空间。
(6)RAS 行地址选通信号,CAS 列地址选通信号,WE 写使能,分别与
S3C2440 相应的控制引脚 nSRAS、nSCAS、nWE 相连。CLK 时钟信号,CKE
时钟使能信号分别连接到 SCKE、SCLK。
使用程序读写 SDRAM 前,需要初始化 SDRAM,对一些配置寄存器进行设
置。这里只使用了 BANK6,并未用到 BANK7。
初始化的代码大致如下:
void memsetup(void)
{
rBWSCON = 0x22111110; 武汉理工大学硕士学位论文
15
rBANKCON0 = 0x700;
rBANKCON1 = 0x700;
rBANKCON2 = 0x700;
rBANKCON3 = 0x700;
rBANKCON4 = 0x700;
rBANKCON5 = 0x700;
rBANKCON6 = 0x18005;
rBANKCON7 = 0x18005;
rREFRESH = 0x8e07a3;
rBANKSIZE = 0xb2;
rMRSRB6 = 0x30;
rMRSRB7 = 0x30;
}
BWSCON 寄存器这里主要用来设置位宽,其中每 4 位描述一个 BANK,对
于本系统,使用的是两片容量为 32Mbyte、位宽为 16 的 SDRAM,组成了容量
为 64Mbyte、位宽为 32 的存储器,因此要将 BANK6 设置为 32 位。BANKCON0-5
没有用到,使用默认值 0x700 即可。BANKCON6-7 是用来设置 SDRAM,设成
0x18005 意味着外接的是 SDRAM,且列地址位数为 9。REFRESH 寄存器用于设
置SDRAM的刷新周期,查阅HY57V561620数据手册即可知道刷新周期的取值。
BANKSIZE 设置 BANK6 与 BANK7 的大小。BANK6、BANK7 对应的地址空间
与 BANK0~5 不同。BANK0~5 的地址空间大小都是固定的 128M,BANK7 的起
始地址是可变的,本系统仅使用 BANK6 的 64M 空间,因此可以令该寄存器的
位[2:0]=010(128M/128M)或 001(64M/64M),多出来的空间会被检测出来,
不会发生使用不存在内存的情况,因为Bootloader和Linux内核都会作内存检测。
244 触摸屏电路设计
使用触摸屏 TSP(Touch Screen Panel)进行输入,是指用手指或其它物体触
摸安装在显示器前端的触摸屏,将所触摸的位置(以坐标形式)由触摸屏控制
器检测,并通过接口送到 CPU,从而确定输入的相应信息。触摸屏通过一定的
物理机制,使用户直接在加载触摸屏的显示器上,通过触摸控制方式而非传统
的鼠标键盘控制方式向计算机输入信息[14]
。武汉理工大学硕士学位论文
16
根据其技术原理,触摸屏可分为矢量压力传感式、电阻式、电容式、红外
式和表面声波式等五类,当前电阻式触摸屏在嵌入式系统中用的较多。电阻触
摸屏是一个多层的复合膜,由一层玻璃或有机玻璃作为基层,表面涂有一层透
明的导电层,上面盖有一层塑料层,它的内表面也涂有一层透明的导电层,在
两层导电层之间有许多细小的透明隔离点把它们隔开绝缘。工业中常用 ITO
(Indium Tin Oxide 氧化锡)作为导电层。电阻式触摸屏根据信号线数又分为四
线、五线、六线……等类型。信号线数量越多,技术越复杂,坐标定位也越精
确。所有电阻式触摸屏的基本原理都是类似的,当触摸屏幕时,平常绝缘的两
层导电层在触摸点位置就有了一个接触,控制器检测到这个接通后,由于其中
一面导电层接通 Y 轴方向的 5V 均匀电压,另一导电层将接触点的电压引至控制
电路进行 A/D 转换,得到电压值后与 5V 相比,即可得触摸点的 Y 轴坐标,同
理得出 X 轴的坐标[15]
。本文使用是四线电阻式触摸屏。
S3C2440 提供 8 路 A/D 模拟输入,其中有 4 路是与触摸屏复用的,如果 XP、
XM、YP、YM 这 4 根引脚不用做触摸屏输入的时候可以作为普通的 A/D 转换使
用。S3C2440 的触摸屏接口有四种工作模式:
(1)正常转换模式:此模式与通用的 A/D 转换模式相似。此模式可在
ADCCON(ADC 控制寄存器)中设置,在 ADCDAT0(数据寄存器 0)中完成
数据读写。
(2)X/Y 坐标各自转换:触摸屏控制器支持两种转换模式,X/Y 坐标各自
转换与 X/Y 坐标自动转换。各自转换是在 X 模式下,将 X 坐标写入 ADCDAT0
然后产生中断;在 Y 模式下,将 Y 坐标写入 ADCDAT1 然后产生中断。
(3)X/Y 坐标自动转换:在此模式下,触摸屏控制器先后转换触摸点的 X
坐标与 Y 坐标。当 X 坐标与 Y 坐标都转换完成时,会向中断控制器产生中断。
(4)等待中断模式:当触摸笔按下时,触摸屏产生中断(INT_TC)。等待
中断模式必须将寄存器 rADCTSC 设置为 0xd3;在触摸屏控制器产生中断以后,
必须将此模式清除。
本设计采用的触摸屏是由广州友善之臂公司提供的,并且已经加在 LCD 屏
AA084VC03 之上,与 LCD 一起提供了一个对外接口。AA084VC03 是日本三菱
公司的 84 寸 TFT-LCD,分辨率为 640x480,262K 色。本款触摸屏为四线电阻
式触摸屏,使用 S3C2440 的触摸屏控制单元可以大大简化电路设计。具体电路
图见下一小节中的图 2-6。AM29LV800D
看看对你有没有用

#include<reg52h>
#define uint unsigned int
#define uchar unsigned char
uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;
#define yh 0x80
#define er 0x80+0x40//液晶屏的与 C51 之间的引脚连接定义
sbit rs=P2^5;
sbit en=P2^7;
sbit rw=P2^6;//如果硬件上 rw 接地,就不用写这句和后面的 rw=0
//DS1302 时钟芯片与 C51 之间的引脚连接定义
sbit IO=P3^6;
sbit SCLK=P3^5;
sbit RST=P3^7;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;//校时按键与 C51 的引脚连接定义
sbit key1=P3^2;//设置键
sbit key2=P3^3;//加键
sbit key3=P3^4;//减键
uchar code tab1[]={"20//////////"};//年显示的固定字符
uchar code tab2[]={"LOVE ::::::"};//时间显示的固定字符

//延时函数,后面经常调用
void delay(uint xms)//延时函数,有参函数
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
/液晶写入指令函数与写入数据函数,以后可调用/
write_1602com(uchar com) //液晶写入指令函数
{
rs=0; //数据/指令选择置为指令
rw=0; //读写选择 置为写
P0=com; //送入数据
delay(1);
en=1; //拉高使能端,为制造有效的下降沿做准备
delay(1);
en=0;
//en 由高变低,产生下降沿,液晶执行命令
}
write_1602dat(uchar dat) //液晶写入数据函数
{
rs=1; //数据/指令选择置为数据
rw=0; //读写选择置为写
P0=dat; //送入数据
delay(1);
en=1; //en 置高电平,为制造下降沿做准备
delay(1);
en=0; //en 由高变低,产生下降沿,液晶执行命令
}
lcd_init() //液晶初始化函数//
{
write_1602com(0x38); //设置液晶工作模式,意思:162 行显示,57 点阵,8 位数据
write_1602com(0x0c); //开显示不显示光标
write_1602com(0x06); //整屏不移动,光标自动右移
write_1602com(0x01); //清显示
write_1602com(yh+1); //日历显示固定符号从第一行第 1 个位置之后开始显示
for(a=0;a<14;a++)
{
write_1602dat(tab1[a]); //向液晶屏写日历显示的固定符号部分
}
write_1602com(er+1);//时间显示固定符号写入位置,从第 2 个位置后开始显示
for(a=0;a<12;a++)
{
write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号
}
}
/DS1302 有关子函数/
void write_byte(uchar dat)//写一个字节
{
ACC=dat;
RST=1;
for(a=8;a>0;a--)
{
IO=ACC0;//相当于汇编中的 RRC
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
uchar read_byte() //读一个字节
{
RST=1;
for(a=8;a>0;a--)
{
ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
return (ACC);
}
//----------------------------------------//
void write_1302(uchar add,uchar dat) //向 1302 芯片写函数,指定写入地址,数据
{
RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
uchar read_1302(uchar add) //从 1302 读数据函数,指定读取数据来源地址
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
uchar BCD_Decimal(uchar bcd)//BCD 码转十进制函数,输入 BCD,返回十进制
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal10+(bcd&=0x0F));
}
//--------------------------------------//
void ds1302_init()//1302 芯片初始化子函数(2010-01-07,12:00:00,week4)
{
RST=0;
SCLK=0;
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x8e,0x80);//打开写保护
}
//时分秒显示子函数
void write_sfm(uchar add,uchar dat)//向 LCD 写时分秒,有显示位置加、现示数据,两个参数
{
uchar gw,sw;
gw=dat%10;//取得个位数字
sw=dat/10;//取得十位数字
write_1602com(er+add);//er 是头文件规定的值 0x80+0x40
write_1602dat(0x30+sw);//数字+30 得到该数字的 LCD1602 显示码
write_1602dat(0x30+gw);//数字+30 得到该数字的 LCD1602 显示码
}
//年月日显示子函数
void write_nyr(uchar add,uchar dat)//向 LCD 写年月日,有显示位置加数、显示数据,两个参数
{
uchar gw,sw;
gw=dat%10;//取得个位数字
sw=dat/10;//取得十位数字
write_1602com(yh+add);//设定显示位置为第一个位置+add
write_1602dat(0x30+sw);//数字+30 得到该数字的 LCD1602 显示码
write_1602dat(0x30+gw);//数字+30 得到该数字的 LCD1602 显示码
}
void write_week(uchar week)//写星期函数
{
write_1602com(yh+0x0c);//星期字符的显示位置
switch(week)
{
case 1:write_1602dat('M');//星期数为一时,显示
write_1602dat('o');
write_1602dat('n');break;
case 2:write_1602dat('T');//星期数据为二时显示
write_1602dat('u');
write_1602dat('e');break;
case 3:write_1602dat('W');//星期数据为三时显示
write_1602dat('e');
write_1602dat('d');break;
case 4:write_1602dat('T');//星期数据为四是显示
write_1602dat('h');
write_1602dat('u');break;
case 5:write_1602dat('F');//星期数据为五时显示
write_1602dat('r');
write_1602dat('i');break;
case 6:write_1602dat('S');//星期数据为六时显示
write_1602dat('t');
write_1602dat('a');break;
case 7:write_1602dat('S');//星期数据为日时显示
write_1602dat('u');
write_1602dat('n');break;
}
}
//键盘扫描有关函数
void keyscan()
{
if(key1==0)//key1 为功能键(设置键)
{
delay(9);//延时,用于消抖动
if(key1==0)//延时后再次确认按键按下
{
delay(20);
while(!key1);
key1n++;
if(key1n==9)
key1n=1;//设置按键共有秒、分、时、星期、日、月、年、返回,8 个功能循环
switch(key1n)
{
case 1:TR0=0;//关闭定时器
write_1602com(er+0x0E);//设置按键按动一次,秒位置显示光标
write_1602com(0x0f);//设置光标为闪烁
temp=(miao)/1016+(miao)%10;//秒数据写入 DS1302
write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp);//miao
write_1302(0x8e,0x80);break;
case 2:write_1602com(er+11);//按 2 次 fen 位置显示光标
break;
case 3:write_1602com(er+8);//按动 3 次,shi
break;
case 4:write_1602com(yh+0x0e);//按动 4 次,week
break;
case 5:write_1602com(yh+0);//按动 5 次,ri
break;
case 6:write_1602com(yh+0x07);//按动 6 次,yue
break;
case 7:write_1602com(yh+0x04);//按动 7 次,nian
break;
case 8:write_1602com(0x0c);//按动到第 8 次,设置光标不闪烁
TR0=1;//打开定时器
TR0=1;
temp=(miao)/1016+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao 数据写入 DS1302
write_1302(0x8e,0x80);break;
}
}
}
//------------------------------加键 key2----------------------------//
if(key1n!=0)//当 key1 按下以下。再按以下键才有效(按键次数不等于零)
{
if(key2==0)//上调键
{
delay(10);
if(key2==0)
{
delay(20);
while(!key2);
switch(key1n)
{
case 1:miao++;//设置键按动 1 次,调秒
if(miao==60)
miao=0;
write_sfm(0x0D,miao);
temp=(miao)/1016+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+0x0E);
break;
case 2:fen++;
if(fen==60)
fen=0;
write_sfm(0x0A,fen);
temp=(fen)/1016+(fen)%10;
write_1302(0x8e,0x00);
write_1302(0x82,temp);
write_1302(0x8e,0x80);
write_1602com(er+11);
break;
case 3:shi++;
if(shi==24)
shi=0;
write_sfm(7,shi);
temp=(shi)/1016+(shi)%10;
write_1302(0x8e,0x00);
write_1302(0x84,temp);
write_1302(0x8e,0x80);
write_1602com(er+8);
break;
case 4:week++;
if(week==8)
week=1;
write_1602com(yh+0x0C) ;
write_week(week);
temp=(week)/1016+(week)%10;
write_1302(0x8e,0x00);
write_1302(0x8a,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
break;
case 5:ri++;
if(ri==32)
ri=1;
write_nyr(9,ri);
temp=(ri)/1016+(ri)%10;
write_1302(0x8e,0x00);
write_1302(0x86,temp);
write_1302(0x8e,0x80);
write_1602com(yh+10);
break;
case 6:yue++;
if(yue==13)
yue=1;
write_nyr(6,yue);
temp=(yue)/1016+(yue)%10;
write_1302(0x8e,0x00);
write_1302(0x88,temp);
write_1302(0x8e,0x80);
write_1602com(yh+7);
break;
case 7:nian++;
if(nian==100)
nian=0;
write_nyr(3,nian);
temp=(nian)/1016+(nian)%10;
write_1302(0x8e,0x00);
write_1302(0x8c,temp);
write_1302(0x8e,0x80);
write_1602com(yh+4);
break;
}
}
}
//------------------减键 key3,各句功能参照'加键'注释---------------
if(key3==0)
{
delay(10);
//调延时,消抖动
if(key3==0)
{
delay(20);
while(!key3);
switch(key1n)
{
case 1:miao--;
if(miao==-1)
miao=59;
write_sfm(0x0D,miao);
temp=(miao)/1016+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+0x0E);
break;
case 2:fen--;
if(fen==-1)
fen=59;
write_sfm(10,fen);
temp=(fen)/1016+(fen)%10;
write_1302(0x8e,0x00);
write_1302(0x82,temp);
write_1302(0x8e,0x80);
write_1602com(er+11);
break;
case 3:shi--;
if(shi==-1)
shi=23;
write_sfm(7,shi);
temp=(shi)/1016+(shi)%10;
write_1302(0x8e,0x00);
write_1302(0x84,temp);
write_1302(0x8e,0x80);
write_1602com(er+8);
break;
case 4:week--;
if(week==0)
week=7;
write_1602com(yh+0x0C);
write_week(week);
temp=(week)/1016+(week)%10;
write_1302(0x8e,0x00);
write_1302(0x8a,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
break;
case 5:ri--;
if(ri==0)
ri=31;
write_nyr(9,ri);
temp=(ri)/1016+(ri)%10;//十进制转换成 DS1302 要求的 DCB 码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x86,temp);//向 DS1302 内写日期寄存器 86H 写入调整后的日期数据 BCD 码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 6:yue--;
if(yue==0)
yue=12;
write_nyr(6,yue);
temp=(yue)/1016+(yue)%10; //十进制转换成 DS1302 要求的 DCB 码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x88,temp); //向 DS1302 内写月份寄存器 88H 写入调整后的月份数据 BCD 码
write_1302(0x8e,0x80); //打开写保护
write_1602com(yh+7); //因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 7:nian--;
if(nian==-1)
nian=99;
write_nyr(3,nian);
temp=(nian)/1016+(nian)%10; //十进制转换成 DS1302 要求的 DCB 码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x8c,temp); //向 DS1302 内写年份寄存器 8cH 写入调整后的年份数据 BCD 码
write_1302(0x8e,0x80); //打开写保护
write_1602com(yh+4); //因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
}
}
}
}
}
void init()
//定时器、计数器设置函数
{
TMOD=0x11;
//指定定时/计数器的工作方式为 3
TH0=0;
//定时器 T0 的高四位=0
TL0=0;
//定时器 T0 的低四位=0
EA=1;
//系统允许有开放的中断
ET0=1;
//允许 T0 中断
TR0=1;
//开启中断,启动定时器
}
//主函数
void main()
{
lcd_init(); //调用液晶屏初始化子函数
ds1302_init(); //调用 DS1302 时钟的初始化子函数
init(); //调用定时计数器的设置子函数
delay(80);
while(1)
//无限循环下面的语句:
{
keyscan();
//调用键盘扫描子函数
}
}
void timer0() interrupt 1 //取得并显示日历和时间
{ //读取秒时分周日月年七个数据(DS1302 的读寄存器与写寄存器不一样)
miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));
//显示秒、时、分数据:
write_sfm(13,miao); //秒,从第二行第 8 个字后开始显示(调用时分秒显示子函数)
write_sfm(10,fen); //分,从第二行第 5 个字符后开始显示
write_sfm(7,shi); //小时,从第二行第 2 个字符后开始显示
//显示日、月、年数据:
write_nyr(9,ri); //日期,从第二行第 9 个字符后开始显示
write_nyr(6,yue); //月份,从第二行第 6 个字符后开始显示
write_nyr(3,nian); //年,从第二行第 3 个字符后开始显示
write_week(week);
}

连接 一般SI4432都设计成模组,模组连接也简单

1pin GND 2pin VCC 6pin SDO 7pin SDI 8pin SCLK 9pin nSEL 10pin nIRQ

13pin ANT 11、12、14pin GND 就可以了

程序就是利用SDO SDI SCLK nSEL nIRQ 串行输入设置寄存器即可,很容易,按

照datasheet编程就没问题了。

一、整屏不亮,整屏黑屏



1、检测电源是否通电。



2、检测同步屏通讯线是否接通,有无接错。



3、同步屏检测发送卡和接收卡通讯绿灯有无闪烁。



4、如果是同步屏,电脑显示器是否保护,或者显示屏显示领域是黑色或纯蓝。



二、整块单元板不亮



1、连续几块板横方向不亮,检查正常单元板与异常单元板之间的排线连接是否接通;或者芯片245是否正常。



2、连续几块板纵方向不亮,检查此列电源供电是否正常。



二、整块单元板不亮



1、连续几块板横方向不亮,检查正常单元板与异常单元板之间的排线连接是否接通;或者芯片245是否正常。



2、连续几块板纵方向不亮,检查此列电源供电是否正常。



四、单元板不亮



1、查595是否正常。



2、查上下模块对应通脚是否接通。



3、查595输出脚到模块脚是否有通。



五、单元板缺色



1、查245 RG数据是否有输出。



六、一单元板不亮



1、+5V 电或 GND 是否供给



2、+5V 跟 GND 是否短路



3、138 第五腿的 OE 信号是否有



4、245 相连的 OE 信号是否正常(断路或短路);



方法:1、" 给上 +5V 电或 GND



2、" 把短路的给断开" 把 OE 信号供上



3、把断路的连好把短路的给断开



七、一单元板上半部分或下半部分不亮或显示不正常



1、138 的第 5 腿 OE 信号是否有;



2、74HC595 的第 11 、12 腿的信号是否正常;( SCLK 、 RCK )



3、相连的 OE 信号是否正常;(断路或短路)



4、双排插针与 245 相连的 SCLK 、RCK 信号是否正常;(断路或短路)



方法:1、把 OE 信号连上



2、把 SCLK 、 RCK 信号连好



3、把断路的连好把短路的断开



4、把断路的连好把短路的断开



8



八、一单元板上一行或相应一个模块的行不亮或不正常显示



1、查看其所对应模块的行信号的管脚是否虚焊或漏焊;



2、查看其行信号与 4953 所对应的管脚是否断开或与其它信号短路



3、查看其行信号的上、下拉电阻是否没焊或漏焊



4、74HC138 输出的行信号与相对应的4953 之间是否断开或与其它信号短路



方法:1、把虚焊、漏焊的给焊好



2、把断路的连好把短路的断开



3、把没焊的给补上把漏焊的给焊好

1如果是两个集成SPI总线协议的单片机之间的通信,在控制寄存器中可以选择主从方式
2如果是单片机与其它SPI接口芯片进行通信,芯片手册中会说明它与单片机的主从方式建议到网上查找一些SPI协议的资料
3主机向从机发片选信号(一般是一个低电平信号),然后通信开始,主机向从机发数据的同时,从机也可以向主机发数据全双工
SPI是高速、全双向、同步、四线或三线制串行外围设备接口,采用主从模式结构,支持多从机模式应用,一般仅支持单主机,在主机的移位时钟脉冲下,数据按位传输,可以是高位在前(MSB first),低位在后,也可以低位在前,高位在后的顺序发送,目前应用中的数据速率可达5Mbps以上的水平,SPI接
口唯一的一个缺点是没有应答机制确认是否接收到数据,但一般的SPI从器件设计都很完善,只要按照器
件说明书要求读写数据都不会有任何问题的。
SPI接口共有4根信号线,分别是:设备选择线(片选)、时钟线、串行数据输出线、串行数据输入线。
① MOSI(Master Out SlaveIn):主器件数据输出,从器件数据输入,用于主器件到从器件的数据传输。
② MISO(Master In Slave Out):主器件数据输入,从器件数据输出,用于从器件到主器件的数据传输。
③ SCLK(SPI Clock) :时钟信号,只能由主器件产生。
④ /SS:设备选择线(片选),由主器件控制,当从器件片选信号输入低电平时为选中状态,/SS是针对
从器件而言的,作为主器件,不需要使用/SS。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/13378613.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-24
下一篇 2023-07-24

发表评论

登录后才能评论

评论列表(0条)

保存