當前位置:編程學習大全網 - 腳本源碼 - 懂80C51單片機的進~

懂80C51單片機的進~

貼上兩個自己用過的LCD1602驅動(總線、IO口的都有,肯定派得上用場)

再貼上ADC0809總線上的驅動,只是不知道樓主的具體要求如何顯示在LCD上,只能保存在數組裏面

硬件連接在代碼中已經基本補齊了,其他的應該不用再多說了吧?!^_^

*********************************************************************

/*===========================================================================

KS0070(44780) 16x2 字符液晶屏驅動演示程序總線方式 曉奇

=============================================================================

連接線圖: LCM-------51 LCM-------51 LCM--------51

DB0-----P0.0 DB4-----P0.4 RW-------P2.0

DB1-----P0.1 DB5-----P0.5 RC-------P2.1

DB2-----P0.2 DB6-----P0.6 E--------P2.7 =>74ls00+wr+rd

DB3-----P0.3 DB7-----P0.7 VLCD接1K2電阻到GND

[註]:AT89C51的晶振頻率為12MHz

============================================================================*/

//#pragma src // 產生匯編文件

#include <reg51.h>

#include<intrins.h>

//========= 變量類型標識的宏定義,大家都喜歡這麽做 ==============

#define Uchar unsigned char

#define Uint unsigned int

// ================= LCM1602A端口地址定義 =======================

char xdata Lcd1602CmdPort _at_ 0x7cff; //E=1 RS=0 RW=0

char xdata Lcd1602WdataPort _at_ 0x7eff; //E =1 RS=1 RW=0

char xdata Lcd1602StatusPort _at_ 0x7dff; //CS=1 RS=0 RW=1

#define Busy 0x80 // 忙判別位

code char exampl[]="For an example. - By xiaoqi\n";

void Delay400Ms(void);

void Delay5Ms(void);

void LcdWriteData( char dataW );

void LcdWriteCommand( Uchar CMD,Uchar AttribC );

void LcdReset( void );

void Display( Uchar dd );

void DispOneChar(Uchar x,Uchar y,Uchar Wdata);

void ePutstr(Uchar x,Uchar y, Uchar code *ptr);

//================ 隨便寫幾句測試主程序 ================

void main(void)

{

Uchar temp;

Delay400Ms(); // 啟動時必須的延時,等待lcm進入工作狀態

LcdReset(); // 這也是必需的....初始化

temp = 32;

ePutstr(0,0,exampl); // 上面壹行顯示壹個預定字符串

Delay400Ms(); // 保留顯示內容

Delay400Ms();

Delay400Ms();

Delay400Ms();

Delay400Ms();

Delay400Ms();

Delay400Ms();

Delay400Ms();

while(1)

{

temp &= 0x7f; // 只顯示ASCII字符

if (temp<32)temp=32; // 屏蔽控制字符,不予顯示

Display( temp++ );

Delay400Ms();

}

}

/*=======================================================

顯示字符串

=======================================================*/

void ePutstr(Uchar x,Uchar y, Uchar code *ptr) {

Uchar i,l=0;

while (ptr[l] >31){l++;};

for (i=0;i<l;i++) {

DispOneChar(x++,y,ptr[i]);

if ( x == 16 ){

x = 0; y ^= 1;

}

}

}

/*=======================================================

演示壹行連續字符串,配合上位程序演示移動字串

=======================================================*/

void Display( Uchar dd ) {

Uchar i;

for (i=0;i<16;i++) {

DispOneChar(i,1,dd++);

dd &= 0x7f;

if (dd<32) dd=32;

}

}

/*=======================================================

顯示光標定位

=======================================================*/

void LocateXY( char posx,char posy) {

Uchar temp;

temp = posx & 0xf;

posy &= 0x1;

if ( posy )temp |= 0x40;

temp |= 0x80;

LcdWriteCommand(temp,0);

}

/*=======================================================

按指定位置顯示數出壹個字符

=======================================================*/

void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {

LocateXY( x, y ); // 定位顯示地址

LcdWriteData( Wdata ); // 寫字符

}

/*=======================================================

初始化程序, 必須按照產品資料介紹的初始化過程進行

=======================================================*/

void LcdReset( void ) {

LcdWriteCommand( 0x38, 0); // 顯示模式設置(不檢測忙信號)

Delay5Ms();

LcdWriteCommand( 0x38, 0); // ***三次

Delay5Ms();

LcdWriteCommand( 0x38, 0);

Delay5Ms();

LcdWriteCommand( 0x38, 1); // 顯示模式設置(以後均檢測忙信號)

LcdWriteCommand( 0x08, 1); // 顯示關閉

LcdWriteCommand( 0x01, 1); // 顯示清屏

LcdWriteCommand( 0x06, 1); // 顯示光標移動設置

LcdWriteCommand( 0x0c, 1); // 顯示開及光標設置

}

/*=======================================================

寫控制字符子程序: E=1 RS=0 RW=0

=======================================================*/

void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {

if (AttribC) while( Lcd1602StatusPort & Busy ); // 檢測忙信號?

Lcd1602CmdPort = CMD;

}

/*=======================================================

當前位置寫字符子程序: E =1 RS=1 RW=0

=======================================================*/

void LcdWriteData( char dataW ) {

while( Lcd1602StatusPort & Busy ); // 檢測忙信號

Lcd1602WdataPort = dataW;

}

// 短延時

void Delay5Ms(void)

{

Uint i = 5552;

while(i--);

}

//長延時

void Delay400Ms(void)

{

Uchar i = 5;

Uint j;

while(i--)

{

j=7269;

while(j--);

};

}

*********************************************************************

/*===================================================================

KS0070(44780) 16x2 字符液晶屏驅動演示程序 曉奇

=====================================================================

連接線圖: LCM-------51 LCM-------51 LCM--------51

DB0-----P0.0 DB4-----P0.4 RS-------P2.5

DB1-----P0.1 DB5-----P0.5 RW-------P2.6

DB2-----P0.2 DB6-----P0.6 E--------P2.7

DB3-----P0.3 DB7-----P0.7 VLCD接1K2電阻到GND

[註]:AT89C51的晶振頻率為12MHz

====================================================================*/

#include <reg51.h>

#include<intrins.h>

//變量類型標識的宏定義,大家都喜歡這麽做

#define Uchar unsigned char

#define Uint unsigned int

// 控制引腳定義,不同的連接必須修改的部分

sbit RS = P2^5;

sbit RW = P2^6;

sbit Elcm = P2^7;

#define DataPort P0 // 數據端口,必須上拉電阻

#define Busy 0x80

code char exampl[]="For an example. - By xiaoqi\n";

void Delay400Ms(void);

void Delay5Ms(void);

void WaitForEnable( void );

void LcdWriteData( char dataW );

void LcdWriteCommand( Uchar CMD,Uchar AttribC );

void LcdReset( void );

void Display( Uchar dd );

void DispOneChar(Uchar x,Uchar y,Uchar Wdata);

void ePutstr(Uchar x,Uchar y, Uchar code *ptr);

//測試主程序

void main(void)

{

Uchar temp;

Delay400Ms();

LcdReset();

temp = 32;

ePutstr(0,0,exampl); // 上面壹行顯示壹個預定字符串

Delay400Ms();

Delay400Ms();

Delay400Ms();

Delay400Ms();

Delay400Ms();

Delay400Ms();

Delay400Ms();

Delay400Ms();

while(1)

{

temp &= 0x7f; // 只顯示ASCII字符

if (temp<32)temp=32; // 屏蔽控制字符,不予顯示

Display( temp++ );

Delay400Ms();

}

}

/*=======================================================

顯示字符串

=======================================================*/

void ePutstr(Uchar x,Uchar y, Uchar code *ptr) {

Uchar i,l=0;

while (ptr[l] >31){l++;};

for (i=0;i<l;i++) {

DispOneChar(x++,y,ptr[i]);

if ( x == 16 ){

x = 0; y ^= 1;

}

}

}

/*=======================================================

演示壹行連續字符串,配合上位程序演示移動字串

=======================================================*/

void Display( Uchar dd ) {

Uchar i;

for (i=0;i<16;i++) {

DispOneChar(i,1,dd++);

dd &= 0x7f;

if (dd<32) dd=32;

}

}

/*=======================================================

顯示光標定位

=======================================================*/

void LocateXY( char posx,char posy) {

Uchar temp;

temp = posx & 0xf;

posy &= 0x1;

if ( posy )temp |= 0x40;

temp |= 0x80;

LcdWriteCommand(temp,0);

}

/*=======================================================

按指定位置顯示數出壹個字符

=======================================================*/

void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {

LocateXY( x, y ); // 定位顯示地址

LcdWriteData( Wdata ); // 寫字符

}

/*=======================================================

初始化程序, 必須按照產品資料介紹的初始化過程進行

=======================================================*/

void LcdReset( void ) {

LcdWriteCommand( 0x38, 0); // 顯示模式設置(不檢測忙信號)

Delay5Ms();

LcdWriteCommand( 0x38, 0); // ***三次

Delay5Ms();

LcdWriteCommand( 0x38, 0);

Delay5Ms();

LcdWriteCommand( 0x38, 1); // 顯示模式設置(以後均檢測忙信號)

LcdWriteCommand( 0x08, 1); // 顯示關閉

LcdWriteCommand( 0x01, 1); // 顯示清屏

LcdWriteCommand( 0x06, 1); // 顯示光標移動設置

LcdWriteCommand( 0x0c, 1); // 顯示開及光標設置

}

/*=======================================================

寫控制字符子程序: E=1 RS=0 RW=0

=======================================================*/

void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {

if (AttribC) WaitForEnable(); // 檢測忙信號?

RS = 0; RW = 0; _nop_();

DataPort = CMD; _nop_(); // 送控制字子程序

Elcm = 1;_nop_();_nop_();Elcm = 0; // 操作允許脈沖信號

}

/*=======================================================

當前位置寫字符子程序: E =1 RS=1 RW=0

=======================================================*/

void LcdWriteData( char dataW ) {

WaitForEnable(); // 檢測忙信號

RS = 1; RW = 0; _nop_();

DataPort = dataW; _nop_();

Elcm = 1; _nop_(); _nop_(); Elcm = 0; // 操作允許脈沖信號

}

/*=======================================================

正常讀寫操作之前必須檢測LCD控制器狀態: CS=1 RS=0 RW=1

DB7: 0 LCD控制器空閑; 1 LCD控制器忙

========================================================*/

void WaitForEnable( void ) {

DataPort = 0xff;

RS =0; RW = 1; _nop_(); Elcm = 1; _nop_(); _nop_();

while( DataPort & Busy );

Elcm = 0;

}

// 短延時

void Delay5Ms(void)

{

Uint i = 5552;

while(i--);

}

//長延時

void Delay400Ms(void)

{

Uchar i = 5;

Uint j;

while(i--)

{

j=7269;

while(j--);

};

}

*********************************************************************

#include<REG51.H>

#include<ABSACC.H>

#define uchar unsigned char

//通道號,根據硬件實際改動

#define IN0 XBYTE[0X0000] //通道0

#define IN1 XBYTE[0X0001]

#define IN2 XBYTE[0X0002]

#define IN3 XBYTE[0X0003]

#define IN4 XBYTE[0X0004]

#define IN5 XBYTE[0X0005]

#define IN6 XBYTE[0X0006]

#define IN7 XBYTE[0X0007]

sbit ad_busy=P3^5;

void AD0809(uchar idata *x);

//調用該程序後應將模擬量轉換成數字量存於壹數組adcRes[]之中

void AD0809(uchar idata *adcRes)

{

uchar i;

data uchar xdata *ad_adr;

ad_adr=&IN0; // 指向第壹個通道

for(i=0;i<8;i++) {

*ad_adr=0; //啟動AD轉換

ad_busy=0; //調試後發現0才是正確的

while(ad_busy==0); //等待AD轉換結束

adcRes[i]=*ad_adr; //保存轉換結果

ad_adr++; //下壹個通道

}

}

  • 上一篇:中國好聲音第二季英文歌單
  • 下一篇:什麽是常旅客
  • copyright 2024編程學習大全網