void disp_lcd(uchar addr,uchar *temp1) {
uchar num;
write_com(addr);
delay(1); //延时一会儿??? for(num=0;num<16;num++) { write_date(temp1[num]);//或者这样写write_date(*(temp1+num)); delay(1); } }
void init_lcd() {
//uchar num;
lcden=0; //可有可无???
rw=0; //初始化一定要设置为零,表示写数据
write_com(0x38); //使液晶显示点阵,为下面做准备 write_com(0x0c); //初始设置 write_com(0x06); //初始设置 write_com(0x01); //清零
write_com(0x80); //使指针指向第一行第一格
disp_lcd(0x80,&lcd_hang1[4*16]); //在第一行显示 disp_lcd(0xc0,&lcd_hang1[5*16]); //在第二行显示 /*for(num=0;num<16;num++) { write_date(table[num]); delay(5); }
write_com(0x80+0x40); //给指针重新赋值,使之指向第二行第一格 for(num=0;num<16;num++) { write_date(table1[num]); delay(5); } */
/*TMOD=0x01; //选用定时方式1 TH0=(65536-50000)/256; //赋初值 TL0=(65536-50000)%6; // EA=1; //开总中断
ET0=1; //开定时器中断 TR0=1; //启动定时器*/ }
26
/********************1602液晶函数声明结束*********************/
void main() {
uchar i=0;
DA_S2=0; //使DAC寄存器处于直通状态 DAdata=0;
DA_S1=1; //关闭8位输入寄存器 init_lcd();
waveform=0;
TMOD=0x01; //设置定时器0为16位工作方式 IT0=1; //设置外部中断0为下降沿触发 ET0=1; //开定时器中断 EX0=1; EA=1; while(1) { //DAout(0xff); //可输出TTL波形 //DAout(0x80); //T_temp=32; } }
void timer0() interrupt 1 {
TH0=THtemp; TL0=TLtemp;
if(waveform==0) sine_out(); else if(waveform==1) triangle_out(); else if(waveform==2) square_out();
else if(waveform==3) sawtooth_out(); //tian jian }
void key_int0() interrupt 0 {
uchar keytemp;
uint total_freq; //总频率
EA=0; TR0=0; //关总中断与定时器 delay(5); //延时够吗???
if(key==0) //确实有按键按下而引发中断 { keytemp=P3&0xf0; //获取P3口高四位的值 switch(keytemp)
27
{ case 0xe0: //选择波形 waveform++; if(waveform>3) waveform=0; //jiang 2 gai wei 3 break; case 0xd0: //频率按规定单位依次增加 wavefreq[waveform]++; if(wavefreq[waveform]>10) wavefreq[waveform]=1; // /*这边要用“>10”,因为它比“=11”可靠
break; // 性更高,使加数有个上限,不会一直加下去*/
case 0xb0: //频率按规定单位依次衰减 wavefreq[waveform]--; if(wavefreq[waveform]<1) wavefreq[waveform]=10; //这边要用“<1”,因为它比“=0”可靠性更高
break; case 0x70: //TTL输出 DA_S2=1; //使DAC寄存器关闭 break; }
THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]; //方括号中选取第几个数后,并把该值赋给T_temp
TLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)];
total_freq= wavefreq[waveform] * freq_unit[waveform]; //求输出频率(个数*单位)
lcd_hang2[5]=total_freq+0x30; //在液晶中显示个位,(0x30 在液晶显示中表示数字0)
total_freq/=10; lcd_hang2[4]=total_freq+0x30; //在液晶中显示时十位 total_freq/=10; lcd_hang2[3]=total_freq+0x30; //在液晶中显示时百位 total_freq/=10; lcd_hang2[2]=total_freq+0x30; //在液晶中显示时千位 disp_lcd(0x80,&lcd_hang1[waveform*16]); //在第一行显示 disp_lcd(0xc0,lcd_hang2); //在第二行显示 }
wavecount=0; //'抽点'计数清零 while(!key);
EA=1; TR0=1; //开启总中断与定时器
28
附录三 电路原理图
图12 电路原理图
29