?? 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 + -