#include<reg51.h> #define uint unsigned int #ifndef LCD_CHAR_1602_2005_4_9 #define LCD_CHAR_1602_2005_4_9 #include <intrins.h> sbit pwm=P1^0; sbit LcdRs = P2^0; sbit LcdRw = P2^1; sbit LcdEn = P2^2; sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口 //内部等待函数************************************************************************** unsigned char LCD_Wait(void) { LcdRs=0; LcdRw=1; _nop_(); LcdEn=1; _nop_(); while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环, //可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80 LcdEn=0; return DBPort; } //向LCD写入命令或数据************************************************************ #define LCD_COMMAND 0 // Command #define LCD_DATA 1 // Data #define LCD_CLEAR_SCREEN 0x01 // 清屏 #define LCD_HOMING 0x02 // 光标返回原点 void LCD_Write(bit style, unsigned char input) { LcdEn=0; LcdRs=style; LcdRw=0; _nop_(); DBPort=input; _nop_();//注意顺序 LcdEn=1; _nop_();//注意顺序 LcdEn=0; _nop_(); LCD_Wait(); } //设置显示模式************************************************************ #define LCD_SHOW 0x04 //显示开 #define LCD_HIDE 0x00 //显示关 #define LCD_CURSOR 0x02 //显示光标 #define LCD_NO_CURSOR 0x00 //无光标 #define LCD_FLASH 0x01 //光标闪动 #define LCD_NO_FLASH 0x00 //光标不闪动 void LCD_SetDisplay(unsigned char DisplayMode) { LCD_Write(LCD_COMMAND, 0x08|DisplayMode); } //设置输入模式************************************************************ #define LCD_AC_UP 0x02 #define LCD_AC_DOWN 0x00 // default #define LCD_MOVE 0x01 // 画面可平移 #define LCD_NO_MOVE 0x00 //default void LCD_SetInput(unsigned char InputMode) { LCD_Write(LCD_COMMAND, 0x04|InputMode); } //移动光标或屏幕************************************************************ /* #define LCD_CURSOR 0x02 #define LCD_SCREEN 0x08 #define LCD_LEFT 0x00 #define LCD_RIGHT 0x04 void LCD_Move(unsigned char object, unsigned char direction) { if(object==LCD_CURSOR) LCD_Write(LCD_COMMAND,0x10|direction); if(object==LCD_SCREEN) LCD_Write(LCD_COMMAND,0x18|direction); } */ //初始化LCD************************************************************ void LCD_Initial() { LcdEn=0; LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵 LCD_Write(LCD_COMMAND,0x38); LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动 } //************************************************************************ void GotoXY(unsigned char x, unsigned char y) { if(y==0) LCD_Write(LCD_COMMAND,0x80|x); if(y==1) LCD_Write(LCD_COMMAND,0x80|(x-0x40)); } void Print(unsigned char *str) { while(*str!='\0') { LCD_Write(LCD_DATA,*str); str++; } } /* void LCD_LoadChar(unsigned char user[8], unsigned char place) { unsigned char i; LCD_Write(LCD_COMMAND,0x40|(place*8)); for(i=0; i<8; i++) LCD_Write(LCD_DATA,user); } */ //************************************************************************ #endif void fangbo() { TMOD=0x10; //模式设置,000000110,可见采用的是定时器1,工作与模式1 (M1=0,M0=1)。 TR0=1; //打开定时器 TH1=(65536-500)/256; //定时器设置,每隔100微秒发起一次中断。 TL1=(65536-500)%256; ET1=1; //开T1溢出中断 EA=1; //开总中断 TR1=1; //等待T1溢出中断 for(;;); } void time1() interrupt 3 //T1溢出中断服务程序 { TH1=(655536-500)/256; // T1重新赋值 TL1=(65536-500)%256; pwm=!pwm; //输出取反 } unsigned char TempBuffer[10]; void IntToStr(unsigned int t, unsigned char *str, unsigned char n) { unsigned char a[5]; char i, j; a[0]=(t/10000)%10; //取得整数值到数组 a[1]=(t/1000)%10; a[2]=(t/100)%10; a[3]=(t/10)%10; a[4]=(t/1)%10; for(i=0; i<5; i++) //转成ASCII码 a=a+'0'; for(i=0; a=='0' && i<=3; i++); for(j=5-n; j<i; j++) //填充空格 { *str=' '; str++; } for(; i<5; i++) { *str=a; str++; } //加入有效的数字 *str='\0'; } void Delay1ms(unsigned int count) { unsigned int i,j; for(i=0;i<count;i++) for(j=0;j<120;j++); } main() { unsigned int Count = 0; LCD_Initial(); GotoXY(0,0); Print("Frequency 1000Hz"); GotoXY(0,1); Print("Period 1000uS"); while(1) { fangbo(); Delay1ms(100); } 程序源码如上。自己第一次网上找的例子。希望能动手DIY一下。重复定义没找出来。对51单片机各个引脚理解不到位。希望能指点一下 |
FCXAG13B`00{D6O6Y8TP~95.png (6.49 KB, 下载次数: 77)
报错。
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |