C8051F020例程

C8051F020例程
C8051F020例程

/***************************************************************************** 本测试程序用来测试板上所以I/O连接状况外接LED共阳数码管实验时将跳线帽接至+3V

*****************************************************************************/

#include

#define uchar unsigned char

#define uint unsigned int

uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void PORT_Init (void)

{

XBR2 = 0x40; /*使能交叉开关*/

P0MDOUT =0xff;

P1MDOUT =0xff;

P2MDOUT =0xff;

P3MDOUT =0xff;

P74OUT =0xff;

}

/*******************************/

void delay(uint z)

{

uint x,y;

for(x=0;x

for(y=0;y<121;y++);

}

/*******************************/

void main (void)

{

uchar i;

WDTCN = 0xde;

WDTCN = 0xad; //禁止看门狗定时器

PORT_Init ();

while(1)

{

for(i=0;i<10;i++)

{

P0=tab[i];

P1=tab[i];

P2=tab[i];

P3=tab[i];

P4=tab[i];

P5=tab[i];

P6=tab[i];

P7=tab[i];

delay(500);

}

}

}

/***************************************************************************** 闪烁灯实验本实验采用P3.4口输出短接J11 实验时将跳线帽接至+3V

*****************************************************************************/ #include

#define uchar unsigned char

#define uint unsigned int

sbit LED=P3^4;

void PORT_Init (void)

{

XBR2 = 0x40; /*使能交叉开关*/

P3MDOUT =0xff;

}

/*******************************/

void delay(uint z)

{

uint x,y;

for(x=0;x

for(y=0;y<121;y++);

}

/*******************************/

void main (void)

{

WDTCN = 0xde;

WDTCN = 0xad; //禁止看门狗定时器

PORT_Init ();

while (1)

{

LED=0;

delay(500);

LED=1;

delay(500);

}

}

/***************************************************************************** 流水灯实验本实验采用P0口输出外接LED 实验时将跳线帽接至+3V

*****************************************************************************/

#include

#include

#define uchar unsigned char

#define uint unsigned int

void PORT_Init (void)

{

XBR2 = 0x40; /*使能交叉开关*/

P0MDOUT =0xff;

}

/*******************************/

void delay(uint z)

{

uint x,y;

for(x=0;x

for(y=0;y<121;y++);

}

/*******************************/

void main (void)

{

uchar i;

WDTCN = 0xde;

WDTCN = 0xad; //禁止看门狗定时器

i=0xfe;

PORT_Init ();

P0=i;

while(1)

{

delay(500);

i = _crol_(i,1); //循环右移1位,点亮下一个LED

P0 = i;

}

}

/*****************************************************************************

数码管实验本实验采用P0口输出外接LED共阳数码管实验时将跳线帽接至+3V

*****************************************************************************/

#include

#define uchar unsigned char

#define uint unsigned int

uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void PORT_Init (void)

{

XBR2 = 0x40; /*使能交叉开关*/

P0MDOUT =0xff;

}

/*******************************/

void delay(uint z)

{

uint x,y;

for(x=0;x

for(y=0;y<121;y++);

}

/*******************************/

void main (void)

{

uchar i;

WDTCN = 0xde;

WDTCN = 0xad; //禁止看门狗定时器

PORT_Init ();

while(1)

{

for(i=0;i<10;i++)

{

P0=tab[i];

delay(500);

}

}

}

/****************************************************************************** 按键实验本实验采用P2.0和P2.1作为输入P0外接LED共阳数码管输出实验时将跳线帽接至+3V

******************************************************************************* *********/

#include

#define uchar unsigned char

#define uint unsigned int

sbit K1 = P2^0;

sbit K2 = P2^1;

uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void PORT_Init (void)

{

XBR2 = 0x40; /*使能交叉开关*/

P0MDOUT = 0xff;

}

/*******************************/

void delay(uint z)

{

uint x,y;

for(x=0;x

for(y=0;y<121;y++);

}

/*******************************/

void main (void)

{

uchar i;

WDTCN = 0xde;

WDTCN = 0xad; //禁止看门狗定时器

PORT_Init ();

while(1)

{

if(K1==0)

{

delay(10);

if(K1==0)

{

if(i==9)

i=9;

else

i++;

while(!K1);

}

}

if(K2==0)

{

delay(10);

if(K2==0)

{

if(i==0)

i=0;

else

i--;

while(!K2);

}

}

P0=tab[i];

}

}

/***************************************************************************** 串口通讯实验本实验采用UART0输出数据到PC机实验时将跳线帽接至+3V

复位一次,单片机发送256个数据波特率为9600

*****************************************************************************/

#include

#define uchar unsigned char

#define uint unsigned int

void SYSCLK_Init();

void PORT_Init();

void UART0_Init();

void SYSCLK_Init()

{

unsigned int i;

OSCXCN=0X67; //0X67=0110,0111

for(i=0;i<256;i++); //等待>1ms

while(!(OSCXCN&0X80)); //等待XTLVLD变为1

OSCICN=0X88; //时钟失效监测器,选择外部时钟源作为系统时钟

}

void PORT_Init()

{

XBR0 = 0x04;

XBR2 = 0x40;

}

void UART0_Init()

{

SCON0=0x50; //串口方式1

TMOD=0X20; //选用定时器1作为波特率发生器

TH1=0xF4;

TL1=0xF4;

PCON=0x80; //波特率为9600

TR1=1; //定时器启动

}

void main()

{

unsigned int i;

WDTCN=0XDE;

WDTCN=0XAD;

SYSCLK_Init();

PORT_Init();

UART0_Init();

for(i=0;i<256;i++)

{

SBUF0=i;

while(!TI0);

TI0=0;

}

while(1);

}

/***************************************************************************** LCD1602并口显示实验本实验采用P6为数据口和P1为控制口实验时将跳线帽接至+5V *****************************************************************************/ #include

#define uchar unsigned char

#define uint unsigned int

#define DataPort P6

sbit LCM_VO=P1^7;

sbit LCM_RS=P1^6;

sbit LCM_RW=P1^5;

sbit LCM_EN=P1^4;

sbit LED=P3^4;

uchar code TAB1[] = "C8051F-020";

uchar code TAB2[] = "QQ:123514611";

uchar aa,bb;

/*******************************/

void PORT_Init (void)

{

XBR2 = 0x40; /*使能交叉开关*/ P1MDOUT =0xff;

P3MDOUT =0xff;

P74OUT |= 0xff; /*推挽输出*/

}

/*******************************/

void delay(uint z)

{

uint x,y;

for(x=0;x

for(y=0;y<121;y++);

}

/*******************************/

/*******************************///写指令

void WriteCommandLCM(uchar CMD)

{

LCM_RS=0;

LCM_RW=0;

DataPort=CMD;

LCM_EN=1;

delay(50);

LCM_EN=0;

}

/*******************************///写数据

void WriteDataLCM(uchar dataW)

{

LCM_RS=1;

LCM_RW=0;

DataPort=dataW;

LCM_EN=1;

delay(50);

LCM_EN=0;

}

/***********************************/

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)

{

Y &= 0x1;

X &= 0xF; //限制X不能大于15,Y不能大于1

if (Y) X |= 0x40; //当要显示第二行时地址码0x40;

X |= 0x80; // 算出指令码

WriteCommandLCM(X); //这里不检测忙信号,发送地址码

WriteDataLCM(DData);

}

//-----------------------------------------------------------------------------

//按指定位置显示一串字符

//-----------------------------------------------------------------------------

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {

unsigned char ListLength;

ListLength = 0;

Y &= 0x1;

X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>0x20) //若到达字串尾则退出

{

if (X <= 0xF) //X坐标应小于0xF

{

DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符

ListLength++;

X++;

}

}

}

/***********************************/

void InitLcd()

{

WriteCommandLCM(0x38); //8位数据,双行显示,5X7字型WriteCommandLCM(0x08); //

WriteCommandLCM(0x01); //

WriteCommandLCM(0x06); //

WriteCommandLCM(0x0c); //

}

/***********************************/

void main (void)

{

WDTCN = 0xde;

WDTCN = 0xad; //禁止看门狗定时器

PORT_Init ();

OSCICN |= 0x01;

delay(5000);

LCM_VO=0;

InitLcd ();

aa=0x41;

for(bb=0;bb<26;bb++)

{

LED=0;

delay(500);

WriteDataLCM(aa);

aa++;

if(aa==0x51)

{

WriteCommandLCM(0xc0);

}

if(aa==0x5b)

{

break;

}

LED=1;

delay(500);

}

delay(2000);

WriteCommandLCM(0x01);

for(bb=0;bb<10;bb++)

{

LED=0;

delay(500);

DisplayListChar(3, 0, TAB1);

DisplayListChar(2, 1, TAB2);

LED=1;

delay(500);

}

delay(5000);

}

/****************************************************************************** **********

LCD12864 ST7920控制芯片测试程序本实验采用P3口和P0口驱动实验时将跳线帽接至+3V

******************************************************************************* *********/

#include

#define uchar unsigned char

#define uint unsigned int

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

//------------------------------------

void PORT_Init (void);

void delay(uint z);

//-----------------------------------

#define LCDBUS P3

sbit RS = P0^0;

sbit RW = P0^1;

sbit E = P0^2;

sbit PSB = P0^3;

sbit RST = P0^4;

void PORT_Init (void)

{

XBR2 = 0x40; /*使能交叉开关*/

P3MDOUT =0xff;

P0MDOUT =0xff;

}

/*******************************/

void delay(uint z)

{

uint x,y;

for(x=0;x

for(y=0;y<121;y++);

}

/*******************************/

uchar code symbo[]={

/*-- 调入了一幅图像:D:\guoq files\technic support\pic\128x32 Symbo.bmp --*/

/*-- 宽度x高度=128x32 --*/

0x00,0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x1F,0xC0,0x00,0x1F,0xC0,0x03,0xE0,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x00,0x20,0x40,0x04,0x10,0x00,

0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x40,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x00,0x80,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x04,0x01,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x02,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x04,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x88,0x00,0x80,0x04,0x10,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x50,0x01,0x00,0x03,0xE0,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x02,0x00,0x00,0x00,0x00, 0x1F,0xFC,0x01,0xFF,0xDF,0xFF,0xFF,0xFF,0xC1,0x00,0x00,0x04,0x00,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x80,0x00,0x08,0x1F,0xFF,0xFF,0xF8, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x40,0x00,0x10,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x20,0x00,0x20,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x10,0x00,0x40,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x08,0x00,0x80,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x10,0x00,0x40,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x20,0x00,0x20,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x40,0x00,0x10,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x80,0x00,0x08,0x1F,0xFF,0xFF,0xF8, 0x1F,0xFC,0x01,0xFF,0xDF,0xFF,0xFF,0xFF,0xC1,0x00,0x00,0x04,0x00,0x00,0x00,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x02,0x00,0x00,0x00,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x50,0x01,0x00,0x03,0xE0,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x88,0x00,0x80,0x04,0x10,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x04,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x02,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x04,0x01,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x00,0x80,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x40,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x00,0x20,0x40,0x04,0x10,0x00, 0x00,0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x1F,0xC0,0x00,0x1F,0xC0,0x03,0xE0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };

//-----------------------------------

// Delay Routine

//-----------------------------------

void delay100us(void) //delay TIMER1*1 ms for 12MHz

{

uchar data i;

for(i=0;i<=10;i++)

{

_nop_();

_nop_();

}

}

void delayms( uint m ) // 12MHz Xtal, close to ms value {

uint j;

uint i;

for(i=0; i

for(j=0; j<109; j++)

_nop_();

}

void SdCmd(uchar Command) //send command

{

RS = 0;

RW=0;

LCDBUS = Command;

E = 1;

E = 0;

delay100us();

}

void SdData(uchar DData) //send display data

{

RS = 0;

RS=1;

RW=0;

LCDBUS = DData;

E = 1;

E = 0;

delay100us();

}

uchar RdData()

{

uchar DData;

RS = 0;

RW = 1;

RS=1;

LCDBUS=0xff;

E=1;

DData = LCDBUS;

E = 0;

return(DData);

}

//-----西文写入函数----------------

void PrintASCII(uint x,y,uchar *pstr) //通用函数

uint addr;

y=y<<4;

addr=y|0x80+x;

SdCmd(addr);

while(*pstr>0)

{

SdData(*pstr++);

}

}

//----中文写入函数-----------------

void PrintGB(uchar x,y,uchar *pstr)

{

uint addr;

y=y<<4;

addr=y|0x80+x;

SdCmd(addr);

while(*pstr>0)

{

SdData(*pstr++);

delayms(300); //演示用

}

}

//----初始化函数-----------------

void initLCM()

{

RST=0;

delayms(5);

RST=1;

delayms(800);

SdCmd(0x30); /* 设置工作方式(8位总线) */ SdCmd(0x06); /* 设置输入方式*/

SdCmd(0x0f); /* 设置显示方式*/

SdCmd(0x01); /* 清屏*/

delayms(2);

}

//----清屏函数------------------

void ClearRAM()

{

uchar i,j;

SdCmd(0x34);

for(i=0;i<32;i++)

{

SdCmd(i|0x80);

SdCmd(0x80);

for(j=0;j<16;j++)

{

SdData(0x00);//

SdData(0x00);

}

}

SdCmd(0x30);

}

//---- 画图函数-----------------------------

void ShowBmp(uchar x,y, width,high,uchar *bmp) {

uchar i,j;

SdCmd(0x34);

SdCmd(0x36);

for(i=y;i<(y+high);i++)

{

if (i<32)

{

SdCmd(0x80|i);

SdCmd(0x80|x);

}

else

{

SdCmd(0x80|(i-32));

SdCmd(0x80|(x+8));

}

for(j=0;j

{

SdData(*bmp++);

SdData(*bmp++); //

}

}

SdCmd(0x30);

}

//---画点函数----------------

void Draw_Dot(uint x,y)

{

uchar m,n;

uint k;

if(y>=32)

{

y=y-32;

x=x+128;

}

SdCmd(y|0x80);

k=x/16;

SdCmd(k|0x80);

k=0x8000;

k=k>>x%16;

m=RdData();

m=RdData()|k>>8;

n=RdData()|k;

k=x/16;

SdCmd(y|0x80);

SdCmd(k|0x80);

SdData(m);

SdData(n);

}

//--- 画线函数---------------

void Draw_Line(uint x1,y1,x2,y2) {

uint temp;

int dalt_x,dalt_y,err=0;

if (y1>y2)

{

temp=x1;

x1=x2;

x2=temp;

temp=y1;

y1=y2;

y2=temp;

}

Draw_Dot(x1,y1);

dalt_x=x2-x1;

dalt_y=y2-y1;

if(dalt_x>=0)

{

if(dalt_y>dalt_x)//k>1

{

while(y1

{

if(err<0)

{

x1=x1+1;

y1=y1+1;

err=err+dalt_y-dalt_x;

}

else

{

y1=y1+1;

err=err-dalt_x;

}

Draw_Dot(x1,y1);

}

}

else // 0<=k=<1

{

if (dalt_y==0)

y1=y1-1;

while(x1

{

if(err<0)

{

x1=x1+1;

err=err+dalt_y;

}

else

{

y1=y1+1;

x1=x1+1;

err=err+dalt_y-dalt_x;

}

Draw_Dot(x1,y1);

}

}

}

else

{

dalt_x=x1-x2;

if(dalt_y>dalt_x)//k<-1

{

while(y1

{

if(err<0)

{

x1=x1-1;

y1=y1+1;

err=err+dalt_y-dalt_x;

}

else

{

y1=y1+1;

err=err-dalt_x;

}

Draw_Dot(x1,y1);

}

}

else //0>k>=-1

{

if (dalt_y==0)

y1=y1-1;

while(x1>x2)

{

if(err<0)

{

x1=x1-1;

err=err+dalt_y;

}

else

{

x1=x1-1;

y1=y1+1;

err=err+dalt_y-dalt_x;

}

Draw_Dot(x1,y1);

}

}

}

}

//--功能演示函数------------------------- void quxian1()

{

SdCmd(0x06);

PrintGB( 0,0,"画面不动光标地址加1 指令代码为06");

delayms(3000);

SdCmd(0x01);

delayms(2);

SdCmd(0x04);

PrintGB( 15,0,"画面不动光标地址减1 指令代码为04");

delayms(3000);

SdCmd(0x01);

delayms(2);

SdCmd(0x07);

PrintGB( 0,0,"画面整体左移1 位指令代码为07");

delayms(3000);

SdCmd(0x01);

delayms(2);

SdCmd(0x05);

PrintGB( 15,0,"画面整体右移1 位指令代码为05");

delayms(3000);

SdCmd(0x06);

}

//----做图演示函数------------------------------------

void quxian2()

{

uint code data1[48]={88,89,85,87,89,90,89,89,

88,86,87,86,88,89,90,94,

95,96,96,97,99,99,101,103,

101,101,100,103,105,113,113,

117,117,116,114,107,110,114,

113,112,115,112,113,119,120,

125,124,128};

uint a1,b1,a2,b2,i;

SdCmd(0x01);

delayms(2);

SdCmd(0x0c);

PrintASCII(0,0," Time");

PrintASCII(14,1,"Temp");

SdCmd(0x34);

SdCmd(0x36);

Draw_Line(1, 60, 125,60);// 设置坐标X coordinate

Draw_Line(1, 15, 1, 60);// 设置坐标Y coordinate delayms(1000);

a1=1;

for ( i=0;i<40;i++)

{

b1=data1[i]-70;

Draw_Dot(a1,b1);//画点

a1=a1+3;

}

delayms(3000);

a1=1;

for ( i=0;i<40;i++)

{

b1=data1[i]-70;

b2=data1[i+1]-70;

a2=a1+3;

Draw_Line(a1,b1,a2,b2);//画线

a1=a2;

}

SdCmd(0x32);

}

//-----------------------------------

// Main Program

//-----------------------------------

void main()

{

WDTCN = 0xde;

WDTCN = 0xad; //禁止看门狗定时器

PORT_Init ();

SP=0x60;

EA=0;

PSB=1; //并行接口选择

LCDBUS=0xff; // 初始化接口

RW=1;

E =0;

initLCM();

while(1)

{

SdCmd(0x01); /* 清屏*/

delayms(2);

ClearRAM();

//-- 字库字符显示

PrintASCII(8,0," ST7920 演示程序");

相关主题
相关文档
最新文档