问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何用51单片机定时器0定时 显示在12864液晶屏上

发布网友 发布时间:2022-04-23 19:40

我来回答

4个回答

热心网友 时间:2023-06-29 11:42

可以参考下面的驱动LCD12864.H

#ifndef __LCD12864_H__
#define __LCD12864_H__

sbit LCD_RS=P1^0;//定义引脚
sbit LCD_RW=P1^1;
sbit LCD_E=P1^2;
sbit PSB =P1^3; //PSB脚为12864-12系列的串、并通讯功能切换,我们使用8位并行接口,PSB=1
#define LCD_Data P0
#define Busy 0x80 //用于检测LCD状态字中的Busy标识

/*================================函数声明==============================*/
/*写数据 */void WriteDataLCD(unsigned char WDLCD);
/*写指令 */void WriteCommandLCD(unsigned char WCLCD,BuysC);
/*读数据 */unsigned char ReadDataLCD(void);
/*检测忙 */unsigned char ReadStatusLCD(void);
/*初始化 */void LCDInit(void);
/*清屏 */void LCDClear(void);
/*屏幕闪动 */void LCDFlash(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 DisplayImage (unsigned char code *DData);
/*延时5ms */void Delay5Ms(void);
/*延时400ms */void Delay400Ms(void);
/*================================函数声明==============================*/

//写数据
void WriteDataLCD(unsigned char WDLCD)
{
ReadStatusLCD(); //检测忙
LCD_RS = 1;
LCD_RW = 0;
LCD_Data = WDLCD;
LCD_E = 1;
LCD_E = 1;
LCD_E = 1;
LCD_E = 0;
}

//写指令
void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCD(); //根据需要检测忙
LCD_RS = 0;
LCD_RW = 0;
LCD_Data = WCLCD;
LCD_E = 1;
LCD_E = 1;
LCD_E = 1;
LCD_E = 0;
}

//读数据
unsigned char ReadDataLCD(void)
{
LCD_RS = 1;
LCD_RW = 1;
LCD_E = 0;
LCD_E = 0;
LCD_E = 1;
return(LCD_Data);
}

//读状态
unsigned char ReadStatusLCD(void)
{
LCD_Data = 0xFF;
LCD_RS = 0;
LCD_RW = 1;
LCD_E = 1;
while (LCD_Data & Busy); //检测忙信号
LCD_E = 0;
return(LCD_Data);
}

void LCDInit(void) //LCM初始化
{
WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCD(0x01,1); //显示清屏
WriteCommandLCD(0x06,1); // 显示光标移动设置
WriteCommandLCD(0x0C,1); // 显示开及光标设置
}
void LCDClear(void) //清屏
{
WriteCommandLCD(0x01,1); //显示清屏
WriteCommandLCD(0x34,1); // 显示光标移动设置
WriteCommandLCD(0x30,1); // 显示开及光标设置
}
void LCDFlash(void) //闪烁效果
{
WriteCommandLCD(0x08,1); //显示清屏
Delay400Ms();
WriteCommandLCD(0x0c,1); // 显示开及光标设置
Delay400Ms();
WriteCommandLCD(0x08,1); //显示清屏
Delay400Ms();
WriteCommandLCD(0x0c,1); // 显示开及光标设置
Delay400Ms();
WriteCommandLCD(0x08,1); //显示清屏
Delay400Ms();
}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
if(Y<1)
Y=1;
if(Y>4)
Y=4;
X &= 0x0F; //*X不能大于16,Y不能大于1
switch(Y){
case 1:X|=0X80;break;
case 2:X|=0X90;break;
case 3:X|=0X88;break;
case 4:X|=0X98;break;
}
WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCD(DData);
}

//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength,X2;
ListLength = 0;
X2=X;
if(Y<1)
Y=1;
if(Y>4)
Y=4;
X &= 0x0F; //*X不能大于16,Y在1-4之内
switch(Y){
case 1:X2|=0X80;break; //根据行数来选择相应地址
case 2:X2|=0X90;break;
case 3:X2|=0X88;break;
case 4:X2|=0X98;break;
}
WriteCommandLCD(X2, 1); //发送地址码
while (DData[ListLength]>=0x20) //若到达字串尾则退出
{
if (X <= 0x0F) //X坐标应小于0xF
{
WriteDataLCD(DData[ListLength]); //
ListLength++;
X++;
Delay5Ms();
}
}
}

//图形显示122*32
void DisplayImage (unsigned char code *DData){
unsigned char x,y,i;
unsigned int tmp=0;
for(i=0;i<9;){ //分两屏,上半屏和下半屏,因为起始地址不同,需要分开
for(x=0;x<32;x++){ //32行
WriteCommandLCD(0x34,1);
WriteCommandLCD((0x80+x),1);//列地址
WriteCommandLCD((0x80+i),1); //行地址,下半屏,即第三行地址0X88
WriteCommandLCD(0x30,1);
for(y=0;y<16;y++)
WriteDataLCD(DData[tmp+y]);//读取数据写入LCD
tmp+=16;
}
i+=8;
}
WriteCommandLCD(0x36,1); //扩充功能设定
WriteCommandLCD(0x30,1);
}

