📄 shuzi.c
字号:
#include <reg51.h>
//#include <AT89X51.H>
#include<intrins.h>
#include<absaCC.h>
#define uchar unsigned char
#define uint unsigned int
sbit st=P3^2;
sbit oe=P3^1;
sbit eoc=P3^3;
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
sbit S1=P2^3;
sbit S2=P2^4;
sbit S3=P2^5;
unsigned char data temp_data[2] = {0x00,0x00} ;
uchar code tab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
uchar code td[]={0x00,0x10,0x20,0x30,0x40,0x050,0x60,0x70};
uchar code first[ ] = {" welcome "};
uchar data_temp,data_temp1,data_temp2;
unsigned int ad_0809,ad_data0,ad_data1,ad_data2,ad_data3,ad1_data1,ad1_data2,ad1_data3,temp1,temp2,temp_data1,temp_data2,temp_data3;
#define delayNOP();{_nop_();_nop_();_nop_();_nop_();};
uchar m,number;
uchar x[8];
void delaynms(uint x);
void display();
void delay();
void delayns();
void ad0809();
void LCD_init_DIS();
bit lcd_busy();
void lcd_pos(uchar pos);
void lcd_wdat(uchar dat);
void lcd_wcmd(uchar cmd);
void lcd_init();
unsigned char channel=0xbc;
/*延时*/
void delaynms(uint x)
{
uchar i;
while(x-->0)
{
for(i=0;i<125;i++)
{
;
}
}
}
void delay(void)
{
unsigned char m,n;
for (m=0;m<10;m++)
for (n=0;n<248;n++);
}
void delayns(void)
{unsigned char m,n,k;
for (m=0;m<10;m++)
for (n=0;n<20;n++)
for (k=0;k<248;k++);
}
/********************************************************/
/*
/*检查LCD忙状态
/*lcd_busy为1时,忙,等待。为0时,闲,可写指令与数据。
/*
/********************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/********************************************************/
/*
/*写指令数据到LCD
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
/*
/********************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/********************************************************/
/*
/*写显示数据到LCD
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
/*
/********************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/********************************************************/
/*
/* LCD初始化设定
/*
/********************************************************/
void lcd_init()
{
delaynms(30);
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay();
lcd_wcmd(0x38);
delay();
lcd_wcmd(0x38);
delay();
lcd_wcmd(0x0c); //显示开,关光标
delay();
lcd_wcmd(0x06); //移动光标
delay();
lcd_wcmd(0x01); //清除LCD的显示内容
delay();
}
/********************************************************/
/*
/* LCD1602初始显示子程序
/*
/********************************************************/
void LCD_init_DIS()
{
delay(); //延时
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行的第1个字符
m = 0;
while(first[m] != '\0')
{ //显示字符
lcd_wdat(first[m]);
m++;
} ;
}
/*******************************************************/
/*
/* 设定显示位置
/*
/********************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
}
/********************************************************/
/*
/* LCD1602数据转换子程序
/*
/********************************************************/
//void data_conv()
//{
//data_temp1=data_temp>>4; //高位
//
//{data_temp1=data_temp1+0x30;}
//data_temp2=data_temp%16; //低位
// data_temp2=data_temp2+0x30;
// }//
uchar data_conva(uchar convno)
{
uchar conv_temp1,conv_temp2;
conv_temp1=(convno&0x0f);
if(conv_temp1>0x09)
conv_temp1+=0x06;
conv_temp2=(convno&0xf0);
convno=conv_temp1+conv_temp2;
return(convno);
}
/*****************/
/****中断*****/
/***************************************/
void t0(void)// interrupt 1 using 0
{
while(lcd_busy());
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
//if(ad_0809>0xff||ad_0809<0x00)
//{
//lcd_wdat(fs[m]);
// m++;
// }
ad_data1=((ad_0809*2)/100)&0x0f;
ad_data2=(((ad_0809*2)%100)/10)&0x0f;
ad_data3=((((ad_0809*2))%100)%10)&0x0f;
// ad1_data1=(((ad_0809)/100)&0x0f);
//ad1_data2=((((ad_0809)%100))/10)&0x0f;
// ad1_data3=((((ad_0809)%100))%10)&0x0f;
//temp_data3=ad_data3+ad1_data3;
// temp_data3=ad_data3*(data1/data2);
//temp_data3=data_conva(temp_data3);
//temp_data2=ad_data2+ad1_data2;
// temp_data2=ad_data2*(data1/data2);
//temp_data2=data_conva(temp_data2);
//temp1=(temp_data2&0xf0)>>4;
//temp_data1=ad_data1+ad1_data1+temp1;
//temp_data1=(ad_data1+temp1)*(data1/data2);
//temp_data1=data_conva(temp_data1);
ad_data1=(ad_data1&0x0f)+0x30;
ad_data2=(ad_data2&0x0f)+0x30;
ad_data3=(ad_data3&0x0f)+0x30;
lcd_pos(0x4b) ;
lcd_wdat(ad_data1) ;
lcd_pos(0x4c) ;
lcd_wdat('.') ;
lcd_pos(0x4d) ;
lcd_wdat(ad_data2);
lcd_pos(0x4e) ;
lcd_wdat(ad_data3) ;
lcd_pos(0x4f) ;
lcd_wdat('V') ;
}
/**************************************/
/*********数据移位*******************/
/************************************/
//uchar ltoh(uchar dat)
//{
// unsigned char i = 0 ;
// unsigned char dat = 0 ;
// unsigned char dat1 = 0 ;
// bit DQ ;
// for (i = 8 ; i > 0 ; i--)
// {
// DQ = 0 ;
// DQ = dat&0x01 ;
// dat1 <<= 1 ;
// if(DQ)
// dat1 |= 0x01 ;
// dat>>=1 ;
// }
// return (dat1);
//}
void main(void)
{
LCD_init_DIS();
TMOD=0x01;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
TR0=1;
ET0=1;
EX0=1;
EA=1;
P3=channel;
S1=1;
S2=1;
S3=0;
while(1)
{
st=0;
st=1;
st=0;
while(eoc==0);
oe=1;
ad_0809=P1;
//ad_0809=ltoh(ad_0809);
oe=0;
t0();
}
}
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -