`

51单片机学习笔记,操作1602液晶

阅读更多

TX-1C板

 

操作并行模式的1602液晶
液晶第1,2脚是gnd和vcc
第3脚是对比度调节
第4脚是数据/指令选择端RS
第5脚是读写选择端R/W,我们这次只写不读,故直接接地
第6脚是读写使能EN
第7到14脚是数据口,我们接STC89C52RC的P0口
第15,16脚是背光源

 

最终液晶显示

Tom is playing  the TNT game!

#include <reg52.h>
#include "MY51.H"

void write_data(uchar dataValue); //写数据
void write_cmd(uchar cmdValue);	 //写指令

uchar code tableLCD1[]  ={"Tom is playing"};
uchar code tableLCD2[]  ={"  the TNT game!"};

void lcdInit()		//初始化函数
{
	dula=0;			 //
	wela=0;			 //防止数码管误显,浪费电流
	lcdEN=low; 	 	 //给高脉冲之前的状态
	lcdRS=high; 	 //初始给高电平,其实上电默认也是高电平
	write_cmd(0x38); //液晶显示模式初始化
	write_cmd(0x0c); //打开液晶,不显示光标,光标不闪烁
	write_cmd(0x06); //地址指针加加,且光标加加 
	write_cmd(0x01); //液晶数据指针和显示清零
}

void write_cmd(uchar cmdValue) //写入指令
{
	lcdRS=low;  	//刚上电时是高电平,低电平时是指令模式
	P0=cmdValue;
	delayms(1);
	lcdEN=high;    //一个高脉冲把数据读走
	delayms(1);
	lcdEN=low;
}

void write_data(uchar dataValue) //写入数据
{
	lcdRS=high;     //高电平是数据模式
	P0=dataValue;
	delayms(1);
	lcdEN=high;      //给一个高脉冲
	delayms(1);
	lcdEN=low;
}

void lcdShow(uchar* pValue) //液晶显示函数
{
	while(*pValue!='\0')
	{
		write_data(*pValue);
		pValue++;
	}
}

void main()
{
	lcdInit();				 //初始化
	lcdShow(tableLCD1);	 //显示第一行
	write_cmd(0x80+0x40); //重新设置数据显示指针
	lcdShow(tableLCD2);	 //显示第二行
	while(1);
}

 

#ifndef _MY51_H_
#define _MY51_H_
#include <math.h>
#include <intrins.h>

typedef int   				int16  ;
typedef int   				INT16  ;
typedef unsigned int    uint16 ;
typedef unsigned int    UINT16 ;
typedef unsigned short  uint ;
typedef unsigned short  UINT ;
typedef unsigned short  word ;
typedef unsigned short  WORD ;
typedef unsigned long   uint32 ;
typedef unsigned long   UINT32 ;
typedef unsigned long   DWORD ;
typedef unsigned long   dword ;
typedef signed long	   int32	 ;
typedef signed long	   INT32  ;
typedef float		    	    float32	 ;
typedef double		    	double64  ;
typedef signed char		int8 ;
typedef signed char 		INT8 ;
typedef unsigned char	byte ;
typedef unsigned char    BYTE 	 ;		//WINDOWS的windef.h里面是这么定义的
typedef unsigned char	uchar ;
typedef unsigned char	UCHAR ;
typedef unsigned char	UINT8 ;
typedef unsigned char	uint8 ;
typedef unsigned char	BOOL	 ;		//windows中定义BOOL为int
typedef unsigned char	bool	 ;		    //bool是c++的内置类型

#define TRUE     1
#define true     1
#define FALSE    0
#define false    0

#define open     1    //open和close用于 标志打开和关闭状态
#define OPEN     1
#define close    0
#define CLOSE    0
#define lock     0
#define start    1
#define START    1
#define stop     0
#define STOP     0
#define keyDown  0
#define keyUp    1
#define gnd       0  //接地
#define GND       0  //接地
#define high	1  //高电平
#define low		0   //低电平
#define yes		1
#define YES     1
#define no		0
#define NO      0

sbit dula =P2^6;  //段选锁存器控制  控制笔段
sbit wela =P2^7;  //位选锁存器控制  控制位置

#define led P1    //灯总线控制
sbit led0=P1^0;   //8个led灯,阴极送低电平点亮
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;

sbit keyS2=P3^4; 	//4个独立按键
sbit keyS3=P3^5;
sbit keyS4=P3^6;
sbit keyS5=P3^7;
sbit lcdEN=P3^4; //液晶通讯使能端en,高脉冲有效
sbit lcdRS=P3^5; //液晶第4脚,RS,低电平是指令模式,高电平是数据模式
//sbit lcdR/W    //液晶第5脚,低电平是写入模式,因为我们只写不读,所以接地

sbit csda=P3^2;  //DAC0832模数转换cs口
sbit adwr=P3^6; //ADC0804这个同DAC0832
sbit dawr=P3^6;
sbit adrd=P3^7;  //ADC0804
sbit beep=P2^3;  //蜂鸣器
void displaySMG(uint8 one,uint8 two,uint8 three,uint8 four,uint8 five,uint8 six,uint8 dot); 
void delayms(uint16 ms);
void T0_Work();

void delayms(uint16 ms)  //软延时函数
{
	uint16 i,j;
	for(i=ms;i>0;i--)
	{
        for(j=113;j>0;j--)
        {}
	}
}
///////////////////////////////////////////////////////////////////////////
#define dark	0x11  //在段中,0x11是第17号元素,为0是低电平,数码管不亮
#define dotDark 0xff //小数点全暗时
uint8 code table[]= { 			//0~F外加小数点和空输出的数码管编码
	0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3
	0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7
	0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B
	0x39 , 0x5e , 0x79 , 0x71 , // C D E F
	0x80 , 0x00 ,0x40           // . 空  负号    空时是第0x11号也就是第17号元素
 };

uint8 dotTable[]={		   //小数点位置
    0xff ,                 //全暗
	0xfe , 0xfd , 0xfb ,   //1 2 3
	0xf7 , 0xef , 0xdf     //4 5 6                    
};
/////////////////////////////////////////////////////////////////////////////
uint8   TH0Cout=0 ;	    //初值	
uint8   TL0Cout=0 ;	   
uint16  T0IntCout=0;     //中断计数
uint16  T0IntCountAll=0; //(N-1)/65536+1;  //总中断次数
bool    bT0Delay=false;  //使用延时函数标志,初始未用
bool    bT0Over=false; 	 //中断处理函数执行结果之一

void startT0(uint32 ms)  //开启定时器
{	
	float32   	t=ms/1000.0;		   		 //定时时间
	double64    fox =11.0592*(pow(10,6));   //晶振频率
	uint32    	N=(t*fox)/12 ; 				 //定时器总计数值

	TH0Cout =(65536-N%65536)/256;      	 //装入计时值零头计数初值
	TL0Cout =(65536-N%65536)%256;
	T0IntCountAll=(N-1)/65536+1;			 //总中断次数
	TMOD=TMOD | 0x01; 						 //设置定时器0的工作方式为1
	
	EA =open;   //打开总中断
	ET0=open;   //打开定时器中断

	TH0=TH0Cout;  //定时器装入初值
	TL0=TL0Cout;
	TR0=start;	 //启动定时器
}

void delayT0(uint32 ms)		//硬延时函数,自己乱写的不好用,求指点
{
	startT0(ms);				//启动定时器
	bT0Delay=true;    		//告诉T0定时器,起用延时模式
	while(bT0Over==false);	//时间没到的话继续检测
	bT0Over=false;				//时间到了,让标志复位
}

void T0_times() interrupt 1 //T0定时器中断函数
{
	T0IntCout++;
	if(T0IntCout==T0IntCountAll)  //达到总中断次数值
	{	
		T0IntCout=0; 		 //中断次数清零,重新计时
		bT0Over=true;     //时间真的到了
		if(bT0Delay)		//本次中断是用来延时的吗
		{
			TR0=stop; 		 //如果是由延时函数开启T0的话,关闭T0
			return;
		}

		TH0=TH0Cout;   		//循环定时的话要重装初值,每次定时1秒,重装一次
		TL0=TL0Cout;
		T0_Work();     		//工作函数
	}
}

////////////////////////////////////////////////////////////////////////////////
void displaySMG(uint8 oneWela,uint8 twoWela,uint8 threeWela,uint8 fourWela,uint8 fiveWela,uint8 sixWela,uint8 dot)
{	
    //控制6位数码管显示函数,不显示的位用参数dark,保留ADC0804的片选信号
    uint8 csadState=0x80&P0;  				//提取最高位,即ADC0804的片选信号
    uint8 tempP0=((csadState==0)?0x7f:0xff); //数码管位选初始信号,阴极全置高电平
    P0=tempP0;		//0x7f表示数码管不亮,同时ADC0804片选有效
    wela=1;			//注:wela和dula上电默认为1
    P0=tempP0;
    wela=0;

    P0=0;			    //由于数码管是共阴极的,阳极送低电平,灯不亮,防止灯误亮
    dula=1;
    P0=0;
    dula=0;	 		    //段选数据清空并锁定
//////////////////////////oneWela
    {  //消除叠影,数码管阴极置高电平,并锁存
        P0=tempP0;
        wela=1;			
        P0=tempP0;
        wela=0;
    }
    P0=0;       	//低电平送到数码管阳极,避免数码管误亮
    dula=1;
    P0=table[oneWela]|((0x01&dot)?0x00:0x80);   //送段数据,叠加小数点的显示
    dula=0;
    

    P0=tempP0;          //送位数据前关闭所有显示,并保持csad信号
    wela=1;
    P0=tempP0 & 0xfe;   //0111 1110最高位是AD片选,低6位是数码管位选,低电平有效
    wela=0;
    delayms(2);

/////////////////////////twoWela
    {  //消除叠影
        P0=tempP0;
        wela=1;			
        P0=tempP0;
        wela=0;
    }
    P0=0;
    dula=1;
    P0=table[twoWela]|((0x02&dot)?0x00:0x80);
    dula=0;
    
    P0=tempP0;
    wela=1;
    P0=tempP0 & 0xfd;    //0111 1101
    wela=0;
    delayms(2);

/////////////////////////threeWela
    {  //消除叠影
        P0=tempP0;
        wela=1;			
        P0=tempP0;
        wela=0;
    }
    P0=0;
    dula=1;
    P0=table[threeWela]|((0x04&dot)?0x00:0x80);
    dula=0;

    P0=tempP0;
    wela=1;
    P0=tempP0 & 0xfb;    //0111 1011
    wela=0;
    delayms(2);

/////////////////////////fourWela
    {  //消除叠影
        P0=tempP0;
        wela=1;			
        P0=tempP0;
        wela=0;
    }
    P0=0;
    dula=1;
    P0=table[fourWela]|((0x08&dot)?0x00:0x80);
    dula=0;

    P0=tempP0;
    wela=1;
    P0=tempP0 & 0xf7;   //0111 0111
    wela=0;
    delayms(2);

/////////////////////////fiveWela
    {  //消除叠影
        P0=tempP0;
        wela=1;			
        P0=tempP0;
        wela=0;
    }
    P0=0;
    dula=1;
    P0=table[fiveWela]|((0x10&dot)?0x00:0x80);
    dula=0;

    P0=tempP0;
    wela=1;
    P0=tempP0 & 0xef; 		//0110 1111
    wela=0;
    delayms(2);

/////////////////////////sixWela
    {  //消除叠影
        P0=tempP0;
        wela=1;			
        P0=tempP0;
        wela=0;
    }
    P0=0;
    dula=1;
    P0=table[sixWela]|((0x20&dot)?0x00:0x80);
    dula=0;

    P0=tempP0;
    wela=1;
    P0=tempP0 & 0xdf;   //0101 1111
    wela=0;
    delayms(2);
}

#endif

 

 

 

0
4
分享到:
评论

相关推荐

    江科大51单片机教程的笔记.zip

    在江科大的51单片机教程笔记中,我们还可以期待看到各种实例解析和实验指导,帮助学习者掌握实际操作技能。通过这些笔记,你可以一步步了解如何配置硬件电路,编写控制程序,调试系统,最终实现特定的功能。 总结来...

    51单片机学习资料.pdf

    51单片机的生产厂商众多,其中知名的国外厂商有Atmel、飞利浦、Intel和西门子等,国内代表厂商是宏晶公司生产的STC单片机系列。以STC89C52RC型号为例,它具有8051内核,属于CMOS产品,内部程序存储器为8KB,内部RAM...

    HJ2GAVR单片机学习笔记1概述.pdf

    HJ-2G AVR单片机学习笔记主要介绍了开发板的介绍、核心处理器ATMEGA16、锁存器、数码管、矩阵键盘、液晶1602接口、串口接口MAX232、DS1302时钟电路等内容,为学习单片机的开发者提供了丰富的资源和知识。

    51单片机经典40个实验(学习单片机必备!!)

    这个名为"51单片机经典40个实验(学习单片机必备!!)"的资源,显然是一个专门为想要深入理解单片机工作原理和编程的爱好者或学生设计的实践教程。它包含了40个精心挑选的实验,每个实验都旨在帮助学习者逐步掌握...

    单片机学习笔记ourdev_530143.pdf

    ### 单片机学习笔记ourdev_530143.pdf知识点总结 #### 一、开发板配件 - **HJ-1G开发板主机**:作为学习平台的核心部分,该开发板集成了多种功能模块,适用于初学者进行单片机的学习与实践。 - **STC单片机**:已...

    51单片机的OV7670摄像头驱动程序

    总结来说,驱动OV7670摄像头并在9325彩屏液晶上显示图像,涉及到51单片机的SPI接口编程、摄像头传感器的寄存器配置、LCD显示控制等多个方面的知识。这个项目为学习者提供了一个实际的嵌入式系统设计案例,有助于提升...

    C51单片机学习记录.zip

    这个“C51单片机学习记录.zip”文件很可能包含了某位学习者在探索C51单片机过程中积累的资料和心得,其子目录“c51-master”可能包含源代码、教程、笔记或其他相关资源。 1. **C51编程语言**:C51是为8051单片机...

    51单片机ge-processin开发笔记

    【51单片机GE-Processing开发笔记】 51单片机是微控制器领域中非常经典的一款产品,因其内核简单、易于上手而被广泛应用于各种嵌入式系统设计中。GE-Processing则是一种在51单片机上进行图像处理的开发工具或框架,...

    51学习笔记

    根据给定的信息,我们可以整理出以下关于51单片机的学习知识点: ### 一、51单片机的基础概念 1. **时钟频率与波特率**:在51单片机的学习过程中,理解时钟频率(如10Hz)与波特率(如5bit/s)之间的关系非常重要...

    基于S51的单片机时钟设计

    总结来说,"基于S51的单片机时钟设计"项目涵盖了单片机硬件接口设计、软件编程、定时器应用以及中断处理等多个方面,是一个综合性的学习和实践课题,对于提升单片机技术的实际应用能力大有裨益。

    USB下载 51单片机开发板与应用

    ### USB下载51单片机开发板与应用 #### 一、引言 随着计算机技术的不断进步,传统的...此外,搭配STC89C52芯片和丰富的实验板资源,不仅能够提高学习效率,还能帮助学习者深入理解和掌握51单片机的相关知识和技术。

    普中51-A2开发板资料.7z

    1. **普中51单片机开发攻略--A2.pdf**:这可能是开发板的用户指南或教程,涵盖基本操作、示例项目和常见问题解答。 2. **5--开发工具.rar**:可能包含开发环境的安装教程、配置指南和使用技巧。 3. **5--实验程序....

    用Proteus制作的郭天翔《十天学会51单片机》的学习板

    用Proteus制作的郭天翔《十天学会51单片机》的学习板 本文链接:http://blog.sina.com.cn/s/blog_574d08530100hqw0.html 此篇文章说明: 1.想免费体验郭天翔TX-1C的51学习板而又不怕麻烦请往下看,怕麻烦的请再去...

    51单片机C语言实例(400例).zip

    《51单片机C语言实例精粹》 在电子工程和嵌入式系统的世界里,51单片机以其简单易用、成本低廉的特点,成为初学者和工程师...在学习过程中,读者可以通过实际操作,加深对51单片机和C语言的理解,提升自身的编程技能。

    51单片机开发实验板使用说明

    根据给定文件的信息,我们可以详细地探讨51单片机学习开发实验板的相关知识点,包括其功能、使用方法以及各种接口和技术的应用。 ### 一、51单片机学习开发实验板简介 #### 1.1 SYB-2A单片机学习开发实验板概述 ...

    十天学会单片机实例100

    【51单片机驱动LCD1602程序设计】是单片机学习中的一个重要环节,LCD1602是一种常见的字符型液晶显示器,广泛应用于各种电子设备的数据显示。51单片机是Intel 8051系列的微控制器,具有8位数据总线和16位地址总线,...

Global site tag (gtag.js) - Google Analytics