?? square.c
字號(hào):
#include <reg51.h>
#include <intrins.h>
/******************************與編譯器無關(guān)的數(shù)據(jù)類型定義*********************************/
typedef unsigned char uint8; // 無符號(hào)8位整型變量
typedef signed char int8; // 有符號(hào)8位整型變量
typedef unsigned short uint16; // 無符號(hào)16位整型變量
typedef signed short int16; // 有符號(hào)16位整型變量
typedef unsigned long uint32; // 無符號(hào)32位整型變量
typedef signed long int32; // 有符號(hào)32位整型變量
typedef float fp32; // 單精度浮點(diǎn)數(shù)(32位長(zhǎng)度)
typedef double fp64; // 雙精度浮點(diǎn)數(shù)(64位長(zhǎng)度)
/********************************MPU管腳定義***********************************************/
#define KEY P2 //鍵盤管腳定義
sbit OUT = P1^0; //方波輸出管腳定義
/********************************全局變量定義***********************************************/
uint8 code Tab[36]={0x14,0x46,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,0x65, //顯示數(shù)據(jù)
0x3A,0x39,0x39,0x39,0x39,0x2E,0x39,0x39,0x39,0x48,
0x7A,0x50,0x65,0x72,0x69,0x6F,0x64,0x3A,0x30,0x30,
0x30,0x31,0x30,0x30,0x75,0x53};
int8 data1,data2,data3,data4=1; //顯示緩存
uint16 k=0,count=1; //軟件計(jì)數(shù)寄存器
/********************************************************************************************
* 函數(shù)名稱:Delay()
* 功 能:軟件延時(shí)
* 入口參數(shù):count 延時(shí)參數(shù),值越大,延時(shí)越長(zhǎng)
* 出口參數(shù):無
*********************************************************************************************/
void Delay(uint16 count)
{
uint8 i;
while(--count!=0)
{
for(i=0;i<125;i++); // i 從0加到125,在12M晶體下CPU大概耗時(shí)1毫秒
}
}
/********************************************************************************************
* 函數(shù)名稱:Key()
* 功 能:掃描鍵值
* 入口參數(shù):無
* 出口參數(shù):Key_value 有按鍵返回鍵值,否則返回0
*********************************************************************************************/
uint8 Key(void)
{
uint8 Key_value;
if(KEY!=0xFF) //有鍵按下
{
Delay(20); //延時(shí)去抖動(dòng)
if(KEY!=0xFF) //確認(rèn)真的有鍵按下
{
Key_value=KEY;
switch(Key_value) //根據(jù)按鍵情況賦鍵值
{
case(0xFE):{Key_value=8;}
break;
case(0xFD):{Key_value=7;}
break;
case(0xFB):{Key_value=6;}
break;
case(0xF7):{Key_value=5;}
break;
case(0xEF):{Key_value=4;}
break;
case(0xDF):{Key_value=3;}
break;
case(0xBF):{Key_value=2;}
break;
case(0x7F):{Key_value=1;}
break;
}
}
else Key_value=0; //此次按鍵為誤碼,返回0
}
else Key_value=0; //無鍵按下,返回0
return Key_value;
}
/********************************************************************************************
* 函數(shù)名稱:COM_init()
* 功 能:串口初始化,用于LCD數(shù)據(jù)發(fā)送
* 入口參數(shù):無
* 出口參數(shù):無
*********************************************************************************************/
void COM_init(void)
{
TMOD=0x22; //定時(shí)器T1設(shè)置(方式2)
TL1=0xFA; //置定時(shí)器T1初值
TH1=0xFA; //串口波特率9600(晶振11.0592M)
TR1=1; //啟動(dòng)T1
PCON=0x80; //SMOD=1
SCON=0x50; //設(shè)置串口方式1工作
}
/********************************************************************************************
* 函數(shù)名稱:Time0_init()
* 功 能:定時(shí)器0初始化
* 入口參數(shù):無
* 出口參數(shù):無
*********************************************************************************************/
void Time0_init(void)
{
TMOD=0x22; //定時(shí)器T0設(shè)置(方式2)
TL0=0xD2; //置定時(shí)器T0初值
TH0=0xD2; //定時(shí)50uS(晶振11.0592M)
EA=1; //開CPU中斷
ET0=1; //允許T0中斷
TR0=1; //啟動(dòng)T0
}
/********************************************************************************************
* 函數(shù)名稱:Timer0()
* 功 能:定時(shí)器T0中斷服務(wù)程序
* 入口參數(shù):無
* 出口參數(shù):無
*********************************************************************************************/
void Timer0(void) interrupt 1
{
k++;
if(k>=count)
{
k=0;
OUT=!OUT; //方波輸出
}
}
/********************************************************************************************
* 函數(shù)名稱:LCD_write()
* 功 能:向LCD寫入1Byte數(shù)據(jù)
* 入口參數(shù):data 要寫入的數(shù)據(jù)
* 出口參數(shù):無
*********************************************************************************************/
void LCD_write(uint8 DATA)
{
EA=0; //關(guān)中斷
SBUF=DATA; //向LCD串行寫入1Byte數(shù)據(jù)
Delay(10); //延時(shí)
EA=1; //開中斷
}
/********************************************************************************************
* 函數(shù)名稱:Init()
* 功 能:程序初始化
* 入口參數(shù):無
* 出口參數(shù):無
*********************************************************************************************/
void Init(void)
{
uint8 i;
Time0_init();
COM_init();
P1=0; //清P0口
for(i=0;i<36;i++) //LCD顯示初始化
{
LCD_write(Tab[i]);
}
}
/********************************************************************************************
* 函數(shù)名稱:main()
* 功 能:主程序
* 入口參數(shù):無
* 出口參數(shù):無
*********************************************************************************************/
void main(void)
{
int8 key_value; //鍵值存放寄存器
int8 DP; //指示光標(biāo)位置寄存器
uint32 freq;
Init();
while(1)
{
key_value=Key();
if(key_value!=0)
{
switch(key_value)
{
case(1):
{
DP=0x1E;
LCD_write(0x10); //指示光標(biāo)定位
LCD_write(0x1E);
LCD_write(0x15); //光標(biāo)閃爍
}
break;
case(5):
{
if(DP!=0)
{
LCD_write(0x14); //光標(biāo)消隱
EA=0;
count=data1*1000+data2*100+data3*10+data4;
EA=1;
if(count==0)
{
count=1;
LCD_write(0x10); //指示光標(biāo)定位
LCD_write(0x1E);
LCD_write(0x31);
}
if(count==1)
{
LCD_write(0x10); //指示光標(biāo)定位
LCD_write(0x0A);
LCD_write(0x39);
LCD_write(0x39);
LCD_write(0x39);
LCD_write(0x39);
LCD_write(0x2E);
LCD_write(0x39);
LCD_write(0x39);
LCD_write(0x39);
}
else
{
freq=10000000/count;
LCD_write(0x10); //指示光標(biāo)定位
LCD_write(0x0A);
LCD_write(freq/1000000+0x30);
LCD_write((freq/100000)%10+0x30);
LCD_write((freq/10000)%10+0x30);
LCD_write((freq/1000)%10+0x30);
LCD_write(0x2E);
LCD_write((freq/100)%10+0x30);
LCD_write((freq/10)%10+0x30);
LCD_write(freq%10+0x30);
}
DP=0;
}
}
break;
case(3):
{
if(DP!=0)
{
switch(DP)
{
case(0x1B):
{
data1++; //數(shù)據(jù)增
if(data1==10){data1=0;}
LCD_write(data1+0x30); //更新顯示
LCD_write(0x10); //指示光標(biāo)重新定位
LCD_write(DP);
}
break;
case(0x1C):
{
data2++; //數(shù)據(jù)增
if(data2==10){data2=0;}
LCD_write(data2+0x30); //更新顯示
LCD_write(0x10); //指示光標(biāo)重新定位
LCD_write(DP);
}
break;
case(0x1D):
{
data3++; //數(shù)據(jù)增
if(data3==10){data3=0;}
LCD_write(data3+0x30); //更新顯示
LCD_write(0x10); //指示光標(biāo)重新定位
LCD_write(DP);
}
break;
case(0x1E):
{
data4++; //數(shù)據(jù)增
if(data4==10){data4=0;}
LCD_write(data4+0x30); //更新顯示
LCD_write(0x10); //指示光標(biāo)重新定位
LCD_write(DP);
}
break;
}
}
}
break;
case(7):
{
if(DP!=0)
{
switch(DP)
{
case(0x1B):
{
data1--; //數(shù)據(jù)減
if(data1<0){data1=9;}
LCD_write(data1+0x30); //更新顯示
LCD_write(0x10); //指示光標(biāo)重新定位
LCD_write(DP);
}
break;
case(0x1C):
{
data2--; //數(shù)據(jù)減
if(data2<0){data2=9;}
LCD_write(data2+0x30); //更新顯示
LCD_write(0x10); //指示光標(biāo)重新定位
LCD_write(DP);
}
break;
case(0x1D):
{
data3--; //數(shù)據(jù)減
if(data3<0){data3=9;}
LCD_write(data3+0x30); //更新顯示
LCD_write(0x10); //指示光標(biāo)重新定位
LCD_write(DP);
}
break;
case(0x1E):
{
data4--; //數(shù)據(jù)減
if(data4<0){data4=9;}
LCD_write(data4+0x30); //更新顯示
LCD_write(0x10); //指示光標(biāo)重新定位
LCD_write(DP);
}
break;
}
}
}
break;
case(2):
{
if(DP!=0)
{
DP--; //光標(biāo)左移
if(DP==0x1A){DP=0x1B;}
LCD_write(0x10); //指示光標(biāo)重新定位
LCD_write(DP);
}
}
break;
case(6):
{
if(DP!=0)
{
DP++; //光標(biāo)右移
if(DP==0x1F){DP=0x1E;}
LCD_write(0x10); //指示光標(biāo)重新定位
LCD_write(DP);
}
}
break;
}
Delay(100);
}
}
}
******************************************************************exp666********************************************
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -