蓝桥杯单片机头文件导入_CT107D蓝桥杯单片机编程笔记

一、IO口编程

IO编程,该开发板使用了573锁存器,通过P2口的5,6,7位连接3-8译码器,扩展出了8个口,其中4个口分别连接4个573锁存器,这里以LED的锁存器来举例:

原理图573:

分析代码:

P2=((P2&0x1f)|0x80);

其中0x1f=0001 1111,P2与0x1f进行与运算,高三位清零,其余位保持原来状态,不改变,即把控制3-8译码器的高三位留出来:

接着再或上0x80;容易发现0x80=1000 0000;或运算,与1或结果为1,与0或结果不变,所以或上0x80只需看P2的高三位,则高三位为100,对应3-8译码器的话,P2^7=1;P2^6=0;P2^5=0;

所以输出Y4=0;Y4再经过与非运算,看下图示:

则输出Y4C=1;即LED对应的锁存器的片选信号被选中,锁存器打通,接下来就可以对P0口进行操作,操作完之后,

P2=P2&0x1f;P2高三位直接清零,此时Y4C=0,则把锁存器锁上了。

类似的方法,数码管、蜂鸣器等都是如此操作,

选中锁存器代码:

P2=((P2&0x1f)|(这里填对应锁存器的位移号))。

二、              数码管动态扫描和定时器

数码管显示分为段选和位选,

数码管定义和显示函数:code unsigned char tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsigned chardspbuf[]={10,10,10,10,10,10,10,10};

unsigned chardspcom=0;

void display()

{

//段选,消隐

P2=((P2&0x1f)|0xe0);

P0=0xff;

P2=P2&0x1f;

//位选

P2=((P2&0x1f)|0xc0);

P0=(1<

P2=P2&0x1f;

//段码输入

P2=((P2&0x1f)|0xe0);

P0=tab[dspbuf[dspcom]];

P2=P2&0x1f;

if(++dspcom==8)

dspcom=0;

}注意:这里1左移dspcom位,刚开始dspcom=0,则1左移dspcom位依旧为1,接着dspcom每次自增1,1对应二进制00000001,即把1每次向左移,每次都比上一次多移一位,直至8位移完,对应8个数码管。

定时器配置:

这里只需记住定时器的配置,知道怎么使用就可以了。首先有两个定时器,T0和T1,(也有的单片机有T2),定时器有4种工作方式0,1,2,3;其中最常用的是方式1(16位),其次是方式2(8位自动重装,串口通讯中断会用到)。

定时器需要配置:TMOD |=0x01;配置成使用定时器0,工作方式为1;同理使用定时器1工作方式1:TMOD|=0x10;则同时使用两个定时器且工作方式为1,那么可以:TMOD|=0x11;

定时器1配置成工作方式2:TMOD |=0x20;

接着配置(以定时器0举例):

TH0=(65535-2000)/256;//配置初值

TL0=(65535-2000)%6;

ET0=1;

TR0=1;//定时0中断

EA=1;//总中断

定时器1也是同理的,只不过0要改成1.

接着定时中断函数和优先级:

定时器0

void isr_timer_0(void) interrupt1  //默认中断优先级1

{

TH0= (65536-2000)/256;

TL0= (65536-2000)%6;  //定时器重载

display();

}

定时器1:

voidisr_timer_1(void)  interrupt 3 //默认中断优先级3

{

TH0= (65536-2000)/256;

TL0= (65536-2000)%6;  //定时器重载

display();

}注意:定时器0优先级为1,定时器1为3,串口中断优先级为4,总共有5个中断源,后面还会介绍外部中断和串口中断。

数码管动态扫描,显示函数放在定时中断函数里面,2ms扫一次是最稳定的!!

三、              矩阵键盘

矩阵键盘需要死记了!这里不再讲独立键盘。

第二种单片机键盘扫描代码(没有消抖):

sfrP4^4=0xC0;

//键盘定义

sbitr1=P3^0;  //4行

sbit r2=P3^1;

sbit r3=P3^2;

sbit r4=P3^3;

//4列

sbit c1=P4^4;

sbit c2=P4^2;

sbit c3=P3^5;

sbit c4=P3^4;

//读取矩阵键盘键值

unsigned charkey_scan()

{

unsigned char key_value;

r1=0;

r2=r3=r4=1;

c1=c2=c3=c4=1;

if(!c1) key_value=0;

else if(!c2) key_value=1;

else if(!c3) key_value=2;

else if(!c4) key_value=3;

r2=0;

r1=r3=r4=1;

c1=c2=c3=c4=1;

if(!c1) key_value=4;

else if(!c2) key_value=5;

else if(!c3) key_value=6;

else if(!c4) key_value=7;

r3=0;

r2=r1=r4=1;

c1=c2=c3=c4=1;

if(!c1) key_value=8;

else if(!c2) key_v

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值