Chào các bác thân mến.
Mình đang làm cái mạch đo nhiệt độ dùng adc0809 hiện thị lên LCD. Đây là code của mình.
Nhưng không hiểu sao hiện thị kí tự thì vô tư, nhưng mà hiện thị số đoạn cuối thì chả lên cái gì cả( đã làm mạch thật rồi). Thử mô phong lại trên protues xem thế nào thì đến đoạn cuối nó báo thế này: " controller reveived command whilst busy" liên tục cả nghìn cái( bó tay).
Các bác " chịu khó " giúp mình với, gận 3 ngày nay dậm chân tại chỗ đoạn này rồi.
Mình đang làm cái mạch đo nhiệt độ dùng adc0809 hiện thị lên LCD. Đây là code của mình.
PHP Code:
#include <REGX52.H>
#include <stdio.H>
//------------Khoi tao bien va cac gia tri gan-------------//
sbit RS_LCD = P2^5;
sbit RW_LCD = P2^6;
sbit E_LCD = P2^7;
#define lcd_data_pin P0
sbit ALE= P2^0;
sbit start = P3^0;
sbit EOC =P3^1;
sbit OE= P3^3;
int num[10];
//sbit rd = P3^1;
//sbit wr = P3^2;
//sbit cs = P3^5;
//---------------Sau day la cac chuong trinh con------------//
//--------------Ham tre khoang thoi gian rat ngan phuc vu viec kiem tr co ban---------------//
void delay_short()
{
unsigned int i;
for(i=0;i<3;i++);
}//--------------****------------------//
//------------Ham tre 2---------------//
void delay(unsigned int time) // Thoi gian time ms
{
TMOD = 0x01; // Timer 0 che do 1
while (time--)
{
TH0 = -1000/256;
TL0 = -1000%256;
TR0 = 1;
while (!TF0);
TR0 = 0;
TF0 = 0;
}
}
//-----------------******----------------//
//--------------Ham kiem tra co ban (busy_flag)--------------??
void kt_ban()
{
unsigned char x;
P0 = 0xff;
RS_LCD = 0;
RW_LCD = 1;
do
{
E_LCD = 1;
delay(50);
E_LCD = 0;
x=P0;
x=x&0x80;
}
while(x!=0x80);
}//-----------*******--------------------//
//---------------Ham ghi lenh giao tiep voi LCD---------------//
void LCD_lenh(unsigned char lenh)
{
kt_ban();
delay(50);
P0 = lenh;
RS_LCD = 0; // Chon thanh ghi lenh
RW_LCD = 0; // Chon che do ghi du lieu tu 8051 vao LCD
E_LCD = 1;
delay_short();
E_LCD = 0;
}//------------*******-----------------//
//-----------Ham ghi ky tu ra LCD------------//
void LCD_kytu(unsigned char kytu)
{
kt_ban();
delay(50);
P0 = kytu;
RS_LCD = 1; // Chon che do doc du lieu tu 8051
RW_LCD = 0;
E_LCD =1;
delay_short();
E_LCD = 0;
}//------------*******-----------------//
//-----------Ham ghi nhanh ky tu ra LCD------------//
//-----------Ham ghi chuoi ky tu ra LCD------------//
void ghi_chuoi(char *str)
{
while(*str)
{
delay(50);
ghi_kytu(*str);
str++;
}
}//-----------********------------//
//-----------Ham ghi nhanh chuoi ky tu ra LCD------------//
//-----------************------------//
//-----------Ham ghi so nguyen ra LCD------------//
//-----------Ham khoi tao LCD------------//
void setting_LCD()
{
LCD_lenh(0x38);
LCD_lenh(0x01); // Xoa man hinh
LCD_lenh(0x02); // Co dich hien thi
}
//-----------**********------------//
void dauvao_adc( unsigned char so) // cho ADC 0809
{
switch(so)
{ case 0: { P2_3=0; P2_2=0;P2_1=0;break;}
case 1: { P2_3=0; P2_2=0;P2_1=0; break;}
case 2: { P2_3=0;P2_2=1;P2_1=0; break;}
case 3: { P2_3=0;P2_2=1;P2_1=1; break;}
case 4: { P2_3=1;P2_2=0;P2_1=0; break;}
case 5: { P2_3=1;P2_2=0;P2_1=1; break;}
case 6: { P2_3=1;P2_2=1;P2_1=0; break;}
case 7: { P2_3=1;P2_2=1;P2_1=1; break;}
}
}
void lcd_data(unsigned int i) //Function to send data on LCD
{ int p,c;
int k=0;
while(i>0)
{
num[k]=i%10;
i=i/10;
k++;
}
k--;
for (p=k;p>=0;p--)
{ kt_ban();
c=num[p]+48;
lcd_data_pin = c;
RW_LCD = 0;
RS_LCD = 1;
E_LCD = 1;
delay(1);
E_LCD = 0;
}}
/*********************************/
/* CON DAY LA CHUONG TRINH CHINH */
/* ----------??????--------------*/
/*********************************/
void main(void)
{
float v;
//char chuoi[32];
unsigned char x;
setting_LCD();
LCD_lenh(0x01);
LCD_lenh(0x0c);
ghi_chuoi(" MACH DO NHIET DO");
LCD_lenh(0x0c);
LCD_lenh(0xc0);
ghi_chuoi(" HIEN THI LCD" );
ALE=0;
start=0;
OE=1;
while(1)
{ dauvao_adc(0);
ALE=1;
delay(2);
ALE=0;
start=1;
delay(1);
start=0;
while( EOC==1)
{ OE=0;
x=P1;
v=(float)x;
LCD_lenh(0x01);
ghi_chuoi("Dien ap = ");
LCD_lenh(0x0c);
LCD_lenh(0xc0);
lcd_data(23); // gia su nhiet do la 23 do C
//lcs_data(x);
delay(300);
}
}
}
Nhưng không hiểu sao hiện thị kí tự thì vô tư, nhưng mà hiện thị số đoạn cuối thì chả lên cái gì cả( đã làm mạch thật rồi). Thử mô phong lại trên protues xem thế nào thì đến đoạn cuối nó báo thế này: " controller reveived command whilst busy" liên tục cả nghìn cái( bó tay).
Các bác " chịu khó " giúp mình với, gận 3 ngày nay dậm chân tại chỗ đoạn này rồi.
Comment