📄 tree.c
字号:
#include<reg52.h>
#define uc unsigned char
#define ui unsigned int
sbit E=P3^4;
sbit RW=P0^2; //读写控制
sbit RS=P0^3; //数据 指令选择
sbit L=P0^1; //左屏
sbit R=P0^0; //右屏
sbit Busy=P2^7;
uc i,j,licheng_ge=0,licheng_shi=0,licheng_bai=0,licheng_qian=0;
float dj=3.5,zj,lc;
const uc code HZ[][32] = {
0x00,0x00,0xF8,0x49,0x4A,0x4C,0x48,0xF8,// 单
0x48,0x4C,0x4A,0x49,0xFC,0x08,0x00,0x00,
0x10,0x10,0x17,0x12,0x12,0x12,0x12,0xFF,
0x12,0x12,0x12,0x12,0x13,0x18,0x10,0x00,
0x80,0x40,0x20,0xF8,0x87,0x40,0x20,0x90,// 价
0x08,0x07,0x08,0x90,0x20,0xC0,0x40,0x00,
0x00,0x00,0x00,0xFF,0x00,0x80,0x40,0x3F,
0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0xFE,0x12,0x12,0x12,0x12,0xFE,// 里
0x12,0x12,0x12,0x12,0xFF,0x02,0x00,0x00,
0x40,0x48,0x49,0x49,0x49,0x49,0x49,0x7F,
0x49,0x49,0x49,0x49,0x4D,0x68,0x40,0x00,
0x10,0x12,0xD2,0xFE,0x91,0x11,0x80,0xBF,// 程
0xA1,0xA1,0xA1,0xA1,0xBF,0x80,0x00,0x00,
0x04,0x03,0x00,0xFF,0x00,0x41,0x44,0x44,
0x44,0x7F,0x44,0x44,0x44,0x44,0x40,0x00,
0x00,0x00,0x00,0xF8,0x89,0x8E,0x88,0x88,//总
0x88,0x8C,0x8B,0xF8,0x00,0x00,0x00,0x00,
0x00,0x20,0x38,0x00,0x3C,0x40,0x40,0x42,
0x4C,0x40,0x40,0x70,0x04,0x18,0x30,0x00,
0x40,0x20,0xF0,0x1C,0x47,0x22,0x10,0xC8,//价
0x04,0x03,0x04,0xD8,0x30,0x60,0x20,0x00,
0x00,0x00,0xFF,0x00,0x80,0x60,0x18,0x07,
0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,
0x00,0xFC,0x84,0x84,0x84,0xFE,0x14,0x10,//时
0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x00,
0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,
0x00,0x23,0x40,0x80,0x7F,0x00,0x00,0x00,
0x00,0xF8,0x01,0x02,0xF6,0x10,0x12,0x12,//间
0x12,0x12,0xFA,0x12,0x02,0xFF,0x02,0x00,
0x00,0xFF,0x00,0x00,0x3F,0x11,0x11,0x11,
0x11,0x11,0x3F,0x40,0x80,0x7F,0x00,0x00,
0x00,0x20,0x20,0x22,0x22,0xE2,0x22,0x22,//元
0x22,0xE2,0x22,0x22,0x22,0x20,0x20,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,
0x00,0x3F,0x40,0x40,0x40,0x40,0x70,0x00,
0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,//欢
0x0F,0xE8,0x08,0x08,0x28,0x18,0x08,0x00,
0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,
0x0C,0x03,0x06,0x18,0x30,0x60,0x20,0x00,
0x40,0x41,0xCE,0x04,0x00,0xFC,0x04,0x02,//迎
0x02,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
0x40,0x20,0x1F,0x20,0x40,0x47,0x42,0x41,
0x40,0x5F,0x40,0x42,0x44,0x43,0x40,0x00,
0x08,0x28,0x2A,0x2A,0xFA,0x0A,0x0A,0xFE,//乘
0x0A,0x09,0xF9,0x49,0x29,0x2C,0x88,0x00,
0x22,0x22,0x11,0x11,0x0B,0x0C,0x06,0x7F,
0x02,0x04,0x0D,0x19,0x31,0x11,0x01,0x00,
0x00,0x80,0x60,0x1C,0x20,0xC0,0x00,0xFF,//坐
0x00,0x80,0x40,0x3C,0x40,0x80,0x00,0x00,
0x41,0x40,0x44,0x44,0x44,0x44,0x44,0x7F,
0x45,0x44,0x44,0x44,0x44,0x40,0x40,0x00,
};
const uc code FH[][16] = { //符号
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00, //:
0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//.
0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,
0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,//k
0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, //m
0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,
};
const uc code SZ[][16]= { //数字 ;
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,//0
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,//1
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,//2
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,//3
0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,//4
0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,//5
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,//6
0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,//7
0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,//8
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00//9
,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
};
void iniLCD(void); //函数声明
void chkbusy(void);
void wcode(uc);
void wdata(uc);
void display_HZ(uc,uc,uc *);
void SetOnOff(uc onoff);
void delay(uc a)
{
uc i;
while(a--)
for(i=100;i>0;i--)
;
}
void SendCommand(uc command)
{
chkbusy();
E = 1;
RW = 0;
RS = 0;
P2 = command;
E = 0;
}
void SetOnOff(uc onoff) //1-开显示 0-关
{
if(onoff == 1)
{chkbusy();E=1;RW=0;RS=0;P2=0x3f;E=0;} //0011 111x
else
P2=0x3e;
}
void SetLine(uc line) //line -> 0 : 7
{
line = line & 0x07;
line = line | 0xb8; //1011 1xxx
SendCommand(line);
}
void SetColum(uc colum) //colum -> 0 :63
{
colum = colum & 0x3f;
colum = colum | 0x40; //01xx xxxx
SendCommand(colum);
}
void SelectScreen(uc screen) //0-全屏,1—左屏,2-右屏
{
switch(screen)
{
case 0 :
L = 0;
delay(2);
R = 1;
delay(2);
break;
case 1 :
L = 1;
delay(2);
R = 0;
delay(2);
break;
case 2 :
L = 0;
delay(2);
R = 0;
delay(2);
break;
}
}
void ClearScreen(uc screen) // 清屏 点亮背光 2-全屏,0—左屏,1-右屏
{
uc i,j;
SelectScreen(screen);
for(i = 0;i < 8;i ++)
{
SetLine(i);
SetColum(0);
for(j = 0;j < 64; j ++)
wdata(0x00);
}
}
void iniLCD(void)
{
wcode(0x3f); //开显示设置
wcode(0xc0); //设置显示起始行为第一行
wcode(0xb8); //页面地址设置
wcode(0x40); //列地址设为0
L=1;R=1;
SetOnOff(1); //开显示
ClearScreen(2); //清屏,点亮背光
}
void chkbusy(void) //检测LCD忙状态
{
E=1; //LCD使能
RS=0; //读写指令
RW=1; //读
P2=0xff; //读操作以前先进行一次空读操作 接下来才能读到数据
while(!Busy); //等待不忙
}
void wcode(uc cd) //写指令代码
{
chkbusy(); //等待空闲
E=1; //以下使能LCD,设置LCD写指令状态
RW=0;
RS=0;
P2=cd; //写指令代码
E=1; //一下二句E产生下降沿,使得写操作有效
E=0;
}
void wdata(uc dat) //写显示数据
{
chkbusy(); //等待空闲
E=1; // 以下使能LCD,设置LCD写数据状态
RW=0;
RS=1;
P2=dat; //写数据代码
E=1; //一下二句E产生下降沿,使得写操作有效
E=0;
}
void display_HZ(uc page,uc col,uc *temp) //显示汉字子程序
{
L=1;R=0; //从左半屏开始 若列数超过128 改右
if(col>=0x80)
{
R=1;L=0;
col-=0x40;
}
wcode(page); //按要求写入页地址
wcode(col); //按要求从相应列开始写数据
for(j=0;j<16;j++) //写入一个汉字的上半部分,共16字节
{
wdata(temp[j]);
}
wcode(page+1); //从下一页开始显示汉字的下半部分要求从相应的列开始写数据
wcode(col);
for(j=16;j<32;j++)
{
wdata(temp[j]);
}
}
void display_FH(uc page,uc col,uc *temp) //显示16*8字符子程序
{
L=1;R=0; //从左半屏开始 若列数超过128 改右
if(col>=0x80)
{
R=1;L=0;
col-=0x40;
}
wcode(page); //按要求写入页地址
wcode(col); //按要求从相应列开始写数据
for(j=0;j<8;j++)
{
wdata(temp[j]);
}
wcode(page+1);
wcode(col);
for(j=8;j<16;j++)
{
wdata(temp[j]);
}
}
void Display_FiveNum(uc a, uc b, float num) //函数功能:从a地址代表的页,b地址代表的列开始向左显示 0000.0 五位数据,
{
uc flag=0,shuzu[5]=0; //shuzu[]用来存储num的千,百,十,个,'.',十分位共六位
ui i=0,j=0,num1,quzheng;
quzheng=num; //num的整数部分
num1=num*10; //先乘10,精确到十分位
while(num1) //分离float型 num 的整数部分quzheng的各位数字
{
i=num1%10;
num1=num1/10;
shuzu[j++]=i;
}
if(j!=0)
{ while(shuzu[j--]==0);}
for(i=0;i<=j+1;i++)
{ if(flag==1)
display_FH(a,b-(1+i)*8,SZ[shuzu[i]]);
if(flag==0)
display_FH(a,b-i*8,SZ[shuzu[i]]);
if(i==0)
{
display_FH(a,b-(i+1)*8,FH[1]);flag=1; //显示小数点
}
}
}
void initshow() //0xb8~0xbf表示第0~7页(64行); 0x01_____表示行(0x40~0x3f)
{
display_HZ(0xb8,0x40,HZ[0]); //单
display_HZ(0xb8,0x50,HZ[1]); //价
display_FH(0xb8,0x60,FH[0]); //:
Display_FiveNum(0xb8,0xA8,dj); //从0xA8列开始向左显示
display_HZ(0xb8,0xB0,HZ[8]); //元
display_HZ(0xba,0x40,HZ[2]); //里:一个汉字占2行 行+2
display_HZ(0xba,0x50,HZ[3]); //程
display_FH(0xba,0x60,FH[0]); //:
Display_FiveNum(0xba,0xA8,lc);
//display_FH(0xba,0xB0,FH[2]); //k
display_FH(0xba,0xB4,FH[3]); //m
display_HZ(0xbc,0x40,HZ[4]); //总
display_HZ(0xbc,0x50,HZ[1]); //价
display_FH(0xbc,0x60,FH[0]); //:
Display_FiveNum(0xbc,0xA8,zj);
display_HZ(0xbc,0xB0,HZ[8]); //元
}
void int1() interrupt 0 //外部中断0——实时显示处理
{
lc=lc+0.5;
zj=lc*dj;
if(lc<3) zj=3;
Display_FiveNum(0xb8,0xA8,dj);
Display_FiveNum(0xba,0xA8,lc);
Display_FiveNum(0xbc,0xA8,zj);
}
void main(void)
{
uc t,a,b,c=0,flag1=100;
SCON=0x11; //方式0设置 (彬哥不理解)
//EX0=1; //打开外部中断0
IT0=1; //下降沿触发中断INT0
EA=1; //全局中断允许
iniLCD();
for(t=0;t<4;t++)
display_HZ(0xbb,0x50+23*t,HZ[9+t]);
//
while(1) //键盘扫描程序
{
P1=0x0f;//p1接矩阵键盘
a=P1;
delay(10);
P1=0xf0;
b=P1;
delay(10);
c=a+b; //c为键盘扫描的键值
if(c==0xee)
{flag1=0;delay(10);}//按下0
if(c==0xde)
{flag1=1;delay(10);}//按下1
if(c==0xbe)
{ flag1=2;delay(300);}//2
if(c==0x7e)
{ flag1=3;delay(300);}//3
switch(flag1)
{
case 0:flag1=-1;EX0=0;
dj=0;zj=0;lc=0;
SelectScreen(0);
for(i = 0;i < 8;i ++)
{
SetLine(i);
SetColum(64);
for(j = 0;j < 48; j++)
wdata(0x00);
}
initshow(); break;
case 1:flag1=-1;iniLCD();initshow();EX0=1;break;
/* case 1:
{
flag1=-1;EX0=0;
iniLCD();initshow();break; //按下1,回归显示
Display_FiveNum(0xb8,0xA8,dj);
Display_FiveNum(0xba,0xA8,lc);
Display_FiveNum(0xbc,0xA8,zj);break; // 按下0,清0; */
case 2:flag1=-1;EX0=0;dj+=0.5;zj=0;lc=0;
SelectScreen(0);
for(i = 0;i < 8;i ++)
{
SetLine(i);
SetColum(64);
for(j = 0;j < 48; j++)
wdata(0x00);
}
Display_FiveNum(0xb8,0xA8,dj);
Display_FiveNum(0xba,0xA8,lc);
Display_FiveNum(0xbc,0xA8,zj);
break;
case 3:flag1=-1;EX0=0;
if(dj>0)
{dj-=0.5;zj=0;lc=0;}
SelectScreen(0);
for(i = 0;i < 8;i ++)
{
SetLine(i);
SetColum(64);
for(j = 0;j < 48; j++)
wdata(0x00);
}
Display_FiveNum(0xb8,0xA8,dj);
Display_FiveNum(0xba,0xA8,lc);
Display_FiveNum(0xbc,0xA8,zj);
break;
//case 3:flag1=-1;EX0=0;
}
//if(c!=0xff)
// break;
//if(c==0x7e)
// {show_shuzi(3); break;}//按下3,右屏显示‘3’
}
//while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -