}
}
voideffect3(){
unsignedcharc,t=0xfe;
for(c=0;c<=7;c++){
PORTB=t;
delay();
t<<=1;
}
}
voideffect4(){
unsignedcharc,t=0;
for(c=0;c<=7;c++){
PORTB=t;
delay();
t=(t<<1)+1;;
}
}
voidmain(void){
unsignedcharx;
DDRA=0xf0;
DDRB=0xff;
for(;;){
x=PORTA&0x03;
switch(x){
case0:
effect1();break;
case1:
effect2();break;
case2:
effect3();break;
case3:
effect4();break;
}
}/*waitforever*/
/*pleasemakesurethatyouneverleavethisfunction*/
}
//行列反转法
unsignedcharkey_scan()//键盘扫描函数
{unsignedcharx,row=4,col=4,key=16;
PUCR|=0x01;//等同于PUCR=PUCR|0x01,PUCR寄存器的第0位设置为1,即允许PORTA端口的上拉电阻。
PUCR寄存器的解释参见书本P113
DDRA=0x0f;//行线PA0-PA3设置为输出,列线PA4-PA7设置为输入DDRA寄存器知识参见书本P113数据方向寄存器
PORTA=0xf0;//0bxxxx0000,四条行线PA0-PA3输出四个0,相当于四条行线接地
x=PORTA&0xf0;//读取四条列线的值,并保留高4位,清除低4位的值
if(x!
=0xf0)//如果四条列线不全为1,则说明有按键按下
{
switch(x)
{
case0xe0:
col=1;break;//按键在第1列
case0xd0:
col=2;break;//按键在第2列
case0xb0:
col=3;break;//按键在第3列
case0x70:
col=4;break;//按键在第4列
}
//以下开始行列反转,输入变输出,输出变输入。
即行线PA0-PA3设为输入,列线PA4-PA7设为输出
DDRB=0xf0;//行线PA0-PA3设为输入,列线PA4-PA7设为输出
PORTA=0x0f;//0b0000xxxx,四条列线PA4-PA7输出四个0,相当于四条列线接地
x=PORTA&0x0f//读取四条行线的值,并保留低4位,清除高4位的值
if(x!
=0x0f)//如果四条行线不全为1,则说明有按键按下
{switch(x)
{
case0x0e:
row=1;break;//按键在第1行
case0x0d:
row=2;break;//按键在第2行
case0x0b:
row=3;break;//按键在第3行
case0x07:
row=4;break;//按键在第4行
}
key=(row-1)*4+col-1;//求出键号:
0-15的整数
}
}
returnkey;//如果没有按键按下,则函数返回的key=16;
}
main()
{unsignedcharkeyno;
while
(1)
{
keyno=key_scan();//调用键盘扫描函数获取是否有按键按下,是哪个按键按下
if(keyno<16)//keyno<16有按键按下,keyno=16则表明无按键按下
switch(keyno)
{case0:
//每一个按键按下后要实现什么功能,程序写在这。
case1:
case2:
case3:
case4:
case5:
case6:
case7:
case8:
case9:
case10:
case11:
case12:
case13:
case14:
case15:
}
}
}
//行扫描法1
unsignedcharkey_scan()
{unsignedcharx,i,temp,row=4,col=4,key=16;
//PUCR|=0x01;//等同于PUCR=PUCR|0x01,PUCR寄存器的第0位设置为1,即允许PORTA端口的上拉电阻。
PUCR寄存器的解释参见书本P113
DDRA=0x0f;//行线PA0-PA3设置为输出,列线PA4-PA7设置为输入DDRA寄存器知识参见书本P113数据方向寄存器
PORTA=0xf0;//0bxxxx0000,四条行线PA0-PA3输出四个0,相当于四条行线接地
x=PORTA&0xf0;//读取四条列线的值,并保留高4位,清除低4位的值
if(x!
=0xf0)//如果四条列线不全为1,则说明有按键按下
{
switch(x)
{
case0xe0:
col=1;break;//按键在第1列
case0xd0:
col=2;break;//按键在第2列
case0xb0:
col=3;break;//按键在第3列
case0x70:
col=4;break;//按键在第4列
}
//以下开始从第1行到第4行逐行判断按键是否在该行
temp=0b11111110;
for(i=1;i<=4;i++)//i代表正在判断按下的按键是否是在第i行
{
PORTA=temp;//第i行所在的行线输出0,其他三条行线输出1
x=PORTA&0xf0;//读取四条列线的值,并保留高4位,清除低4位的值
if(x!
=0xf0)//如果四条列线不全为1,则说明按键就在第i行,否则表明按键不在该行,则准备扫描下一行
{row=i;
key=(row-1)*4+col-1;//求出按键
returnkey;//退出key_scan函数
}
temp=(temp<<1)+1;//按键不在该行,则改变temp的值,为扫描下一行做准备。
}
}
returnkey;//如果没有按键按下,程序才回执行到这,此时key为初值16;
}
main()
{unsignedcharkeyno;
while
(1)
{
keyno=key_scan();//调用键盘扫描函数获取是否有按键按下,是哪个按键按下
if(keyno<16)//keyno<16有按键按下,keyno=16则表明无按键按下
switch(keyno)
{case0:
//每一个按键按下后要实现什么功能,程序写在这。
case1:
case2:
case3:
case4:
case5:
case6:
case7:
case8:
case9:
case10:
case11:
case12:
case13:
case14:
case15:
}
}
}
PWM模块:
voidPWM_Init(void)
{
PWME=0x00;//禁止PWM模块
PWMPRCLK=0x06;//CLOCKA的预分频设置为6,分频系数64
PWMSCLA=125;//SA的分频因子设置为125,分频系数250
PWMCLK=0x01;//通道0选择SA作为PWM时钟
PWMPER0=200;//通道0周期寄存器设置为200
PWMDTY0=100;//通道0占空比寄存器设置
PWMPOL=0x01;//PWM输出先为高电平,之后变为低电平
PWMCAE=0x00;//左对齐输出
PWMCTL=0x00;//不级联
PWME=0x01;//使能PWM通道0
}
voidmain(void){
byteLedCnt=0;
setbusclock();
PWM_Init();
for(;;)
{
}
}
voidinterrupt0_Startup(void){
INIT_SP_FROM_STARTUP_DESC();//初始化堆栈指针SP
main();
}
输入捕捉(求占空比):
#include/*commondefinesandmacros*/
#include"derivative.h"/*derivative-specificdefinitions*/
#include
#include
unsignedintx,y;
unsignedlongintn,Th,Tl;
unsignedchart,a;
voidTIM_Init()
{
TSCR1=0x00;
TSCR2=0x84;
TIOS_IOS0=0;
TCTL4=0x01;
TIE_C0I=0x01;
TSCR1|=0x80;//启动定时器
}
#pragmaCODE_SEG_NEAR_SEGNONBANKED
voidinterrupt8TIM_Tie()
{
y=x;
x=TC0;
if(TCTL4==0x02)
Th=(x-y+(n<<16))*t;
if(TCTL4==0x01)
Tl=(x-y+(n<<16))*t;
TFLG1|=0x01;//写1清零
n=0;
a=TCTL4;
a=~a&0x03;
TCTL4=a;
}
#pragmaCODE_SEG_NEAR_SEGNONBANKED
voidinterrupt16TIM_Tof()
{
n++;
TFLG2|=0x80;//写1清零
}
voidmain(void){
TIM_Init();
for(;;){
//_FEED_COP();/*feedsthedog*/
}/*loopforever*/
/*pleasemakesurethatyouneverleavemain*/
}
电子时钟(包含串口通信和定时器):
//知识点1:
串口初始化、串口数据收发及数据处理
//2:
定时器如何实现指定的定时时间
#include
#include
#include"IO_Map.h"
//#include"derivative.h"
//globalvariablesdefinitions
staticintwaittime=5;
staticunsignedcharredButtonDown=FALSE,blueButtonDown=FALSE;
staticlongabsoluteTime=0;
unsignedintcount=0;
unsignedchartime[3]={0,0,0};
unsignedcharcmd_buf[8];
unsignedcharpos=0;
staticconstcharsegs[]={~0x3f,~0x06,~0x5b,~0x4f,~0x66,~0x6d,~0x7d,~0x07,~0x7f,~0x6f};
//staticconstchar//segss[]={~0xbf,~0x86,~0xdb,~0xcf,~0xe6,~0xed,~0xfd,~0x87,~0xff,~0xef};
//#pragmaCODE_SEGDEFAULT
staticvoidWriteToSCI0(constchar*text){
while(*text!
='\0'){
while(!
(SCI0SR1&0x80));//waitforoutputbufferempty
SCI0DRL=*text++;
}
}
voidexecute_cmd()
{unsignedchartmp[3];
if((cmd_buf[0]=='t')&&(pos==7))
{
tmp[0]=(cmd_buf[1]-'0')*10+cmd_buf[2]-'0';
tmp[1]=(cmd_buf[3]-'0')*10+cmd_buf[4]-'0';
tmp[2]=(cmd_buf[5]-'0')*10+cmd_buf[6]-'0';
if((tmp[0]<24)&&(tmp[1]<60)&&(tmp[2]<60))
{
time[0]=tmp[0];
time[1]=tmp[1];
time[2]=tmp[2];
}
}
pos=0;
}
//*
#pragmaCODE_SEG__NEAR_SEGNON_BANKED
voidinterrupt20SCI0_ISR(void){
unsignedcharrc;
rc=SCI0SR1;//dummyreadtoclearflags
rc=SCI0DRL;//dataread
if(rc!
=0x0d)
cmd_buf[pos++]=rc;
else
execute_cmd();
SCI0DRL=rc;
}
#pragmaCODE_SEG__NEAR_SEGNON_BANKED
voidsetbusclock(void)
{
CLKSEL=0X00;//disengagePLLtosystem
PLLCTL_PLLON=1;//turnonPLL
SYNR=0x00|0x01;//VCOFRQ[7:
6];SYNDIV[5:
0]
//fVCO=2*fOSC*(SYNDIV+1)/(REFDIV+1)fVCO=2*fOSC*2/2=2*fOSC
//fPLL=fVCO/(2×POSTDIV)fPLL=fVCO;
//fBUS=fPLL/2fBUS=fPLL/2=fosc;
//VCOCLKFrequencyRangesVCOFRQ[7:
6]
//32MHz<=fVCO<=48MHz00
//48MHz//Reserved10
//80MHzREFDV=0x80|0x01;//REFFRQ[7:
6];REFDIV[5:
0]
//fREF=fOSC/(REFDIV+1)
//REFCLKFrequencyRangesREFFRQ[7:
6]
//1MHz<=fREF<=2MHz00
//2MHz//6MHz//fREF>12MHz11
//pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
POSTDIV=0x00;//4:
0,fPLL=fVCO/(2xPOSTDIV)
//IfPOSTDIV=$00thenfPLLisidenticaltofVCO(dividebyone).
_asm(nop);//BUSCLOCK=16M
_asm(nop);
while(!
(CRGFLG_LOCK==1));//whenpllissteady,thenuseit;
CLKSEL_PLLSEL=1;//engagePLLtosystem;
}
voidinterrupt26MDC_ISR(void)//定时器MDC模块中断服务程序,当定时时间到时自动执行该程序
{
MCFLG|=0X80;//MCFLG_MCZF=1;
count++;
if(count%10==0)
{
count=0;
time[2]++;
if(time[2]>=60)
{
time[2]=0;
time[1]++;
if(time[1]>=60)
{
time[1]=0;
time[0]++;
if(time[0]>=24)
time[0]=0;
}
}
}
}
//*/
#pragmaCODE_SEGDEFAULT
staticvoidSCI0Init(void){
SCI0BDL=(unsignedchar)((16000000UL/*OSCfreq*//2)/9600/*baudrate*//16/*factor*/);
SCI0CR2=0x2C;
}
voidMDC_Init(){
unsignedchari;
MCCTL=0b11101111;//MCZI=1,MODMC=1,RDMCL=1,ICLAT=0,FLMC=1,MCEN=0,MCPR1-0=0b11(16分频)
MCCNT=10000;//定时10000us=10ms
//MCCTL_MCEN=1;
}
voidmain(void){
unsignedchartmp;
DDRA=0xFF;
DDRB=0xFF;
DDRE=0xFF;
DDRP=0xFF;
DDRM=0xFF;
DDRT=0xFF;
PORTA=0xFF;
PORTB=0xFF;
PORTE=0xFF;
PTP=0xFF;
PTM=0xFF;
PTT=0xFF;
setbusclock();
//startTimeBase();
SCI0Init();
MDC_Init();
WriteToSCI0("\n\n***TimerDemo***\n");
WriteToSCI0("\nEnter't123456'tosettimeto12:
34:
56\n");
INTCR_IRQEN=0;//屏蔽IRQ中断
EnableInterrupts;//使能全局中断
for(;;){
if(time[2]!
=tmp)//if秒钟数有更新
{
tmp=time[2];
PORTA=segs[time[0]/10];
PORTB=segs[time[0]%10]&0x7f;
PORTE=segs[time[1]/10];
PTP=segs[time[1]%10]&0x7f;
PTM=segs[time[2]/10];
PTT=segs[time[2]%10];
}
}
}