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 演示程序");