#include <stdlib.h>
#include <intrins.h>
#include <stdio.h>
/********************引脚定义********************/
sbitRW =P3^1 //读写
sbitE =P3^2 //使能
sbitCSL =P3^3 //左片选
sbitCSM =P3^4 //中片选
sbitCSR =P3^5 //右片选
sbitRST =P3^6
unsigned char Page//页 地址
unsigned char Col //列 地址
unsigned char code BMP1[]
unsigned char code BMP2[]
void Delay(unsigned int MS)
void wtcom(void)
/***************************/
/顷枝*检查Busy */
/***************************/
void BusyL(void)
{
CSL= 1
CSM= 0
CSR= 0
wtcom()
}
void BusyM(void)
{
CSL= 0
CSM= 1
CSR= 0
wtcom()
}
void BusyR(void)
{
CSL= 0
CSM= 0
CSR= 1
wtcom()
}
void wtcom(void)
{
RS = 0//指令
RW = 1
P1 = 0xFF //输出0xff以便读取正确
E = 1
_nop_()_nop_()_nop_()
while(P1 &0x80) //Status Read Bit7 = BUSY
E = 0
_nop_()_nop_()_nop_()
}
/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个 *** 作单元位置 */
/********************************************************/
void Locatexy(void)
{
unsigned char x,y
switch (Col&0xc0) /* col.and.0xC0*/
{/*条件分支执行 */
case 0: {BusyL()break}/*左区 */
case 0x40: {BusyM()break}/*中区 */
case 0x80: {BusyR()break}/*右区 */
}
x = Col&0x3F|0x40 /* col.and.0x3f.or.Set Y Address*/
y = Page&0x07|0xB8/* row.and.0x07.or.set Page */
wtcom() /* waitting for enable */
RS = 0//指贺乎纤令
RW = 0//写
P1 = y//设置页面地址
E = 1
_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()
wtcom() /* waitting for enable */
RS = 0
RW = 0
P1 = x//设置列地址
E = 1
_nop_()_nop_()_nop_()_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()
}
/***************************/
/*写指令 */
/***************************/
void WriteCommandL( unsigned char CommandByte )
{
BusyL()
P1 = CommandByte
RS = 0//指令
RW = 0
E = 1
_nop_()_nop_()_nop_()_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()
}
void WriteCommandM( unsigned char CommandByte )
{
BusyM()
P1 = CommandByte
RS = 0//指令
RW = 0
E = 1
_nop_()_nop_()_nop_()_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()
}
void WriteCommandR( unsigned char CommandByte )
{
BusyR()
P1 = CommandByte
RS = 0//指令
RW = 0
E = 1
_nop_()_nop_()_nop_()_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()
}
/***************************/
/*读数据 */
/***************************/
unsigned char ReadData( void )
{
unsigned char DataByte
Locatexy()/*坐标定位,返回时保留分区状态不变 */
RS = 1/*数据输出*/
RW = 1/*读入 */
P1 = 0xFF //输出0xff以便读取正确
E = 1/*读入到LCM*/
_nop_()_nop_()_nop_()_nop_()
DataByte = P1 /*数据读出到数据口P1 */
E = 0
_nop_()_nop_()_nop_()_nop_()
return DataByte
}
/***************************/
/*写数据 */
/***************************/
void WriteData( unsigned char DataByte )
{
Locatexy()/*坐标定位,返回时保留分区状态不变 */
RS = 1/*数据输出*/
RW = 0/*写输出 */
P1 = DataByte /*数据输出到数据口 */
E = 1/*写入到LCM*/
_nop_()_nop_()_nop_()_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()
}
void LcmClear( void )
{
Page = 0
Col = 0
for(Page=0Page<8Page++)
for(Col=0Col<192Col++)
WriteData(0)
}
void LcmInit( void )
{
WriteCommandL(0x3f) //开显示
WriteCommandM(0x3f)
WriteCommandR(0x3f)
WriteCommandL(0xc0) //设置起始地址=0
WriteCommandM(0xc0)
WriteCommandR(0xc0)
WriteCommandL(0x3f) //开显示
WriteCommandM(0x3f)
WriteCommandR(0x3f)
LcmClear()
Col = 0
Page= 0
Locatexy()
}
void LcmPutDots( unsigned char DotByte )
{
Page = 0
Col = 0
for(Page=0Page<8Page++)
{
for(Col=0Col<192Col++)
{
WriteData( DotByte )
DotByte = ~DotByte
}
}
}
void LcmPutBMP( unsigned char *puts )
{
unsigned int X=0
Page = 0
Col = 0
for(Page=0Page<8Page++)
{
for(Col=0Col<192Col++)
{
WriteData( puts[X] )
X++
}
}
}
void LcmReverseBMP( void )
{
unsigned char temp
Page = 0
Col = 0
for(Page=0Page<8Page++)
{
for(Col=0Col<192Col++)
{
temp = ReadData() //空读一次
temp = ReadData()
temp = ~temp
WriteData(temp)
}
}
}
void Delay(unsigned int MS)
{
unsigned char us,usn
while(MS!=0)
{
usn = 2 //for 12M
while(usn!=0)
{
us=0xf6
while (us!=0){us--}
usn--
}
MS--
}
}
void Main( void )
{
Delay(200)//等待复位
LcmInit()
LcmClear()
while(1)
{
LcmPutBMP(BMP1)
Delay(1500)
LcmReverseBMP()
Delay(1500)
LcmPutBMP(BMP2)
Delay(1500)
LcmReverseBMP()
Delay(1500)
}
}
更多0
// 19264 Demo Program//***************************************************************************
//连线表: CPU=89C52*
//RS=P3.0 R/W=P3.1 E=P3.2 CS1=P3.3 CS2=P3.4 CS3=P3.5*
//SysClock=12MHz DB0-DB7=P1.0-P1.7
//SysClock=12MHz DB0-DB7=P1.0-P1.7
//Reset 接1来节省口
//V0 接-6v我所知的只能接 -6v 不知道其他可不可以 ,要小心!我的已经挂了一个了。
//vee 接5~ -13v 或野岁者不接
//颂敏睁leda 接+5v
//vss 0v
//vdd 5v
//P1 为数据端
//***************************************************************************
#include "STC89C51RC_RD_PLUS.H" // 包含的头文件
#include <stdlib.h>
#include <intrins.h>
#include <stdio.h>
#include "code_data.h"
/********************引脚定义********************/
sbitRS =P2^0 //数据指令
sbitRW =P2^1 //读写
sbitE =P2^5 //使能
sbitCSL =P2^2 //左片选
sbitCSM =P2^3 //中片选
sbitCSR =P2^4 //右片选
sbitCPUWR =P3^6
sbitCPURD =P3^7
unsigned char Page//页 地址
unsigned char Col //列 地址
void Delay(unsigned int MS)
void wtcom(void)
/***************************/
/*检查Busy */
/***************************/
void BusyL(void)
{
CSL= 0
CSM= 1
CSR= 1
wtcom()
}
void BusyM(void)
{
CSL= 1
CSM= 0
CSR= 1
wtcom()
}
void BusyR(void)
{
CSL= 1
CSM= 1
CSR= 0
wtcom()
}
void wtcom(void)
{
RS = 0//指令
RW = 1
P0 = 0xFF //输出0xff以便读取正确
E = 1
_nop_()_nop_()_nop_()
while(P0 &0x80) //Status Read Bit7 = BUSY
E = 0
_nop_()_nop_()_nop_()
}
/********************************************************/
/*根据设定拿枣的坐标数据,定位LCM上的下一个 *** 作单元位置 */
/********************************************************/
void Locatexy(void)
{
unsigned char x,y
switch (Col&0xc0) /* col.and.0xC0*/
{ /*条件分支执行 */
case 0: {BusyL()break}/*左区 */
case 0x40: {BusyM()break}/*中区 */
case 0x80: {BusyR()break}/*右区 */
}
x = Col&0x3F|0x40 /* col.and.0x3f.or.Set Y Address*/
y = Page&0x07|0xB8/* row.and.0x07.or.set Page */
wtcom() /* waitting for enable */
RS = 0//指令
RW = 0//写
P0 = y//设置页面地址
E = 1
_nop_()_nop_()_nop_()_nop_()_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()_nop_()
wtcom() /* waitting for enable */
RS = 0
RW = 0
P0 = x//设置列地址
E = 1
_nop_()_nop_()_nop_()_nop_()_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()_nop_()
}
/***************************/
/*写指令 */
/***************************/
void WriteCommandL( unsigned char CommandByte )
{
BusyL()
P0 = CommandByte
RS = 0//指令
RW = 0
E = 1
_nop_()_nop_()_nop_()_nop_()_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()_nop_()
}
void WriteCommandM( unsigned char CommandByte )
{
BusyM()
P0 = CommandByte
RS = 0//指令
RW = 0
E = 1
_nop_()_nop_()_nop_()_nop_()_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()_nop_()
}
void WriteCommandR( unsigned char CommandByte )
{
BusyR()
P0 = CommandByte
RS = 0//指令
RW = 0
E = 1
_nop_()_nop_()_nop_()_nop_()_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()_nop_()
}
/***************************/
/*读数据 */
/***************************/
unsigned char ReadData( void )
{
unsigned char DataByte
Locatexy()/*坐标定位,返回时保留分区状态不变 */
RS = 1/*数据输出*/
RW = 1/*读入 */
P0 = 0xFF //输出0xff以便读取正确
E = 1/*读入到LCM*/
_nop_()_nop_()_nop_()_nop_()_nop_()
DataByte = P0/*数据读出到数据口P1 */
E = 0
_nop_()_nop_()_nop_()_nop_()_nop_()
return DataByte
}
/***************************/
/*写数据 */
/***************************/
void WriteData( unsigned char DataByte )
{
Locatexy()/*坐标定位,返回时保留分区状态不变 */
RS = 1/*数据输出*/
RW = 0/*写输出 */
P0 = DataByte/*数据输出到数据口 */
E = 1/*写入到LCM*/
_nop_()_nop_()_nop_()_nop_()_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()_nop_()
}
void LcmClear( void )
{
Page = 0
Col = 0
for(Page=0Page<8Page++)
for(Col=0Col<192Col++)
WriteData(0)
}
void LcmInit( void )
{
WriteCommandL(0x3f) //开显示
WriteCommandM(0x3f)
WriteCommandR(0x3f)
WriteCommandL(0xc0) //设置起始地址=0
WriteCommandM(0xc0)
WriteCommandR(0xc0)
WriteCommandL(0x3f) //开显示
WriteCommandM(0x3f)
WriteCommandR(0x3f)
LcmClear()
Col = 0
Page= 0
Locatexy()
}
//////////////////////////////////////////////以上是驱动程序/////////////////////////////
void LcmPutDots( unsigned char DotByte )//点显示
{
Page = 0
Col = 0
for(Page=0Page<8Page++)
{
for(Col=0Col<192Col++)
{
WriteData( DotByte )
DotByte = ~DotByte
}
}
}
void LcmPutBMP( unsigned char *puts ) //显示图片
{
unsigned int X=0
Page = 0
Col = 0
for(Page=0Page<8Page++)
{
for(Col=0Col<192Col++)
{
WriteData( puts[X] )
X++
}
}
}
void LcmReverseBMP( void ) //反白控制
{
unsigned char temp
Page = 0
Col = 0
for(Page=0Page<8Page++)
{
for(Col=0Col<192Col++)
{
temp = ReadData() //空读一次
temp = ReadData()
temp = ~temp
WriteData(temp)
}
}
}
void Delay(unsigned int MS)
{
unsigned char us,usn
while(MS!=0)
{
usn = 2 //for 12M
while(usn!=0)
{
us=0xf6
while (us!=0){us--}
usn--
}
MS--
}
}
/****************************************/
/*写字符串 不得超过27个 */
/****************************************/
void write_chars(unsigned char x,unsigned char y,unsigned char code *date,unsigned char quantity)//任意行写不超过一行的字符串
{
unsigned char i,ii,iii
Page = 0
Col = 0
for(i=0i<quantityi++) //字符串数
{
for(ii=0ii<2ii++) //上下
{
Page=x+ii
for(iii=0iii<7iii++) //一个单元
{
Col=iii+7*(i+y)
WriteData(date[iii+7*ii+14*i])
}
}
}
}
/****************************************/
/*写汉字串 不得超过12个 */
/****************************************/
void write_chineses(unsigned char x,unsigned char y,unsigned char code *date,unsigned char quantity)//任意行写不超过一行的字符串
{
unsigned char i,ii,iii
Page = 0
Col = 0
for(i=0i<quantityi++)
{
for(ii=0ii<2ii++) //上下
{
Page=x+ii
for(iii=0iii<15iii++)
{
Col=iii+15*(i+y)
WriteData(date[iii+15*ii+30*i])
}
}
}
}
/*********************************************/
/*汉字反白 */
void write_Reverse_chineses(unsigned char x,unsigned char y,unsigned char quantity)//任意行写不超过一行的字符串
{
unsigned char temp
unsigned char i,ii,iii
Page = 0
Col = 0
for(i=0i<quantityi++)
{
for(ii=0ii<2ii++) //上下
{
Page=x+ii
for(iii=0iii<15iii++)
{
Col=iii+15*(i+y)
temp = ReadData() //空读一次
temp = ReadData()
temp = ~temp
WriteData(temp)
}
}
}
}
///////////////////////////////////////////
void Main( )
{
unsigned char kp=10
CPUWR=1
CPURD=0
Delay(200)//等待复位
LcmInit()
LcmClear()
CPUWR=1
CPURD=0
while(1)
{
P4=P4&0xfd
LcmClear()
while(kp--)
{
write_chineses(3,2,pray,8)
Delay(100)
write_Reverse_chineses(3,2,8)
Delay(100)
}
LcmClear()
write_chars(2,4,moble_num,13)
write_chars(4,4,QQ,16)
kp=10
while(kp--)
{
write_chineses(0,0,moble,3)
Delay(100)
write_Reverse_chineses(0,0,3)
Delay(100)
}
Delay(10000)
LcmClear()//刷新
write_chineses(4,2,write_me,5)
Delay(500)
LcmReverseBMP()
Delay(500)
LcmReverseBMP()
Delay(500)
LcmReverseBMP()
Delay(500)
LcmReverseBMP()
Delay(1500)
LcmReverseBMP()
LcmPutBMP(BMP1)
Delay(1500)
LcmReverseBMP()
Delay(1500)
LcmPutBMP(BMP2)
Delay(1500)
LcmReverseBMP()
Delay(1500)
for(kp=0kp<=255kp++){
LcmPutDots(kp)
Delay(2500)
}
}
}
液晶不知道你用过没有。其实STM32和51IO唯一区别就是51的不用配置输入还是输出,只要把IO拉高,就可以用作输入比如P1=0XFF, A=P1 此时A读取P1就相当于输入使用了,给IO赋值比如P1=0xF0,就已经成为输出了。
而STM32在使用IO前需要先开启IO时钟,然后配置好对应的IO配置寄存器,即配置为输入还是输出。这样才可以使用,当你需要输出时先要配置为输出模式,等你要读取时就需要在配置为输入模式,在读取。
而且STM32的IO是16位的,即GOIOx0~GPIOx15。相当于51的2组IO口比如P0+P1这样,因为51Px只有Px.0-Px.7.
所以你使用前先要硬件配置好IO接口,比如D0-D7 8位数据配置为GPIOA.0-.7使用GPIOA口的低8位,然后相应的使能,19265貌似还有个EN1,EN2左半屏和右半屏。还是上半屏下半屏,我记不住了,然后就是A0数据/命令信号,RW读取/写入信号,比如为低电平为写入,为高电平为读取。
还有个复位信号,每次开机初始化前复位一次就够了,这些都可以通过手册查找到
另外就是19264的信号电平问题,19264貌似大部分是5V的,因为STM32IO是3.3V的标有[FT]的为能够耐受5V不过需要你外部加上拉电阻接到5V,而且输辩枣旁出需携橡要配置为开漏输出。我记得他的GPIOB口基本全是FT的IO。所以你可以把他的这些电平信号全接到GPIOB口上。通过上拉电阻去拉高电平。然后在程序中定义好EN,RW,RS或A0这些就可以了,剩下的就是按照手册去写命令。具体可以查下网上很多19264的驱动C程序,只是可能是51驱动的,你需要根据你的实际使用去改变IO定义以及写入时把IO配置为输出岩毕,需要读取时把IO配置为输入。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)