📄 main.c
字号:
#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
#define LEVEL0 0x42
#define LEVEL1 0x82
#define LEVEL2 0x14
#define LEVEL3 0x24
#define LEVEL4 0x44
#define LEVEL5 0x84
#define LEVEL6 0x18
#define LEVEL7 0x28
#define LEVEL8 0x48
#define LEVEL9 0x88
#define LEVELEXIT 0x22
#define LEVELBEGIN 0x12
//;/CS=P1.5 /WR=P1.3 DATA=P1.2 ********************
sbit LCD_WR=P0^1;
sbit LCD_CS=P0^0;
sbit LCD_DA=P0^2;
sbit maichong=P0^4;
sbit jiaodu=P0^3;
sbit DIRECTION=P0^5;
bit timerflag;
uchar rtlevel; //发动机的实时档
///////////////////////键盘处理程序/////////////////////
uchar code key_number[]={0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};
//uchar code key_number1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void dlms(void); // delay time
uchar kbscan(void);
uchar changelevel(uchar level);
///////////////////////键盘处理程序/////////////////////
////////////////////////显示子程序//////////////////////
uchar LCD_pub_number[11]={0xbf,0x06,0xed,0xcf,0x5e,0xdb,0xfb,0x07,0xff,0xdf,0x00};// 显示码
uchar LCD_strdata[6]={0x00,0x00,0x00,0x00,0x00,0x00}; // 对应段码
uchar LCD_str[6]; //显示字符的真实值
void SendOneBit(bit blcddata);
void SData1_6(uint number);
void InitLcd();
void SCommand(uchar strco);
void ClsLcd();
void ChangeToBcd(int number);
void IntToChar(uint a);
void Delay_nop(int n );
////////////////////////显示子程序//////////////////////
////////////////////////马达驱动程序////////////////////
void MoUp(uchar n);
void MoDown(uchar n );
void mortermov(uchar level);
////////////////////////马达驱动程序////////////////////
void StartTestSpeed() ;
timer0() interrupt 1 //定时器中断0 、计数器中断1
{
timerflag=1;
TH0=-50000/256;
TL0=-50000%256;
}
main()
{
uint frequency,count,temp;
uchar level;
P1=0xf0;
InitLcd();
ClsLcd();
StartTestSpeed();
while(1)
{
if(timerflag)
{
count+=1;
if(count==200)// 每10秒钟为单位计数
{
frequency|=TH1;
frequency<<=8;
temp|=TL1;
frequency+=temp;
SData1_6(frequency*6); //一分钟的水滴数
temp=0;
frequency=0;
count=0;
TH1=0;
TL1=0;
}
timerflag=0;
}//计算速度
if(kbscan()==LEVELBEGIN) //进入键盘处理程序
{
while(1)
{
EA=0; //禁止所有中断
if( (level=kbscan())==LEVELEXIT )
{
EA=1;//开中断
break; //如果想退出键盘处理程序
}
else //设定不同的档次,并驱动电机转动
{
level=changelevel(level);
mortermov(level);
}
}
}
}
}
/*
main()
{
uchar level;
rtlevel=0;
level=10;
mortermov(level);
P0=0;
}*/
uchar changelevel(uchar level)
{
//uchar i;
switch(level)
{
case 0x42: level=1;break;
case 0x82: level=2;break;
case 0x14: level=3;break;
case 0x24: level=4;break;
case 0x44: level=5;break;
case 0x84: level=6;break;
case 0x18: level=7;break;
case 0x28: level=8;break;
case 0x48: level=9;break;
case 0x88: level=10;break;
default :break;
}
return level;
}
void StartTestSpeed()
{
TMOD=0x51; // T0 16bits timer, T1 16 bits counter
//TH0=-50000/256;
//TL0=-50000%256; //每50ms 产生一个定时器中断
TH0=-50000/256;
TL0=-50000%256;
TH1=0;
TL1=0;
IP=0x08;
EA=1; // enable cpu interrupt
ET0=1; // enable T/C0 interrupt timer
ET1=1; // enable T/C1 interrupt counter
TR0=1; // begin to timer
TR1=1; //begin to count
}
////---------马达驱动程序-----------------------
void mortermov(uchar level)
{
char n;
n=level-rtlevel;
if(n>0)
MoUp(n);
else
MoDown(n);
}
////---------马达驱动程序-----------------------
void MoUp(uchar n)
{
uint i;
for(;n>0;n--)
for(i=0;i<900;i++)
{
maichong=!maichong;
Delay_nop(250);
maichong=!maichong;
Delay_nop(250);
}
}
void MoDown(uchar n)
{
uint i;
DIRECTION=!DIRECTION;
for(;n>0;n--)
for(i=0;i<900;i++)
{
maichong=!maichong;
Delay_nop(250);
maichong=!maichong;
Delay_nop(250);
}
}
////---------马达驱动程序-----------------------
////---------显示子程序-------------------------
void SData1_6(uint number) //directory display if BCD
{
uchar i,j;
ChangeToBcd( number);
LCD_CS=1;
LCD_CS=0;
SendOneBit(1);
SendOneBit(0);
SendOneBit(1);
for(i=0;i<6;i++)
SendOneBit(0); //send first memory address;
for(i=0;i<6;i++)
for(j=0;j<8;j++)
{
if( (LCD_strdata[i]&0x80)==0x80 ) // if the lowest is 1
SendOneBit(1);
else
SendOneBit(0);
LCD_strdata[i]<<=1; //send from low to high
}
}
void ChangeToBcd( int number)
{
unsigned int i,a,temp;
//Int to char
a=number;
temp=a/10000;
if(a!=0) { a-=temp*10000; LCD_str[1]=temp; }
temp=a/1000;
if(a!=0) { a-=temp*1000; LCD_str[2]=temp; }
temp=a/100;
if(a!=0) { a-=temp*100; LCD_str[3]=temp; }
temp=a/10;
if(a!=0) { a-=temp*10; LCD_str[4]=temp; }
temp=a;
LCD_str[5]=temp;
//Int to char
for(i=0;i<6;i++)
{
switch(LCD_str[i])
{
case 0 : LCD_strdata[i]=LCD_pub_number[0];break;
case 1 : LCD_strdata[i]=LCD_pub_number[1];break;
case 2 : LCD_strdata[i]=LCD_pub_number[2];break;
case 3 : LCD_strdata[i]=LCD_pub_number[3];break;
case 4 : LCD_strdata[i]=LCD_pub_number[4];break;
case 5 : LCD_strdata[i]=LCD_pub_number[5];break;
case 6 : LCD_strdata[i]=LCD_pub_number[6];break;
case 7 : LCD_strdata[i]=LCD_pub_number[7];break;
case 8 : LCD_strdata[i]=LCD_pub_number[8];break;
case 9 : LCD_strdata[i]=LCD_pub_number[9];break;
default :break;
}
}
}
void Delay_nop(int n )
{
for(;n>0;n--)
_nop_();
}
void InitLcd()
{
Delay_nop(500);
SCommand(0x29); // INITIALIZE
SCommand(0x14); //EX CRYSTAL
SCommand(0x01); //SYS EN
SCommand(0x03); //LCD ON
}
void SCommand(uchar strco)
{
uchar i;
LCD_CS=1;
Delay_nop(5);
LCD_CS=0;
SendOneBit(1);
SendOneBit(0);
SendOneBit(0);
for(i=0;i<8;i++)
{
if( (strco&0x80)==0x80) //if the highest bit is 1
{
Delay_nop(4);
SendOneBit(1);
}
else
{ SendOneBit(0); Delay_nop(4);}
strco<<=1;
}
SendOneBit(0);
LCD_CS=1;
}
void SendOneBit(bit blcddata)
{
Delay_nop(5);
LCD_WR=0;
Delay_nop(5);
LCD_DA=blcddata;
Delay_nop(5);
LCD_WR=1;
}
void ClsLcd()
{
uchar i;
LCD_CS=1;
LCD_CS=0;
_nop_();
SendOneBit(1);
SendOneBit(0);
SendOneBit(1);
for(i=0;i<5;i++)
{
SendOneBit(0);
}//five zeros for the first memorys
for(i=0;i<128;i++)
{
SendOneBit(0);
}//all datas are 0 to make the display disable
}
/////---------显示子程序-------------------------
/////---------键盘处理------------------------
void dlms(void)
{
uchar i;
for(i=200;i>0;i--){}
}
uchar kbscan(void) //select the key
{
uchar sccode,recode,j,a;
P1=0xf0;
if((P1&0xf0)!=0xf0) //如果有键按下
{ dlms();
if((P1&0xf0)!=0xf0)
{ sccode=0xfe; //逐行扫描初值
while((sccode&0x10)!=0)
{
P1=sccode; //输出行扫描码
if((P1&0xf0)!=0xf0) //如果本行有键按下
{
a=P1;
j=a&0xf0;
recode=j|0x0f;
return((~sccode)+(~recode)); //返回字节特征码
}
else
sccode=(sccode<<1)|0x01; //行扫描码左移一位
}
}
}
return(0); //无键按下返回0
}
/////---------键盘处理------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -