本文目录一览:
- 1、麻烦你能不能写一个c语言程序 用at89c52单片机要求使用1602液晶显示当前时间和温度编程
- 2、求单片机ds1302+1602电子钟c语言编程。谢谢。
- 3、1602显示超声波测距的C语言程序和Proteus仿真图
- 4、这是 单片机 1602的C语言的源程序: 在此: 寻一个能解释每一步代码含义的朋友
麻烦你能不能写一个c语言程序 用at89c52单片机要求使用1602液晶显示当前时间和温度编程
#include REGX52.H
#include stdio.h
#include "LCD1602.h"
#include "DS1302.h"
sbit DQ=P3^0;//ds18b20 端口
unsigned int ReadTemperature(void);
bit Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void DelayUs2x(unsigned char);
void Delay1ms(unsigned int);
/*-----------------------------------------------
名称:18B20温度传感器
网站:
编写:shifang
日期:2009.5
修改:无
内容:18B20单线温度检测的应用样例程序
------------------------------------------------*/
/*-----------------------------------------------
18b20初始化
------------------------------------------------*/
bit Init_DS18B20(void)
{
bit dat=0;
DQ = 1; //DQ复位
DelayUs2x(5); //稍做延时
DQ = 0; //单片机将DQ拉低
DelayUs2x(200); //精确延时 大于 480us 小于960us
DelayUs2x(200);
DQ = 1; //拉高总线
DelayUs2x(50); //15~60us 后 接收60-240us的存在脉冲
dat=DQ; //如果x=0则初始化成功, x=1则初始化失败
DelayUs2x(25); //稍作延时返回
return dat;
}
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
读取一个字节
------------------------------------------------*/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i0;i--)
{
DQ = 0; // 给脉冲信号
dat=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
DelayUs2x(25);
}
return(dat);
}
/*------------------------------------------------
写入一个字节
------------------------------------------------*/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i0; i--)
{
DQ = 0;
DQ = dat0x01;
DelayUs2x(25);
DQ = 1;
dat=1;
}
DelayUs2x(25);
}
/*------------------------------------------------
读取温度
------------------------------------------------*/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Delay1ms(10);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
b=8;
t=a+b;
return(t);
}
void Delay1ms(unsigned int count)
{
unsigned int i,j;
for(i=0;icount;i++)
for(j=0;j120;j++);
}
main()
{
SYSTEMTIME CurrentTime;
int temp;
float temperature;
unsigned char dist[4];
LCD_Initial();
Initial_DS1302();
Init_DS18B20();
GotoXY(14,0);
Print(".");
GotoXY(15,1);
Print("C");
while(1)
{
DS1302_GetTime(CurrentTime);
TimeToStr(CurrentTime);
DateToStr(CurrentTime);
GotoXY(0,0);Print("20");
GotoXY(2,0);
Print(CurrentTime.DateString);
GotoXY(0,1);
Print(CurrentTime.TimeString);
temp=ReadTemperature();
temperature=(float)temp*0.0625;
sprintf(dist,"%4f",temperature);
GotoXY(9,1);
Print(dist);
Delay1ms(400);
}
}
求单片机ds1302+1602电子钟c语言编程。谢谢。
//液晶显示温度
#include "AT89X52.H"
#define Ddata P0
sbit RS=P3^5; //命令数据控制端
sbit RW=P3^6; //读写选择端
sbit LCDE=P3^7; //液晶使能端
sbit DQ=P1^0; //ds18b20与单片机连接口
#define uchar unsigned char
#define uint unsigned int
unsigned char hour=0,min=0,sec=0; //定义初值
unsigned int count=0;
unsigned char line1[16]={"
temp: "}; //16个字符
unsigned char line2[16]={" time: 00:00:00"}; //16个字符
unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组
uchar
data disdata[5];
uint tvalue; //温度值
uchar tflag; //温度正负标志
void time();
/*************************lcd1602程序**************************/
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{
unsigned
int i,j;
for(i=0;ims;i++)
for(j=0;j110;j++);
}
void delay5ms()//延时5毫秒(不够精确的)
{
unsigned
int i;
for (i=0;i1000;i++);
}
void delay50us()
{
register
int i;
for (i=0;i20;i++);
}
void delay()
{unsigned char m,n;
for(m=255;m0;m--)
for(n=255;n0;n--);
}
void wr_com(unsigned char comm)
//********写控制字符程序 E=1 RS=0
RW=0**********//
{
LCDE=0; //使能端
RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
LCDE=1;
Ddata=comm;
RS=0;
RW=0;
LCDE=0;
}
void wr_data(unsigned char dat)//*****当前位置写字符子程序:E=1 RS=1 RW=0
{
LCDE=0;
RS=0;
//********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。
RW=0;
//********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。
RS=1;
RW=0;
LCDE=1;
Ddata=dat; //将dat赋给P0口
LCDE=0;
RS=0;
RW=0;
}
unsigned char busycheck()//*****忙状态检查*******//
{
unsigned char i;
LCDE=0;
RS=0;
RW=0;
RS=0;
RW=1;
LCDE=1;
i=Ddata;
LCDE=0;
return(i);
}
void init()//**********初始化程序,必须按照产品的资料介绍的过程进行********//
{
wr_com(0x38); //*****显示模式设置必须三次,不用检测忙信号
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x38);
delay5ms();
wr_com(0x01); ///***清屏****
delay5ms();
busycheck();
wr_com(0x08);
delay5ms();
busycheck();
delay5ms();
wr_com(0x06); ///****光标移动设置,写一个字符后地址指针加1***
delay5ms();
busycheck();
delay50us();
wr_com(0x38); ////***显示模式设置****
delay50us();
busycheck();
delay50us();
wr_com(0x0c); /////***显示开,不显示光标***
delay50us();
busycheck();
delay50us();
wr_com(0x40); //set cgram address
delay50us();
delay50us(); //***这些延时可用可不用***//
}
void display()
{ unsigned char i;
wr_com(0x80); //set ram address
delay50us();
busycheck();
delay50us();
for(i=0;i6;i++)
{wr_data(line1[i]); //display(6个字符)
delay50us();
busycheck();}
busycheck();
delay50us();
wr_com(0xc0); // 0xc0=0x80+0x40
delay50us();
busycheck();
delay50us();
for(i=0;i16;i++)
{
wr_data(line2[i]); //display
delay50us();
busycheck();
}
}
/******************************温度传感器ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i0;i--) //读一个字节的数据函数
{ DQ = 0; //给脉冲信号
dat=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80; //等价于 dat =
dat | 0x80,dat和0x80做“或”的运算, 结果是最高位置1,其它位保持不变。
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
for (i=8; i0; i--)
{ DQ = 0;
DQ = wdata0x01;
delay_18B20(10);
DQ = 1;
wdata=1;
//右移一位
}
}read_temp()/*读取温度值并转换*/
{uchar a,b;
ds1820rst(); //ds1802/初始化程序
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd(); //读低八位
b=ds1820rd(); //读高八位
tvalue=b;
tvalue=8;
tvalue=tvalue|a;
if(tvalue0x0fff)
tflag=0;
else //“” 是逻辑与“|” 是逻辑或if(dat 0x01):不管dat是什么数和0x01(00000001)做了“与”的运算后,最低位保持不变,其它位均为0.如果dat的最低位为1,则表达式为真,就会执行if语句中的内容。如果dat最低位为0,则表达式为假,不执行if语句,执行if语句后的下一条语句。dat |= 0x80:等价于 dat = dat | 0x80,dat和0x80做“或”的运算,意思是最高位置1,其它位保持不变。
具体的可以去参考一下C语言的相关语法。
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
void ds1820disp()//温度值显示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位
if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-
if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}
wr_com(0x88);
wr_data(flagdat);//显示符号位
wr_com(0x89);
wr_data(disdata[0]);//显示百位
wr_com(0x8a);
wr_data(disdata[1]);//显示十位
wr_com(0x8b);
wr_data(disdata[2]);//显示个位
wr_com(0x8c);
wr_data(0x2e);//显示小数点
wr_com(0x8d);
wr_data(disdata[3]);//显示小数位
}
void main()
{
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
init();
while(1)
{
read_temp();//读取温度
ds1820disp();//显示
time(); //时间程序
display();//时间显示程序
}
}
void t0(void)interrupt 1 using 0
{
TH0=(65536-4995)/256;
TL0=(65536-4995)%256;
count++;
if(count==200){count=0;sec++;}
if(sec==60){sec=0;min++;}
if(min==60){min=0;hour++;}
if(hour==24){hour=0;}
}
void time()
{
line2[15]=tab[sec%10];line2[14]=tab[sec/10];
line2[12]=tab[min%10];line2[11]=tab[min/10];
line2[9]=tab[hour%10];line2[8]=tab[hour/10];
if(!P1_2){delay();if(!P1_2){delay();sec++;if(sec==60){sec=0;}}}
if(!P1_1){delay();if(!P1_1){delay();min++;if(min==60){min=0;}}}
if(!P1_0){delay();if(!P1_0){delay();hour++;if(hour==24){hour=0;}}}
}
给你参考一下,这样才能提高哦
1602显示超声波测距的C语言程序和Proteus仿真图
#include"reg52.h"
#include"intrins.h"
#define uchar unsigned char //无符号8位
#define uint unsigned int //无符号16位
#define ulong unsigned long //无符号32位
sbit K1=P1^0; //按下K1后,开始测距
sbit LEDRed=P1^1; //测距指示灯,亮表示正在测距,灭表示测距完成
//sbit BEEP=P1^2; //报警测量超出范围
sbit Trig=P2^5; //HC-SR04触发信号输入
sbit Echo=P2^6; //HC-SR04回响信号输出
float xdata DistanceValue=0.0; //测量的距离值
float xdata SPEEDSOUND; //声速
float xdata XTALTIME; //单片机计数周期
uchar xdata stringBuf[6]; //数值转字符串缓冲
//LCD1602提示信息
uchar code Prompts[][16]=
{
{"Measure Distance"}, //测量距离
{"- Out of Range -"}, //超出测量范围
{"MAX range 400cm "}, //测距最大值400cm
{"MIN range 2cm "}, //测距最小值2cm
{" "}, //清屏
{" Press K1 Start "} //按键开始测量
};
uchar xdata DistanceText[]="Range: "; //测量结果字符串
uchar xdata TemperatureText[]="Temperature: ";//测量温度值
extern void LCD_Initialize(); //LCD初始化
extern void LCD_Display_String(uchar *, uchar); //字符串显示
extern void ReadTemperatureFromDS18B20(); //从DS18B20读取温度值
extern int xdata CurTempInteger;
//毫秒延时函数
void DelayMS(uint ms);
//20微秒延时函数
void Delay20us();
//HCSR04初始化
void HCSR04_Initialize();
//测量距离
float MeasuringDistance();
//测距的数值排序求平均
float DistanceStatistics();
//输出距离值到LCD1602上
void DisplayDistanceValue(float dat);
//将无符号的整数转成字符串,返回字符串长度,不包括'\0'结束符
uchar UnsigedIntToString(uint value);
//蜂鸣器
//void Beep(uchar time);
//显示温度值
void DisplayTemperatureValue();
void main()
{
LCD_Initialize();//LCD1602初始化
LCD_Display_String(Prompts[0],0x00);
LCD_Display_String(Prompts[5],0x40);
ReadTemperatureFromDS18B20(); //测温度
HCSR04_Initialize(); //HC-SR04初始化
while(1)
{
if(K1==0)
{
DelayMS(5);
if(K1==0)
{
//Beep(1);
while(K1==0);
LEDRed=0;
ReadTemperatureFromDS18B20();//测温度
DisplayTemperatureValue();
if(CurTempInteger14)
CurTempInteger=14;
else if(CurTempInteger26)
CurTempInteger=26;
SPEEDSOUND=334.1+CurTempInteger*0.61;//计算声速
DistanceValue=DistanceStatistics(); //测距并返回距离值
DisplayDistanceValue(DistanceValue); //显示距离值
LEDRed=1;
}
}
}
}
//测距的数值排序求平均
float DistanceStatistics()
{
uchar i,j;
float disData[7],t;
//连续测距
for(i=0;i7;i++)
{
disData=MeasuringDistance();
DelayMS(80);
}
//排序
for(j=0;j=6;j++)
{
for(i=0;i7-j;i++)
{
if(disDatadisData[i+1])
{
t=disData;
disData=disData[i+1];
disData[i+1]=t;
}
}
}
return (disData[2]+disData[3]+disData[4])/3;
}
//测量距离
float MeasuringDistance()
{
//最大定时时间约65ms
TH0=0;
TL0=0;
//生成20us的脉冲宽度的触发信号
Trig=1;
Delay20us();
Trig=0;
//等待回响信号变高电平
while(!Echo);
TR0=1; //启动定时器0
//等待回响信号变低电平
while(Echo);
TR0=0; //关闭定时器0
//返回距离值(mm)
return (SPEEDSOUND*XTALTIME*((float)TH0*256+(float)TL0))/2000;
}
//HCSR04初始化
void HCSR04_Initialize()
{
//计算单片机计数周期 晶振=11.953M 单位us
XTALTIME=12/11.953;
//温度25度时声速的值
SPEEDSOUND=334.1+25*0.61;
Trig=0;
Echo=0;
TMOD=0x01;
}
//输出距离值到LCD1602上
void DisplayDistanceValue(float dat)
{
uchar i=0,j=0,len;
uint value;
value=(uint)dat;
//范围检查大于4000mm和小于20mm都为超出测量范围
if(value4000)
{
LCD_Display_String(Prompts[1],0x00);
LCD_Display_String(Prompts[2],0x40);
//Beep(2);
}
else if(value20)
{
LCD_Display_String(Prompts[1],0x00);
LCD_Display_String(Prompts[3],0x40);
//Beep(2);
}
else
{
//将数值转换成字符串
len=UnsigedIntToString(value);
//保留1位小数
while(stringBuf!='\0')
{
if(len-j==1)
{
DistanceText[6+j]='.';
j++;
}else
{
DistanceText[6+j]=stringBuf;
i++;
j++;
}
}
DistanceText[6+j]='c';
j++;
DistanceText[6+j]='m';
i=7+j;
//剩余位置补空格
while(i16)
{
DistanceText=' ';
i++;
}
//LCD_Display_String(Prompts[0],0x00);
LCD_Display_String(DistanceText,0x40);
}
}
//显示温度值
void DisplayTemperatureValue()
{
TemperatureText[13]=CurTempInteger/10+'0';
TemperatureText[14]=CurTempInteger+'0';
TemperatureText[15]='C';
LCD_Display_String(TemperatureText,0x00);
}
//将无符号的整数转成字符串,返回字符串长度
uchar UnsigedIntToString(uint value)
{
uchar i=0,t,length;
//从个位开始转换
do
{
stringBuf='0'+value;
value=value/10;
i++;
}while(value!=0);
length=i;
//将字符串颠倒顺序
for(i=0;i(length/2);i++)
{
t=stringBuf;
stringBuf=stringBuf[length-i-1];
stringBuf[length-i-1]=t;
}
stringBuf[length]='\0';
return length;
}
//蜂鸣器
//延时函数 毫秒 @12.000MHz
void DelayMS(uint ms)
{
uchar i, j;
while(ms--)
{
_nop_();
i = 2;
j = 239;
do
{
while (--j);
}while (--i);
}
}
//延时函数 20微秒 @12.000MHz
void Delay20us()
{
uchar i;
_nop_();
i = 7;
while (--i);
}
//定时器0中断
void Timer0() interrupt 1
{
}
//DS18B20代码:
#include
#include
#define uchar unsigned char //无符号8位
#define uint unsigned int //无符号16位
//定义DS18B20端口DS18B20_DQ
sbit DS18B20_DQ = P2^7;
//当前采集的温度值整数部分
int xdata CurTempInteger;
//当前采集的温度值小数部分
int xdata CurTempDecimal;
void Delayus(uint count)
{
while (--count);
}
uchar Reset_DS18B20()
{
uchar status;
DS18B20_DQ=1;
Delayus(1);
//开始复位过程
DS18B20_DQ=0; //数据线拉低
Delayus(100); //延时480us-960us
DS18B20_DQ=1; //数据线拉高
Delayus(10); //延时15us-60us
status=DS18B20_DQ; //读取数据线上的状态
Delayus(120);
return status;
}
void WriteByteToDS18B20(uchar dat)
{
uchar i;
for(i=0;i8;i++)
{
DS18B20_DQ=0;
DS18B20_DQ=dat0x01; //发送1位数据
Delayus(15); //延时60us以上
DS18B20_DQ=1; //释放总线,等待总线恢复
dat=1; //准备下一位数据
}
}
uchar ReadByteFromDS18B20()
{
uchar i,dat=0;
for(i=0;i8;i++)
{
DS18B20_DQ=0; //拉低总线,产生读信号
dat=1;
DS18B20_DQ=1; //释放总线,准备读1位数据
Delayus(2); //延时4us
if(DS18B20_DQ) dat|=0x80; //合并每位数据
Delayus(15); //延时60us
DS18B20_DQ=1; //拉高总线,准备读下1位数据
}
return dat;
}
void ReadTemperatureFromDS18B20()
{
uchar flag=0;//正负符号标志
//存储当前采集的温度值
uchar TempValue[]={0,0};
if(Reset_DS18B20())
{
CurTempInteger=255;
CurTempDecimal=0;
}
else
{
WriteByteToDS18B20(0xCC);//跳过ROM命令
WriteByteToDS18B20(0x44);//温度转换命令
Reset_DS18B20();//复位
WriteByteToDS18B20(0xCC);//跳过ROM命令
WriteByteToDS18B20(0xBE);//读取温度暂存器命令
TempValue[0]=ReadByteFromDS18B20();//先读低字节温度值
TempValue[1]=ReadByteFromDS18B20();//后读高字节温度值
Reset_DS18B20();//复位
//计算温度值
//先进行正温度与负温度判断,高5位全为1(0xF8)则为负数
if((TempValue[1]0xF8)==0xF8)
{
//负温度计算:取反加1,低字节为0时,高字节取反加1,否则不需要。
TempValue[1]=~TempValue[1];
TempValue[0]=~TempValue[0]+1;
if(TempValue[0]==0x00) TempValue[1]++;
flag=1;//负数标志
}
//将温度值分为整数和小数两部分存储(默认为12位精度)
CurTempInteger=((TempValue[1]0x07)4)|((TempValue[0]0xF0)4); if(flag) CurTempInteger=-CurTempInteger;
CurTempDecimal=(TempValue[0]0x0F)*625;
}
}
//LCD1602程序代码:
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define Delay4us(){_nop_();_nop_();_nop_();_nop_();}
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
void LCDDelay(uint ms)
{
uchar i, j;
while(ms--)
{
_nop_();
i = 2;
j = 239;
do
{
while (--j);
}while (--i);
}
}
bit LCD_Busy_Check()
{
bit result;
LCD_RS=0; LCD_RW=1; LCD_EN=1;
Delay4us();
result=(bit)(P00x80);
LCD_EN=0;
return result;
}
void Write_LCD_Command(uchar cmd)
{
while(LCD_Busy_Check());
LCD_RS=0; LCD_RW=0; LCD_EN=0; _nop_(); _nop_();
P0=cmd; Delay4us();
LCD_EN=1; Delay4us(); LCD_EN=0;
}
void Write_LCD_Data(uchar dat)
{
while(LCD_Busy_Check());
LCD_RS=1;LCD_RW=0;LCD_EN=0;
P0=dat;Delay4us();
LCD_EN=1;Delay4us();LCD_EN=0;
}
void LCD_Set_POS(uchar pos)
{
Write_LCD_Command(pos|0x80);
}
void LCD_Initialize()
{
Write_LCD_Command(0x01); LCDDelay(5);
Write_LCD_Command(0x38); LCDDelay(5);
Write_LCD_Command(0x0C); LCDDelay(5);
Write_LCD_Command(0x06); LCDDelay(5);
}
void LCD_Display_String(uchar *str, uchar LineNo)
{
uchar k;
LCD_Set_POS(LineNo);
for(k=0;k16;k++)
{
Write_LCD_Data(str[k]);
}
}
void LCD_Display_OneChar(uchar Dat, uchar X, uchar Y)
{
Y = 0x01; //限制Y不能大于1(2行,0-1)
X = 0x0F; //限制X不能大于15(16个字符,0-15)
if(Y) {X |= 0x40;} //当要在第二行显示时地址码+0x40;
X |= 0x80; //算出指令码
Write_LCD_Command(X);
Write_LCD_Data(Dat);
}
这是 单片机 1602的C语言的源程序: 在此: 寻一个能解释每一步代码含义的朋友
这和你的硬件电路有关系,看程序好像P0是数据输入端
#include reg51.h
#define uchar unsigned char //宏定义
sbit Rs=P2^0; //P2.0引脚接1602的数据/命令选择端
sbit Rw=P2^1; //P2.1引脚接1602的读/写控制端
sbit E=P2^7; //P2.7引脚接1602的使能端
uchar table[]="Liu Xiao Ming",buffer; //定义两个字符型变量
int k=0;
void delay(int t) //延时子程序
{
int i,j;
for(i=0;i255;i++)
for(j=0;jt;j++) ;
}
void writecom(void) //写命令子程序
{
Rs=0;Rw=0;E=1;
P0=buffer;
E=0;
delay(5);
}
void writedata(void) //写数据子程序
{
Rs=1;Rw=0;E=1;
P0=buffer;
E=0;
delay(5);
}
void init(void) //1602初始化子程序
{
buffer=0x08;writecom(); //显示关闭
buffer=0x3c;writecom(); //
buffer=0x14;writecom();
buffer=0x06;writecom(); //显示光标移动设置
buffer=0x01;writecom(); //显示清屏
buffer=0x0f;writecom(); //
}
void main()
{
init(); //1602初始化
buffer=0x80; //
writecom();
buffer=0xc0;
writecom();
for(k=0;k20;k++)
{
buffer=table[k]; //缓存数据
writedata(); //向1602写数据,使其显示Liu Xiao Ming
}
}