这是我改过的程序。
用的是0802的lcm,因为是比较早做的,所以程序有点改乱了。
楼主看着用吧。:)
/* mcu xtal freq. 12.000mhz */
/* contains 0802 lcm driver */
/* 1 second gate */
#include <at892051.h>
#include <string.h>
#define lcd_rs p3_0 /* switch register: command/data */
#define lcd_rw p3_1 /* switch mode:!write/read */
#define lcd_en p3_4 /* lcd operation enable */
#define lcd_data p1
#define lcd_clear 0x01
#define max_x 0x10 /* defines how many ltr can be disp.in a row. */
#define max_y 0x02 /* defines how many ltr can be disp.in a line. */
#define uchar unsigned char
#define uint unsigned int
/* the declaration of some functions about lcd driver */
void delay5ms(void);
void delay400ms(void);
void lcd_wrtcmd(uchar command, busy_c);
void init_lcd(void);
uchar get_lcd_status(void);
void lcd_wrtdata(uchar data);
void putcharxy(uchar x,uchar y,unsigned disp_data);
void outtextxy(uchar x,uchar y,uchar *disp_data);
/* for counter */
uchar timer0_count = 0, timer1_count = 0;
uchar temp1, temp2, temp3;
uchar tag = 0;
/* timer0 */
void timer0() interrupt 1 using 1
{
timer0_count ++;
if (timer0_count==16) {
ea = 0;
tag = 1;
tr1 = 0;
tr0 = 0;
temp1=timer1_count;
temp2=th1;
temp3=tl1;
th0=189;
tl0=208;
timer1_count=0;
th1=0;
tl1=0;
tr0=1;
tr1=1;
ea=1;
timer0_count=0;
}
}
void timer1() interrupt 3 using 2
{
timer1_count ++;
}
/* main function */
void main(void)
{
unsigned long count;
uchar freq[9];
unsigned long res;
uchar i;
delay400ms();
init_lcd();
outtextxy(0,0,"ham freq");
outtextxy(0,1,"counter!");
for(i=5;i>0;i--) delay400ms();
tmod = 0x51; //tmr1 external input: 0x51
ie = 0x8a;
ip = 0x08; //timer1 piority higher than timer0
th0= 189;
tl0= 208;
th1 = 0;
tl1 = 0;
tr0 = 1; //start tmr0 here
tr1 = 1;
while(1)
{
if(tag){
count = temp1 * 65536;
count = count + temp2*256;
count = count + temp3;
res=100000;
for(i=0;i<8;i++)
{
if(i==2) continue;
if(i==6) continue;
freq=count/res+Ɔ'
count%=res;
res/=10;
}
freq[2]=','
freq[6]='.'
freq[8]='\0'
outtextxy(0,0,"freq:khz");
outtextxy(0,1,freq);
}
}
}
void init_lcd(void)
{
lcd_data=0;
lcd_wrtcmd(0x38,0);
/* two lines, 5x7 font style, no cursors, no blink */
delay5ms();
lcd_wrtcmd(0x38,0);
delay5ms();
lcd_wrtcmd(0x38,0);
delay5ms();
lcd_wrtcmd(0x38,1);
lcd_wrtcmd(0x80,1);
lcd_wrtcmd(lcd_clear,1);
lcd_wrtcmd(0x06,1);
lcd_wrtcmd(0x0c,1);
}
uchar get_lcd_status(void)
{
lcd_data=0xff;
lcd_en=0;
lcd_en=0;
lcd_rw=1;
lcd_rs=0;
lcd_en=1;
while(lcd_data & 0x80);
lcd_en=0;
return lcd_data;
}
void lcd_wrtdata(uchar data)
{
lcd_en=0;
get_lcd_status();
lcd_data=data;
lcd_rs=1;
lcd_rw=0;
lcd_en=0;
lcd_en=0;
lcd_en=1;
lcd_en=1;
lcd_en=0;
}
void lcd_wrtcmd(uchar command, busy_c)
{
lcd_en=0;
if(busy_c) get_lcd_status();
lcd_data=command;
lcd_rs=0;
lcd_rw=0;
lcd_en=0;
lcd_en=0;
lcd_en=1;
lcd_en=1;
lcd_en=0;
}
void putcharxy(uchar x,uchar y,unsigned disp_data)
{
y=y&(max_y-1);
x=x&(max_x-1);
if(y) x+=0x40;
x+=0x80;
lcd_wrtcmd(x,1);
lcd_wrtdata(disp_data);
}
void outtextxy(uchar x,uchar y,uchar *disp_data)
{
uchar char_length,j;
char_length=strlen(disp_data);
y=y&(max_y-1);
x=x&(max_x-1);
for (j=0;j<char_length;j++)
{
putcharxy(x,y,disp_data[j]);
x++;
}
}
void delay5ms(void)
{ uint i=6025;while(i--); }
void delay400ms(void)
{
uchar i=5; uint j;
while(i--)
{ j=7888; while(j--); }
}