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
复制代码
|