📄 jijiaqi.c
字号:
#include<absacc.h>
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define w_c_add XBYTE[0x2070] /* LCD写命令字地址 */
#define w_d_add XBYTE[0x2071] /* LCD写数据地址 */
#define r_s_add XBYTE[0x2072] /* LCD读状态字地址 */
#define r_d_add XBYTE[0x2073] /* LCD读数据地址 */
#define COM XBYTE[0x2021] /*8279命令状态口地址*/
#define DAT XBYTE[0x2020] /*8279数据口地址*/
void dispzfs(uchar ajj,uchar t1,uchar t2);
void dispzf(uchar akk,uchar s);
void displcd(uchar add,uint x);
void lcd_busy(void) ;
uchar code num[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
/*LCD字符表 0 1 2 3 4 5 6 7 8 9 */
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80,0x7c};
/* LED字型表 0 1 2 3 4 5 6 7 8 9 . 确定 */
uchar zj[]={"总价: "};
uchar sj[]={"时间: "};
uchar sd[]={"速度: "};
uchar dj[]={"单价: "};
uchar bdata status; /* 可位寻址片内数据存储器,允许位与字节混合访问 */
sbit busy=status^7;
sbit clflag=ACC^6; /*建立清除标志*/
uchar bdata count,count1;
uint shu1,shu2,time,sudu,min;
uchar jian[]={ 0,0,0,0};
uchar ds1,ds2,money,danjia;
uchar key1,key2,key3,key4;
//////////////////////////////*一毫秒延时*//////////////////////////////////
void delay(uchar x)
{
uchar j;
while(x--)
{
for(j=0;j<125;j++)
{;}
}
}
////////////////////////////////*8279初始化*////////////////////////////////
void set8279()
{
COM=0xd1; /* 总的清除命令 */
do {ACC=COM;}
while(clflag==1); /* 读状态字,等待清除结束*/
COM=0x00; /* 8字符显示左入口 */
COM=0x23; /* 12分频 */
}
////////////////////////////*判断FIFO键按下函数*/////////////////////////////
uchar deky(void)
{
uchar k;
k=COM;
return(k&0x0f); /*有键按下*/
}
////////////////////////////////*取键值函数*//////////////////////////////////
uchar keyin(void)
{
uchar i;
while(deky()==0); /*无键按下等待*/
COM=0x40; /*读FIFO RAM命令*/
i=DAT;
i=i&0x3f; /*取键值低6位*/
return(i); /*返回键值*/
}
//////////////////////////////////*键盘显示函数*///////////////////////////////
void disp(uchar j,uchar x)
{
COM=0x80+j;
DAT=table[x];
}
//////////////////////////////////*按键设定单价*///////////////////////////////
void keyscan(void)
{
COM=0xd1; /* 总的清除命令 */
do {ACC=COM;}
while(clflag==1); /* 读状态字,等待清除结束 */
COM=0x00; /* 8字符显示左入口 */
COM=0x23; /* 12分频 */
for(;;)
{
key1=keyin(); /*有键按下,取键值*/
if(key1==0x0b) /*判断是否为确认键,是即跳出*/
{break;}
disp(0,key1); /*在0x80处显示键值*/
key2=keyin(); /*有键按下,取键值*/
if(key2==0x0b) /*判断是否为确认键,是即跳出*/
{break;}
disp(1,key2); /*在0x81处显示键值*/
key3=keyin(); /*有键按下,取键值*/
if(key3==0x0b) /*判断是否为确认键,是即跳出*/
{break;}
disp(2,key3); /*在0x82处显示键值*/
key4=keyin(); /*有键按下,取键值*/
if(key4==0x0b) /*判断是否为确认键,是即跳出*/
{break;}
disp(3,key4); /*在0x83处显示键值*/
}
return;
}
/////////////////////////////////*LCD忙状态检测函数 *///////////////////////////
void lcd_busy(void) /*LCD忙状态检测函数 */
{
do
{
status=r_s_add; /* 读状态字地址的第7位 */
}
while(busy);
}
//////////////////////////////////////*LCD初始化*///////////////////////////////
void setlcd(void)
{
lcd_busy();
w_c_add=0x30; /* 功能设置:8位数据 */
lcd_busy();
w_c_add=0x0C; /* 显示状态:整体显示,游标位置无效*/
lcd_busy();
w_c_add=0x01; /* 清除显示:将DDRAM填满“20H”,并且设定DDRAM的地址计数器到“00”*/
lcd_busy();
w_c_add=0x02; /* 地址归位:设定DDRAM的地址计数器到“00”,将游标移到开头原点位置 */
}
////////////////////////////////////*速度转换与显示*/////////////////////////////
void displcd(uchar add,uint x)
{
uchar ds3,ds4,ds5; /*定义速度值*/
lcd_busy();
w_c_add=add; /*送显示地址*/
lcd_busy();
ds3=x/100%10; /*数值转换*/
ds4=x/10%10;
ds5=x%10;
w_d_add=num[ds3]; /*速度显示*/
lcd_busy();
w_d_add=num[ds4];
lcd_busy();
w_d_add=num[ds5];
dispzf(0x95,0x4d); /*速度单位显示*/
dispzf(0x96,0x2f);
dispzf(0x97,0x6d);
}
///////////////////////////////*LCD行显示*//////////////////////////////////
void displcd1(uchar add,uchar *p)
{
int q;
lcd_busy();
w_c_add=add; /* 送命令 */
for(q=0;q<4;q++) /*循环显示*/
{
lcd_busy();
w_d_add=p[2*q];
w_d_add=p[2*q+1];
}
}
//////////////////////////////////*LCD显示单价*///////////////////////////////
void dispdanjia(void)
{
lcd_busy();
w_c_add=0x83; /*送显示起始地址*/
lcd_busy();
w_d_add=num[key1]; /*在":"后显示单价整数位*/
lcd_busy();
w_d_add=0x2e; /*显示小数点*/
lcd_busy();
w_d_add=num[key3]; /*写单价小数位*/
lcd_busy();
dispzfs(0x85,0xa3,0xa4); /*显示单位*/
dispzfs(0x86,0xa3,0xaf);
dispzfs(0x87,0xa3,0xcd);
}
///////////////////////////*定时/计数器初始化*/////////////////////////////////
void init(void)
{
time=0; /*显示时间初始值为0*/
money=7; /*显示总价初始值为7*/
count=0;
count1=0;
set8279(); /*8279初始化*/
setlcd(); /*LCD初始化*/
TMOD=0x50; /*设置定时/计数器工作方式*/
EA=1; /*开中断*/
ET0=1;
ET1=1;
TR0=1; /*启动定时器*/
TR1=1; /*启动计数*/
TH1=0x00; /*计数器赋初值*/
TL1=0x00;
EX0=1; /*开外部中断INT0*/
IT0=1; /*设置外部中断INT0触发方式*/
PX0=1; /*设置外部中断INT0为高优先级*/
TH0=(65536-50000)/256; /*定时器赋初值定时50ms*/
TL0=(65536-50000)%256;
}
///////////////////////* T0中断服务函数完成1s定时*////////////////////////////
void T0_srv (void) interrupt 1 using 1
{
TH0=(65536-50000)/256; /*定时50ms赋初值*/
TL0=(65536-50000)%256;
count++; /*50ms到,标志+1*/
if(count==20) /*1秒到*/
{
count1++; /*秒计数*/
time++;
TR1=0; /*停止计数*/
count=0;
ds1=TH1; /*由T1读取速度*/
ds2=TL1;
TH1=0x00; /*T1重新计数*/
TL1=0x00;
TR1=1; /*启动计数*/
shu1=ds1*256+ds2; /*速度值转化*/
shu2=shu1*24/60; /*将速度转化为一个合适值*/
sudu=shu2/40;
if(count1==60)
{
count1=0;
if(shu2<40) /*当速度<40时,按速度为40计价*/
money=money+1*danjia;
money=money+sudu*danjia; /*总价*/
}
}
}
///////////////////////////////////////*单字符显示程序*//////////////////////////////////
void dispzf(uchar akk,uchar s)
{
lcd_busy();
w_c_add=akk; /*送显示地址*/
lcd_busy();
w_d_add=s; /*送显示值*/
}
/////////////////////////////////////*双字符显示程序*///////////////////////////////////
void dispzfs(uchar ajj,uchar t1,uchar t2)
{
lcd_busy();
w_c_add=ajj; /*送显示地址*/
lcd_busy();
w_d_add=t1; /*送显示值*/
lcd_busy();
w_d_add=t2;
}
////////////////////////////////*主函数*/////////////////////////////////////////
void main(void)
{
init(); /*初始化程序*/
setlcd(); /*LCD初始化*/
keyscan(); /*按键设定单价*/
danjia=key1+key3*0.1;
while(1)
{
displcd1(0x80,&dj[0]); /*单价显示*/
dispdanjia();
displcd1(0x90,&sd[0]); /*速度显示*/
displcd(0x93,shu2);
delay(10);
min=time/60; /*以分计时*/
displcd1(0x88,&sj[0]); /*时间显示*/
displcd(0x8b,min);
dispzf(0x8d,0x20);
dispzf(0x8e,0x6d);
delay(10);
displcd1(0x98,&zj[0]); /*总价显示*/
displcd(0x9b,money);
dispzfs(0x9d,0xa3,0xa4);
delay(10);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -