飞思卡尔单片机各种功能程序

更新时间:2023-12-20 22:16:01 阅读量: 教育文库 文档下载

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

流水灯四种效果:

#include /* common defines and macros */ #include

#include /* derivative information */ #pragma LINK_INFO DERIVATIVE \

#include \ unsigned char temp;

//unsigned char pa @0x200; //unsigned char pb @0x202; unsigned char key;

static void delay(void) { volatile unsigned long i; for(i=0;i<100000;i++); }

static unsigned char random;

static void Random(void) {

random = (unsigned char)rand(); }

void effect1() {

unsigned char c; for(c=0;c<=6;c++) { delay();

PORTB = ~(1<

for(c=7;c>=1;c--) { delay();

PORTB = ~(1<

void effect2() {

unsigned char c; for(c=0;c<=6;c++) { delay();

PORTB = ~(3<

for(c=7;c>=1;c--) {

delay();

PORTB = ~(3<

void effect3() {

unsigned char c,t=0xfe; for(c=0;c<=7;c++) { PORTB = t; delay(); t<<=1; } }

void effect4() {

unsigned char c,t=0; for(c=0;c<=7;c++) { PORTB=t; delay();

t = (t<<1)+1;; } }

void main(void) { unsigned char x; DDRA=0xf0; DDRB=0xff;

for(;;) {

x=PORTA&0x03; switch(x) {

case 0:effect1(); break; case 1:effect2(); break; case 2:effect3(); break;

case 3:effect4(); break; }

}/* wait forever */

/* please make sure that you never leave this function */ }

//行列反转法

unsigned char key_scan() //键盘扫描函数 { unsigned char x,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) {

case 0xe0:col=1;break; //按键在第1列 case 0xd0:col=2;break; //按键在第2列 case 0xb0:col=3;break; //按键在第3列 case 0x70: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) {

case 0x0e:row=1;break; //按键在第1行 case 0x0d:row=2;break; //按键在第2行 case 0x0b:row=3;break; //按键在第3行 case 0x07:row=4;break; //按键在第4行 }

key=(row-1)*4+col-1; //求出键号:0-15的整数 } }

return key; //如果没有按键按下,则函数返回的key=16; }

main()

{ unsigned char keyno; while(1) {

keyno=key_scan(); //调用键盘扫描函数获取是否有按键按下,是哪个按键按下 if(keyno<16) //keyno<16有按键按下,keyno=16则表明无按键按下 switch(keyno)

{ case 0: //每一个按键按下后要实现什么功能,程序写在这。 case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: } } }

//行扫描法1

unsigned char key_scan()

{ unsigned char x,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) {

case 0xe0:col=1;break; //按键在第1列 case 0xd0:col=2;break; //按键在第2列 case 0xb0:col=3;break; //按键在第3列 case 0x70: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; //求出按键 return key; //退出key_scan函数 }

temp=(temp<<1) +1; //按键不在该行,则改变temp的值,为扫描下一行做准备。 } }

return key; //如果没有按键按下,程序才回执行到这,此时key为初值16; }

main()

{ unsigned char keyno; while(1) {

keyno=key_scan(); //调用键盘扫描函数获取是否有按键按下,是哪个按键按下 if(keyno<16) //keyno<16有按键按下,keyno=16则表明无按键按下 switch(keyno)

{ case 0: //每一个按键按下后要实现什么功能,程序写在这。 case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: } } }

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

Top