📄 4个菜单 1 7上下调.txt
字号:
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
//数据口定义
#define lcd1602_bus P3
//引脚定义
sbit rs_1602=P2^5;
sbit rw_1602=P2^6;
sbit e_1602=P2^7;
sbit cs_549=P0^2;
sbit data_549=P0^3;
sbit clk_549=P0^4;
sbit SCL=P2^0;
sbit SDA=P2^1;
uchar state;
uchar bdata adc_549;
sbit adc_549low=adc_549^0;
uchar s;
uchar mea,m[2];
uint in[2];
//ASCII码表
/**********0---9**************/
unsigned int code table[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
/**********a---z**************/
unsigned int code table1[26]={0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a};
/***********A---Z*************/
unsigned int code table2[26]={0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,
0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a};
//基本变量定义
//uchar cnt;
// unsigned int d[3];
/*
hexstoascii2(unsigned int hex)
{
d[0]=table[hex/10];
hex=hex%10;
d[1]=table[hex];
}
hexstoascii3(unsigned int hex)
{
d[0]=table[hex/100];
hex=hex%100;
d[1]=table[hex/10];
hex=hex%10;
d[2]=table[hex];
}
*/
/**********************************lcd1602******************************************/
/*********延时子程序**********/
void delay(uchar dy)
{
while(--dy);
}
/*****************启动总线**********************/
void IICStart(void)
{
SCL=0;
SDA=1;SCL=1;SCL=1;SCL=1;SCL=1;
SDA=0;SDA=0;SDA=0;SDA=0;SDA=0;
SCL=0;SCL=0;SCL=0;
SDA=1;
}
/*****************停止IIC总线****************/
void IICStop(void)
{
SCL=0;SDA=0;
SCL=1;SCL=1;SCL=1;SCL=1;
SDA=1;SDA=1;SDA=1;SDA=1;
SCL=0;
}
/**************检查应答位*******************/
bit IICRecAck(void)
{
SCL=0;
SDA=1;
SCL=1;SCL=1;SCL=1;SCL=1;SCL=1;
CY=SDA; //因为返回值总是放在CY中的
SCL=0;
return(CY);
}
/*****************不对IIC总线产生应答***************/
void IICNoAck(void)
{
SDA=1;
SCL=1;SCL=1;SCL=1;SCL=1;SCL=1;SCL=0;
}
/*******************向IIC总线写数据*********************/
void IICSendByte(uchar sendbyte)
{
uchar j;
for(j=8;j>0;j--)
{
SCL=0;
sendbyte<<=1; //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
SDA=CY;
SCL=1;
}
SCL=0;
}
/**********************从IIC总线上读数据子程序**********/
uchar IICReceiveByte(void)
{
uchar receivebyte,ii;
SCL=0;
ii=8;
while(ii--)
{
SCL=1;
receivebyte=(receivebyte<<1)|SDA;
SCL=0;
}
return(receivebyte);
}
/**************************************************************************************************
*
*IIC总线写函数
*函数声明:bit IICWrite(uint address,uchar buf);
*函数参数:address为AT24C64的地址,buf为要在这个地址写的数据
*函数作用:往地址写一个字节的数据
**************************************************************************************************/
bit IICWrite(uint address,uchar buf)
{
bit flag;
flag=1;
IICStart();
IICSendByte(0xa0);
if(IICRecAck())
flag=0;
IICSendByte((uchar)(address>>8));
if(IICRecAck())
flag=0;
IICSendByte((uchar)address);
if(IICRecAck())
flag=0;
IICSendByte(buf);
if(IICRecAck())
flag=0;
IICStop();
delay(255);
delay(255);
delay(255);
delay(255);
return(flag);
}
uchar IICRead(uint address)
{ uchar buf;
IICStart();
IICSendByte(0xa0);
if(IICRecAck())
buf=0xff;
IICSendByte((uchar)(address>>8));
if(IICRecAck())
buf=0xff;
IICSendByte((uchar)address);
if(IICRecAck())
buf=0xff;
IICStart();
IICSendByte(0xa1);
if(IICRecAck())
buf=0xff;
buf=IICReceiveByte();
//read last byte data
IICNoAck();
IICStop();
delay(50);
return(buf);
}
/**************adc_549convert*******************/
uchar adc_549convert()
{ unsigned char i;
cs_549=1;
cs_549=0;
clk_549=0;
for(i=0;i<8;i++)
{
data_549=1;
clk_549=1;
adc_549low=data_549; //read one bit
clk_549=0;
if(i<7) adc_549=adc_549<<1;//经八次左移adc初值可以不付
}
clk_549=0;
cs_549=1;
return(adc_549);
}
/***********忙判断标志,返回一个位BF********************/
bit lcd1602_busy(void)
{
uchar busy_flag;
rs_1602=0;
rw_1602=1;
_nop_();
e_1602=1;
_nop_();
lcd1602_bus=0xff;
busy_flag=lcd1602_bus; //e在高电平时读
e_1602=0;
return (bit)(busy_flag&0x80); //BF=1; BUSY 返回一个位
}
/********写命令,有两个参数,一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1;
判断: 为0
***************/
void lcd1602_wrcmd(unsigned char lcdcmd)
{
while(lcd1602_busy()); //等待空闲
lcd1602_bus=lcdcmd;
rs_1602=0;
rw_1602=0;
_nop_();
e_1602=1;
_nop_();
_nop_();
e_1602=0; //产生一个下沿
}
/***************向液晶写数据******************/
void lcd1602_wrdata(uchar lcddata)
{
while(lcd1602_busy()); //等待空闲
lcd1602_bus=lcddata; //在下沿的时候写数据
rs_1602=1;
rw_1602=0;
_nop_();
e_1602=1;
_nop_();
_nop_();
e_1602=0;
//lcd_bus=0xff;
}
/************液晶的清屏************/
void lcd1602_clear(void)
{
lcd1602_wrcmd(0x01); //液晶清屏控制字 并延时>40us
delay(100);
}
/***********1602液晶的初始化***************/
void lcd1602_init(void)
{
lcd1602_wrcmd(0x38); //功能设置-----8位数据接口,两行显示,5*7点阵字符显示
delay(100);
lcd1602_wrcmd(0x0e); //显示开关控制----显示开关开,光标开关关,闪烁开关关
delay(100);
lcd1602_wrcmd(0x06); //输入方式设置,AC自增1, S=0;
delay(100);
lcd1602_wrcmd(0x01); //清屏
delay(100);
}
/**********4*4矩阵键盘****************/
/************
矩阵键盘
D---------P1.0
C---------P1.1
B---------P1.2
A---------P1.3
1---------P1.4
2---------P1.5
3---------P1.6
4---------P1.7
按键值的分布
D C B A
1〔15 14 13 12〕
2〔11 10 9 8〕
3〔 7 6 5 4〕
4〔 3 2 1 0〕
利用已有的那个按键程序
*************/
uchar getkey_ii()
{
unsigned char keycode=0xff,temp,i;
P1=0x0f;
temp=P1&0x0f;
if(temp!=0x0f) //判是否有键按下
{
// beep=0;
P1=0xef; //自第0行开始扫描输出,自列读入键值
for(i=0;i<4;i++)
{
temp=P1&0x0f;
if(temp==0x07) //判断第0列是否有键按下
{
keycode=i*4+0;
break;
}
else if(temp==0x0b)//判断第1列是否有键按下
{
keycode=i*4+1;
break;
}
else if(temp==0x0d)//判断第2列是否有键按下
{
keycode=i*4+2;
break;
}
else if(temp==0x0e)//判断第3列是否有键按下
{
keycode=i*4+3;
break;
}
P1=(P1<<1)|0x1;
}
while((P1&0x0f)!=0x0f) //等待释放
{
P1=0x0f;
}
// beep=1;
}
return keycode;
}
/**********lcd1602 测试程序**********************/
//上电后lcd1602 显示
// "System of P.H.Y"
// " Welcome!"
//
//分别按矩阵最右下角的三个按键 分别出现下面几个显示界面:
// key=0 显示
// " 2005/7/28";
// " 20:27";
// key=1 显示
// "<>?+-*/()="
// "`-=\[]/.,;"
// key=2 显示
// "!@#$%^&*()_+|~"
// "!@#$%^&*()_+|~"
void xianshi(uchar j)
{ uchar str[][9]={{"1.0ne "},{"2.two "},{"3.three"},{"4.four "},{"1.0ne "}};
uchar i;
unsigned char offset=0x80;
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
lcd1602_wrcmd(offset+0x00);
lcd1602_wrdata('#');
for(i=0;i<9;i++) lcd1602_wrdata(str[j+0][i]);
lcd1602_wrcmd(offset+0x40);
lcd1602_wrdata(' ');
for(i=0;i<9;i++) lcd1602_wrdata(str[j+1][i]);
}
void main()
{
uchar i;
// uint t;
uchar j=0; //标记
unsigned char offset=0x80; //定义一个偏移地址变量,lcd1602 写入控制字时用到
unsigned char key;
delay(2);
lcd1602_bus=0xff;
lcd1602_init();
lcd1602_wrcmd(offset+0x00);
xianshi(0);
// lcd1602_clear();
while(1)
{
key=getkey_ii();
// hexstoascii2(count1);
// hexstoascii3(count2);
if(key==4)
{
j=j+1;
if(j>3)j=0;
xianshi(j);
}
if (key==0)
{
if (j==0) j=4;
j=j-1;
xianshi(j);
// lcd1602_clear();
// lcd1602_wrcmd(offset+0x00);
// a=a*10+4;
// xianshi(a);
//lcd1602_wrcmd(offset+0x40);
//for(i=0;i<15;i++) lcd1602_wrdata(str22[i]);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -