#define LCM_RS P2_1
#define LCM_E P2_2
#define LCM_Data P1
#define Busy0x80 //用于检测LCM状脊大槐态字中的Busy标识
#i nclude <at89x51.h>
void WriteDataLCM(unsigned char WDLCM)
void WriteCommandLCM(unsigned char WCLCM,BuysC)
unsigned char ReadDataLCM(void)
unsigned char ReadStatusLCM(void)
void LCMInit(void)
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
void Delay5Ms(void)
void Delay400Ms(void)
unsigned char code uctech[] = {"uctech"}
unsigned char code net[] = {"uctech.icpcn.com"}
void main(void)
{
Delay400Ms()//启动等待,等LCM讲入工作状态
LCMInit()//LCM初始化
Delay5Ms()//延时片刻(可不要)
DisplayListChar(0, 5, uctech)
DisplayListChar(0, 0, net)
ReadDataLCM()//测试用句无意义
while(1)
}
//写数据
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM()//检测忙
LCM_Data = WDLCM
LCM_RS = 1
LCM_RW = 0
LCM_E = 0//若晶振速度太高可以在这后加小的仿余延时
LCM_E = 0//延时
LCM_E = 1
}
//写指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM()//根据需要检测忙
LCM_Data = WCLCM
LCM_RS = 0
LCM_RW = 0
LCM_E = 0
LCM_E = 0
LCM_E = 1
}
//读数据
unsigned char ReadDataLCM(void)
{
LCM_RS = 1
LCM_RW = 1
LCM_E = 0
LCM_E = 0
LCM_E = 1
return(LCM_Data)
}
//读状态
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF
LCM_RS = 0
LCM_RW = 1
LCM_E = 0
LCM_E = 0
LCM_E = 1
while (LCM_Data &Busy)//检测忙信号
return(LCM_Data)
}
void LCMInit(void) //LCM初始化
{
LCM_Data = 0
WriteCommandLCM(0x38,0)//三次显示模式设置樱友,不检测忙信号
Delay5Ms()
WriteCommandLCM(0x38,0)
Delay5Ms()
WriteCommandLCM(0x38,0)
Delay5Ms()
WriteCommandLCM(0x38,1)//显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1)//关闭显示
WriteCommandLCM(0x01,1)//显示清屏
WriteCommandLCM(0x06,1)// 显示光标移动设置
WriteCommandLCM(0x0C,1)// 显示开及光标设置
}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1
X &= 0xF//限制X不能大于15,Y不能大于1
if (Y) X |= 0x40//当要显示第二行时地址码+0x40
X |= 0x80// 算出指令码
WriteCommandLCM(X, 0)//这里不检测忙信号,发送地址码
WriteDataLCM(DData)
}
//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength
ListLength = 0
Y &= 0x1
X &= 0xF//限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x20) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength])//显示单个字符
ListLength++
X++
}
}
}
//5ms延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552
while(TempCyc--)
}
//400ms延时
void Delay400Ms(void)
{
unsigned char TempCycA = 5
unsigned int TempCycB
while(TempCycA--)
{
TempCycB=7269
while(TempCycB--)
}
你可以按照以下步骤编写STC8G1K08芯片的LED点亮和灭的时间控制程序:
设卜手置芯片的时钟和计数器,以便实现时间控制。例如,可以使用定时器或延时函数来控制时间。
在主函数中编写程序,实现LED点亮和灭的时间控制。可以使用if语句或while语句来判断时间是否达到要求,然后控制LED灯的点亮和灭。
在main函数中添加延时函数,以实现上电后30秒后LED灯开始点亮的要求。
下面是一个简单的示例程序,仅供参考:
#include<reg52.h>
sbit LED=P1^0
void delay(unsigned int i)
{
while(i--)
}
void main()
{
unsigned int count=0 //计数器,用于实现30秒的延时
while(count<30000) //上电后30秒开始执行程序
{
delay(1000) //每次延时1秒
count+=1000
}
LED=1 //点亮LED
delay(3000) //LED持续3秒
LED=0 //灭掉LED
while(1) //芯片不工作
}
在拿弊迹上述程序中,使用了一个计数器来实现上电后30秒的延时,然后LED点亮并持续3秒后灭掉,最后芯片不工作。需要注意的是,示例程序仅供参消并考,具体实现方式需要根据实际情况进行调整和优化。
四块OLED用一块STC12C90S2同时衡丛控制显示不同画面,单片机可以用模拟四路IIC接咐春樱口连接四个OLED屏,软件森悉上分别给四块OLED屏 刷新不同的画面就可以了,如果用一路IIC接口连接四个OLED屏(需要四个OLED屏 用四个不同的地址)。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)