//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--);
};
}

#endif

热心网友 时间:2023-06-29 11:43

#include<reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

void delay(uint i) ;

/*TS12864A-3 端口定义*/
#define LCD_data P0 //数据口
sbit LCD_RS = P3^5; //寄存器选择输入
sbit LCD_RW = P3^6; //液晶读/写控制
sbit LCD_EN = P3^4; //液晶使能控制
sbit LCD_PSB = P3^7; //串/并方式控制
sbit wela = P2^6;
sbit la = P2^7;

#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

/*******************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/* */
/*******************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}

/*********************************************************/
/* */
/* 设定显示位置 */
/* */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //显示地址
}

/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void init12864()
{
LCD_PSB = 1; //并口方式
lcd_wcmd(0x34); //扩充指令操作
delay(50);
lcd_wcmd(0x30); //基本指令操作
delay(50);
lcd_wcmd(0x0C); //显示开,关光标
delay(50);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(50);
}

/************************************
向12864的X,Y位置写一个字符串buf
************************************/
void Out12864( uchar x,uchar y,uchar *buf )
{
lcd_pos(y,x) ;
for( ; *buf; buf++ )
lcd_wdat(*buf);
}
这是12864的子程序

热心网友 时间:2023-06-29 11:43

我用的是1602,没有用12864的,所以也不是很清楚,爱莫能助~~~~不过给你个建议研究一下12864的数据手册

热心网友 时间:2023-06-29 11:44

没看明白。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
茶映人生:苦尽甘来 海尔冰箱冷藏室和冷冻室都是空空的通上电工作会更耗电吗? 上菱冰箱用过7年了,1米5高有点大,我每天冰箱里面只冻半斤肉,冷藏室其它... 结婚前个人的保险结婚后转成存单是属于个人财产还是夫妻双方的财产_百 ... 六个月宝宝大便水样蛋花怎么办 宝宝拉蛋花样便怎么办 ...张仙亲送玉麒麟,一家老少皆欢喜,祖德宗功信可凭。 我见青山多妩媚,料青山见我应如是意思 料青山见我应如是的意思_百度知... 电脑导航用哪个比较好电脑用什么网址导航哪个更好用 电脑看地图哪个好电脑上的哪个地图软件好 zb-0|定时器屏不显示 定时器设置? 大屏幕关机后开机,定时器不动了 南昌为什么一直下雨? 南昌的天气什么时候会变暖呢? 南昌的大气压 谁来解释一下,青岛与南昌的空气的气温、湿度、风力差别,青岛会下雪么? 今天南昌空气质量怎么样 南昌室内空气质量检测的哪家好?哪家更专业点? 南昌每天直排超50万吨生活污水,这会对环境造成什么影响? 据南昌市环境监测站数据显示,南昌市2013年下半年平均空气质量指数(AQI)为216,首要污染物为可吸入颗粒 南昌室内空气治理公司哪家最专业?有没有推荐的? 郑州和南昌对比下? 成都和南昌相比,冬天哪个地方更冷。南昌冬天的气候是什么样啊。谢谢。 我是南昌的,这个时候的空气相对湿度在70%以上,有什么办法能把空气湿度降到50%以下?_百度问一问 南昌与杭州的气候比较 南昌的锋芒体现在哪里? 南昌天空是雾霾还是水汽 脚踝崴到了怎么能更好的恢复 江西南昌怎么样?一年四季的气温 环境 交通 空气 特别是冬天有没有雾霾 kg316t定时器怎么恢复出厂设置? 液晶显示器如何设置定时关机 桥乐定时器AL-06使用说明书 温控定时器YM-1说明书 md一268米迪节能定时器怎么用 微电脑定时器的时间怎么调整 上海天基电器路灯定时器怎么设置时问 计时器屏幕不显示怎么办? 品益定时器滚晶不显示是什么原因 微电脑定时器显示屏不显数字是坏了吗? 金科德tw-l12定时器怎么用 科沃德电子定时器说明书 爱剪切怎么让合并的视频出现不同的文字 爱剪切 如何去掉爱剪辑的自带片头 P头像最好的软件是什么? p头像用哪款软件 快手上面那些人拍段子用的是什么软件剪辑和添加字幕,还有如何做到熟练 手机哪个软件,可以Ps照片换人头像? 爱剪切里面插入的图片不显示,导不出视屏 爱剪切怎么把人头图片怎么跟着视频移动