总之是找对应的库,另外,如果不是很懂,建议从 uno入手
在使用Wire.h函式库时,如看IC规格书时,装置位址格式中的最後的一个 bit(读/写位元) 我们必须忽略它(因为在使用Wire.h库函式时这个读/写位元的值它会自动帮你填上,虽然我们在写sketch代码时看不到)所以-我们要将 读/写位元 忽略它拿掉(楼主用的方式是将整个位址右移,或是直接用人脑除以2後答案填上 都行)後 一定会变成7个bit的装置位址,也符合I2C装置位址规范(0~127)
///////////////////////////////////////////////////////////////////////////////////基于arduino 平台的KS0180芯片128*64并口显示LCD测试程序by 王瑾 2014/9/27
//程序较大使用小RAM芯片可能无法运行,如无法运行可将调用logo部分删除,会大幅减小RAM使用
//因为uno 坏了只在mega 2560测试成功
//和ST7920芯片主要是RAM地址的分布不同注意分析RAM地址写程序
//程序没有采用库文件,显示程序也没有另写子程序,主要是为了个人修改方便
//////////////////////////////////////////////////////////////////////////////
//
int CS1=A0//左半屏,高电平有效
int CS2=A1//右半屏,高电平有效
int RS = 12
int RW = 11
int DB[] = {3, 4, 5, 6, 7, 8, 9, 10}//使用数组来定义总线需要的管脚DB 0-7
int Enable = 2
/////////////////////////////////////////////////////////////////////////
// Bitmap点阵数据表//
// 内容为:南京舟芯电子,TEL025-66085988 //
// 图片尺寸: 128 * 64 //
/////////////////////////////////////////////////////////////////////////
unsigned char logo1[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
}
////////////////////////////////////////////////////////
//写命令子程序
///////////////////////////////////////////////////////
void LcdCommandWrite(int value) {
digitalWrite(RS, 0)
digitalWrite(RW, 0)
int i = 0
for (i=3i <= 10i++) //总线赋值
{
digitalWrite(i,value &01)//value与0001相与赋予i
value >>= 1//value右移一位
}
digitalWrite(Enable,1)
delayMicroseconds(1)
digitalWrite(Enable,LOW)
delayMicroseconds(1)
}
//////////////////////////////////////////////////////
//写数据子程序
/////////////////////////////////////////////////////
void LcdDataWrite(int value) {
// 定义所有引脚
int i = 0
digitalWrite(RS, 1)
digitalWrite(RW, 0)
//digitalWrite(DI, HIGH)
//digitalWrite(RW, LOW)
for (i=DB[0]i <= DB[7]i++) {
digitalWrite(i,value &01)
value >>= 1
}
digitalWrite(Enable,HIGH)
delayMicroseconds(1)
digitalWrite(Enable,LOW)
delayMicroseconds(1) // 延时百万分之一秒
}
///////////////////////////////////////////////////
//输出引脚声明
//////////////////////////////////////////////////
void setup (void) {
int i = 0
for (i=Enablei <= 12i++) {
pinMode(i,OUTPUT)
}
pinMode(A0,OUTPUT)
pinMode(A1,OUTPUT)
}
////////////////////////////////////////////
//循环主程序
/////////////////////////////////////////////////
void loop (void) {
///////////////////////////////////////////////////////////////////////////////////////////
//初始化,因为KS0108芯片无初始化命令需要对整个屏幕赋值0x00, 不然的话会有杂点
//没有查到KS0108芯片的始化命令,位图调用一直有杂点,采用REST复位也不能解决,所以采用此方法
//////////////////////////////////////////////////////////////////////////////////////////
digitalWrite(CS1,1)
digitalWrite(CS2,1)
LcdCommandWrite(0x3e) // 显示关
int i = 0
int yg,x,y
int temp
int tmp
for(yg=0yg<8yg++)
{
x=yg+0xb8 //0xb8为首页地址
y=0x40 //0x40为首列地址注意分析规格书RAM地址分布图
LcdCommandWrite(x) //写入y轴坐标
LcdCommandWrite(y) //写入x轴坐标
tmp=yg*64
for(i=0i<64i++)
{
LcdDataWrite(0x00)
tmp++
}
}
LcdCommandWrite(0x3f) //显示图象
delay(1)
//////////////////////////////////////////////////////////
//显示ZXET logo
///////////////////////////////////////////////////////////
digitalWrite(CS1,1) //先显示左半屏
digitalWrite(CS2,0)
for(yg=0yg<8yg++)
{
x=yg+0xb8
y=0x40
LcdCommandWrite(x) //写入y轴坐标
LcdCommandWrite(y) //写入x轴坐标
tmp=2*yg*64
for(i=0i<64i++)
{
LcdDataWrite(logo[tmp])
tmp++
}
}
LcdCommandWrite(0x3f) //此处无需延迟直接接右半屏显示程序
////////////////////////
digitalWrite(CS1,0)//显示右半屏
digitalWrite(CS2,1)
for(yg=0yg<8yg++)
{
x=yg+0xb8
y=0x40
LcdCommandWrite(x) //写入y轴坐标
LcdCommandWrite(y) //写入x轴坐标
tmp=(2*yg+1)*64
for(i=0i<64i++)
{
LcdDataWrite(logo[tmp])
tmp++
}
}
LcdCommandWrite(0x3f)
delay(3000)
///////////////////////////////////////////////////////////////
//显示 文字,依然采用位图数据调用,KS0108无字库只能采用这种办法
///////////////////////////////////////////////////////////////
digitalWrite(CS1,1)
digitalWrite(CS2,0)
for(yg=0yg<8yg++)
{
x=yg+0xb8
y=0x40
LcdCommandWrite(x) //写入y轴坐标
LcdCommandWrite(y) //写入x轴坐标
tmp=2*yg*64
for(i=0i<64i++)
{
LcdDataWrite(logo1[tmp])
tmp++
}
}
LcdCommandWrite(0x3f)
//////////////////////////////////////
digitalWrite(CS1,0)
digitalWrite(CS2,1)
for(yg=0yg<8yg++)
{
x=yg+0xb8
y=0x40
LcdCommandWrite(x) //写入y轴坐标
LcdCommandWrite(y) //写入x轴坐标
tmp=(2*yg+1)*64
for(i=0i<64i++)
{
LcdDataWrite(logo1[tmp])
tmp++
}
}
LcdCommandWrite(0x3f)
delay(3000)
///////////////////////////////////////////////////////
//测试画面 :全黑
////////////////////////////////////////////////////////
digitalWrite(CS1,1)
digitalWrite(CS2,1)
for(yg=0yg<8yg++)
{
x=yg+0xb8
y=0x40
LcdCommandWrite(x) //写入y轴坐标
LcdCommandWrite(y) //写入x轴坐标
for(i=0i<64i++)
{
LcdDataWrite(0xFF)
}
}
LcdCommandWrite(0x3f)
delay(3000)
///////////////////////////////////////////////////////
//测试画面 :全白
////////////////////////////////////////////////////////
digitalWrite(CS1,1)
digitalWrite(CS2,1)
for(yg=0yg<8yg++)
{
x=yg+0xb8
y=0x40
LcdCommandWrite(x) //写入y轴坐标
LcdCommandWrite(y) //写入x轴坐标
for(i=0i<64i++)
{
LcdDataWrite(0x00)
}
}
LcdCommandWrite(0x3f)
delay(3000)
///////////////////////////////////////////////////////
//测试画面 :数条纹
////////////////////////////////////////////////////////
digitalWrite(CS1,1)
digitalWrite(CS2,1)
for(yg=0yg<8yg++)
{
x=yg+0xb8
for(i=0i<32i++)
{
y=0x40+2*i
LcdCommandWrite(x) //写入y轴坐标
LcdCommandWrite(y) //写入x轴坐标
LcdDataWrite(0xFF)
}
}
LcdCommandWrite(0x3f)
delay(3000)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)