?? ?
字號:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit LCM_RS=P3^2; //定義LCD引腳
//sbit LCM_RW=P3^3;
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 UpdateScale(void);
void UpdateLCM();
void UpdateDDS(void);
unsigned char code num1[] = {"KM0123456789Hz"};
unsigned char code num2[] = {"abcdefghijklmnopqrstuvwxyz"};
unsigned char disp_freq[16];
uchar disp_freq_1[16];
uchar disp_freq_2[16];
uchar IntNum = 0; //中斷次數(shù)計數(shù)
uchar KeyV; //鍵值
uchar BF=0; //標識是否有字符被收到
ulong freq=0;
ulong word=0;
//uchar number;
uint i,x,j;
uint a=0;
/*----------------------------------主程序-------------------------------*/
void main()
{
Delay400Ms(); //啟動等待,等LCM講入工作狀態(tài)
LCMInit(); //LCM初始化
LCMInit();
LCMInit();
DisplayListChar(0,0,"zhang xiao guang");
Delay5Ms(); //延時
// InitDDS(); //向DDS送入初設值
IT1 = 0; //設外部中斷1為低電平觸發(fā)
EX1 = 1; //開中斷
EA=1;
i=0;
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(x=0;x<j;x++)
{DisplayOneChar(16-j+x,0,disp_freq_1[x]);
//DisplayOneChar(16-i+x,1,disp_freq_2[x]);
}
for(x=0;x<i;x++)
{//DisplayOneChar(16-j+x,0,disp_freq_1[x]);
DisplayOneChar(16-i+x,1,disp_freq_2[x]);
}
//UpdateScale();
// for(number=0;number<16;number++)
//disp_freq_temp[number]=disp_freq[number];
//switch(a)
//{case 0:a=1;
// break;
// case 1:a=0;
// break;
// default:
// break;
//}
word=predefine*freq; //計算頻率控制字
//UpdateDDS(); //更新DDS function to be completed
freq=0; //清空數(shù)據(jù)緩沖區(qū)
i=0;
}
else
{
i++;
UpdateLCM(); //更新LCD顯示
if ((KeyV==0x42) || (KeyV==0x3A) || (KeyV==0x33))
{
if(!a)
{
j=i;
a=1;
i=0;
}
}
}
BF=0; //按鍵標志歸零
EA=1; //重新開中斷
}
}
/*---------------------------------函數(shù)-----------------------------------*/
//寫數(shù)據(jù)
void WriteDataLCM(unsigned char WDLCM)
{
LCM_Data = WDLCM;
LCM_RS=1;
//LCM_RW=0;
LCM_E=0; //若晶振速度太高可以在這后加小的延時
Delay5Ms();
LCM_E=0; //延時
LCM_E=1;
}
//寫指令
void WriteCommandLCM(unsigned char WCLCM)
{
LCM_Data = WCLCM;
LCM_RS = 0;
//LCM_RW = 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); //發(fā)命令字
WriteDataLCM(DData); //發(fā)數(shù)據(jù)
}
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 = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
}
}
void Keyboard_out(void) interrupt 2
{
if ((IntNum > 0) && (IntNum < 9))
{
KeyV = KeyV >> 1; //因鍵盤數(shù)據(jù)是低>>高,結合上一句所以右移一位
if (Key_Data) KeyV = KeyV | 0x80; //當鍵盤數(shù)據(jù)線為1時為1到最高位
}
IntNum++;
while (!Key_CLK); //等待PS/2CLK拉高
if (IntNum > 10)
{
IntNum = 0; //當中斷11次后表示一幀數(shù)據(jù)收完,清變量準備下一次接收
BF = 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 0x33: //按下"h"
freq=freq*1;
//DisplayOneChar(14,a,'H');
//DisplayOneChar(15,a,'z');
//a=1;
disp_freq[i]='H';
disp_freq[i=i+1]='z';
break;
case 0x42: // 按下"k"
freq=freq*1000;
//DisplayOneChar(13,a,'K');
//DisplayOneChar(14,a,'H');
//DisplayOneChar(15,a,'z');
//a=1;
disp_freq[i]='K';
disp_freq[i=i+1]='H';
disp_freq[i=i+1]='z';
break;
case 0x3A: // 按下"m"
freq=freq*1000000;
//DisplayOneChar(13,a,'M');
//DisplayOneChar(14,a,'H');
//DisplayOneChar(15,a,'z');
//a=1;
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 UpdateScale(void)
{
DisplayOneChar(14,a,'H');
DisplayOneChar(15,a,'z');
switch (KeyV)
{
case 0x42:
DisplayOneChar(13,a,'K');
UpdateLCM(3);
break;
case 0x3A:
DisplayOneChar(13,a,'M');
UpdateLCM(3);
break;
case 0x5A:
UpdateLCM(2);
break;
}
//if(a==1)
// a=0;
}*/
void UpdateLCM()
{
int b,c,number1,number2;
if(!a)
{
for(b=0;b<i;b++)
{
//for(number1=j;number<j+1;number++)
disp_freq_1[number1]=disp_freq[b];
DisplayOneChar(number1,0,disp_freq_1[number1]);
number1++;
}
number1=0;
}
else
{
//for( k=0;k<j;k++)
//DisplayOneChar(k,0,disp_freq_1[k]);
for(c=0;c<i;c++)
{
//for(number2=0;number<16;number++)
disp_freq_2[number2]=disp_freq[c];
DisplayOneChar(c,1,disp_freq[c]);
number2++;
}
number2=0;
}
}
/*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 + -