嵌入式实验报告

更新时间:2023-03-08 17:00:47 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

ARM 实验报告

姓名: 学号: 专业: 学院: 指导老师:

一、GPIO输出与按键控制实验——按键控制流水灯实验 实验原内容:

通过数组认为定义流水灯花样; 一个按键控制一种流水灯花色;

实验电路图:

源程序:

#include \#include \

/* 名称:DelayNS() 功能:长软件延时 入口参数:dly 延时参数,值越大,延时越久**/

void DelayNS(uint32 dly) { uint32 i;

for(; dly>0; dly--)

for(i=0; i<50000; i++);}

/** 函数名称:main() 函数功能:GPIO输出测试,花样流水灯。*/

const uint32 LED_TBL[8][10] = { 花样流水灯,注意调用时候用了取反操作 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, // 全部点亮 {0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0xFF}, // 依次逐个点亮

{0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF}, // 依次逐个叠加 {0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0xFF}, // 依次逐个递减 {0x00, 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81, 0xFF}, // 两个靠拢后分开 {0x00, 0x81, 0xC3, 0xE7, 0xFF, 0xFF, 0xE7, 0xC3, 0x81, 0xFF}, // 从两边叠加后递减 {0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xFF, 0xFF}, {0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF} };

/** 函数名称:keyscan() 函数功能:按键扫描,每按一次键对相应的LED进行取反*/ void keyscan(void) { uint32 i,j,k,m;

PINSEL0 = 0x00000000;

// 设置管脚连接GPIO IO0DIR = 0x000000ff; k=IO0PIN;

if((k&keycon)!=keycon)

{ for(j=0; j<50000; j++);//延时去抖 k=IO0PIN;

if((k&keycon)!=keycon) { i=(k&keycon)|(~keycon); i=~i; switch(i) { case KEY1 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[0][m]));DelayNS(3);IO0CLR = ((LED_TBL[0][m]));DelayNS(3);} break; case

KEY2 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[1][m]));DelayNS(3);IO0CLR = ((LED_TBL[1][m]));DelayNS(3);} break; case

KEY3 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[2][m]));DelayNS(3);IO0CLR = ((LED_TBL[2][m]));DelayNS(3);} break; case

KEY4 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[3][m]));DelayNS(3);IO0CLR = ((LED_TBL[3][m]));DelayNS(3);} break; case

KEY5 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[4][m]));DelayNS(3);IO0CLR = ((LED_TBL[4][m]));DelayNS(3);} break; case

KEY6 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[5][m]));DelayNS(3);IO0CLR = ((LED_TBL[5][m]));DelayNS(3);} beak; case

KEY7 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[6][m]));DelayNS(3);IO0CLR = ((LED_TBL[6][m]));DelayNS(3);} break;

case

KEY8 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[7][m]));DelayNS(3);IO0CLR = ((LED_TBL[7][m]));DelayNS(3);} break; } } while((k&keycon)!=keycon) k=IO0PIN; } }

/* 函数名称:main()

* 函数功能:每按一次键,对相应LED的状态取反*/

int main(void) {

TargetResetInit();

PINSEL0 =0x00000000; // 设置所

有管脚连接GPIO

PINSEL1 =0x00000000;

IO0DIR = 0x000000ff; // 设

置P0.0-P0.7为输出,其余为输入 IO0CLR = 0xffffffff; while(1)

{ keyscan(); }}

二、GPIO输出实验——流水灯实验 实验内容:

通过数组认为定义流水灯花样; 有六种花样的流水灯依次闪烁;

实验电路图:

源程序:

#include \

/** 函数名称:DelayNS()函数功能:长软件延时入口参数:dly 延时参数,值越大,延时越久*/

void DelayNS (uint32 dly) { uint32 i; for ( ; dly>0; dly--) for (i=0; i<50000; i++);} /** 函数名称:main() 函数功能:GPIO输出测试,花样流水灯。*/ const uint32 LED_TBL[] = { // 花样流水灯,注意调用时候用了取反操作 0x00, 0xFF, // 全部熄灭后,再全部点亮 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, // 依次逐个点亮 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, // 依次逐个叠加 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, // 依次逐个递减 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81, // 两个靠拢后分开 0x81, 0xC3, 0xE7, 0xFF, 0xFF, 0xE7, 0xC3, 0x81 };// 从两边叠加后递减 int main (void) { uint8 i;

PINSEL0 = 0x00000000; // 设置管脚连接GPIO IO0DIR = 0x000000ff; // 设置P0.0-P0.7控制口为输出 while (1) { for (i=0; i<42; i++) // 花样流水灯显示 { IO0SET = ~((LED_TBL[i]));DelayNS(3);IO0CLR = ((LED_TBL[i]));DelayNS(3); }}}

三、单路按键控制LED/蜂鸣器 实验内容:

按键key1一按,蜂鸣器响,LED灯亮;

实验电路图:

源程序:

#include \

#define BEEP 1<<7 //P0.7控制蜂鸣器,低电平蜂鸣 #define KEY1 1<<8

/* 函数名称:DelayNS() 函数功能:长软件延时* 入口参数:dly 延时参数,值越大,延时越久 出口参数:无*******/ void DelayNS (uint32 dly) { uint32 i; for ( ; dly>0; dly--) for (i=0; i<50000; i++); }

/** 函数名称:main()** 函数功能:用P0.7控制BEEP,让蜂鸣器蜂鸣*/ int main (void) { PINSEL0 = 0x00000000; // 设置引脚连接GPIO PINSEL1 = 0x00000000; IO0DIR = BEEP; // 设置BEEP控制口为输出 while (1) { if((IO0PIN & KEY1) == 0)IO0CLR = BEEP; else IO0SET = BEEP;}}

四、定时器0控制数码管一亮一灭 实验内容:

0.5定时时间一到,数码管闪烁一次;

实验电路图:

源程序:

#include \#include \

#define LED (1 << 7) /* P0.7引脚控制LED,低电平点亮 */ /* 函数名称:main()

* 函数功能:通过查询定时器0中断标志位控制LED点亮*/ int main(void)

{ PINSEL1 = 0x00000000; // 设置管脚连接GPIO IO0DIR = LED; // 设置LED控制口输出 T0TC = 0; // 定时器0初始化 T0PR = 99; // 设置定时器0分频为100分频,得120000Hz T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC T0MR0 = 60024; // 比较值(0.5s定时值) T0TCR = 0x03; // 启动并复位T0TC T0TCR = 0x01; while (1) { while ((T0IR & 0x01) == 0); // 等待定时时间到 T0IR = 0x01; // 清除中断标志 if ((IO0SET & LED) == 0) // 取反LED状态 IO0SET = LED; else IO0CLR = LED; } }

五、数码管动态显示 实验电路图:

源程序:

#include\void delay(uint32 x) { uint8 i; while(x--) for(i=500000;i>0;i--); }

uint8 table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };

uint8 table1[]={ 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 };

int main(void) { uint8 i,j,p=16; PINSEL0=0x00000000; PINSEL1=0x00000000; IO0DIR=0x00ffff00; while(1) { for(i=0;i<8;i++) { IO0CLR=IO0CLR|0xff00; IO0SET=~table[i]<<8;

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

IO0CLR=IO0CLR|0xff0000; IO0SET=1<

六、将读取的DS18B20温度值转换为十进制 实验电路图:

#include \ #include \

uint8

}

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

Tp[12]; *************************************

*** // 温度显示数据

uint16 tt; * 函数名称:ConvertTemperature() uint8 TMark = 0; * 函数功能: 将读取的 DS18B20 温度值转换// 温度正负标志 为十进制数 * 入口参数:tvalue 读取的DS18B20当前温/************************************度值 ***************************************************************************** *************************************

**/ * 函数名称:Init()

void ConvertTemperature(uint16 tvalue){ * 函数功能:I/O端口初始化,设置引脚连

Tp[1] = tvalue/1000+0x30; 接模块

************************************* // 百位数 ************************************* Tp[2] = tvalue00/100+0x30; **/ // 十位数 void Init(void){ Tp[3] = tvalue0/10+0x30; PINSEL0 |= 0x00000000; // 设置引脚连// 个位数

Tp[4] = 0x2E; 接模块

PINSEL1 |= 0x00000088; // 显示小数点 PINSEL2 &= 0x00000004; Tp[5] = tvalue+0x30;

for (i=0; i<50000; i++); // 显示温度小数位

Tp[6] = 0x01; }

// 显示自定义字符,用于温度符号显示

Tp[7]= 0x43; /************************************

*************************************// 显示字符\

Tp[8]= 0x20; *** // 显示字符\ * 函数名称:main() Tp[9]= 0x20; * 函数功能:主函数

// 显示字符\

Tp[10]= 0x20; // 显示字符\

Tp[11]= 0x20; // 显示字符\

if (TMark == 0){ Tp[0] = 0x20; // 正温度不显示符号

} else{ Tp[0] = 0x2D; // 负温度显示负号:- } if (Tp[1] == 0x30){ Tp[1] = 0x20; // 如果百位为0,不显示

if (Tp[2] == 0x30){ Tp[2] = 0x20; // 如果十位为0,不显示

} } } /**************************************************************************** * 函数名称:DelayNS()

* 函数功能:软件延时

* 入口参数:dly 延时参数,值越大,延时

越久

****************************************************************************/ void DelayNS(uint32 dly){ uint32 i; for ( ; dly>0; dly--)

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

**/ int main(void){

uint8 i; Init(); // I/O 端口初始化

lcd_init(); // LCD初始化 DisText(0x80,\ for(i=0;i<110;i++)ReadTemp(); // 预读DS18B20 while (1){ ConvertTemperature(ReadTemp()); // 温度转换

DisText(0xc4,Tp); // 显示当前温度 }

}

七、LCD 1602显示1 实验电路图:

源程序:

#include \#define rs (1<<5) #define rw (1<<6) #define en (1<<7) #define busy (1<<15)

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

* 函数名称:ChkBusy()

* 函数功能:检查总线是否忙

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

void ChkBusy() { IO0DIR=0xf0; while(1) { IO0CLR=rs; IO0SET=rw; IO0SET=en;

if(!(IO0PIN & busy))break;

IO0CLR=en; } IO0DIR=0xffffffff; }

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

* 函数名称:WrOp() * 函数功能:写命令

* 入口参数:dat,待写入LCD的命令 ****************************************************************************/

void WrOp(uint8 dat) { ChkBusy(); IO0CLR=rs; IO0CLR=rw; IO0CLR=IO0CLR|0xff00; //先清零 IO0SET=dat<<8; //再送数

IO0SET=en; IO0CLR=en; }

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

* 函数名称:WrDat() * 函数功能:写数据

* 入口参数:dat,待写入LCD的数据 ****************************************************************************/

void WrDat(uint8 dat) { ChkBusy(); IO0SET=rs; IO0CLR=rw; IO0CLR=IO0CLR|0xff00; //先清零 IO0SET=dat<<8; //再送数 IO0SET=en; IO0CLR=en; }

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

* 函数名称:lcd_init() * 函数功能:lcd初始化

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

void lcd_init(void) { WrOp(0x38); WrOp(0x06); WrOp(0x0c); }

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

* 函数名称:LocateXY() * 函数功能:显示光标定位

* 入口参数:posx LCD列位置,posy LCD行

位置

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

void LocateXY( uint8 posx,uint8 posy) { uint8 temp; temp = posx & 0xf; posy &= 0x1; if ( posy )temp |= 0x40; temp |= 0x80; WrOp(temp); }

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

* 函数名称:DispOneChar() * 函数功能:显示单字符

* 入口参数:x LCD列位置,y LCD行位置,Wdata 显示字符

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

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

LocateXY( x, y ); // 定位显示字符的x,y位置 WrDat( Wdata ); // 写字符 }

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

* 函数名称:ePutstr() * 函数功能:显示字符串

* 入口参数:x LCD列,y LCD行,j 字符串长度,*ptr 字符串指针

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

void ePutstr(uint8 x,uint8 y, uint8 j,uint8 *ptr){ uint8 i,l=0;

for (i=0;i

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

* 函数名称:DisText() * 函数功能:显示文本

* 入口参数:addr LCD DDRAM地址,*p 文本指针

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

void DisText(uint8 addr,char *p) { WrOp(addr); while(*p !='\\0')WrDat(*(p++)); }

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

* 函数名称:main() * 函数功能:LCD初始化,自定义汉字字符,LCD显示英文和汉字字符。

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

int main(void) { uint8 i; uint8

examp1[]={0x32,0x30,0x31,0x32,0x00,0x31,0x01,0x32,0x36,0x02}; uint8

Hzzimo[]={0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x00, // 年

0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00, //

0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,0x00}; // 日

lcd_init(); // LCD初始化 WrOp( 0x40 ); // 自定义汉字字符:年、月、日 for (i=0;i<24;i++){ WrDat(Hzzimo[i]); } DisText(0x80,\ // 第一行从第0位开始显示英文字符 ePutstr(4,1,10,examp1); // 第二行从第4位开始显示2012年1月26日 while(1); }

八、LCD 1602显示2 实验电路图:

源程序:

#include \#define rs (1<<5) #define rw (1<<6) #define en (1<<7) #define busy (1<<15)

/* 函数名称:ChkBusy()

* 函数功能:检查总线是否忙**/ void ChkBusy() { IO0DIR=0xf0; while(1) { IO0CLR=rs; IO0SET=rw; IO0SET=en; if(!(IO0PIN & busy))break; IO0CLR=en; } IO0DIR=0xffffffff;} /* 函数名称:WrOp() * 函数功能:写命令

* 入口参数:dat,待写入LCD的命令 **/ void WrOp(uint8 dat)

{ ChkBusy();IO0CLR=rs;IO0CLR=rw; IO0CLR=IO0CLR|0xff00; //先清零 IO0SET=dat<<8; //再送数 IO0SET=en;IO0CLR=en;} /* 函数名称:WrDat() * 函数功能:写数据

* 入口参数:dat,待写入LCD的数据 **/ void WrDat(uint8 dat)

{ ChkBusy();IO0SET=rs;IO0CLR=rw; IO0CLR=IO0CLR|0xff00; //先清零 IO0SET=dat<<8; //再送数 IO0SET=en;IO0CLR=en;} /* 函数名称:lcd_init() * 函数功能:lcd初始化**/ void lcd_init(void)

{ WrOp(0x38);WrOp(0x06);WrOp(0x0c); }

/* 函数名称:DisText() * 函数功能:显示文本

* 入口参数:addr LCD DDRAM地址,*p 文本指针 **/

void DisText(uint8 addr,char *p) { WrOp(addr); while(*p !='\\0')WrDat(*(p++));} /* 函数名称:main() * 函数功能:LCD初始化,自定义汉字字符,LCD显示英文和汉字字符。**/ int main(void) { uint8 i;

lcd_init(); // LCD初始化 DisText(0x80,\ DisText(0xc0,\hijklmn\ while(1);}

九、LCD 1602显示3 实验电路图:

源程序:

#include \#define rs (1<<5) #define rw (1<<6) #define en (1<<7) #define busy (1<<15) /* 函数名称:ChkBusy()

* 函数功能:检查总线是否忙**/ void ChkBusy() { IO0DIR=0xf0; while(1) { IO0CLR=rs; IO0SET=rw; IO0SET=en; if(!(IO0PIN & busy))break; IO0CLR=en; } IO0DIR=0xffffffff;} /* 函数名称:WrOp() * 函数功能:写命令

* 入口参数:dat,待写入LCD的命令 **/ void WrOp(uint8 dat)

{ ChkBusy();IO0CLR=rs;IO0CLR=rw; IO0CLR=IO0CLR|0xff00; //先清零 IO0SET=dat<<8; //再送数 IO0SET=en;IO0CLR=en;} /* 函数名称:WrDat() * 函数功能:写数据

* 入口参数:dat,待写入LCD的数据 **/ void WrDat(uint8 dat)

{ ChkBusy();IO0SET=rs;IO0CLR=rw;

IO0CLR=IO0CLR|0xff00; //先清零 IO0SET=dat<<8; //再送数 IO0SET=en;IO0CLR=en;} /* 函数名称:lcd_init() * 函数功能:lcd初始化**/ void lcd_init(void)

{ WrOp(0x38);WrOp(0x06);WrOp(0x0c); }

/* 函数名称:DisText() * 函数功能:显示文本

* 入口参数:addr LCD DDRAM地址,*p 文本指针 **/

void DisText(uint8 addr,char *p) { WrOp(addr); while(*p !='\\0')WrDat(*(p++));} /* 函数名称:main() * 函数功能:LCD初始化,自定义汉字字符,LCD显示英文和汉字字符。**/ int main(void) { uint8 i;

lcd_init(); // LCD初始化 DisText(0x80,\hijklmn\DisText(0xc0,\ while(1);}

十、PWM脉宽调制 实验内容:

LPC2131芯片PWM模块可以实现6路单边沿控制或者3路双边沿控制,或者两者混合输出。

实验电路图:

源程序:

#include #define RED_A (1<<8); #define YELLOW_A (1<<9); #define GREEN_A (1<<10); #define RED_B (1<<11); #define YELLOW_B (1<<12); #define GREEN_B (1<<13);

uint8 Flash_Count = 0;

uint8 Operation_Type = 1; void DelayMS(uint16 x) { uint16 t; while(x--) {for(t=500;t>0;t--);} }

void Traffic_lignt() {

switch(Operation_Type) {case 1: IO0SET=RED_A; IO0SET=YELLOW_A; IO0CLR=GREEN_A; IO0CLR=RED_B; IO0SET=YELLOW_B; IO0SET=GREEN_B; DelayMS(2000); Operation_Type = 2; break; case 2: DelayMS(200); IO0SET=YELLOW_A; DelayMS(200); IO0CLR=YELLOW_A; IO0SET=GREEN_A; if(++Flash_Count !=5) return; Flash_Count=0; Operation_Type = 3; break; case 3: IO0CLR=RED_A; IO0SET=YELLOW_A; IO0SET=GREEN_A; IO0SET=RED_B; IO0SET=YELLOW_B; IO0CLR=GREEN_B; DelayMS(2000); Operation_Type = 4; break; case 4: DelayMS(200); IO0SET=YELLOW_B; DelayMS(200); IO0CLR=YELLOW_B; IO0SET=GREEN_B; if(++Flash_Count !=5) return; Flash_Count=0; Operation_Type = 1; break; } }

int main(void) { PINSEL0=0x00000000;

PINSEL1=0X00000000; IO0DIR=0x00003f00; while(1)

{Traffic_lignt(); }}

十一、流水灯 实验电路图:

#include \

void DelayNS (uint32 dly) { uint32 i; for ( ; dly>0; dly--) for (i=0; i<50000; i++); }

int main (void) { PINSEL0 = 0x00000000; IO0DIR = 0x000000ff; while (1) { IO0PIN = 0xAA; DelayNS(15); IO0PIN = 0x55 ; DelayNS(15); IO0PIN = 0x00 ; DelayNS(15); }}

十二、模拟交通灯 实验电路图:

源程序:

#include #define RED_A (1<<8); #define YELLOW_A (1<<9); #define GREEN_A (1<<10); #define RED_B (1<<11); #define YELLOW_B (1<<12); #define GREEN_B (1<<13); uint8 Flash_Count = 0; uint8 Operation_Type = 1; void DelayMS(uint16 x) { uint16 t; while(x--) {for(t=500;t>0;t--);} }

void Traffic_lignt() {

switch(Operation_Type) {case 1: IO0SET=RED_A; IO0SET=YELLOW_A; IO0CLR=GREEN_A; IO0CLR=RED_B; IO0SET=YELLOW_B; IO0SET=GREEN_B; DelayMS(2000); Operation_Type = 2; break; case 2: DelayMS(200); IO0SET=YELLOW_A; DelayMS(200); IO0CLR=YELLOW_A; IO0SET=GREEN_A; if(++Flash_Count !=5) return;

Flash_Count=0;

Operation_Type = 3; break; case 3: IO0CLR=RED_A; IO0SET=YELLOW_A; IO0SET=GREEN_A; IO0SET=RED_B; IO0SET=YELLOW_B; IO0CLR=GREEN_B; DelayMS(2000); Operation_Type = 4; break; case 4: DelayMS(200); IO0SET=YELLOW_B; DelayMS(200); IO0CLR=YELLOW_B; IO0SET=GREEN_B; if(++Flash_Count !=5) return; Flash_Count=0; Operation_Type = 1; break; }

}

int main(void) { PINSEL0=0x00000000; PINSEL1=0X00000000; IO0DIR=0x00003f00; while(1) {Traffic_lignt(); }}

十三、FIQ中断服务 实验电路图:

#include \

#define LED1 1 << 18 #define EINT0 14 int main (void)

{ PINSEL1 = 0x00000001; IO0DIR = LED1; EXTMODE = 0x00; FIQEnable(); VICIntSelect = 1 << EINT0; EXTINT = 0x01; VICIntEnable = 1 << EINT0; while (1); }

void FIQ_Exception(void) { uint32 i; i = IO0SET; if ((i & LED1) == 0) IO0SET = LED1; else IO0CLR = LED1; while ((EXTINT & 0x01) != 0) { EXTINT = 0x01; } }

十四、按键控制LED 实验内容:

每一按键对应一个LED灯,当按键被按下,对应的LED灯亮;

实验电路图:

#include \IO0SET=LED4; else IO0CLR=LED4; break; #include \ case KEY5 :if((IO0PIN&LED5)!=LED5) void DelayNS(uint32 dly) IO0SET=LED5; else IO0CLR=LED5; break; { uint32 i; case KEY6 :if((IO0PIN&LED6)!=LED6) for(; dly>0; dly--) IO0SET=LED6; else IO0CLR=LED6; break; for(i=0; i<50000; i++); case KEY7 :if((IO0PIN&LED7)!=LED7) } IO0SET=LED7; else IO0CLR=LED7; break; void keyscan(void) case KEY8 :if((IO0PIN&LED8)!=LED8) { uint32 i,j,k; IO0SET=LED8; else IO0CLR=LED8; break; k=IO0PIN; }} if((k&keycon)!=keycon) while((k&keycon)!=keycon) k=IO0PIN; { }} for(j=0; j<50000; j++); int main(void) k=IO0PIN; { if((k&keycon)!=keycon) TargetResetInit(); { i=(k&keycon)|(~keycon); PINSEL0 = 0x00000000; i=~i; PINSEL1 = 0x00000000; switch(i) IO0DIR = 0x000000ff; { case KEY1 :if((IO0PIN&LED1)!=LED1) IO0CLR = 0xffffffff; IO0SET=LED1;else IO0CLR=LED1;break; while(1) case KEY2 :if((IO0PIN&LED2)!=LED2) {

IO0SET=LED2;、else IO0CLR=LED2; break; keyscan();

} case KEY3 :if((IO0PIN&LED3)!=LED3)

} IO0SET=LED3;else IO0CLR=LED3; break;

case KEY4 :if((IO0PIN&LED4)!=LED4)

十五、PWM作32位定时器实验 实验内容:

将PWM作为32位定时器使用,控制蜂鸣器、LED灯的响与亮灭

实验电路图:

源程序:

/****************************************Copyright

(c)**************************************************

** Guangzou ZLG-MCU Development Co.,LTD.

** graduate school

** http://www.zlgmcu.com **

**--------------File

Info------------------------------------------------------------------------------- ** File name: main.c

** Last modified Date: 2004-09-16 ** Last Version: 1.0 ** Descriptions: The main() function example template **

**------------------------------------------------------------------------------------------------------ ** Created by: Chenmingji ** Created date: 2004-09-16 ** Version: 1.0 ** Descriptions: The original version

**

**------------------------------------------------------------------------------------------------------ ** Modified by: ** Modified date: ** Version: ** Descriptions: **

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

#define BEEP 1 << 7 // P0.7控制蜂鸣器 /*

******************************************************************************************************** ** 函数名称: PWM_Int()

** 功能描述: PWM中断服务函数,取反控制蜂鸣器。

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

*/

void __irq PWM_Int(void) {

PWMIR = 0x01; // 复位PWM中断标志

/* 取反LED9状态 */

if((IO0SET & BEEP) == 0) IO0SET = BEEP; else IO0CLR = BEEP;

VICVectAddr = 0x00; // VIC结束 } /*

******************************************************************************************************** ** 函数名称: main()

** 功能描述: 演示PWM作32位定时器使用实验。

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

int main (void) {

PINSEL0 = 0x00000000;

// 设

置管脚连接GPIO IO0DIR = BEEP; IO0SET = BEEP;

IRQEnable(); // IRQ

中断使能

/* PWM作为定时器时的初始化 */ PWMTC = 0; // 定时器设置为0 PWMPR = 0; // 时钟不分频

PWMMCR = 0x03;

// 设置T0MR0匹配后复位T0TC,并产生中断标志 PWMMR0 = Fpclk / 2; // 0.5秒钟定时 PWMTCR = 0x01;

// 启动定时器

/* 设置PWM中断 */

VICIntSelect = 0x00000000; // 所有中断连接IRQ

VICVectCntl0 = 0x20 | 8; // 选择通道0

VICVectAddr0 = (int)PWM_Int; // PWM中断服务程序地址 VICIntEnable = (1 << 8); // 使能PWM中断

while(1); // 等待中断 return 0; }

十一、 十六、LCD 1602显示4 实验电路图:

源程序:

#include \#define rs (1<<5) #define rw (1<<6) #define en (1<<7) #define busy (1<<15)

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

* 函数名称:ChkBusy()

* 函数功能:检查总线是否忙

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

void ChkBusy() { IO0DIR=0xf0; while(1) { IO0CLR=rs; IO0SET=rw; IO0SET=en; if(!(IO0PIN & busy))break; IO0CLR=en; } IO0DIR=0xffffffff;

}

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

* 函数名称:WrOp() * 函数功能:写命令

* 入口参数:dat,待写入LCD的命令 ****************************************************************************/

void WrOp(uint8 dat) { ChkBusy(); IO0CLR=rs; IO0CLR=rw; IO0CLR=IO0CLR|0xff00; //先清零 IO0SET=dat<<8; //再送数 IO0SET=en; IO0CLR=en; }

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

* 函数名称:WrDat() * 函数功能:写数据

* 入口参数:dat,待写入LCD的数据 ****************************************************************************/

void WrDat(uint8 dat) { ChkBusy(); IO0SET=rs; IO0CLR=rw; IO0CLR=IO0CLR|0xff00; //先清零 IO0SET=dat<<8; //再送数 IO0SET=en; IO0CLR=en; }

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

* 函数名称:lcd_init() * 函数功能:lcd初始化

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

void lcd_init(void) { WrOp(0x38); WrOp(0x06); WrOp(0x0c); }

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

* 函数名称:LocateXY() * 函数功能:显示光标定位

* 入口参数:posx LCD列位置,posy LCD行位置

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

void LocateXY( uint8 posx,uint8 posy) { uint8 temp; temp = posx & 0xf; posy &= 0x1;

if ( posy )temp |= 0x40;

temp |= 0x80; WrOp(temp); }

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

* 函数名称:DispOneChar() * 函数功能:显示单字符

* 入口参数:x LCD列位置,y LCD行位置,Wdata 显示字符

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

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

LocateXY( x, y ); // 定

位显示字符的x,y位置 WrDat( Wdata );

// 写字符 }

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

* 函数名称:ePutstr() * 函数功能:显示字符串

* 入口参数:x LCD列,y LCD行,j 字符串长度,*ptr 字符串指针

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

void ePutstr(uint8 x,uint8 y, uint8 j,uint8 *ptr){ uint8 i,l=0; for (i=0;i

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

* 函数名称:DisText() * 函数功能:显示文本

* 入口参数:addr LCD DDRAM地址,*p 文本指针

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

void DisText(uint8 addr,char *p) { WrOp(addr); while(*p !='\\0')WrDat(*(p++)); }

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

* 函数名称:main() * 函数功能:LCD初始化,自定义汉字字符,LCD显示英文和汉字字符。

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

int main(void) { uint8 i; uint8

examp1[]={0x32,0x30,0x31,0x33,0x00,0x36,0x01,0x31,0x36,0x02}; uint8

Hzzimo[]={0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x00, // 年

0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00, // 月

0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,0x00}; // 日 lcd_init(); // LCD初始化 WrOp( 0x40 ); // 自定义汉字字符:年、月、日 for (i=0;i<24;i++){ WrDat(Hzzimo[i]); } DisText(0x80,\ // 第一行从第0位开始显示英文字符 ePutstr(4,1,10,examp1); // 第二行从第4位开始显示2012年1月26日 while(1); }

十七、128*64显示 实验电路图:

源程序:

#include

#define LCD12864_RS (1<<7) #define LCD12864_RW (1<<6) #define LCD12864_E (1<<5) #define LCD12864_CS1 (1<<16) #define LCD12864_CS2 (1<<17) uint32 doyleee[] = {

0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x81,0xF1,0xF1,0xF1,0x71,0x31, 0x31,0x71,0xF1,0xF1,0xE1,0xC1,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x81,0xF1,0xF1,0xF1,0x71,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,

0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xF0,0xFF,0xFF,0xFF,0x0F,0x00,0x00, 0x00,0x00,0xC0,0xFF,0xFF,0xFF,0x7F,0x00, 0x00,0xF0,0xFC,0xFE,0xFE,0x0F,0x03,0x03, 0x07,0xFF,0xFE,0xFE,0xF8,0x00,0xE0,0xE0, 0xE0,0xE0,0x00,0x03,0x3F,0xFF,0xFF,0xFC, 0xC0,0xF0,0xFE,0x3F,0x0F,0x03,0x00,0xF0, 0xFF,0xFF,0xFF,0x0F,0x00,0x00,0xF0,0xFC, 0xFE,0xFE,0x3F,0x33,0x33,0x33,0x3F,0x3F, 0x3E,0x38,0x00,0x00,0xF0,0xFC,0xFE,0xFE, 0x3F,0x33,0x33,0x33,0x3F,0x3F,0x3E,0x38, 0x00,0x00,0xF0,0xFC,0xFE,0xFE,0x3F,0x33, 0x33,0x33,0x3F,0x3F,0x3E,0x38,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80, 0x8E,0x8F,0x8F,0x8F,0x8C,0x8C,0x8C,0x8C, 0x8E,0x8F,0x87,0x87,0x83,0x81,0x80,0x80, 0x80,0x81,0x87,0x87,0x8F,0x8E,0x8C,0x8C, 0x8F,0x87,0x87,0x83,0x80,0x80,0x80,0xC0, 0xC0,0xC0,0xC0,0xC0,0xC0,0xF3,0x7F,0x3F, 0x0F,0x03,0x00,0x00,0x00,0x00,0x0E,0x0F, 0x0F,0x0F,0x00,0x00,0x00,0x00,0x01,0x07, 0x07,0x0F,0x0E,0x0C,0x0C,0x0F,0x07,0x03, 0x01,0x00,0x00,0x00,0x01,0x07,0x07,0x0F, 0x0E,0x0C,0x0C,0x0F,0x07,0x03,0x01,0x00, 0x00,0x00,0x01,0x07,0x07,0x0F,0x0E,0x0C, 0x0C,0x0F,0x07,0x03,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, 0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x00,0x00,0xFC, 0xFC,0x04,0x0C,0xF8,0xF0,0x00,0x00,0xF0, 0xF0,0x00,0x00,0xF0,0xF0,0x00,0x00,0x40, 0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x10, 0x10,0x18,0xFC,0xFC,0x00,0x00,0x00,0x18, 0x1C,0x84,0xC4,0x7C,0x38,0x00,0x00,0xB8, 0xFC,0x64,0xC4,0xFC,0xB8,0x00,0x00,0xE0, 0xF0,0x3C,0x2C,0xE4,0xC0,0x00,0x00,0x80, 0xFC,0x7C,0x00,0xF0,0xF0,0x00,0x00,0xFC, 0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0xF8, 0xFC,0x04,0x04,0x1C,0x18,0x00,0x00,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF, 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07, 0x07,0x04,0x06,0x03,0x01,0x00,0x20,0x23, 0x27,0x34,0x1C,0x0F,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x07,0x07,0x04,0x00,0x00,0x06, 0x07,0x05,0x04,0x04,0x04,0x00,0x00,0x03, 0x07,0x04,0x04,0x07,0x03,0x00,0x00,0x03, 0x07,0x04,0x04,0x07,0x03,0x00,0x00,0x01, 0x01,0x01,0x01,0x07,0x07,0x01,0x00,0x07, 0x07,0x04,0x04,0x04,0x04,0x00,0x00,0x03, 0x07,0x04,0x04,0x07,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0, 0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x00, 0x00,0x20,0x20,0xF0,0xF0,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF0, 0x10,0x10,0x90,0x50,0xF0,0xE0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, 0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x81,0x83, 0x86,0x8C,0x8C,0x86,0x83,0x81,0x80,0x80, 0x88,0x88,0x88,0x8F,0x8F,0x88,0x88,0x88, 0x80,0x80,0x8C,0x8C,0x80,0x80,0x87,0x8F, 0x8A,0x89,0x88,0x88,0x8F,0x87,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF };

void delayms(uint8 x) { uint8 i; while(x--) for(i=50000;i>0;i--); }

void Read_busy() { IO0CLR=IO0CLR|0xff00; IO0SET=LCD12864_RW ; IO0CLR=LCD12864_RS; IO0SET=LCD12864_E; while((IO0CLR=IO0CLR|0xff00) & 0x80); IO0CLR=LCD12864_E; }

void LCD12864_WriteCOM(uint8 com) { IO0CLR=LCD12864_RW; IO0CLR=LCD12864_RS;

Read_busy();

IO0CLR=IO0CLR|0xff00; IO0SET=com<<8; IO0SET=LCD12864_E; IO0CLR=LCD12864_E; Read_busy(); }

void LCD12864_WriteData(uint8 dat)

{ IO0CLR=LCD12864_RW; IO0SET=LCD12864_RS; IO0CLR=IO0CLR|0xff00; IO0SET=dat<<8; IO0SET=LCD12864_E; IO0CLR=LCD12864_E; Read_busy(); }

unsigned char LCD12864_ReadData(void) { unsigned char LCD12864_data; IO0CLR=LCD12864_E; IO0SET=LCD12864_RW; IO0SET=LCD12864_RS; IO0SET=LCD12864_E; LCD12864_data =IO0DIR|0xff00;

Read_busy(); //读LCM忙 return LCD12864_data; }

void LCD12864_Write1Byte_X_Y( unsigned char x, unsigned char y, unsigned char LCD12864_data)

{ x = x&0x7f; y = y&0x3f; IO0SET=LCD12864_CS1;

IO0SET=LCD12864_CS2; if(x<64) { IO0CLR=LCD12864_CS1; } else{ IO0CLR=LCD12864_CS2; x = x-64; } LCD12864_WriteCOM(0x40+x); LCD12864_WriteCOM(0xb8+y); LCD12864_WriteData(LCD12864_data); }

void LCD12864_Fill_Screen( uint8 t, uint8 LCD12864_FillData) { unsigned char x,y; IO0CLR=LCD12864_CS1; IO0CLR=LCD12864_CS2; LCD12864_WriteCOM(0xc0+0); for(x=0;x<8;x++) { delayms(t); LCD12864_WriteCOM(0xb8+x); LCD12864_WriteCOM(0x40); for(y=0;y<64;y++)

LCD12864_WriteData(LCD12864_FillData); } IO0SET=LCD12864_CS1; IO0SET=LCD12864_CS2; }

void LCD12864_Clear_Screen(void) {LCD12864_Fill_Screen(60,0x00); }

void LCD12864_Clear_black(void) {LCD12864_Fill_Screen(12,0xff); }

void LCD12864_Init(void)

{ LCD12864_Clear_Screen(); IO0CLR=LCD12864_CS1; delayms(5); IO0CLR=LCD12864_CS2; delayms(5); LCD12864_WriteCOM(0xb8+0); delayms(5); LCD12864_WriteCOM(0xc0+0); delayms(5); LCD12864_WriteCOM(0x40+0); delayms(5); LCD12864_WriteCOM(0x3e); delayms(5); LCD12864_WriteCOM(0x3f); delayms(5); }

Void LCD12864_Disp_Bitmap_12864( unsigned char t, uint32 *bitmap_12864) { unsigned char j,k; for(k=0;k<8;k++)

{ delayms(t); IO0CLR=LCD12864_CS1; IO0SET=LCD12864_CS2; LCD12864_WriteCOM(0xb8+k); LCD12864_WriteCOM(0x40+0); for(j=0;j<64;j++) {

LCD12864_WriteData(bitmap_12864[k*128+j]); }

IO0SET=LCD12864_CS1; IO0CLR=LCD12864_CS2; LCD12864_WriteCOM(0xb8+k); LCD12864_WriteCOM(0x40+0); for(j=64;j<128;j++) {

LCD12864_WriteData(bitmap_12864[k*128+j]); }}

}

void LCD12864_Display( uint8 t, uint8 a,uint8 b,uint8 page,uint8 col,uint8 { unsigned char j=0,i=0; if(col < 64 ) {IO0CLR=LCD12864_CS1; IO0SET=LCD12864_CS2; } else{ IO0SET=LCD12864_CS1; IO0CLR=LCD12864_CS2; col = col - 64; } for(j=0;j

*Char ) 十八、数码管显示 实验内容:

数码管从0到9连续显示

实验电路图:

源程序:

#include\void delay(uint32 x) { uint8 i; while(x--) for(i=500000;i>0;i--); }

uint8 table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };

int main(void) { uint8 i; PINSEL0=0x00000000; PINSEL1=0x00000000; IO0DIR=0x0000ff00; for(i=0;i<10;i++) { IO0CLR=IO0CLR|0xff00; IO0SET=table[i]<<8; delay(5000); } }

本文来源:https://www.bwwdw.com/article/aja6.html

Top