十五、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); }