📄 液晶显示2.c
字号:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit LCM_RS=P3^2; //定义LCD引脚
sbit LCM_E=P3^4;
#define LCM_Data P0
sbit Key_Data=P3^5; //定义Keyboard引脚
sbit Key_CLK=P3^3;
//#define DDS_Word P0 //定义DDS控制字接口
//sbit RESET_9852=P1^1;
//sbit PD1=P1^5;
//sbit PD2=P1^6;
//sbit FQ_UD=P1^7;
//sbit W_CLK=P3^6;
//sbit RD_CLK=P3^7;
//sbit A0=P2^0;
//sbit A1=P2^1;
//sbit A2=P2^2;
//sbit A3=P2^3;
//sbit A4=P2^4;
//sbit A5=P2^5;
//sbit EN0=P2^6;
//sbit EN1=P2^7;
#define predefine 131 //2^32除以DDS晶振频率(32.768MHz)
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);
//void Decode(unsigned char ScanCode);
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM);
void UpdateData(void);
void UpdateLCM();
//void UpdateDDS(void);
uchar code table1[]={"Please enter the "};
uchar code table2[]={"Frequency and Phase "};
uchar code num1[] = {".KM0123456789Hz"};
uchar code num2[] = {"abcdefghijklmnopqrstuvwxyz"};
uchar disp_freq[16];
uchar disp_freq_1[16];
uchar disp_freq_2[16];
uchar IntNum = 0; //中断次数计数
uchar KeyV; //键值
uchar BF=0; //标识是否有字符被收到
uchar fale=0;
ulong freq=0;
ulong word=0;
uint i,j,k=0,a=0;
/*----------------------------------主程序-------------------------------*/
void main()
{
uchar c,q,d;
Delay400Ms(); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
LCMInit();
LCMInit();
IT1 = 0; //设外部中断1为低电平触发
EX1 = 1; //开中断
EA=1;
i=0;
//while(1);
//DisplayListChar(0,0,"zhang xiao guang");
//Delay5Ms(); //延时
// InitDDS(); //向DDS送入初设值
if(!fale)
{
while(!fale)
{
WriteCommandLCM(0x80);
Delay5Ms();
for(c=0;c<20;c++)
{
WriteDataLCM(table1[c]);
Delay5Ms();
}
WriteCommandLCM(0xc0);
Delay5Ms();
for(c=0;c<20;c++)
{
WriteDataLCM(table2[c]);
Delay5Ms();
}
for(c=0;c<20;c++)
{
WriteCommandLCM(0x18);
//Delay5Ms();
Delay400Ms();
}
}
}
while(1)
{
do
{
if (BF)
{
if (i==0)
{
WriteCommandLCM(0x01); //清屏
break;
}
else break;
}
}while(1);
EA=0;
UpdateData();
if (KeyV==0x5A) //按下"Enter"更新频率
{
WriteCommandLCM(0x01);
Delay5Ms();
a=0;
for(d=0;d<q;d++)
{DisplayOneChar(16-q+d,0,disp_freq_1[d]);
;
}
for(d=0;d<j;d++)
{
DisplayOneChar(16-j+d,1,disp_freq_2[d]);
}
if(k) //计算频率控制字
{
word=predefine*freq/10^(q-k);
}
word=predefine*freq;
//UpdateDDS(); //更新DDS function to be completed
freq=0; //清空数据缓冲区
i=0;
k=0;
}
else
{
i++;
UpdateLCM(); //更新LCD显示
if ((KeyV==0x42) || (KeyV==0x3A) || (KeyV==0x33))
{
if(!a)
{
q=i;
a=1;
i=0;
}
}
}
BF=0; //按键标志归零
EA=1; //重新开中断
}
}
/*---------------------------------函数-----------------------------------*/
//写数据
void WriteDataLCM(unsigned char WDLCM)
{
LCM_Data = WDLCM;
LCM_RS=1;
LCM_E=0; //若晶振速度太高可以在这后加小的延时
Delay5Ms();
LCM_E=0; //延时
LCM_E=1;
}
//写指令
void WriteCommandLCM(unsigned char WCLCM)
{
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_E = 0;
Delay5Ms();
LCM_E = 0;
LCM_E = 1;
}
void LCMInit(void) //LCM初始化
{
LCM_Data=0;
WriteCommandLCM(0x38); //三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCM(0x38);
Delay5Ms();
WriteCommandLCM(0x38);
Delay5Ms();
WriteCommandLCM(0x38); //显示模式设置,开始要求每次检测忙信号
Delay5Ms();
WriteCommandLCM(0x08); //关闭显示
Delay5Ms();
WriteCommandLCM(0x01); //显示清屏
Delay5Ms();
WriteCommandLCM(0x06); // 显示光标移动设置
Delay5Ms();
WriteCommandLCM(0x0C); // 显示开及光标设置
Delay5Ms();
}
//按指定位置显示一个字符
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); //发命令字
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]>0x19) //若到达字串尾则退出
{
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 = 3;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
}
}
void Keyboard_out(void) interrupt 2
{
if ((IntNum > 0) && (IntNum < 9))
{
KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
}
IntNum++;
while (!Key_CLK); //等待PS/2CLK拉高
if (IntNum > 10)
{
IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
BF = 1; //标识有字符输入完了
fale=1;
EA = 0; //关中断等显示完后再开中断
}
}
void UpdateData(void)
{
switch (KeyV)
{
case 0x45: // 按下"0"
freq=freq*10+0;
disp_freq[i]='0';
break;
case 0x16: // 按下"1"
freq=freq*10+1;
disp_freq[i]='1';
break;
case 0x1E: // 按下"2"
freq=freq*10+2;
disp_freq[i]='2';
break;
case 0x26: // 按下"3"
freq=freq*10+3;
disp_freq[i]='3';
break;
case 0x25: // 按下"4"
freq=freq*10+4;
disp_freq[i]='4';
break;
case 0x2E: // 按下"5"
freq=freq*10+5;
disp_freq[i]='5';
break;
case 0x36: // 按下"6"
freq=freq*10+6;
disp_freq[i]='6';
break;
case 0x3D: // 按下"7"
freq=freq*10+7;
disp_freq[i]='7';
break;
case 0x3E: // 按下"8"
freq=freq*10+8;
disp_freq[i]='8';
break;
case 0x46: // 按下"9"
freq=freq*10+9;
disp_freq[i]='9';
break;
case 0x49: // 按下"."
disp_freq[i]='.';
k=i;
break;
case 0x33: //按下"h"
freq=freq*1;
disp_freq[i]='H';
disp_freq[i=i+1]='z';
break;
case 0x42: // 按下"k"
freq=freq*1000;
disp_freq[i]='K';
disp_freq[i=i+1]='H';
disp_freq[i=i+1]='z';
break;
case 0x3A: // 按下"m"
freq=freq*1000000;
disp_freq[i]='M';
disp_freq[i=i+1]='H';
disp_freq[i=i+1]='z';
break;
case 0x1c: disp_freq[i]='a';
break;
case 0x32: disp_freq[i]='b';
break;
case 0x21: disp_freq[i]='c';
break;
case 0x23: disp_freq[i]='d';
break;
case 0x24: disp_freq[i]='e';
break;
case 0x2b: disp_freq[i]='f';
break;
case 0x34: disp_freq[i]='g';
break;
//case 0x33: disp_freq[i]='h';
//break;
case 0x43: disp_freq[i]='i';
break;
case 0x3b: disp_freq[i]='j';
break;
//case 0x42: disp_freq[i]='k';
//break;
case 0x4b: disp_freq[i]='l';
break;
//case 0x3a: disp_freq[i]='m';
//break;
case 0x31: disp_freq[i]='n';
break;
case 0x44: disp_freq[i]='o';
break;
case 0x4d: disp_freq[i]='p';
break;
case 0x15: disp_freq[i]='q';
break;
case 0x2d: disp_freq[i]='r';
break;
case 0x1b: disp_freq[i]='s';
break;
case 0x2c: disp_freq[i]='t';
break;
case 0x3c: disp_freq[i]='u';
break;
case 0x2a: disp_freq[i]='v';
break;
case 0x1d: disp_freq[i]='w';
break;
case 0x22: disp_freq[i]='x';
break;
case 0x35: disp_freq[i]='w';
break;
case 0x1a: disp_freq[i]='z';
break;
}
}
void UpdateLCM()
{
int b,c,number1,number2;
if(!a)
{
for(b=0;b<i;b++)
{
disp_freq_1[number1]=disp_freq[b];
DisplayOneChar(number1,0,disp_freq_1[number1]);
number1++;
}
number1=0;
}
else
{
for(c=0;c<i;c++)
{
disp_freq_2[number2]=disp_freq[c];
DisplayOneChar(c,1,disp_freq[c]);
number2++;
}
number2=0;
j=i;
}
}
/*void UpdateDDS(void)
{
int j;
unsigned char CON[5];
RESET_9852=0;
RESET_9852=1;
RESET_9852=0;
FQ_UD=0;
CON[0]=0x00;
for(j=4;j>0;j--)
{
CON[j]=word;
word=word>>8;
}
for(j=0;j<5;j++)
{
W_CLK=0;
DDS_Word=CON[j];
W_CLK=1;
}
FQ_UD=1;
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -