📄 square.c
字号:
#include <reg51.h>
#include <intrins.h>
/******************************与编译器无关的数据类型定义*********************************/
typedef unsigned char uint8; // 无符号8位整型变量
typedef signed char int8; // 有符号8位整型变量
typedef unsigned short uint16; // 无符号16位整型变量
typedef signed short int16; // 有符号16位整型变量
typedef unsigned long uint32; // 无符号32位整型变量
typedef signed long int32; // 有符号32位整型变量
typedef float fp32; // 单精度浮点数(32位长度)
typedef double fp64; // 双精度浮点数(64位长度)
/********************************MPU管脚定义***********************************************/
#define KEY P2 //键盘管脚定义
sbit OUT = P1^0; //方波输出管脚定义
/********************************全局变量定义***********************************************/
uint8 code Tab[36]={0x14,0x46,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,0x65, //显示数据
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; //软件计数寄存器
/********************************************************************************************
* 函数名称:Delay()
* 功 能:软件延时
* 入口参数:count 延时参数,值越大,延时越长
* 出口参数:无
*********************************************************************************************/
void Delay(uint16 count)
{
uint8 i;
while(--count!=0)
{
for(i=0;i<125;i++); // i 从0加到125,在12M晶体下CPU大概耗时1毫秒
}
}
/********************************************************************************************
* 函数名称:Key()
* 功 能:扫描键值
* 入口参数:无
* 出口参数:Key_value 有按键返回键值,否则返回0
*********************************************************************************************/
uint8 Key(void)
{
uint8 Key_value;
if(KEY!=0xFF) //有键按下
{
Delay(20); //延时去抖动
if(KEY!=0xFF) //确认真的有键按下
{
Key_value=KEY;
switch(Key_value) //根据按键情况赋键值
{
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;
}
/********************************************************************************************
* 函数名称:COM_init()
* 功 能:串口初始化,用于LCD数据发送
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void COM_init(void)
{
TMOD=0x22; //定时器T1设置(方式2)
TL1=0xFA; //置定时器T1初值
TH1=0xFA; //串口波特率9600(晶振11.0592M)
TR1=1; //启动T1
PCON=0x80; //SMOD=1
SCON=0x50; //设置串口方式1工作
}
/********************************************************************************************
* 函数名称:Time0_init()
* 功 能:定时器0初始化
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Time0_init(void)
{
TMOD=0x22; //定时器T0设置(方式2)
TL0=0xD2; //置定时器T0初值
TH0=0xD2; //定时50uS(晶振11.0592M)
EA=1; //开CPU中断
ET0=1; //允许T0中断
TR0=1; //启动T0
}
/********************************************************************************************
* 函数名称:Timer0()
* 功 能:定时器T0中断服务程序
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Timer0(void) interrupt 1
{
k++;
if(k>=count)
{
k=0;
OUT=!OUT; //方波输出
}
}
/********************************************************************************************
* 函数名称:LCD_write()
* 功 能:向LCD写入1Byte数据
* 入口参数:data 要写入的数据
* 出口参数:无
*********************************************************************************************/
void LCD_write(uint8 DATA)
{
EA=0; //关中断
SBUF=DATA; //向LCD串行写入1Byte数据
Delay(10); //延时
EA=1; //开中断
}
/********************************************************************************************
* 函数名称:Init()
* 功 能:程序初始化
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Init(void)
{
uint8 i;
Time0_init();
COM_init();
P1=0; //清P0口
for(i=0;i<36;i++) //LCD显示初始化
{
LCD_write(Tab[i]);
}
}
/********************************************************************************************
* 函数名称:main()
* 功 能:主程序
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void main(void)
{
int8 key_value; //键值存放寄存器
int8 DP; //指示光标位置寄存器
uint32 freq;
Init();
while(1)
{
key_value=Key();
if(key_value!=0)
{
switch(key_value)
{
case(1):
{
DP=0x1E;
LCD_write(0x10); //指示光标定位
LCD_write(0x1E);
LCD_write(0x15); //光标闪烁
}
break;
case(5):
{
if(DP!=0)
{
LCD_write(0x14); //光标消隐
EA=0;
count=data1*1000+data2*100+data3*10+data4;
EA=1;
if(count==0)
{
count=1;
LCD_write(0x10); //指示光标定位
LCD_write(0x1E);
LCD_write(0x31);
}
if(count==1)
{
LCD_write(0x10); //指示光标定位
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); //指示光标定位
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++; //数据增
if(data1==10){data1=0;}
LCD_write(data1+0x30); //更新显示
LCD_write(0x10); //指示光标重新定位
LCD_write(DP);
}
break;
case(0x1C):
{
data2++; //数据增
if(data2==10){data2=0;}
LCD_write(data2+0x30); //更新显示
LCD_write(0x10); //指示光标重新定位
LCD_write(DP);
}
break;
case(0x1D):
{
data3++; //数据增
if(data3==10){data3=0;}
LCD_write(data3+0x30); //更新显示
LCD_write(0x10); //指示光标重新定位
LCD_write(DP);
}
break;
case(0x1E):
{
data4++; //数据增
if(data4==10){data4=0;}
LCD_write(data4+0x30); //更新显示
LCD_write(0x10); //指示光标重新定位
LCD_write(DP);
}
break;
}
}
}
break;
case(7):
{
if(DP!=0)
{
switch(DP)
{
case(0x1B):
{
data1--; //数据减
if(data1<0){data1=9;}
LCD_write(data1+0x30); //更新显示
LCD_write(0x10); //指示光标重新定位
LCD_write(DP);
}
break;
case(0x1C):
{
data2--; //数据减
if(data2<0){data2=9;}
LCD_write(data2+0x30); //更新显示
LCD_write(0x10); //指示光标重新定位
LCD_write(DP);
}
break;
case(0x1D):
{
data3--; //数据减
if(data3<0){data3=9;}
LCD_write(data3+0x30); //更新显示
LCD_write(0x10); //指示光标重新定位
LCD_write(DP);
}
break;
case(0x1E):
{
data4--; //数据减
if(data4<0){data4=9;}
LCD_write(data4+0x30); //更新显示
LCD_write(0x10); //指示光标重新定位
LCD_write(DP);
}
break;
}
}
}
break;
case(2):
{
if(DP!=0)
{
DP--; //光标左移
if(DP==0x1A){DP=0x1B;}
LCD_write(0x10); //指示光标重新定位
LCD_write(DP);
}
}
break;
case(6):
{
if(DP!=0)
{
DP++; //光标右移
if(DP==0x1F){DP=0x1E;}
LCD_write(0x10); //指示光标重新定位
LCD_write(DP);
}
}
break;
}
Delay(100);
}
}
}
******************************************************************exp666********************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -