173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

单片机驱动屏程序

htxw 2023-03-15 资讯中心 42 ℃

单片机液晶显示驱动程序(用C语言写的)

** 1602A液晶屏驱动程序** 晶 振 频 率:11.0592M*****************************************/#include reg51.h#define uchar unsigned char#define uint unsigned int sbit LCM_E=P3^5;//定义接口sbit LCM_RW=P3^6;sbit LCM_RS=P3^7; #define LCM_Data P1//数据接口 void LCM_WriteData(uchar WDLCM);void LCM_WriteCommand(uchar WCLCM,BuysC);uchar LCM_ReadData(void);uchar LCM_ReadStatus(void);void LCM_Init(void);void DisplayOneChar(uchar X, uchar Y, uchar DData);void DisplayListChar(uchar X, uchar Y, uchar code *DData);void Delay5Ms(void);void Delay400Ms(void); uchar code uctech[] = {"1602A"};uchar code net[] = {""}; void main(void){Delay400Ms();//启动等待,等LCM讲入工作状态LCM_Init();//LCM初始化Delay5Ms();//延时片刻(可不要) DisplayListChar(6, 1, uctech);DisplayListChar(0, 0, net);LCM_ReadData();//测试用句无意义LCM_Data=255;while(1);} /****************************1602A写数据函数**************************//*函数原型:void LCM_WriteData(uchar WDLCM)/*函数功能:1602A写数据/*输入参数:要写入的数据/*输出参数:无/*调用模块:/**********************************************************************/ void LCM_WriteData(uchar WDLCM){LCM_ReadStatus();//检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0;//若晶振速度太高可以在这后加小的延时LCM_E = 0;//延时LCM_E = 1;} /****************************1602A写指令函数**************************//*函数原型:void LCM_WriteCommand(uchar WCLCM,BuysC)/*函数功能:1602A写指令/*输入参数:要写入的指令/*输出参数:无/*调用模块:/**********************************************************************/ void LCM_WriteCommand(uchar WCLCM,BuysC)//BuysC为0时忽略忙检测{if (BuysC) LCM_ReadStatus();//根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;} /****************************1602A读数据函数**************************//*函数原型:uchar LCM_ReadData(void)/*函数功能:1602A读数据/*输入参数:无/*输出参数:1602A返回的数据/*调用模块:/**********************************************************************/ uchar LCM_ReadData(void){LCM_RS = 1;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);} /****************************1602A读状态函数**************************//*函数原型:uchar LCM_ReadData(void)/*函数功能:1602A读状态/*输入参数:无/*输出参数:1602A返回的状态/*调用模块:/**********************************************************************/ uchar LCM_ReadStatus(void){LCM_Data = 0xFF;LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;while (LCM_Data 0x80);//检测忙信号return(LCM_Data);} /****************************1602A初始化函数**************************//*函数原型:void LCM_Init(void)/*函数功能:1602A初始化/*输入参数:无/*输出参数:无/*调用模块:/**********************************************************************/ void LCM_Init(void){LCM_Data = 0;LCM_WriteCommand(0x38,0);//三次显示模式设置,不检测忙信号Delay5Ms();LCM_WriteCommand(0x38,0);Delay5Ms();LCM_WriteCommand(0x38,0);Delay5Ms(); LCM_WriteCommand(0x38,1);//显示模式设置,开始要求每次检测忙信号LCM_WriteCommand(0x08,1);//关闭显示LCM_WriteCommand(0x01,1);//显示清屏LCM_WriteCommand(0x06,1);// 显示光标移动设置LCM_WriteCommand(0x0C,1);// 显示开及光标设置} /******************1602A按指定位置显示一个字符函数**********************//*函数原型:void DisplayOneChar(uchar X, uchar Y, uchar DData)/*函数功能:1602A按指定位置显示一个字符/*输入参数:X坐标 Y坐标 要显示的字符/*输出参数:无/*调用模块:/**********************************************************************/ void DisplayOneChar(uchar X, uchar Y, uchar DData){Y = 0x1;X = 0xF;//限制X不能大于15,Y不能大于1if (Y) X |= 0x40;//当要显示第二行时地址码+0x40;X |= 0x80;// 算出指令码LCM_WriteCommand(X, 0);//这里不检测忙信号,发送地址码LCM_WriteData(DData);} /*******************1602A按指定位置显示一串字符函数*********************//*函数原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData)/*函数功能:1602A按指定位置显示一个字符/*输入参数:X坐标 Y坐标 要显示字符串的首地址/*输出参数:无/*调用模块:/**********************************************************************/ void DisplayListChar(uchar X, uchar Y, uchar code *DData){uchar ListLength;ListLength = 0;Y = 0x1;X = 0xF;//限制X不能大于15,Y不能大于1while (DData[ListLength]0x20)//若到达字串尾则退出{if (X = 0xF)//X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]);//显示单个字符ListLength++;X++;}}} /********************5ms延时函数************************//*函数原型:void Delay5Ms(void)/*函数功能:5ms延时/*输入参数:无/*输出参数:无/*调用模块:/**********************************************************************/ void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);} /********************400ms延时延时函数************************//*函数原型:void Delay400Ms(void)/*函数功能:400ms延时延时/*输入参数:无/*输出参数:无/*调用模块:/**********************************************************************/ void Delay400Ms(void){uchar TempCycA = 5;unsigned int TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);};}

单片机怎样驱动LCD呢,具体程序好,奖励大快急用

/*

必要操作:正确连接1602

*/

#includereg51.h

#define uint unsigned int //定义常用数据类型替代码

#define uchar unsigned char

#define dat P0 //定义LCD1602的数据口为P0

sbit rs=P1^0; //定义RS口为P10

sbit rw=P1^1; //定义RW口为P11

sbit e=P1^2; //定义E口为P12

uchar busy; //1602判忙标志

void delay_1ms(void); //延时程序

void display(void); //显示程序

void busy_1602(void); //液晶查忙程序

void shj_1602(uchar a); //液晶写数据程序

void int_1602(void); //液晶初始化

void zhl_1602(uchar a); //液晶写指令程序

void main(void) //主程序开始

{

for(;;)

{

display(); //在大循环内调用显示函数,一直显示

}

}

void delay_1ms(void) //延时程序

{

uchar i,j;

for(i=0;i10;i++)

for(j=0;j20;j++);

}

void display(void) //液晶显示程序

{

uchar i; //定义计数值

uchar table0[16]={"Hello bin MCU! "}; //定义LCD1602显示2行的字符

uchar table1[16]={"--chen qi bin "};

int_1602(); //初始化1602

zhl_1602(0x80); //写指令

for(i=0;i16;i++) //发送数据第一行

{

shj_1602(table0[i]);

}

zhl_1602(0xc0);

for(i=0;i16;i++) //发送数据第二行

{

shj_1602(table1[i]);

}

}

void busy_1602(void) //查询忙碌标志信号程序

{

do

{

e=0;

rw=1;//高电平读操作

rs=0;//指令

e=1;

busy=dat;

e=0;

delay_1ms();

} while(busy0x10==1); //忙就一直读,此读忙是读的DB7 do while 用法是当while里面成立时就一直do

}

void zhl_1602(uchar a) //写指令到LCM程序 写数据写指令前都需要查忙

{

busy_1602();

e=0;

rw=0;

rs=0;

e=1;

dat=a; //e=1变为e=0下降沿写入

e=0;

}

void shj_1602(uchar a) //写数据到LCM程序 LCM为液晶显示模块

{

busy_1602();

e=0;

rw=0;//低电平写操作

rs=1;//数据

e=1;

dat=a;

e=0;

}

void int_1602(void) //启动LCM程序 初始化LCD

{

zhl_1602(0x38); //显示模式设置

zhl_1602(0x0c); //显示开关光标设置

zhl_1602(0x06);

}

如何使用单片机去驱动控制触摸屏

 触摸屏是目前最简单、方便、自然的而且又适用于中国多媒体信息查询国情的输入设备,它具有坚固耐用、反应速度快、节省空间、易于交流等许多优点。触摸屏技术被认为是未来人机交互科技的主流方向之一,相关的产业及其产品的应用也正在成为一个热点。但是传统的触摸屏因为成本比较高而难以适用到更广泛的工业控制设备中,目前武汉谷鑫科技的触摸屏设计方案而能够很好的解决这个难题,利用触摸屏、单片机和液晶屏搭建了一个人机界面系统。

在用C8051F020实现对TFT6448BS-5.7的控制过程中,采用总线方式进行控制。因为TFT6448BS-5.7液晶控制器自带有锁存功能,所以在使用总线方式进行控制时并不需要外加锁存芯片,只须使用单片机C8051F020的P0、P2、P3口就可以实现。在系统加电之前,由于C8051F020的典型工作电压为3.3V,TFT6448BS-5.7的工作电压是5V,对P0、P2、P3口相应连接管脚进行驱动能力扩展;根据控制需求,通过P0、P2、P3端口寄存器,将相应端口的引脚配置成漏极输出方式。将P3口配置成为数据/地址输出口,输出地址时,其为地址总线的低八位,P2口提供高位地址;传输数据时,其为8位数据总线口。系统加电后,使得TFT6448BS-5.7的片选信号/CS有效,通过往TFT6448BS-5.7的相应行、列、控制、数据寄存器中写入数据,即可用C8051F020芯片实现对TFT6448BS-5.7的控制,从而实现彩色液晶的显示控制。

该触摸屏硬件接口电路的具体工作过程如下:

1、如图2所示电路,连接好线路,给电源输入端、参考基准电压端接入3.3V的直流电源;

2、结合软件编程对AD0进行初始化,系统处于休眠状态时,软件开中断,截止PNP1、PNP2、NPN1,饱和导通NPN2;

3、等待触摸屏被触摸;

4、若触摸屏上发生触摸,进入中断服务程序,关掉外部中断,进行短暂延时以消除外界抖动。通过判断中断输入口P0.0的电平变化,确定抖动是否结束。通过软件截止PNP2、NPN2,饱和导通PNP1、NPN1,选择模数转换通道AIN0.0,采集触摸点的X方向坐标值,延时等待转换结束,移出转换结果;电极电压切换,通过软件置位,截止PNP1、NPN1,饱和导通PNP2、NPN2,选择模数转换通道AIN0.1,采集触摸点的Y方向坐标值,延时等待转换结束,移出转换结果;

5、通过将采集到的X和Y坐标值与设定的按键边界值进行比较,若比较结果为真,则切换到相应的子页面,否则,重新开中断,并返回主程序;

6、触摸屏硬件接口电路工作过程重新回到步骤3,继续等待下一次触摸。

单片机驱动屏程序的介绍就聊到这里吧,感谢您花时间阅读,谢谢。

本文标签:单片机驱动屏程序

<