HD7279是一款用于擴(kuò)展單片機(jī)I/O口的芯片,至少我是這么認(rèn)為的,雖然它占用了單片機(jī)4個(gè)I/O但是真正作為傳輸?shù)膬H僅是一根總線,它可以同時(shí)驅(qū)動(dòng)8位共陰數(shù)碼管(或者8×8點(diǎn)陣),及8×8的矩陣鍵盤(pán),而同時(shí)接在單片機(jī)上的話,至少需要3~4組I/O,當(dāng)然單總線控制的芯片基本需要自己的指令和時(shí)序。
接到這個(gè)課程設(shè)計(jì)之前我自己懶懶散散地看了一段時(shí)間的C51(用C語(yǔ)言編寫(xiě)單片機(jī)代碼),之前老師教的是A51(用匯編編寫(xiě)單片機(jī)代碼),我玩了很久,但是發(fā)現(xiàn)A51真的很局限,匯編這種語(yǔ)言是寫(xiě)給機(jī)器看的,真正地寫(xiě)0和寫(xiě)1,真正是一個(gè)寄存器一個(gè)寄存器的調(diào)用,對(duì)于8位的51單片機(jī)來(lái)說(shuō),要實(shí)現(xiàn)1000×1000或者小數(shù)是比較困難的。老師推薦用C,之前只是看書(shū)實(shí)現(xiàn)過(guò)一些小東西這回要做比較大的項(xiàng)目了,雖然還有其他課題比如溫度計(jì)和數(shù)字鐘,不過(guò)都做過(guò),只是環(huán)境不一樣,修改一下代碼太沒(méi)有挑戰(zhàn)性了。
確實(shí)開(kāi)始輕敵了,真正做的時(shí)候發(fā)現(xiàn)不是那么簡(jiǎn)單,
高中的時(shí)候?qū)W過(guò)一點(diǎn)VB做過(guò)計(jì)算器,如果讓我現(xiàn)在做,也許給我?guī)滋煳铱梢宰龀鰜?lái),用C我也沒(méi)什么問(wèn)題,但是C51就有難度了,要考慮太多硬件的東西,特別是顯示這個(gè)模塊好不容易瘦下去的頭又兩個(gè)大了。等我真正意識(shí)到的時(shí)候,已經(jīng)過(guò)去幾個(gè)禮拜了,呵呵,要和朋友說(shuō)抱歉了,雖然我答應(yīng)“等我做完計(jì)算器之后再幫你改下程序”但是沒(méi)一個(gè)實(shí)現(xiàn)。
當(dāng)然,此程序因?yàn)榛救亲约簩?xiě)的,被方晉甬老師稱之為“程序設(shè)計(jì)不成熟、比較亂”的,額,本來(lái)準(zhǔn)備用switch語(yǔ)句,但是呂昂老師說(shuō)switch語(yǔ)句會(huì)產(chǎn)生過(guò)多閑置寄存器(可是他沒(méi)有考慮到我僅僅是實(shí)現(xiàn)很少的功能),這段程序只實(shí)現(xiàn)+-×÷,符號(hào)閃爍,過(guò)八位報(bào)錯(cuò)等功能但是沒(méi)有小數(shù),只能計(jì)算一步(加少數(shù)程序即可計(jì)算多部)。其實(shí)程序挺早就寫(xiě)出來(lái)了,只是一直出不來(lái)效果,后來(lái)在仿真和VC++編譯環(huán)境下修改了很多,理論上是可以實(shí)現(xiàn)了,可是還是沒(méi)有顯示,于是抓狂了“看來(lái)我已處在瓶頸...”,晃了最后一個(gè)禮拜,周日周一看了兩天晚上,依然沒(méi)有看出什么來(lái),禮拜二去方晉甬老師辦公室請(qǐng)教,查了近3個(gè)鐘頭【基本看過(guò)了我所有奇形怪狀的子程序—。—||||】,在仿真多遍之后發(fā)現(xiàn)就少了一句“while(!key)【檢測(cè)釋放按鍵】”【程序中紅字部分即主程序最后一句】囧啊~~~~以至于周四答辯的時(shí)候我演示之后,剛點(diǎn)看ppt他就說(shuō)直接給A,不用答了。。。。
程序的完整版下載地址:http://m.raoushi.com/ziliao/file/jsjq.rar
/////////////////////////////****************程序*****************///////////////////////
#include<reg51.h>
#include<math.h>
sbit cs=P2^6;
sbit clk=P1^0;
sbit dat=P1^1;
sbit key=P3^3;
bit add,sub,mul,div,equ,clr;
unsigned char times,st,l,data_jp,flag,d;
unsigned int tmr;
unsigned long num[8],sn[8],disp[8],sh,result,hp=100000000;
void send(unsigned char);
unsigned char receive(void);
unsigned long real(unsigned long ,unsigned char);
unsigned long calcu(unsigned long, unsigned long);
void display(unsigned long);
unsigned long write_key(unsigned char);
void char_flk(void);
void test(void);
void error(void);
void long_delay(void);
void short_delay(void);
void delay10ms(unsigned char);
/////////**************主函數(shù)****************//////////
void main ()
{
times=0;
l=times;
st=0;
flag=0;
test();
while(1)
{
unsigned char i;
if(!key)
{
send(0x15);
data_jp=receive();
cs=1;
d=write_key(data_jp);
if (data_jp<=9)
{
flag=0;
num[times]=d;
}
else
{
flag=1;
//times-=1;
}
if(flag!=1)
{
if(num[0]==0)
{
times=0;
continue;
}
if(7>times>=1)
{
send(0xa1);
}
send(0x80);
send(num[times]);
while(!key);
delay10ms(1);
times=times+1;
cs=1;
if(times>7)
{
send(0xa4);
error() ;
times=0;
send(0xa4);
}
}
else
{
send(0xa4);
char_flk();
times-=1;
l=times;
for(i=0;i<=times;i++)
{
num[i]=real(num[i],l);
sh=sh+num[i];
l--;
}
sn[st]=sh;
if(st>=1)
{
result=calcu(sn[st],sn[st-1]);
sn[st-1]=result;
st--;
}
st++;
times=0;
flag=0;
sh=0;
if(equ==1)
{
st=0;
send(0xa4);
display(result);
equ=0;
}
if(clr==1)
{
st=0;
times=0;
flag=0;
sh=0;
add=0;
sub=0;
mul=0;
div=0;
equ=0;
clr=0;
send(0xa4);
}
while(!key);
}
}
}
}
/////////*********************測(cè)試子函數(shù)****************////////
void test(void)
{
char i;
delay10ms(2);
send(0xbf);
cs=1;
for (i=0;i<=3;i++)
{
delay10ms(100);
}
send(0xa4);
cs=1;
delay10ms(20);
}
///////***********************讀鍵盤(pán)程序**************///////
unsigned long write_key(unsigned char data_jp)
{
unsigned char shuzi;
if(data_jp<10)
{
shuzi=data_jp;
}
else
{
if(data_jp==10)
{
add=1;
}
else if(data_jp==11)
{
sub=1;
}
else if(data_jp==12)
{
mul=1;
}
else if(data_jp==13)
{
div=1;
}
else if(data_jp==14)
{
equ=1;
}
else if(data_jp==15)
{
clr=1;
}
shuzi=0xff;
}
return(shuzi) ;
}
///////***********************發(fā)送子函數(shù)*************//////
void send(unsigned char data_out)
{
unsigned char i;
cs=0;
long_delay();
for(i=0;i<=7;i++)
{
if(data_out&0x80)
{
dat=1;
}
else
{
dat=0;
}
clk=1;
short_delay();
clk=0;
short_delay();
data_out=data_out<<1;
}
dat=0;
}
/////************************接收鍵盤(pán)子函數(shù)************//////
unsigned char receive(void)
{
unsigned char i,data_in;
dat=1;
long_delay();
for(i=0;i<=7;i++)
{
clk=1;
short_delay();
data_in=data_in<<1;
if(dat)
{
data_in=data_in|0x01;
}
else
{
data_in=data_in|0x00;
}
clk=0;
short_delay();
}
dat=0;
return(data_in);
}
/////////***************************顯示數(shù)字處理子函數(shù)***********/////////
unsigned long real(unsigned long so, unsigned char s)
{
unsigned char z;
if(s!=0)
{
for(z=0;z<=(s-1);z++)
{
if(s!=0)
{
so=so*10;
}
else
{
so=so;
}
}
}
else
{
so=so;
}
return(so);
}
//////////*************************計(jì)算子函數(shù)*******************///////////
unsigned long calcu(unsigned long sn0,unsigned long sn1 )
{
if(add==1)
{
sn0=sn0+sn1;
add=0;
}
if(sub==1)
{
sn0=sn1-sn0;
sub=0;
}
if(mul==1)
{
sn0=sn0*sn1;
mul=0;
}
if(div==1)
{
if(sn0>0)
sn0=sn1/sn0;
else
error();
div=0;
}
return(sn0);
}
////////****************************報(bào)錯(cuò)錯(cuò)誤子函數(shù)***************/////////
void error(void)
{
while(key)
{
send(0x96);
send(0x4f);
delay10ms(2);
send(0x95);
send(0x05);
delay10ms(2);
send(0x94);
send(0x05);
delay10ms(2);
send(0x93);
send(0x1d);
delay10ms(2);
send(0x92);
send(0x05);
delay10ms(2);
}
}
///////////********************顯示子函數(shù)*********////////////
void display(unsigned long display)
{
unsigned char i,asus=8;
if(display>99999999)
error();
else
{
for(i=0;i<=7;i++)
{
if((display/hp)>=1)
break;
else
{
hp=hp/10;
asus-=1;
}
}
for(i=0;i<=asus;i++)
{
disp[i]=display/hp;
if(hp>1)
{
display=display%hp;
hp=hp/10;
}
}
for(i=0;i<=asus;i++)
{
if(i>0)
{ send(0xa1); }
send(0x80);
send(disp[i]);
}
}
}
///////////********************符號(hào)判斷閃爍顯示*********////////////
void char_flk(void)
{
if(add==1)
{
send(0x97);
send(0x77);
}
else if(sub==1)
{
send(0x97);
send(0x01);
}
else if(mul==1)
{
send(0x97);
send(0x37);
}
else if(div==1)
{
send(0x97);
send(0x49);
}
else if(clr)
{
;
}
send(0x88);
send(0x7f);
}
//////************************延時(shí)子函數(shù)*************///////
void long_delay(void)
{
char i;
for(i=0;i<=25;i++) ;
}
void short_delay(void)
{
char j;
for(j=0;j<=4;j++);
}
void delay10ms(unsigned char time)
{
unsigned char i;
unsigned int j;
for (i=0;i<=time;i++)
{
for(j=0;j<=0x390;j++);
}
}
///////////////////////////************效果圖*************////////////////////

以上演示的為9876543÷234,其本來(lái)的結(jié)果是42207.4487179……無(wú)法顯示小數(shù)位,所以結(jié)果為42207 。
