/*
只存储了两位乘客的信息 存储信息增加到5位时,读卡产生错误
按键
1 开始调整小时
2 开始调整分钟
3 小时加加
4 分钟加加
5 时间调整完毕
6 液晶界面翻页
7 乘客结账
8 空车状态与有乘客状态的切换
9 乘客标号清零
10 显示五位乘客的信息 并显示第一位乘客的信息
11 循环显示多位乘客的信息
12 显示营业总额
*/
//电子系统设计--温度控制系统DS18B20 使用内部16M晶振
#include <c8051f020.h> // SFR declarations
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define Lcd_Bus P2
#define KEYIO P1
#define print_BUS P7
uchar num;
uchar time_5ms,time_1s,time_1minite=58,time_1hour=23;
uint delay_time;
uint distance,kilometer,speed,init_distance,sub_distance;
uint passenger[5];//乘客卡号
uchar passenger_num;//乘客编号
uint expense=6,dis_expense=0,delay_expense=0,total_income; //总价 里程价 误时价 今日总收入
uint init_expense;
idata uchar card_data[33],card_num[10],data_num,clk_num,card_data_H;
uchar dis_screen_num;//显示液晶页码变量
uchar dis_passenger_message_screen;//显示乘客信息的变量
bit flag_delay;
bit flag_set_shi,flag_set_fen;
bit once1,once2,once3,once4,once5,once6;
bit flag_check;//乘客结账标志位
bit flag_dis_passenge_information;
bit flag_empty;//空车标志位
bit flag_business=1;//出租车营运状态标志
bit flag_unchange;//使结账液晶界面上显示的乘客应付的车费不再改变的标志位
bit flag_total_income;
//========读卡器数据端口======//
sbit card_dat=P0^4;
//========液晶接口=========//
sbit RS=P3^0;
sbit RW=P3^1;
sbit E =P3^2;
//======AT24C02端口========//
sbit sda=P3^6;
sbit scl=P3^7;
//=====================================================//
/*----------------------12864显示-----------------------*/
//------------------液晶模块开始----------------------
void delay(unsigned int t)
{ unsigned int k,j;
for(k=0;k<t;k++)
for(j=0;j<10;j++) ;
}
void write_com(unsigned char cmdcode)
{
RS=0;
RW=0;
E=1;
Lcd_Bus=cmdcode;
delay(50); //在数据写入的时候加入适当的延时
E=0;
delay(50);
}
void write_data(unsigned char Dispdata)
{
RS=1;
RW=0;
E=1;
Lcd_Bus=Dispdata;
delay(50); // 在数据写入的时候加入适当的延时
E=0;
delay(50);
}
void lcdreset()
{
delay(200);
write_com(0x30);
delay(100); //选择基本指令集
write_com(0x30); //选择8bit数据流
delay(50);
write_com(0x0c); //开显示(无游标、不反白)
delay(50);
write_com(0x01); //清除显示,并且设定地址指针为00H
delay(50);
write_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
}
void hzkdis(unsigned char code *s)
{
while(*s>0)
{ write_data(*s);
s++;
delay(50);
}
}
//---------液晶界面结束----------
//*********************************************************************//
//****************************AT24C02开始**********************************//
//*********************************************************************//
void delay_at24c02()
{
uchar x;
for(x=10;x>0;x--);
}
void delay_read_2402(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=200;y>0;y--);
}
void start() //起始信号
{
sda=1;
delay_at24c02();
scl=1;
delay_at24c02();
sda=0;
delay_at24c02();
}
void stop() //停止信号
{
sda=0;
delay_at24c02();
scl=1;
delay_at24c02();
sda=1;
delay_at24c02();
}
void respons()//应答信号
{
uchar i;
scl=1; //在scl为高电平期间读取信号
delay_at24c02();
while((sda==1)&&(i<250))i++;//sda==1说明没有收到应答信号
//sda==1或者在一段时间后没有应答 则退出while循环
scl=0;//将scl拉低 表示第九个脉冲结束
delay_at24c02();
}
void at24c02_init()//总线数据初始化
{
sda=1;//sda置1 将总线释放
delay_at24c02();
scl=1;
delay_at24c02();
}
void write_byte(uchar date)//写入一个字节 需要一位一位地写入
{
uchar i,temp;
temp=date;//将要写入的数据赋给temp
for(i=0;i<8;i++)//for循环用于写入8个位 即一个字节
{
temp=temp<<1;//temp左移一位 写8次 左移以为则将最高位移入到CY当中
scl=0;
delay_at24c02();
sda=CY;//将移入的最高位位送给数据总线
delay_at24c02();
scl=1; //在高电平期间sda上的数据需要保持稳定 所以要先将数据赋给CY后再将scl置为高电平
delay_at24c02();//数据稳定后将scl置为低电平
}
scl=0;
delay_at24c02();
sda=1;//将sda总线释放 为了读取应答信号 因为应答信号为低电平 如果sda不释放则无法收到低电平信号
delay_at24c02();
}
uchar read_byte()//读数据总线 需从8位数据总线上一位一位地读回来 读回来后需要把8位放入到一个字节当中
{
uchar i,k;
scl=0;
delay_at24c02();
sda=1;//释放数据总线
delay_at24c02();
for(i=0;i<8;i++)//i每增加1 传送一位
{
scl=1;//scl为1时才可以读取数据
delay_at24c02();
k=(k<<1)|sda;//k左移一位后最低位变为0 k和sda或之后最低位变为sda中的数据 这样进行8次就可以传送一个字节
scl=0; //将时钟置低电位 使下次再次进入循环后置高电平传输数据
delay_at24c02();
}
return k;
}
void write_add(uchar address,uchar date) //在指定地址写一个数据
{
start();//起始信号
write_byte(0xa0);//写入地址 寻找从机 数据传送方向为写入
respons();//等待应答信号
write_byte(address);//往芯片的第三个地址写数据
respons();//等待应答信号
write_byte(date);//往芯片中写入数据
respons();//等待应答信号
stop();//停止
}
uchar read_add(uchar address)//在指定地址读一个数据
{
uchar date;
start();//起始信号
write_byte(0xa0);//写入地址 寻找从机 数据传送方向为写入
respons();//等待应答信号
write_byte(address);//往芯片的第三个地址写数据
respons();//等待应答信号
start();//起始信号
write_byte(0xa1);//写入地址 寻找从机 数据传送方向为读出
respons();//等待应答信号
date=read_byte();//读数据
stop();//读完之后不需要应答 而是直接停止
return date;
}
//*********************************************************************//
//****************************AT24C02结束**********************************//
//*********************************************************************//
//*********************************************************************//
//************************键盘扫描子程序*******************************//
//*********************************************************************//
void key_delay(int a)
{
int b,c;
for(b=0;b<a;b++)
{
c=0x1300;
while(c--);
}
}
uchar keyscan(void)
{
uchar key,ch;
KEYIO=0xf0;
key=KEYIO;
if(key!=0xf0)
{
key_delay(2);
KEYIO=0x0f;
ch=KEYIO;
while((KEYIO&0x0f)!=0x0f);//等待键松开
key|=ch;//逻辑或赋值
switch(key)
{
case 0xee:num=1;break;
case 0xde:num=2;break;
case 0xbe:num=3;break;
case 0x7e:num=4;break;
case 0xed:num=5;break;
case 0xdd:num=6;break;
case 0xbd:num=7;break;
case 0x7d:num=8;break;
case 0xeb:num=9;break;
case 0xdb:num=10;break;
case 0xbb:num=11;break;
case 0x7b:num=12;break;
case 0xe7:num=13;break;
case 0xd7:num=14;break;
case 0xb7:num=15;break;
case 0x77:num=16;break;
}
}
return num;
}
//---------------------矩阵按键结束---------------------
void delay18(uint k)
{ while(k)
{ k--; }
}
//--------------通用I/O口及交叉开关初始化----------------//
void PORT_Init (void)
{
XBR0 = 0x04;
XBR1 = 0x14; //将外部中断0配置到P0^2 外部中断1配置到P0^3
XBR2 = 0x40; // 交叉开关使能
P3MDOUT = 0xff; // 设为推挽方式 AT24C02读取设置成推挽模式
P2MDOUT = 0xff;
P1MDOUT = 0xff;
P0MDOUT = 0x00; //读取刷卡器信息设置成开漏模式
}
void Exter0_init()
{
IT0=1;
EX0=1;
}
void Exter1_init()
{
IT1=1;
EX1=1;
}
void Timer0_init()
{
ET0=
评论0